mirror of
https://github.com/Luzifer/ansible-role-version.git
synced 2024-12-23 19:11:20 +00:00
155 lines
3.4 KiB
Go
155 lines
3.4 KiB
Go
package examples
|
|
|
|
import (
|
|
"flag"
|
|
"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/git-fixtures/basic.git"
|
|
|
|
var args = map[string][]string{
|
|
"branch": {defaultURL, tempFolder()},
|
|
"checkout": {defaultURL, tempFolder(), "35e85108805c84807bc66a02d91535e1e24b38b9"},
|
|
"clone": {defaultURL, tempFolder()},
|
|
"context": {defaultURL, tempFolder()},
|
|
"commit": {cloneRepository(defaultURL, tempFolder())},
|
|
"custom_http": {defaultURL},
|
|
"open": {cloneRepository(defaultURL, tempFolder())},
|
|
"progress": {defaultURL, tempFolder()},
|
|
"push": {setEmptyRemote(cloneRepository(defaultURL, tempFolder()))},
|
|
"revision": {cloneRepository(defaultURL, tempFolder()), "master~2^"},
|
|
"showcase": {defaultURL, tempFolder()},
|
|
"tag": {cloneRepository(defaultURL, tempFolder())},
|
|
"pull": {createRepositoryWithRemote(tempFolder(), defaultURL)},
|
|
}
|
|
|
|
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", "gopkg.in/src-d/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 {
|
|
return createRepository(dir, true)
|
|
}
|
|
|
|
func createRepository(dir string, isBare bool) string {
|
|
var cmd *exec.Cmd
|
|
if isBare {
|
|
cmd = exec.Command("git", "init", "--bare", dir)
|
|
} else {
|
|
cmd = exec.Command("git", "init", dir)
|
|
}
|
|
err := cmd.Run()
|
|
CheckIfError(err)
|
|
|
|
return dir
|
|
}
|
|
|
|
func createRepositoryWithRemote(local, remote string) string {
|
|
createRepository(local, false)
|
|
addRemote(local, remote)
|
|
return local
|
|
}
|
|
|
|
func setEmptyRemote(dir string) string {
|
|
remote := createBareRepository(tempFolder())
|
|
setRemote(dir, 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 addRemote(local, remote string) {
|
|
cmd := exec.Command("git", "remote", "add", "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)
|
|
}
|
|
}
|