testgodefs_test.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package testgodefs
  5. import (
  6. "bytes"
  7. "os"
  8. "os/exec"
  9. "path/filepath"
  10. "strings"
  11. "testing"
  12. )
  13. // We are testing cgo -godefs, which translates Go files that use
  14. // import "C" into Go files with Go definitions of types defined in the
  15. // import "C" block. Add more tests here.
  16. var filePrefixes = []string{
  17. "anonunion",
  18. "bitfields",
  19. "issue8478",
  20. "fieldtypedef",
  21. "issue37479",
  22. "issue37621",
  23. "issue38649",
  24. "issue39534",
  25. "issue48396",
  26. }
  27. func TestGoDefs(t *testing.T) {
  28. testdata, err := filepath.Abs("testdata")
  29. if err != nil {
  30. t.Fatal(err)
  31. }
  32. gopath, err := os.MkdirTemp("", "testgodefs-gopath")
  33. if err != nil {
  34. t.Fatal(err)
  35. }
  36. defer os.RemoveAll(gopath)
  37. dir := filepath.Join(gopath, "src", "testgodefs")
  38. if err := os.MkdirAll(dir, 0755); err != nil {
  39. t.Fatal(err)
  40. }
  41. for _, fp := range filePrefixes {
  42. cmd := exec.Command("go", "tool", "cgo",
  43. "-godefs",
  44. "-srcdir", testdata,
  45. "-objdir", dir,
  46. fp+".go")
  47. cmd.Stderr = new(bytes.Buffer)
  48. out, err := cmd.Output()
  49. if err != nil {
  50. t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
  51. }
  52. if err := os.WriteFile(filepath.Join(dir, fp+"_defs.go"), out, 0644); err != nil {
  53. t.Fatal(err)
  54. }
  55. }
  56. main, err := os.ReadFile(filepath.Join("testdata", "main.go"))
  57. if err != nil {
  58. t.Fatal(err)
  59. }
  60. if err := os.WriteFile(filepath.Join(dir, "main.go"), main, 0644); err != nil {
  61. t.Fatal(err)
  62. }
  63. if err := os.WriteFile(filepath.Join(dir, "go.mod"), []byte("module testgodefs\ngo 1.14\n"), 0644); err != nil {
  64. t.Fatal(err)
  65. }
  66. // Use 'go run' to build and run the resulting binary in a single step,
  67. // instead of invoking 'go build' and the resulting binary separately, so that
  68. // this test can pass on mobile builders, which do not copy artifacts back
  69. // from remote invocations.
  70. cmd := exec.Command("go", "run", ".")
  71. cmd.Env = append(os.Environ(), "GOPATH="+gopath)
  72. cmd.Dir = dir
  73. if out, err := cmd.CombinedOutput(); err != nil {
  74. t.Fatalf("%s [%s]: %v\n%s", strings.Join(cmd.Args, " "), dir, err, out)
  75. }
  76. }