Skip to content

Commit 7abd584

Browse files
committed
ISSUE-42 Generate Dockerfile
1 parent 43a8ae0 commit 7abd584

File tree

1 file changed

+74
-2
lines changed

1 file changed

+74
-2
lines changed

main.go

+74-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111

1212
const (
1313
fmtPackage = protogen.GoImportPath("fmt")
14+
osPackage = protogen.GoImportPath("os")
15+
strConvPackage = protogen.GoImportPath("strconv")
1416
contextPackage = protogen.GoImportPath("context")
1517
protoPackage = protogen.GoImportPath("github.com/golang/protobuf/proto")
1618
grpcPackage = protogen.GoImportPath("google.golang.org/grpc")
@@ -19,6 +21,7 @@ const (
1921
remotePackage = protogen.GoImportPath("github.com/carvalhorr/protoc-gen-mock/remote")
2022
codesPackage = protogen.GoImportPath("google.golang.org/grpc/codes")
2123
statusPackage = protogen.GoImportPath("google.golang.org/grpc/status")
24+
bootstrapPackage = protogen.GoImportPath("github.com/carvalhorr/protoc-gen-mock/bootstrap")
2225
deprecationComment = "// Deprecated: Do not use."
2326
)
2427

@@ -45,15 +48,82 @@ func main() {
4548
for _, f := range gen.Files {
4649
GenerateFile(gen, f)
4750
}
51+
GenerateMain(gen)
52+
GenerateDockerfile(gen)
4853
return nil
4954
})
5055
}
5156

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.
53119
func GenerateFile(gen *protogen.Plugin, file *protogen.File) *protogen.GeneratedFile {
120+
if !file.Generate {
121+
return nil
122+
}
54123
if len(file.Services) == 0 {
55124
return nil
56125
}
126+
// fmt.Println("FILENAME ", file.GeneratedFilenamePrefix)
57127
filename := file.GeneratedFilenamePrefix + ".mock.pb.go"
58128
g := gen.NewGeneratedFile(filename, file.GoImportPath)
59129
mockGenerator := mockServicesGenerator{
@@ -317,7 +387,9 @@ func (m mockServicesGenerator) genRemoteClient(service *protogen.Service) {
317387

318388
func (m mockServicesGenerator) genRemoteCalls(service *protogen.Service, method *protogen.Method) {
319389
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"
321393
methodFullName := m.getFullMethodName(service, method)
322394
m.g.P("func (c ", remoteMockClientName, ") On", method.GoName, "(ctx ", contextPackage.Ident("Context"), ", request *", method.Input.GoIdent, ")", callName, "{")
323395
m.g.P("return ", callName, "{")

0 commit comments

Comments
 (0)