From 27bf7238f49fa6a76e585a46aa325a4aac2c6b1b Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Fri, 16 Dec 2022 14:42:41 -0800 Subject: [PATCH] Added include guard to mock headers (#31909) * Added include guard to mock headers * Fix test --- src/compiler/cpp_generator.cc | 33 ++++++++++++++-------- test/cpp/codegen/compiler_test_mock_golden | 9 ++++-- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 5b25a16b0ef..a781fe8f91a 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -2147,6 +2147,7 @@ std::string GetMockPrologue(grpc_generator::File* file, std::map vars; vars["filename"] = file->filename(); + vars["filename_identifier"] = FilenameIdentifier(file->filename()); vars["filename_base"] = file->filename_without_ext(); vars["message_header_ext"] = params.message_header_extension.empty() ? kCppGeneratorMessageHeaderExt @@ -2158,6 +2159,9 @@ std::string GetMockPrologue(grpc_generator::File* file, "// If you make any local change, they will be lost.\n"); printer->Print(vars, "// source: $filename$\n\n"); + printer->Print(vars, "#ifndef GRPC_MOCK_$filename_identifier$__INCLUDED\n"); + printer->Print(vars, "#define GRPC_MOCK_$filename_identifier$__INCLUDED\n"); + printer->Print(vars, "\n"); printer->Print(vars, "#include \"$filename_base$$message_header_ext$\"\n"); printer->Print(vars, "#include \"$filename_base$$service_header_ext$\"\n"); if (params.include_import_headers) { @@ -2350,20 +2354,27 @@ std::string GetMockServices(grpc_generator::File* file, std::string GetMockEpilogue(grpc_generator::File* file, const Parameters& /*params*/) { - std::string temp; - - if (!file->package().empty()) { - std::vector parts = file->package_parts(); + std::string output; + { + // Scope the output stream so it closes and finalizes output to the string. + auto printer = file->CreatePrinter(&output); + std::map vars; + vars["filename_identifier"] = FilenameIdentifier(file->filename()); - for (auto part = parts.begin(); part != parts.end(); part++) { - temp.append("} // namespace "); - temp.append(*part); - temp.append("\n"); + if (!file->package().empty()) { + std::vector parts = file->package_parts(); + for (auto part = parts.rbegin(); part != parts.rend(); part++) { + vars["part"] = *part; + printer->Print(vars, "} // namespace $part$\n"); + } + printer->Print(vars, "\n"); } - temp.append("\n"); - } - return temp; + printer->Print(vars, "\n"); + printer->Print(vars, + "#endif // GRPC_MOCK_$filename_identifier$__INCLUDED\n"); + } + return output; } } // namespace grpc_cpp_generator diff --git a/test/cpp/codegen/compiler_test_mock_golden b/test/cpp/codegen/compiler_test_mock_golden index f876d9cb03d..5051aa687bb 100644 --- a/test/cpp/codegen/compiler_test_mock_golden +++ b/test/cpp/codegen/compiler_test_mock_golden @@ -2,6 +2,9 @@ // If you make any local change, they will be lost. // source: src/proto/grpc/testing/compiler_test.proto +#ifndef GRPC_MOCK_src_2fproto_2fgrpc_2ftesting_2fcompiler_5ftest_2eproto__INCLUDED +#define GRPC_MOCK_src_2fproto_2fgrpc_2ftesting_2fcompiler_5ftest_2eproto__INCLUDED + #include "src/proto/grpc/testing/compiler_test.pb.h" #include "src/proto/grpc/testing/compiler_test.grpc.pb.h" @@ -34,6 +37,8 @@ class MockServiceBStub : public ServiceB::StubInterface { MOCK_METHOD3(PrepareAsyncMethodB1Raw, ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>*(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq)); }; -} // namespace grpc -} // namespace testing +} // namespace testing +} // namespace grpc + +#endif // GRPC_MOCK_src_2fproto_2fgrpc_2ftesting_2fcompiler_5ftest_2eproto__INCLUDED