@@ -11,6 +11,8 @@ import (
11
11
12
12
const (
13
13
fmtPackage = protogen .GoImportPath ("fmt" )
14
+ osPackage = protogen .GoImportPath ("os" )
15
+ strConvPackage = protogen .GoImportPath ("strconv" )
14
16
contextPackage = protogen .GoImportPath ("context" )
15
17
protoPackage = protogen .GoImportPath ("github.com/golang/protobuf/proto" )
16
18
grpcPackage = protogen .GoImportPath ("google.golang.org/grpc" )
@@ -19,6 +21,7 @@ const (
19
21
remotePackage = protogen .GoImportPath ("github.com/carvalhorr/protoc-gen-mock/remote" )
20
22
codesPackage = protogen .GoImportPath ("google.golang.org/grpc/codes" )
21
23
statusPackage = protogen .GoImportPath ("google.golang.org/grpc/status" )
24
+ bootstrapPackage = protogen .GoImportPath ("github.com/carvalhorr/protoc-gen-mock/bootstrap" )
22
25
deprecationComment = "// Deprecated: Do not use."
23
26
)
24
27
@@ -45,15 +48,82 @@ func main() {
45
48
for _ , f := range gen .Files {
46
49
GenerateFile (gen , f )
47
50
}
51
+ GenerateMain (gen )
52
+ GenerateDockerfile (gen )
48
53
return nil
49
54
})
50
55
}
51
56
52
- // GenerateFile generates a _grpc.pb.go file containing gRPC service definitions.
57
+ func GenerateMain (gen * protogen.Plugin ) {
58
+ if len (gen .Files ) == 0 {
59
+ return
60
+ }
61
+ packageName := gen .Files [0 ].GoPackageName
62
+ file := gen .NewGeneratedFile ("main.go" , "" )
63
+ file .P ("package " , packageName )
64
+ file .P ("" )
65
+ file .P ("func main() {" )
66
+ file .P ("restPort, found := " , osPackage .Ident ("LookupEnv" ), "(\" REST_PORT\" )" )
67
+ file .P ("if !found {" )
68
+ file .P ("restPort = \" 1068\" // default REST port" )
69
+ file .P ("}" )
70
+ file .P ("restP, err := " , strConvPackage .Ident ("ParseUint" ), "(restPort, 10, 64)" )
71
+ file .P ("if err != nil {" )
72
+ file .P ("restP = 1068" )
73
+ file .P ("}" )
74
+ file .P ("grpcPort, found := " , osPackage .Ident ("LookupEnv" ), "(\" GRPC_PORT\" )" )
75
+ file .P ("if !found {" )
76
+ file .P ("grpcPort = \" 10010\" // default GRPC port" )
77
+ file .P ("}" )
78
+ file .P ("grpcP, err := " , strConvPackage .Ident ("ParseUint" ), "(grpcPort, 10, 64)" )
79
+ file .P ("if err != nil {" )
80
+ file .P ("grpcP = 10010" )
81
+ file .P ("}" )
82
+ file .P ("Start(uint(restP), uint(grpcP), \" ./tmp\" )" )
83
+ file .P ("}" )
84
+ file .P ("" )
85
+ file .P ("func Start(restPort, grpcPort uint, tmpPath string) {" )
86
+ file .P (bootstrapPackage .Ident ("BootstrapServers" ), "(tmpPath, restPort, grpcPort, MockServicesRegistrationCallback)" )
87
+ file .P ("}" )
88
+ file .P ("var MockServicesRegistrationCallback = func(stubsMatcher " , stubPackage .Ident ("StubsMatcher" ), ") " , grpcHandlerPackage .Ident ("MockService" ), " {" )
89
+ file .P ("return " , grpcHandlerPackage .Ident ("NewCompositeMockService" ), "([]" , grpcHandlerPackage .Ident ("MockService" ), "{" )
90
+ for _ , f := range gen .Files {
91
+ for _ , s := range f .Services {
92
+ file .P ("New" , s .GoName , "MockService(stubsMatcher)," )
93
+ }
94
+ }
95
+ file .P ("})" )
96
+ file .P ("}" )
97
+
98
+ }
99
+
100
+ func GenerateDockerfile (gen * protogen.Plugin ) {
101
+ if len (gen .Files ) == 0 {
102
+ return
103
+ }
104
+ packageName := gen .Files [0 ].GoPackageName
105
+ file := gen .NewGeneratedFile ("Dockerfile" , "" )
106
+ file .P ("FROM golang:1.15.8-alpine3.13 as builder" )
107
+ file .P ("RUN apk add build-base" )
108
+ file .P ("WORKDIR /mock" )
109
+ file .P ("COPY *.go ./" )
110
+ file .P ("RUN sed -i 's/package " , packageName , "/package main/' *.go" )
111
+ file .P ("RUN go mod init " , packageName )
112
+ file .P ("RUN go build -o app" )
113
+ file .P ("FROM golang:1.15.8-alpine3.13" )
114
+ file .P ("COPY --from=builder /mock/app ." )
115
+ file .P ("ENTRYPOINT ./app" )
116
+ }
117
+
118
+ // GenerateFile generates a .mock.pb.go file containing gRPC service definitions.
53
119
func GenerateFile (gen * protogen.Plugin , file * protogen.File ) * protogen.GeneratedFile {
120
+ if ! file .Generate {
121
+ return nil
122
+ }
54
123
if len (file .Services ) == 0 {
55
124
return nil
56
125
}
126
+ // fmt.Println("FILENAME ", file.GeneratedFilenamePrefix)
57
127
filename := file .GeneratedFilenamePrefix + ".mock.pb.go"
58
128
g := gen .NewGeneratedFile (filename , file .GoImportPath )
59
129
mockGenerator := mockServicesGenerator {
@@ -317,7 +387,9 @@ func (m mockServicesGenerator) genRemoteClient(service *protogen.Service) {
317
387
318
388
func (m mockServicesGenerator ) genRemoteCalls (service * protogen.Service , method * protogen.Method ) {
319
389
remoteMockClientName := m .getRemoteMockClientName (service )
320
- callName := method .GoName + "Call"
390
+ // Added the service name to the generated call name to avoid collision in the resulting generated code
391
+ // in case of multiple services with RPCs with the same name
392
+ callName := service .GoName + "_" + method .GoName + "Call"
321
393
methodFullName := m .getFullMethodName (service , method )
322
394
m .g .P ("func (c " , remoteMockClientName , ") On" , method .GoName , "(ctx " , contextPackage .Ident ("Context" ), ", request *" , method .Input .GoIdent , ")" , callName , "{" )
323
395
m .g .P ("return " , callName , "{" )
0 commit comments