launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/uniter/charm/git_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package charm_test 5 6 import ( 7 "io/ioutil" 8 "os" 9 "os/exec" 10 "path/filepath" 11 12 "launchpad.net/errgo/errors" 13 gc "launchpad.net/gocheck" 14 15 corecharm "launchpad.net/juju-core/charm" 16 "launchpad.net/juju-core/testing" 17 jc "launchpad.net/juju-core/testing/checkers" 18 "launchpad.net/juju-core/testing/testbase" 19 "launchpad.net/juju-core/worker/uniter/charm" 20 ) 21 22 var curl = corecharm.MustParseURL("cs:series/blah-blah-123") 23 24 type GitDirSuite struct { 25 testing.GitSuite 26 LoggingSuite testbase.LoggingSuite 27 } 28 29 var _ = gc.Suite(&GitDirSuite{}) 30 31 func (s *GitDirSuite) SetUpTest(c *gc.C) { 32 s.GitSuite.SetUpTest(c) 33 s.LoggingSuite.SetUpTest(c) 34 s.LoggingSuite.PatchEnvironment("LC_ALL", "en_US") 35 } 36 37 func (s *GitDirSuite) TearDownTest(c *gc.C) { 38 s.LoggingSuite.TearDownTest(c) 39 s.GitSuite.TearDownTest(c) 40 } 41 42 func (s *GitDirSuite) TestInitConfig(c *gc.C) { 43 base := c.MkDir() 44 repo := charm.NewGitDir(filepath.Join(base, "repo")) 45 err := repo.Init() 46 c.Assert(err, gc.IsNil) 47 48 cmd := exec.Command("git", "config", "--list", "--local") 49 cmd.Dir = repo.Path() 50 out, err := cmd.Output() 51 c.Assert(err, gc.IsNil) 52 outstr := string(out) 53 c.Assert(outstr, jc.Contains, "user.email=juju@localhost") 54 c.Assert(outstr, jc.Contains, "user.name=juju") 55 } 56 57 func (s *GitDirSuite) TestCreate(c *gc.C) { 58 base := c.MkDir() 59 repo := charm.NewGitDir(filepath.Join(base, "repo")) 60 exists, err := repo.Exists() 61 c.Assert(err, gc.IsNil) 62 c.Assert(exists, jc.IsFalse) 63 64 err = ioutil.WriteFile(repo.Path(), nil, 0644) 65 c.Assert(err, gc.IsNil) 66 _, err = repo.Exists() 67 c.Assert(err, gc.ErrorMatches, `".*/repo" is not a directory`) 68 err = os.Remove(repo.Path()) 69 c.Assert(err, gc.IsNil) 70 71 err = os.Chmod(base, 0555) 72 c.Assert(err, gc.IsNil) 73 defer os.Chmod(base, 0755) 74 err = repo.Init() 75 c.Assert(err, gc.ErrorMatches, ".* permission denied") 76 exists, err = repo.Exists() 77 c.Assert(err, gc.IsNil) 78 c.Assert(exists, jc.IsFalse) 79 80 err = os.Chmod(base, 0755) 81 c.Assert(err, gc.IsNil) 82 err = repo.Init() 83 c.Assert(err, gc.IsNil) 84 exists, err = repo.Exists() 85 c.Assert(err, gc.IsNil) 86 c.Assert(exists, jc.IsTrue) 87 88 _, err = charm.ReadCharmURL(repo) 89 c.Assert(errors.Cause(err), jc.Satisfies, os.IsNotExist) 90 91 err = repo.Init() 92 c.Assert(err, gc.IsNil) 93 } 94 95 func (s *GitDirSuite) TestAddCommitPullRevert(c *gc.C) { 96 target := charm.NewGitDir(c.MkDir()) 97 err := target.Init() 98 c.Assert(err, gc.IsNil) 99 err = ioutil.WriteFile(filepath.Join(target.Path(), "initial"), []byte("initial"), 0644) 100 c.Assert(err, gc.IsNil) 101 err = charm.WriteCharmURL(target, curl) 102 c.Assert(err, gc.IsNil) 103 err = target.AddAll() 104 c.Assert(err, gc.IsNil) 105 dirty, err := target.Dirty() 106 c.Assert(err, gc.IsNil) 107 c.Assert(dirty, jc.IsTrue) 108 err = target.Commitf("initial") 109 c.Assert(err, gc.IsNil) 110 dirty, err = target.Dirty() 111 c.Assert(err, gc.IsNil) 112 c.Assert(dirty, jc.IsFalse) 113 114 source := newRepo(c) 115 err = target.Pull(source) 116 c.Assert(err, gc.IsNil) 117 url, err := charm.ReadCharmURL(target) 118 c.Assert(err, gc.IsNil) 119 c.Assert(url, gc.DeepEquals, curl) 120 fi, err := os.Stat(filepath.Join(target.Path(), "some-dir")) 121 c.Assert(err, gc.IsNil) 122 c.Assert(fi, jc.Satisfies, os.FileInfo.IsDir) 123 data, err := ioutil.ReadFile(filepath.Join(target.Path(), "some-file")) 124 c.Assert(err, gc.IsNil) 125 c.Assert(string(data), gc.Equals, "hello") 126 dirty, err = target.Dirty() 127 c.Assert(err, gc.IsNil) 128 c.Assert(dirty, jc.IsFalse) 129 130 err = ioutil.WriteFile(filepath.Join(target.Path(), "another-file"), []byte("blah"), 0644) 131 c.Assert(err, gc.IsNil) 132 dirty, err = target.Dirty() 133 c.Assert(err, gc.IsNil) 134 c.Assert(dirty, jc.IsTrue) 135 err = source.AddAll() 136 c.Assert(err, gc.IsNil) 137 dirty, err = target.Dirty() 138 c.Assert(err, gc.IsNil) 139 c.Assert(dirty, jc.IsTrue) 140 141 err = target.Revert() 142 c.Assert(err, gc.IsNil) 143 _, err = os.Stat(filepath.Join(target.Path(), "some-file")) 144 c.Assert(err, jc.Satisfies, os.IsNotExist) 145 _, err = os.Stat(filepath.Join(target.Path(), "some-dir")) 146 c.Assert(err, jc.Satisfies, os.IsNotExist) 147 data, err = ioutil.ReadFile(filepath.Join(target.Path(), "initial")) 148 c.Assert(err, gc.IsNil) 149 c.Assert(string(data), gc.Equals, "initial") 150 dirty, err = target.Dirty() 151 c.Assert(err, gc.IsNil) 152 c.Assert(dirty, jc.IsFalse) 153 } 154 155 func (s *GitDirSuite) TestClone(c *gc.C) { 156 repo, err := newRepo(c).Clone(c.MkDir()) 157 c.Assert(err, gc.IsNil) 158 _, err = os.Stat(filepath.Join(repo.Path(), "some-file")) 159 c.Assert(err, jc.Satisfies, os.IsNotExist) 160 _, err = os.Stat(filepath.Join(repo.Path(), "some-dir")) 161 c.Assert(err, jc.Satisfies, os.IsNotExist) 162 dirty, err := repo.Dirty() 163 c.Assert(err, gc.IsNil) 164 c.Assert(dirty, jc.IsTrue) 165 166 err = repo.AddAll() 167 c.Assert(err, gc.IsNil) 168 dirty, err = repo.Dirty() 169 c.Assert(err, gc.IsNil) 170 c.Assert(dirty, jc.IsTrue) 171 err = repo.Commitf("blank overwrite") 172 c.Assert(err, gc.IsNil) 173 dirty, err = repo.Dirty() 174 c.Assert(err, gc.IsNil) 175 c.Assert(dirty, jc.IsFalse) 176 177 lines, err := repo.Log() 178 c.Assert(err, gc.IsNil) 179 c.Assert(lines, gc.HasLen, 2) 180 c.Assert(lines[0], gc.Matches, "[a-f0-9]{7} blank overwrite") 181 c.Assert(lines[1], gc.Matches, "[a-f0-9]{7} im in ur repo committin ur files") 182 } 183 184 func (s *GitDirSuite) TestConflictRevert(c *gc.C) { 185 source := newRepo(c) 186 updated, err := source.Clone(c.MkDir()) 187 c.Assert(err, gc.IsNil) 188 err = ioutil.WriteFile(filepath.Join(updated.Path(), "some-dir"), []byte("hello"), 0644) 189 c.Assert(err, gc.IsNil) 190 err = updated.Snapshotf("potential conflict src") 191 c.Assert(err, gc.IsNil) 192 conflicted, err := updated.Conflicted() 193 c.Assert(err, gc.IsNil) 194 c.Assert(conflicted, jc.IsFalse) 195 196 target := charm.NewGitDir(c.MkDir()) 197 err = target.Init() 198 c.Assert(err, gc.IsNil) 199 err = target.Pull(source) 200 c.Assert(err, gc.IsNil) 201 err = ioutil.WriteFile(filepath.Join(target.Path(), "some-dir", "conflicting-file"), []byte("hello"), 0644) 202 c.Assert(err, gc.IsNil) 203 err = target.Snapshotf("potential conflict dst") 204 c.Assert(err, gc.IsNil) 205 conflicted, err = target.Conflicted() 206 c.Assert(err, gc.IsNil) 207 c.Assert(conflicted, jc.IsFalse) 208 209 err = target.Pull(updated) 210 c.Assert(errors.Cause(err), gc.Equals, charm.ErrConflict) 211 conflicted, err = target.Conflicted() 212 c.Assert(err, gc.IsNil) 213 c.Assert(conflicted, jc.IsTrue) 214 dirty, err := target.Dirty() 215 c.Assert(err, gc.IsNil) 216 c.Assert(dirty, jc.IsTrue) 217 218 err = target.Revert() 219 c.Assert(err, gc.IsNil) 220 conflicted, err = target.Conflicted() 221 c.Assert(err, gc.IsNil) 222 c.Assert(conflicted, jc.IsFalse) 223 dirty, err = target.Dirty() 224 c.Assert(err, gc.IsNil) 225 c.Assert(dirty, jc.IsFalse) 226 } 227 228 func newRepo(c *gc.C) *charm.GitDir { 229 repo := charm.NewGitDir(c.MkDir()) 230 err := repo.Init() 231 c.Assert(err, gc.IsNil) 232 err = os.Mkdir(filepath.Join(repo.Path(), "some-dir"), 0755) 233 c.Assert(err, gc.IsNil) 234 err = ioutil.WriteFile(filepath.Join(repo.Path(), "some-file"), []byte("hello"), 0644) 235 c.Assert(err, gc.IsNil) 236 err = repo.AddAll() 237 c.Assert(err, gc.IsNil) 238 err = repo.Commitf("im in ur repo committin ur %s", "files") 239 c.Assert(err, gc.IsNil) 240 return repo 241 }