diff options
Diffstat (limited to '_examples/common_test.go')
-rw-r--r-- | _examples/common_test.go | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/_examples/common_test.go b/_examples/common_test.go new file mode 100644 index 0000000..b218e07 --- /dev/null +++ b/_examples/common_test.go @@ -0,0 +1,127 @@ +package examples + +import ( + "flag" + "fmt" + "go/build" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "testing" +) + +var examplesTest = flag.Bool("examples", false, "run the examples tests") + +var defaultURL = "https://github.com/mcuadros/basic.git" + +var args = map[string][]string{ + "showcase": []string{defaultURL, tempFolder()}, + "custom_http": []string{defaultURL}, + "clone": []string{defaultURL, tempFolder()}, + "progress": []string{defaultURL, tempFolder()}, + "open": []string{cloneRepository(defaultURL, tempFolder())}, + "push": []string{setEmptyRemote(cloneRepository(defaultURL, tempFolder()))}, +} + +var ignored = map[string]bool{} + +var tempFolders = []string{} + +func TestExamples(t *testing.T) { + flag.Parse() + if !*examplesTest && os.Getenv("CI") == "" { + t.Skip("skipping examples tests, pass --examples to execute it") + return + } + + defer deleteTempFolders() + + examples, err := filepath.Glob(examplesFolder()) + if err != nil { + t.Errorf("error finding tests: %s", err) + } + + for _, example := range examples { + _, name := filepath.Split(filepath.Dir(example)) + + if ignored[name] { + continue + } + + t.Run(name, func(t *testing.T) { + testExample(t, name, example) + }) + } +} + +func tempFolder() string { + path, err := ioutil.TempDir("", "") + CheckIfError(err) + + tempFolders = append(tempFolders, path) + return path +} + +func packageFolder() string { + return filepath.Join( + build.Default.GOPATH, + "src", "srcd.works/go-git.v4", + ) +} + +func examplesFolder() string { + return filepath.Join( + packageFolder(), + "examples", "*", "main.go", + ) +} + +func cloneRepository(url, folder string) string { + cmd := exec.Command("git", "clone", url, folder) + err := cmd.Run() + CheckIfError(err) + + return folder +} + +func createBareRepository(dir string) string { + cmd := exec.Command("git", "init", "--bare", dir) + err := cmd.Run() + CheckIfError(err) + + return dir +} + +func setEmptyRemote(dir string) string { + remote := createBareRepository(tempFolder()) + setRemote(dir, fmt.Sprintf("file://%s", remote)) + return dir +} + +func setRemote(local, remote string) { + cmd := exec.Command("git", "remote", "set-url", "origin", remote) + cmd.Dir = local + err := cmd.Run() + CheckIfError(err) +} + +func testExample(t *testing.T, name, example string) { + cmd := exec.Command("go", append([]string{ + "run", filepath.Join(example), + }, args[name]...)...) + + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + if err := cmd.Run(); err != nil { + t.Errorf("error running cmd %q", err) + } +} + +func deleteTempFolders() { + for _, folder := range tempFolders { + err := os.RemoveAll(folder) + CheckIfError(err) + } +} |