gen_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package generator
  2. import (
  3. "fmt"
  4. "go/build"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "strings"
  9. "testing"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/tal-tech/go-zero/core/logx"
  12. "github.com/tal-tech/go-zero/core/stringx"
  13. conf "github.com/tal-tech/go-zero/tools/goctl/config"
  14. "github.com/tal-tech/go-zero/tools/goctl/rpc/execx"
  15. "github.com/tal-tech/go-zero/tools/goctl/util/env"
  16. )
  17. var cfg = &conf.Config{
  18. NamingFormat: "gozero",
  19. }
  20. func TestRpcGenerate(t *testing.T) {
  21. _ = Clean()
  22. dispatcher := NewDefaultGenerator()
  23. err := prepare()
  24. if err != nil {
  25. logx.Error(err)
  26. return
  27. }
  28. projectName := stringx.Rand()
  29. g := NewRPCGenerator(dispatcher, cfg)
  30. src := filepath.Join(build.Default.GOPATH, "src")
  31. _, err = os.Stat(src)
  32. if err != nil {
  33. return
  34. }
  35. projectDir := filepath.Join(src, projectName)
  36. srcDir := projectDir
  37. defer func() {
  38. _ = os.RemoveAll(srcDir)
  39. }()
  40. common, err := filepath.Abs(".")
  41. assert.Nil(t, err)
  42. // case go path
  43. t.Run("GOPATH", func(t *testing.T) {
  44. err = g.Generate("./test.proto", projectDir, []string{common}, "Mbase/common.proto=./base")
  45. assert.Nil(t, err)
  46. _, err = execx.Run("go test "+projectName, projectDir)
  47. if err != nil {
  48. assert.True(t, func() bool {
  49. return strings.Contains(err.Error(), "not in GOROOT") || strings.Contains(err.Error(), "cannot find package")
  50. }())
  51. }
  52. })
  53. // case go mod
  54. t.Run("GOMOD", func(t *testing.T) {
  55. workDir := t.TempDir()
  56. name := filepath.Base(workDir)
  57. _, err = execx.Run("go mod init "+name, workDir)
  58. if err != nil {
  59. logx.Error(err)
  60. return
  61. }
  62. projectDir = filepath.Join(workDir, projectName)
  63. err = g.Generate("./test.proto", projectDir, []string{common}, "Mbase/common.proto=./base")
  64. assert.Nil(t, err)
  65. _, err = execx.Run("go test "+projectName, projectDir)
  66. if err != nil {
  67. assert.True(t, func() bool {
  68. return strings.Contains(err.Error(), "not in GOROOT") || strings.Contains(err.Error(), "cannot find package")
  69. }())
  70. }
  71. })
  72. // case not in go mod and go path
  73. t.Run("OTHER", func(t *testing.T) {
  74. err = g.Generate("./test.proto", projectDir, []string{common, src}, "Mbase/common.proto=./base")
  75. assert.Nil(t, err)
  76. _, err = execx.Run("go test "+projectName, projectDir)
  77. if err != nil {
  78. assert.True(t, func() bool {
  79. return strings.Contains(err.Error(), "not in GOROOT") || strings.Contains(err.Error(), "cannot find package")
  80. }())
  81. }
  82. })
  83. }
  84. func prepare() error {
  85. if !env.CanExec() {
  86. return fmt.Errorf("%s: can not start new processes using os.StartProcess or exec.Command", runtime.GOOS)
  87. }
  88. if _, err := env.LookUpGo(); err != nil {
  89. return err
  90. }
  91. if _, err := env.LookUpProtoc(); err != nil {
  92. return err
  93. }
  94. return nil
  95. }