github.com/DATA-dog/godog@v0.7.9/builder_test.go (about) 1 package godog 2 3 import ( 4 "bytes" 5 "go/build" 6 "io/ioutil" 7 "os" 8 "os/exec" 9 "path/filepath" 10 "testing" 11 ) 12 13 var builderFeatureFile = `Feature: eat godogs 14 In order to be happy 15 As a hungry gopher 16 I need to be able to eat godogs 17 18 Scenario: Eat 5 out of 12 19 Given there are 12 godogs 20 When I eat 5 21 Then there should be 7 remaining 22 ` 23 24 var builderTestFile = `package godogs 25 26 import ( 27 "fmt" 28 29 "github.com/DATA-DOG/godog" 30 ) 31 32 func thereAreGodogs(available int) error { 33 Godogs = available 34 return nil 35 } 36 37 func iEat(num int) error { 38 if Godogs < num { 39 return fmt.Errorf("you cannot eat %d godogs, there are %d available", num, Godogs) 40 } 41 Godogs -= num 42 return nil 43 } 44 45 func thereShouldBeRemaining(remaining int) error { 46 if Godogs != remaining { 47 return fmt.Errorf("expected %d godogs to be remaining, but there is %d", remaining, Godogs) 48 } 49 return nil 50 } 51 52 func FeatureContext(s *godog.Suite) { 53 s.Step("^there are (\\d+) godogs$", thereAreGodogs) 54 s.Step("^I eat (\\d+)$", iEat) 55 s.Step("^there should be (\\d+) remaining$", thereShouldBeRemaining) 56 57 s.BeforeScenario(func(interface{}) { 58 Godogs = 0 // clean the state before every scenario 59 }) 60 } 61 ` 62 63 var builderXTestFile = `package godogs_test 64 65 import ( 66 "fmt" 67 68 "github.com/DATA-DOG/godog" 69 "godogs" 70 ) 71 72 func thereAreGodogs(available int) error { 73 godogs.Godogs = available 74 return nil 75 } 76 77 func iEat(num int) error { 78 if godogs.Godogs < num { 79 return fmt.Errorf("you cannot eat %d godogs, there are %d available", num, godogs.Godogs) 80 } 81 godogs.Godogs -= num 82 return nil 83 } 84 85 func thereShouldBeRemaining(remaining int) error { 86 if godogs.Godogs != remaining { 87 return fmt.Errorf("expected %d godogs to be remaining, but there is %d", remaining, godogs.Godogs) 88 } 89 return nil 90 } 91 92 func FeatureContext(s *godog.Suite) { 93 s.Step("^there are (\\d+) godogs$", thereAreGodogs) 94 s.Step("^I eat (\\d+)$", iEat) 95 s.Step("^there should be (\\d+) remaining$", thereShouldBeRemaining) 96 97 s.BeforeScenario(func(interface{}) { 98 godogs.Godogs = 0 // clean the state before every scenario 99 }) 100 } 101 ` 102 103 var builderMainCodeFile = `package godogs 104 105 // Godogs available to eat 106 var Godogs int 107 108 func main() { 109 } 110 ` 111 112 func buildTestPackage(dir string, files map[string]string) error { 113 if err := os.MkdirAll(dir, 0755); err != nil { 114 return err 115 } 116 117 for name, content := range files { 118 if err := ioutil.WriteFile(filepath.Join(dir, name), []byte(content), 0644); err != nil { 119 return err 120 } 121 } 122 123 return nil 124 } 125 126 func buildTestCommand(t *testing.T, args ...string) *exec.Cmd { 127 bin, err := filepath.Abs("godog.test") 128 if err != nil { 129 t.Fatal(err) 130 } 131 if build.Default.GOOS == "windows" { 132 bin += ".exe" 133 } 134 if err = Build(bin); err != nil { 135 t.Fatal(err) 136 } 137 138 return exec.Command(bin, args...) 139 } 140 141 func TestGodogBuildWithSourceNotInGoPath(t *testing.T) { 142 dir := filepath.Join(os.TempDir(), "godogs") 143 err := buildTestPackage(dir, map[string]string{ 144 "godogs.feature": builderFeatureFile, 145 "godogs.go": builderMainCodeFile, 146 "godogs_test.go": builderTestFile, 147 }) 148 if err != nil { 149 os.RemoveAll(dir) 150 t.Fatal(err) 151 } 152 defer os.RemoveAll(dir) 153 154 prevDir, err := os.Getwd() 155 if err != nil { 156 t.Fatal(err) 157 } 158 159 if err := os.Chdir(dir); err != nil { 160 t.Fatal(err) 161 } 162 defer os.Chdir(prevDir) 163 164 cmd := buildTestCommand(t, "godogs.feature") 165 166 var stdout, stderr bytes.Buffer 167 cmd.Stdout = &stdout 168 cmd.Stderr = &stderr 169 170 if err := cmd.Run(); err != nil { 171 t.Log(stdout.String()) 172 t.Log(stderr.String()) 173 t.Fatal(err) 174 } 175 } 176 177 func TestGodogBuildWithoutSourceNotInGoPath(t *testing.T) { 178 dir := filepath.Join(os.TempDir(), "godogs") 179 err := buildTestPackage(dir, map[string]string{ 180 "godogs.feature": builderFeatureFile, 181 }) 182 if err != nil { 183 os.RemoveAll(dir) 184 t.Fatal(err) 185 } 186 defer os.RemoveAll(dir) 187 188 prevDir, err := os.Getwd() 189 if err != nil { 190 t.Fatal(err) 191 } 192 193 if err := os.Chdir(dir); err != nil { 194 t.Fatal(err) 195 } 196 defer os.Chdir(prevDir) 197 198 cmd := buildTestCommand(t, "godogs.feature") 199 200 var stdout, stderr bytes.Buffer 201 cmd.Stdout = &stdout 202 cmd.Stderr = &stderr 203 204 if err := cmd.Run(); err != nil { 205 t.Log(stdout.String()) 206 t.Log(stderr.String()) 207 t.Fatal(err) 208 } 209 } 210 211 func TestGodogBuildWithoutTestSourceNotInGoPath(t *testing.T) { 212 dir := filepath.Join(os.TempDir(), "godogs") 213 err := buildTestPackage(dir, map[string]string{ 214 "godogs.feature": builderFeatureFile, 215 "godogs.go": builderMainCodeFile, 216 }) 217 if err != nil { 218 os.RemoveAll(dir) 219 t.Fatal(err) 220 } 221 defer os.RemoveAll(dir) 222 223 prevDir, err := os.Getwd() 224 if err != nil { 225 t.Fatal(err) 226 } 227 228 if err := os.Chdir(dir); err != nil { 229 t.Fatal(err) 230 } 231 defer os.Chdir(prevDir) 232 233 cmd := buildTestCommand(t, "godogs.feature") 234 235 var stdout, stderr bytes.Buffer 236 cmd.Stdout = &stdout 237 cmd.Stderr = &stderr 238 239 if err := cmd.Run(); err != nil { 240 t.Log(stdout.String()) 241 t.Log(stderr.String()) 242 t.Fatal(err) 243 } 244 } 245 246 func TestGodogBuildWithinGopath(t *testing.T) { 247 gopath := filepath.Join(os.TempDir(), "_gp") 248 dir := filepath.Join(gopath, "src", "godogs") 249 err := buildTestPackage(dir, map[string]string{ 250 "godogs.feature": builderFeatureFile, 251 "godogs.go": builderMainCodeFile, 252 "godogs_test.go": builderTestFile, 253 }) 254 if err != nil { 255 os.RemoveAll(gopath) 256 t.Fatal(err) 257 } 258 defer os.RemoveAll(gopath) 259 260 pkg := filepath.Join(gopath, "src", "github.com", "DATA-DOG") 261 if err := os.MkdirAll(pkg, 0755); err != nil { 262 t.Fatal(err) 263 } 264 265 prevDir, err := os.Getwd() 266 if err != nil { 267 t.Fatal(err) 268 } 269 270 // symlink godog package 271 if err := os.Symlink(prevDir, filepath.Join(pkg, "godog")); err != nil { 272 t.Fatal(err) 273 } 274 275 if err := os.Chdir(dir); err != nil { 276 t.Fatal(err) 277 } 278 defer os.Chdir(prevDir) 279 280 cmd := buildTestCommand(t, "godogs.feature") 281 282 var stdout, stderr bytes.Buffer 283 cmd.Stdout = &stdout 284 cmd.Stderr = &stderr 285 cmd.Env = os.Environ() 286 cmd.Env = append(cmd.Env, "GOPATH="+gopath) 287 288 if err := cmd.Run(); err != nil { 289 t.Log(stdout.String()) 290 t.Log(stderr.String()) 291 t.Fatal(err) 292 } 293 } 294 295 func TestGodogBuildWithVendoredGodog(t *testing.T) { 296 gopath := filepath.Join(os.TempDir(), "_gp") 297 dir := filepath.Join(gopath, "src", "godogs") 298 err := buildTestPackage(dir, map[string]string{ 299 "godogs.feature": builderFeatureFile, 300 "godogs.go": builderMainCodeFile, 301 "godogs_test.go": builderTestFile, 302 }) 303 if err != nil { 304 os.RemoveAll(gopath) 305 t.Fatal(err) 306 } 307 defer os.RemoveAll(gopath) 308 309 pkg := filepath.Join(dir, "vendor", "github.com", "DATA-DOG") 310 if err := os.MkdirAll(pkg, 0755); err != nil { 311 t.Fatal(err) 312 } 313 314 prevDir, err := os.Getwd() 315 if err != nil { 316 t.Fatal(err) 317 } 318 319 // symlink godog package 320 if err := os.Symlink(prevDir, filepath.Join(pkg, "godog")); err != nil { 321 t.Fatal(err) 322 } 323 324 if err := os.Chdir(dir); err != nil { 325 t.Fatal(err) 326 } 327 defer os.Chdir(prevDir) 328 329 cmd := buildTestCommand(t, "godogs.feature") 330 331 var stdout, stderr bytes.Buffer 332 cmd.Stdout = &stdout 333 cmd.Stderr = &stderr 334 cmd.Env = os.Environ() 335 cmd.Env = append(cmd.Env, "GOPATH="+gopath) 336 337 if err := cmd.Run(); err != nil { 338 t.Log(stdout.String()) 339 t.Log(stderr.String()) 340 t.Fatal(err) 341 } 342 } 343 344 func TestBuildTestRunner(t *testing.T) { 345 bin := filepath.Join(os.TempDir(), "godog.test") 346 if err := Build(bin); err != nil { 347 t.Fatalf("failed to build godog test binary: %v", err) 348 } 349 os.Remove(bin) 350 } 351 352 func TestBuildTestRunnerWithoutGoFiles(t *testing.T) { 353 bin := filepath.Join(os.TempDir(), "godog.test") 354 pwd, err := os.Getwd() 355 if err != nil { 356 t.Fatalf("failed to get working directory: %v", err) 357 } 358 359 wd := filepath.Join(pwd, "features") 360 if err := os.Chdir(wd); err != nil { 361 t.Fatalf("failed to change working directory: %v", err) 362 } 363 364 defer func() { 365 _ = os.Chdir(pwd) // get back to current dir 366 }() 367 368 if err := Build(bin); err != nil { 369 t.Fatalf("failed to build godog test binary: %v", err) 370 } 371 os.Remove(bin) 372 }