diff --git a/builder_go110.go b/builder_go110.go index 00d8a7d..304e7b6 100644 --- a/builder_go110.go +++ b/builder_go110.go @@ -33,15 +33,26 @@ var ( import ( "github.com/DATA-DOG/godog" {{if .Contexts}}_test "{{.ImportPath}}"{{end}} + {{if .XContexts}}_xtest "{{.ImportPath}}_test"{{end}} + {{if .XContexts}}"testing/internal/testdeps"{{end}} "os" ) +{{if .XContexts}} +func init() { + testdeps.ImportPath = "{{.ImportPath}}" +} +{{end}} + func main() { status := godog.Run("{{ .Name }}", func (suite *godog.Suite) { os.Setenv("GODOG_TESTED_PACKAGE", "{{.ImportPath}}") {{range .Contexts}} _test.{{ . }}(suite) {{end}} + {{range .XContexts}} + _xtest.{{ . }}(suite) + {{end}} }) os.Exit(status) }`)) @@ -349,14 +360,16 @@ func makeImportValid(r rune) rune { func buildTestMain(pkg *build.Package) ([]byte, bool, error) { var ( contexts []string + xcontexts []string err error name, importPath string ) if nil != pkg { - contexts, err = processPackageTestFiles( - pkg.TestGoFiles, - pkg.XTestGoFiles, - ) + contexts, err = processPackageTestFiles(pkg.TestGoFiles) + if err != nil { + return nil, false, err + } + xcontexts, err = processPackageTestFiles(pkg.XTestGoFiles) if err != nil { return nil, false, err } @@ -368,17 +381,21 @@ func buildTestMain(pkg *build.Package) ([]byte, bool, error) { data := struct { Name string Contexts []string + XContexts []string ImportPath string }{ Name: name, Contexts: contexts, + XContexts: xcontexts, ImportPath: importPath, } + + hasContext := len(contexts) > 0 || len(xcontexts) > 0 var buf bytes.Buffer 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. diff --git a/builder_go111_test.go b/builder_go111_test.go index 3f833ac..afa33de 100644 --- a/builder_go111_test.go +++ b/builder_go111_test.go @@ -17,7 +17,57 @@ func TestGodogBuildWithModuleOutsideGopath(t *testing.T) { } 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 { os.RemoveAll(dir) t.Fatal(err) @@ -59,7 +109,11 @@ func TestGodogBuildWithModuleInsideGopath(t *testing.T) { } gopath := filepath.Join(os.TempDir(), "_gp") 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 { os.RemoveAll(gopath) t.Fatal(err) diff --git a/builder_test.go b/builder_test.go index d3d1622..746a750 100644 --- a/builder_test.go +++ b/builder_test.go @@ -20,7 +20,7 @@ var builderFeatureFile = `Feature: eat godogs Then there should be 7 remaining ` -var builderTestFile = `package main +var builderTestFile = `package godogs import ( "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 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 { return err } @@ -97,7 +151,11 @@ func TestGodogBuildWithSourceNotInGoPath(t *testing.T) { t.SkipNow() // no command installed } 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) @@ -133,7 +191,9 @@ func TestGodogBuildWithoutSourceNotInGoPath(t *testing.T) { t.SkipNow() // no command installed } dir := filepath.Join(os.TempDir(), "godogs") - err = buildTestPackage(dir, builderFeatureFile, "", "") + err = buildTestPackage(dir, map[string]string{ + "godogs.feature": builderFeatureFile, + }) if err != nil { os.RemoveAll(dir) t.Fatal(err) @@ -169,7 +229,10 @@ func TestGodogBuildWithoutTestSourceNotInGoPath(t *testing.T) { t.SkipNow() // no command installed } 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 { os.RemoveAll(dir) t.Fatal(err) @@ -206,7 +269,11 @@ func TestGodogBuildWithinGopath(t *testing.T) { } gopath := filepath.Join(os.TempDir(), "_gp") 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 { os.RemoveAll(gopath) t.Fatal(err) @@ -255,7 +322,11 @@ func TestGodogBuildWithVendoredGodog(t *testing.T) { } gopath := filepath.Join(os.TempDir(), "_gp") 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 { os.RemoveAll(gopath) t.Fatal(err)