Этот коммит содержится в:
gedi 2018-11-26 13:49:26 +02:00
родитель cb8e8cae52
коммит 634a1d19e9
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 56604CDCCC201556
3 изменённых файлов: 158 добавлений и 16 удалений

Просмотреть файл

@ -33,15 +33,26 @@ var (
import ( import (
"github.com/DATA-DOG/godog" "github.com/DATA-DOG/godog"
{{if .Contexts}}_test "{{.ImportPath}}"{{end}} {{if .Contexts}}_test "{{.ImportPath}}"{{end}}
{{if .XContexts}}_xtest "{{.ImportPath}}_test"{{end}}
{{if .XContexts}}"testing/internal/testdeps"{{end}}
"os" "os"
) )
{{if .XContexts}}
func init() {
testdeps.ImportPath = "{{.ImportPath}}"
}
{{end}}
func main() { func main() {
status := godog.Run("{{ .Name }}", func (suite *godog.Suite) { status := godog.Run("{{ .Name }}", func (suite *godog.Suite) {
os.Setenv("GODOG_TESTED_PACKAGE", "{{.ImportPath}}") os.Setenv("GODOG_TESTED_PACKAGE", "{{.ImportPath}}")
{{range .Contexts}} {{range .Contexts}}
_test.{{ . }}(suite) _test.{{ . }}(suite)
{{end}} {{end}}
{{range .XContexts}}
_xtest.{{ . }}(suite)
{{end}}
}) })
os.Exit(status) os.Exit(status)
}`)) }`))
@ -349,14 +360,16 @@ func makeImportValid(r rune) rune {
func buildTestMain(pkg *build.Package) ([]byte, bool, error) { func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
var ( var (
contexts []string contexts []string
xcontexts []string
err error err error
name, importPath string name, importPath string
) )
if nil != pkg { if nil != pkg {
contexts, err = processPackageTestFiles( contexts, err = processPackageTestFiles(pkg.TestGoFiles)
pkg.TestGoFiles, if err != nil {
pkg.XTestGoFiles, return nil, false, err
) }
xcontexts, err = processPackageTestFiles(pkg.XTestGoFiles)
if err != nil { if err != nil {
return nil, false, err return nil, false, err
} }
@ -368,17 +381,21 @@ func buildTestMain(pkg *build.Package) ([]byte, bool, error) {
data := struct { data := struct {
Name string Name string
Contexts []string Contexts []string
XContexts []string
ImportPath string ImportPath string
}{ }{
Name: name, Name: name,
Contexts: contexts, Contexts: contexts,
XContexts: xcontexts,
ImportPath: importPath, ImportPath: importPath,
} }
hasContext := len(contexts) > 0 || len(xcontexts) > 0
var buf bytes.Buffer var buf bytes.Buffer
if err = runnerTemplate.Execute(&buf, data); err != nil { if err = runnerTemplate.Execute(&buf, data); err != nil {
return nil, len(contexts) > 0, err return nil, hasContext, err
} }
return buf.Bytes(), len(contexts) > 0, nil return buf.Bytes(), hasContext, nil
} }
// parseImport parses the import path to deal with go module. // parseImport parses the import path to deal with go module.

Просмотреть файл

@ -17,7 +17,57 @@ func TestGodogBuildWithModuleOutsideGopath(t *testing.T) {
} }
dir := filepath.Join(os.TempDir(), "godogs") dir := filepath.Join(os.TempDir(), "godogs")
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
"godogs_test.go": builderTestFile,
})
if err != nil {
os.RemoveAll(dir)
t.Fatal(err)
}
defer os.RemoveAll(dir)
prevDir, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
if err := os.Chdir(dir); err != nil {
t.Fatal(err)
}
defer os.Chdir(prevDir)
if out, err := exec.Command("go", "mod", "init", "godogs").CombinedOutput(); err != nil {
t.Log(string(out))
t.Fatal(err)
}
var stdout, stderr bytes.Buffer
cmd := exec.Command("godog", "godogs.feature")
cmd.Stdout = &stdout
cmd.Stderr = &stderr
cmd.Env = os.Environ()
if err := cmd.Run(); err != nil {
t.Log(stdout.String())
t.Log(stderr.String())
t.Fatal(err)
}
}
func TestGodogBuildWithModuleOutsideGopathWithXTest(t *testing.T) {
_, err := exec.LookPath("godog")
if err != nil {
t.SkipNow() // no command installed
}
dir := filepath.Join(os.TempDir(), "godogs")
err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
"godogs_test.go": builderXTestFile,
})
if err != nil { if err != nil {
os.RemoveAll(dir) os.RemoveAll(dir)
t.Fatal(err) t.Fatal(err)
@ -59,7 +109,11 @@ func TestGodogBuildWithModuleInsideGopath(t *testing.T) {
} }
gopath := filepath.Join(os.TempDir(), "_gp") gopath := filepath.Join(os.TempDir(), "_gp")
dir := filepath.Join(gopath, "src", "godogs") dir := filepath.Join(gopath, "src", "godogs")
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
"godogs_test.go": builderTestFile,
})
if err != nil { if err != nil {
os.RemoveAll(gopath) os.RemoveAll(gopath)
t.Fatal(err) t.Fatal(err)

Просмотреть файл

@ -20,7 +20,7 @@ var builderFeatureFile = `Feature: eat godogs
Then there should be 7 remaining Then there should be 7 remaining
` `
var builderTestFile = `package main var builderTestFile = `package godogs
import ( import (
"fmt" "fmt"
@ -59,7 +59,47 @@ func FeatureContext(s *godog.Suite) {
} }
` `
var builderMainCodeFile = `package main var builderXTestFile = `package godogs_test
import (
"fmt"
"github.com/DATA-DOG/godog"
"godogs"
)
func thereAreGodogs(available int) error {
godogs.Godogs = available
return nil
}
func iEat(num int) error {
if godogs.Godogs < num {
return fmt.Errorf("you cannot eat %d godogs, there are %d available", num, godogs.Godogs)
}
godogs.Godogs -= num
return nil
}
func thereShouldBeRemaining(remaining int) error {
if godogs.Godogs != remaining {
return fmt.Errorf("expected %d godogs to be remaining, but there is %d", remaining, godogs.Godogs)
}
return nil
}
func FeatureContext(s *godog.Suite) {
s.Step("^there are (\\d+) godogs$", thereAreGodogs)
s.Step("^I eat (\\d+)$", iEat)
s.Step("^there should be (\\d+) remaining$", thereShouldBeRemaining)
s.BeforeScenario(func(interface{}) {
godogs.Godogs = 0 // clean the state before every scenario
})
}
`
var builderMainCodeFile = `package godogs
// Godogs available to eat // Godogs available to eat
var Godogs int var Godogs int
@ -68,7 +108,21 @@ func main() {
} }
` `
func buildTestPackage(dir, feat, src, testSrc string) error { func buildTestPackage(dir string, files map[string]string) error {
if err := os.MkdirAll(dir, 0755); err != nil {
return err
}
for name, content := range files {
if err := ioutil.WriteFile(filepath.Join(dir, name), []byte(content), 0644); err != nil {
return err
}
}
return nil
}
func buildTestPackage2(dir, feat, src, testSrc string) error {
if err := os.MkdirAll(dir, 0755); err != nil { if err := os.MkdirAll(dir, 0755); err != nil {
return err return err
} }
@ -97,7 +151,11 @@ func TestGodogBuildWithSourceNotInGoPath(t *testing.T) {
t.SkipNow() // no command installed t.SkipNow() // no command installed
} }
dir := filepath.Join(os.TempDir(), "godogs") dir := filepath.Join(os.TempDir(), "godogs")
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
"godogs_test.go": builderTestFile,
})
if err != nil { if err != nil {
os.RemoveAll(dir) os.RemoveAll(dir)
t.Fatal(err) t.Fatal(err)
@ -133,7 +191,9 @@ func TestGodogBuildWithoutSourceNotInGoPath(t *testing.T) {
t.SkipNow() // no command installed t.SkipNow() // no command installed
} }
dir := filepath.Join(os.TempDir(), "godogs") dir := filepath.Join(os.TempDir(), "godogs")
err = buildTestPackage(dir, builderFeatureFile, "", "") err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
})
if err != nil { if err != nil {
os.RemoveAll(dir) os.RemoveAll(dir)
t.Fatal(err) t.Fatal(err)
@ -169,7 +229,10 @@ func TestGodogBuildWithoutTestSourceNotInGoPath(t *testing.T) {
t.SkipNow() // no command installed t.SkipNow() // no command installed
} }
dir := filepath.Join(os.TempDir(), "godogs") dir := filepath.Join(os.TempDir(), "godogs")
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, "") err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
})
if err != nil { if err != nil {
os.RemoveAll(dir) os.RemoveAll(dir)
t.Fatal(err) t.Fatal(err)
@ -206,7 +269,11 @@ func TestGodogBuildWithinGopath(t *testing.T) {
} }
gopath := filepath.Join(os.TempDir(), "_gp") gopath := filepath.Join(os.TempDir(), "_gp")
dir := filepath.Join(gopath, "src", "godogs") dir := filepath.Join(gopath, "src", "godogs")
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
"godogs_test.go": builderTestFile,
})
if err != nil { if err != nil {
os.RemoveAll(gopath) os.RemoveAll(gopath)
t.Fatal(err) t.Fatal(err)
@ -255,7 +322,11 @@ func TestGodogBuildWithVendoredGodog(t *testing.T) {
} }
gopath := filepath.Join(os.TempDir(), "_gp") gopath := filepath.Join(os.TempDir(), "_gp")
dir := filepath.Join(gopath, "src", "godogs") dir := filepath.Join(gopath, "src", "godogs")
err = buildTestPackage(dir, builderFeatureFile, builderMainCodeFile, builderTestFile) err = buildTestPackage(dir, map[string]string{
"godogs.feature": builderFeatureFile,
"godogs.go": builderMainCodeFile,
"godogs_test.go": builderTestFile,
})
if err != nil { if err != nil {
os.RemoveAll(gopath) os.RemoveAll(gopath)
t.Fatal(err) t.Fatal(err)