1package examples
2
3import (
4 "flag"
5 "go/build"
6 "io/ioutil"
7 "os"
8 "os/exec"
9 "path/filepath"
10 "testing"
11)
12
13var examplesTest = flag.Bool("examples", false, "run the examples tests")
14
15var defaultURL = "https://github.com/git-fixtures/basic.git"
16
17var args = map[string][]string{
18 "branch": {defaultURL, tempFolder()},
19 "checkout": {defaultURL, tempFolder(), "35e85108805c84807bc66a02d91535e1e24b38b9"},
20 "clone": {defaultURL, tempFolder()},
21 "context": {defaultURL, tempFolder()},
22 "commit": {cloneRepository(defaultURL, tempFolder())},
23 "custom_http": {defaultURL},
24 "open": {cloneRepository(defaultURL, tempFolder())},
25 "progress": {defaultURL, tempFolder()},
26 "push": {setEmptyRemote(cloneRepository(defaultURL, tempFolder()))},
27 "revision": {cloneRepository(defaultURL, tempFolder()), "master~2^"},
28 "showcase": {defaultURL, tempFolder()},
29 "tag": {cloneRepository(defaultURL, tempFolder())},
30 "pull": {createRepositoryWithRemote(tempFolder(), defaultURL)},
31}
32
33var ignored = map[string]bool{}
34
35var tempFolders = []string{}
36
37func TestExamples(t *testing.T) {
38 flag.Parse()
39 if !*examplesTest && os.Getenv("CI") == "" {
40 t.Skip("skipping examples tests, pass --examples to execute it")
41 return
42 }
43
44 defer deleteTempFolders()
45
46 examples, err := filepath.Glob(examplesFolder())
47 if err != nil {
48 t.Errorf("error finding tests: %s", err)
49 }
50
51 for _, example := range examples {
52 _, name := filepath.Split(filepath.Dir(example))
53
54 if ignored[name] {
55 continue
56 }
57
58 t.Run(name, func(t *testing.T) {
59 testExample(t, name, example)
60 })
61 }
62}
63
64func tempFolder() string {
65 path, err := ioutil.TempDir("", "")
66 CheckIfError(err)
67
68 tempFolders = append(tempFolders, path)
69 return path
70}
71
72func packageFolder() string {
73 return filepath.Join(
74 build.Default.GOPATH,
75 "src", "gopkg.in/src-d/go-git.v4",
76 )
77}
78
79func examplesFolder() string {
80 return filepath.Join(
81 packageFolder(),
82 "_examples", "*", "main.go",
83 )
84}
85
86func cloneRepository(url, folder string) string {
87 cmd := exec.Command("git", "clone", url, folder)
88 err := cmd.Run()
89 CheckIfError(err)
90
91 return folder
92}
93
94func createBareRepository(dir string) string {
95 return createRepository(dir, true)
96}
97
98func createRepository(dir string, isBare bool) string {
99 var cmd *exec.Cmd
100 if isBare {
101 cmd = exec.Command("git", "init", "--bare", dir)
102 } else {
103 cmd = exec.Command("git", "init", dir)
104 }
105 err := cmd.Run()
106 CheckIfError(err)
107
108 return dir
109}
110
111func createRepositoryWithRemote(local, remote string) string {
112 createRepository(local, false)
113 addRemote(local, remote)
114 return local
115}
116
117func setEmptyRemote(dir string) string {
118 remote := createBareRepository(tempFolder())
119 setRemote(dir, remote)
120 return dir
121}
122
123func setRemote(local, remote string) {
124 cmd := exec.Command("git", "remote", "set-url", "origin", remote)
125 cmd.Dir = local
126 err := cmd.Run()
127 CheckIfError(err)
128}
129
130func addRemote(local, remote string) {
131 cmd := exec.Command("git", "remote", "add", "origin", remote)
132 cmd.Dir = local
133 err := cmd.Run()
134 CheckIfError(err)
135}
136
137func testExample(t *testing.T, name, example string) {
138 cmd := exec.Command("go", append([]string{
139 "run", filepath.Join(example),
140 }, args[name]...)...)
141
142 cmd.Stdout = os.Stdout
143 cmd.Stderr = os.Stderr
144
145 if err := cmd.Run(); err != nil {
146 t.Errorf("error running cmd %q", err)
147 }
148}
149
150func deleteTempFolders() {
151 for _, folder := range tempFolders {
152 err := os.RemoveAll(folder)
153 CheckIfError(err)
154 }
155}