github.com/inteleradmedicalsystems/go-codecommit@v0.1.0/pkg/codecommit/git_test.go (about) 1 package codecommit 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "os" 7 "os/exec" 8 "path/filepath" 9 "testing" 10 11 "gopkg.in/src-d/go-git.v4" 12 "gopkg.in/src-d/go-git.v4/plumbing/object" 13 ) 14 15 // TestRepoWrapperCloneEmpty tests RepoWrapper.Clone() of an empty Git repo. 16 func TestRepoWrapperCloneEmpty(t *testing.T) { 17 tempdir := tempDir(t, "TestRepoWrapper-") 18 defer os.RemoveAll(tempdir) 19 repoRoot := filepath.Join(tempdir, "repo") 20 gitInit(t, repoRoot) 21 22 repoWrapper := RepoWrapper{} 23 destDir := filepath.Join(repoRoot, "dest") 24 r, isEmpty, err := repoWrapper.Clone(repoRoot, destDir) 25 if err != nil { 26 t.Fatalf("Failed cloning repo %v, err=%v, repo=%v", repoRoot, err, r) 27 28 } 29 if !isEmpty { 30 t.Fatalf("Repo %v should have been empty", repoRoot) 31 } 32 33 } 34 35 // TestRepoWrapperClone tests RepoWrapper.Clone() a non-empty Git repo, verifying that the contents of the clone matches the source repo. 36 func TestRepoWrapperClone(t *testing.T) { 37 cwd, err := os.Getwd() 38 if err != nil { 39 t.Fatalf("%v", err) 40 } 41 42 defer os.Chdir(cwd) 43 44 tempdir := tempDir(t, "TestRepoWrapper-") 45 defer os.RemoveAll(tempdir) 46 repoRoot := filepath.Join(tempdir, "repo") 47 gitInit(t, repoRoot) 48 49 os.Chdir(repoRoot) 50 51 f, err := ioutil.TempFile(repoRoot, "") 52 if err != nil { 53 t.Fatalf("%v", err) 54 } 55 56 baseFile := filepath.Base(f.Name()) 57 contentExpected := []byte("foo\n") 58 f.Write(contentExpected) 59 gitAdd(t, baseFile) 60 gitCommit(t, "commit it") 61 62 repoWrapper := RepoWrapper{} 63 destDir := filepath.Join(repoRoot, "dest") 64 r, isEmpty, err := repoWrapper.Clone(repoRoot, destDir) 65 if err != nil { 66 t.Fatalf("Failed cloning repo %v, err=%v, repo=%v", repoRoot, err, r) 67 68 } 69 if isEmpty { 70 t.Fatalf("Repo %v should not have been empty", repoRoot) 71 } 72 73 filename := filepath.Join(destDir, baseFile) 74 _, err = os.Stat(filename) 75 if err != nil { 76 t.Fatalf("Expected file %v was not cloned, err=%v", filename, err) 77 } 78 79 assertFileContents(t, filename, contentExpected) 80 } 81 82 // TestRepoWrapperCommit tests RepoWrapper.commit() of a single file, verifying that the commitl Log() method returns the expected commit. 83 func TestRepoWrapperCommit(t *testing.T) { 84 cwd, err := os.Getwd() 85 if err != nil { 86 t.Fatalf("%v", err) 87 } 88 89 defer os.Chdir(cwd) 90 91 tempdir := tempDir(t, "TestRepoWrapper-") 92 defer os.RemoveAll(tempdir) 93 repoRoot := filepath.Join(tempdir, "repo") 94 gitInit(t, repoRoot) 95 96 os.Chdir(repoRoot) 97 98 f, err := ioutil.TempFile(repoRoot, "") 99 if err != nil { 100 t.Fatalf("%v", err) 101 } 102 103 baseFile := filepath.Base(f.Name()) 104 contentExpected := []byte("foo\n") 105 f.Write(contentExpected) 106 gitAdd(t, baseFile) 107 108 repoWrapper := RepoWrapper{} 109 repo, err := repoWrapper.repo(repoRoot) 110 if err != nil { 111 t.Fatalf("Failed to get a new repo, err=%v", err) 112 } 113 114 w, err := repo.Worktree() 115 if err != nil { 116 t.Fatalf("Failed to get a WorkTree for repo %v, err=%v", repo, err) 117 } 118 119 name := "TestIt" 120 email := "testit@foo.local" 121 message := "testit" 122 h, err := repoWrapper.Commit(w, name, email, message, false) 123 if err != nil { 124 t.Fatalf("Failed to commit to repo %v, err=%v", repo, err) 125 } 126 127 cIter, err := repo.Log(&git.LogOptions{From: *h}) 128 err = cIter.ForEach(func(c *object.Commit) error { 129 if c.Author.Name != name { 130 t.Fatalf("Expected name %v not found for %v", name, h) 131 } 132 if c.Author.Email != email { 133 t.Fatalf("Expected email %v not found for %v", email, h) 134 } 135 if c.Message != message { 136 t.Fatalf("Expected message %v not found for %v", message, h) 137 } 138 return nil 139 }) 140 } 141 142 // TestRepoWrapperPush tests that the RepoWrapper can push changes to a bare remote Git repo. 143 func TestRepoWrapperPush(t *testing.T) { 144 cwd, err := os.Getwd() 145 if err != nil { 146 t.Fatalf("%v", err) 147 } 148 149 defer os.Chdir(cwd) 150 151 tempdir := tempDir(t, "TestRepoWrapper-") 152 defer os.RemoveAll(tempdir) 153 154 repoRoot := filepath.Join(tempdir, "repo") 155 gitInit(t, repoRoot, "--bare") 156 157 cloneDir := filepath.Join(tempdir, "clone") 158 gitClone(t, repoRoot, cloneDir) 159 160 os.Chdir(cloneDir) 161 162 f, err := ioutil.TempFile(cloneDir, "") 163 if err != nil { 164 t.Fatalf("%v", err) 165 } 166 baseFile := filepath.Base(f.Name()) 167 contentExpected := []byte("foo\n") 168 f.Write(contentExpected) 169 gitAdd(t, baseFile) 170 gitCommit(t, "commit it") 171 172 repoWrapper := RepoWrapper{} 173 repo, err := repoWrapper.repo(cloneDir) 174 if err != nil { 175 t.Fatalf("Failed to get a new repo, err=%v", err) 176 } 177 err = repoWrapper.PushR(repo) 178 if err != nil { 179 t.Fatalf("Failed to push repo %v to %v, err=%v", cloneDir, repoRoot, err) 180 } 181 182 otherDir := filepath.Join(tempdir, "other") 183 gitClone(t, repoRoot, otherDir) 184 assertFileContents(t, filepath.Join(otherDir, baseFile), contentExpected) 185 } 186 187 func assertFileContents(t *testing.T, filename string, expected []byte) { 188 actual, err := ioutil.ReadFile(filename) 189 if err != nil { 190 t.Fatalf("Error reading %v, err=%v", expected, err) 191 } 192 193 if bytes.Compare(actual, expected) != 0 { 194 t.Fatalf("Contents of %v does not match expected %v, actual=%v", filename, expected, actual) 195 } 196 197 } 198 func tempDir(t *testing.T, prefix string) string { 199 t.Helper() 200 tempdir, err := ioutil.TempDir("", prefix) 201 if err != nil { 202 t.Fatalf("Temp directory creation failed, err=%v", err) 203 } 204 return tempdir 205 } 206 207 func gitAdd(t *testing.T, files ...string) { 208 t.Helper() 209 execGit(t, "add", files...) 210 } 211 212 func gitInit(t *testing.T, args ...string) { 213 t.Helper() 214 execGit(t, "init", args...) 215 } 216 217 func gitClone(t *testing.T, url string, dest string) { 218 t.Helper() 219 execGit(t, "clone", url, dest) 220 } 221 222 func gitCommit(t *testing.T, message string) { 223 t.Helper() 224 execGit(t, "commit", "-m", message) 225 } 226 227 func execGit(t *testing.T, command string, args ...string) { 228 t.Helper() 229 a := []string{command} 230 a = append(a, args...) 231 cmd := exec.Command("git", a...) 232 stdouterr, err := cmd.CombinedOutput() 233 if err != nil { 234 t.Fatalf("git %v failed, args=%v, err=%v, stdouterr=%s", command, a, err, stdouterr) 235 } 236 }