diff options
author | Mahak Mukhi <mmukhi@google.com> | 2017-04-13 14:45:26 -0700 |
---|---|---|
committer | Mahak Mukhi <mmukhi@google.com> | 2017-04-13 14:45:26 -0700 |
commit | 2814b5148e9f902ef2893da34cc7a81106668e9a (patch) | |
tree | 12e4d598d5ca19c6ac2fea21e3daaaeddb0d70ce | |
parent | 13d85d499a1f7a3a48066511dd9db856f7671e2d (diff) |
formatting
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | include/grpc++/test/mock_stream.h | 2 | ||||
-rw-r--r-- | src/compiler/cpp_generator.cc | 60 | ||||
-rw-r--r-- | src/compiler/cpp_generator.h | 26 | ||||
-rw-r--r-- | src/compiler/cpp_plugin.cc | 11 | ||||
-rw-r--r-- | test/cpp/end2end/mock_test.cc | 59 |
6 files changed, 86 insertions, 74 deletions
@@ -2331,7 +2331,7 @@ $(GENDIR)/src/proto/grpc/testing/echo.pb.cc: src/proto/grpc/testing/echo.proto $ $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc: src/proto/grpc/testing/echo.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS) $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<" $(Q) mkdir -p `dirname $@` - $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< + $(Q) $(PROTOC) -Ithird_party/protobuf/src -I. --grpc_out=generate_mock_code=true:$(GENDIR) --plugin=protoc-gen-grpc=$(PROTOC_PLUGINS_DIR)/grpc_cpp_plugin$(EXECUTABLE_SUFFIX) $< endif ifeq ($(NO_PROTOC),true) diff --git a/include/grpc++/test/mock_stream.h b/include/grpc++/test/mock_stream.h index 1b1a735185..e1dbd5ae3f 100644 --- a/include/grpc++/test/mock_stream.h +++ b/include/grpc++/test/mock_stream.h @@ -3,11 +3,11 @@ #include <stdint.h> +#include <gmock/gmock.h> #include <grpc++/impl/codegen/call.h> #include <grpc++/support/async_stream.h> #include <grpc++/support/async_unary_call.h> #include <grpc++/support/sync_stream.h> -#include <gmock/gmock.h> namespace grpc { namespace testing { diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index c13577ce52..d64f8c9532 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -1408,7 +1408,8 @@ grpc::string GetSourceEpilogue(grpc_generator::File *file, } // TODO(mmukhi): Make sure we need parameters or not. -grpc::string GetMockPrologue(grpc_generator::File *file, const Parameters & /*params*/ ) { +grpc::string GetMockPrologue(grpc_generator::File *file, + const Parameters & /*params*/) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. @@ -1434,7 +1435,8 @@ grpc::string GetMockPrologue(grpc_generator::File *file, const Parameters & /*pa } // TODO(mmukhi): Add client-stream and completion-queue headers. -grpc::string GetMockIncludes(grpc_generator::File *file, const Parameters ¶ms) { +grpc::string GetMockIncludes(grpc_generator::File *file, + const Parameters ¶ms) { grpc::string output; { // Scope the output stream so it closes and finalizes output to the string. @@ -1442,9 +1444,8 @@ grpc::string GetMockIncludes(grpc_generator::File *file, const Parameters ¶m std::map<grpc::string, grpc::string> vars; static const char *headers_strs[] = { - "grpc++/impl/codegen/async_stream.h", - "grpc++/impl/codegen/sync_stream.h", - "gmock/gmock.h", + "grpc++/impl/codegen/async_stream.h", + "grpc++/impl/codegen/sync_stream.h", "gmock/gmock.h", }; std::vector<grpc::string> headers(headers_strs, array_end(headers_strs)); PrintIncludes(printer.get(), headers, params); @@ -1452,7 +1453,7 @@ grpc::string GetMockIncludes(grpc_generator::File *file, const Parameters ¶m if (!file->package().empty()) { std::vector<grpc::string> parts = file->package_parts(); - for(auto part = parts.begin(); part != parts.end(); part++) { + for (auto part = parts.begin(); part != parts.end(); part++) { vars["part"] = *part; printer->Print(vars, "namespace $part$ {\n"); } @@ -1475,36 +1476,33 @@ void PrintMockClientMethods(grpc_generator::Printer *printer, *vars, "MOCK_METHOD3($Method$, ::grpc::Status(::grpc::ClientContext* context, " "const $Request$& request, $Response$* response));\n"); - printer->Print( - *vars, - "MOCK_METHOD3(Async$Method$Raw, " - "::grpc::ClientAsyncResponseReaderInterface< $Response$>*" - "(::grpc::ClientContext* context, const $Request$& request, " - "::grpc::CompletionQueue* cq));\n"); + printer->Print(*vars, + "MOCK_METHOD3(Async$Method$Raw, " + "::grpc::ClientAsyncResponseReaderInterface< $Response$>*" + "(::grpc::ClientContext* context, const $Request$& request, " + "::grpc::CompletionQueue* cq));\n"); } else if (ClientOnlyStreaming(method)) { printer->Print( *vars, "MOCK_METHOD2($Method$Raw, " "::grpc::ClientWriterInterface< $Request$>*" "(::grpc::ClientContext* context, $Response$* response));\n"); - printer->Print( - *vars, - "MOCK_METHOD4(Async$Method$Raw, " - "::grpc::ClientAsyncWriterInterface< $Request$>*" - "(::grpc::ClientContext* context, $Response$* response, " - "::grpc::CompletionQueue* cq, void* tag));\n"); + printer->Print(*vars, + "MOCK_METHOD4(Async$Method$Raw, " + "::grpc::ClientAsyncWriterInterface< $Request$>*" + "(::grpc::ClientContext* context, $Response$* response, " + "::grpc::CompletionQueue* cq, void* tag));\n"); } else if (ServerOnlyStreaming(method)) { printer->Print( *vars, "MOCK_METHOD2($Method$Raw, " "::grpc::ClientReaderInterface< $Response$>*" "(::grpc::ClientContext* context, const $Request$& request));\n"); - printer->Print( - *vars, - "MOCK_METHOD4(Async$Method$Raw, " - "::grpc::ClientAsyncReaderInterface< $Response$>*" - "(::grpc::ClientContext* context, const $Request$& request, " - "::grpc::CompletionQueue* cq, void* tag));\n"); + printer->Print(*vars, + "MOCK_METHOD4(Async$Method$Raw, " + "::grpc::ClientAsyncReaderInterface< $Response$>*" + "(::grpc::ClientContext* context, const $Request$& request, " + "::grpc::CompletionQueue* cq, void* tag));\n"); } else if (method->BidiStreaming()) { printer->Print( *vars, @@ -1521,8 +1519,8 @@ void PrintMockClientMethods(grpc_generator::Printer *printer, } void PrintMockService(grpc_generator::Printer *printer, - const grpc_generator::Service *service, - std::map<grpc::string, grpc::string> *vars) { + const grpc_generator::Service *service, + std::map<grpc::string, grpc::string> *vars) { (*vars)["Service"] = service->name(); printer->Print(service->GetLeadingComments("//").c_str()); @@ -1540,7 +1538,6 @@ void PrintMockService(grpc_generator::Printer *printer, } printer->Outdent(); printer->Print("};\n"); - } grpc::string GetMockServices(grpc_generator::File *file, @@ -1557,12 +1554,12 @@ grpc::string GetMockServices(grpc_generator::File *file, vars["Package"].append("."); } - if(!params.services_namespace.empty()) { + if (!params.services_namespace.empty()) { vars["services_namespace"] = params.services_namespace; printer->Print(vars, "\nnamespace $services_namespace$ {\n\n"); } - for (int i =0; i < file->service_count(); i++) { + for (int i = 0; i < file->service_count(); i++) { PrintMockService(printer.get(), file->service(i).get(), &vars); printer->Print("\n"); } @@ -1574,13 +1571,14 @@ grpc::string GetMockServices(grpc_generator::File *file, return output; } -grpc::string GetMockEpilogue(grpc_generator::File *file, const Parameters & /*params*/) { +grpc::string GetMockEpilogue(grpc_generator::File *file, + const Parameters & /*params*/) { grpc::string temp; if (!file->package().empty()) { std::vector<grpc::string> parts = file->package_parts(); - for (auto part = parts.begin(); part != parts.end(); part++){ + for (auto part = parts.begin(); part != parts.end(); part++) { temp.append("} // namespace "); temp.append(*part); temp.append("\n"); diff --git a/src/compiler/cpp_generator.h b/src/compiler/cpp_generator.h index cd672d120d..6119ebe289 100644 --- a/src/compiler/cpp_generator.h +++ b/src/compiler/cpp_generator.h @@ -65,6 +65,8 @@ struct Parameters { bool use_system_headers; // Prefix to any grpc include grpc::string grpc_search_path; + // Generate GMOCK code to facilitate unit testing. + bool generate_mock_code; }; // Return the prologue of the generated header file. @@ -101,35 +103,35 @@ grpc::string GetSourceEpilogue(grpc_generator::File *file, // Return the prologue of the generated mock file. grpc::string GetMockPrologue(grpc_generator::File *file, - const Parameters ¶ms); + const Parameters ¶ms); // Return the includes needed for generated mock file. grpc::string GetMockIncludes(grpc_generator::File *file, - const Parameters ¶ms); + const Parameters ¶ms); // Return the services for generated mock file. -grpc::string GetMockServices(grpc_generator::File* file, - const Parameters ¶ms); +grpc::string GetMockServices(grpc_generator::File *file, + const Parameters ¶ms); // Return the epilogue of generated mock file. -grpc::string GetMockEpilogue(grpc_generator::File* file, - const Parameters ¶ms); +grpc::string GetMockEpilogue(grpc_generator::File *file, + const Parameters ¶ms); // Return the prologue of the generated mock file. grpc::string GetMockPrologue(grpc_generator::File *file, - const Parameters ¶ms); + const Parameters ¶ms); // Return the includes needed for generated mock file. grpc::string GetMockIncludes(grpc_generator::File *file, - const Parameters ¶ms); + const Parameters ¶ms); // Return the services for generated mock file. -grpc::string GetMockServices(grpc_generator::File* file, - const Parameters ¶ms); +grpc::string GetMockServices(grpc_generator::File *file, + const Parameters ¶ms); // Return the epilogue of generated mock file. -grpc::string GetMockEpilogue(grpc_generator::File* file, - const Parameters ¶ms); +grpc::string GetMockEpilogue(grpc_generator::File *file, + const Parameters ¶ms); } // namespace grpc_cpp_generator diff --git a/src/compiler/cpp_plugin.cc b/src/compiler/cpp_plugin.cc index a0986d92ce..35f1bf3e93 100644 --- a/src/compiler/cpp_plugin.cc +++ b/src/compiler/cpp_plugin.cc @@ -62,6 +62,7 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { grpc_cpp_generator::Parameters generator_parameters; generator_parameters.use_system_headers = true; + generator_parameters.generate_mock_code = false; ProtoBufFile pbfile(file); @@ -85,6 +86,13 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { } } else if (param[0] == "grpc_search_path") { generator_parameters.grpc_search_path = param[1]; + } else if (param[0] == "generate_mock_code") { + if (param[1] == "true") { + generator_parameters.generate_mock_code = true; + } else if (param[1] != "false") { + *error = grpc::string("Invalid parameter: ") + *parameter_string; + return false; + } } else { *error = grpc::string("Unknown parameter: ") + *parameter_string; return false; @@ -114,6 +122,9 @@ class CppGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { grpc::protobuf::io::CodedOutputStream source_coded_out(source_output.get()); source_coded_out.WriteRaw(source_code.data(), source_code.size()); + if (!generator_parameters.generate_mock_code) { + return true; + } grpc::string mock_code = grpc_cpp_generator::GetMockPrologue(&pbfile, generator_parameters) + grpc_cpp_generator::GetMockIncludes(&pbfile, generator_parameters) + diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc index b7968ce230..9c040a0cc3 100644 --- a/test/cpp/end2end/mock_test.cc +++ b/test/cpp/end2end/mock_test.cc @@ -1,5 +1,5 @@ /* -* + * * Copyright 2015, Google Inc. * All rights reserved. * @@ -34,6 +34,7 @@ #include <climits> #include <thread> +#include <gmock/gmock.h> #include <grpc++/channel.h> #include <grpc++/client_context.h> #include <grpc++/create_channel.h> @@ -45,7 +46,6 @@ #include <grpc/support/thd.h> #include <grpc/support/time.h> #include <gtest/gtest.h> -#include <gmock/gmock.h> #include <grpc++/test/mock_stream.h> @@ -55,7 +55,7 @@ #include "test/core/util/port.h" #include "test/core/util/test_config.h" -#include<iostream> +#include <iostream> using namespace std; using grpc::testing::EchoRequest; @@ -98,8 +98,8 @@ class FakeClient { grpc::string msg("hello"); grpc::string exp(msg); - std::unique_ptr<ClientWriterInterface<EchoRequest>> - cstream = stub_->RequestStream(&context, &response); + std::unique_ptr<ClientWriterInterface<EchoRequest>> cstream = + stub_->RequestStream(&context, &response); request.set_message(msg); EXPECT_TRUE(cstream->Write(request)); @@ -122,8 +122,8 @@ class FakeClient { request.set_message("hello world"); ClientContext context; - std::unique_ptr<ClientReaderInterface<EchoResponse>> - cstream = stub_->ResponseStream(&context, request); + std::unique_ptr<ClientReaderInterface<EchoResponse>> cstream = + stub_->ResponseStream(&context, request); grpc::string exp = ""; EXPECT_TRUE(cstream->Read(&response)); @@ -197,8 +197,7 @@ class TestServiceImpl : public EchoTestService::Service { return Status::OK; } - Status ResponseStream(ServerContext* context, - const EchoRequest* request, + Status ResponseStream(ServerContext* context, const EchoRequest* request, ServerWriter<EchoResponse>* writer) { EchoResponse response; vector<grpc::string> tokens = split(request->message()); @@ -221,23 +220,22 @@ class TestServiceImpl : public EchoTestService::Service { } return Status::OK; } + private: const vector<grpc::string> split(const grpc::string& input) { grpc::string buff(""); vector<grpc::string> result; - for (auto n:input) { + for (auto n : input) { if (n != ' ') { buff += n; continue; } - if (buff == "") - continue; + if (buff == "") continue; result.push_back(buff); buff = ""; } - if (buff != "") - result.push_back(buff); + if (buff != "") result.push_back(buff); return result; } @@ -280,7 +278,9 @@ TEST_F(MockTest, SimpleRpc) { MockEchoTestServiceStub stub; EchoResponse resp; resp.set_message("hello world"); - EXPECT_CALL(stub, Echo(_, _, _)).Times(AtLeast(1)).WillOnce(DoAll(SetArgPointee<2>(resp), Return(Status::OK))); + EXPECT_CALL(stub, Echo(_, _, _)) + .Times(AtLeast(1)) + .WillOnce(DoAll(SetArgPointee<2>(resp), Return(Status::OK))); client.ResetStub(&stub); client.DoEcho(); } @@ -299,7 +299,8 @@ TEST_F(MockTest, ClientStream) { EXPECT_CALL(*w, WritesDone()); EXPECT_CALL(*w, Finish()).WillOnce(Return(Status::OK)); - EXPECT_CALL(stub, RequestStreamRaw(_, _)).WillOnce(DoAll(SetArgPointee<1>(resp), Return(w))); + EXPECT_CALL(stub, RequestStreamRaw(_, _)) + .WillOnce(DoAll(SetArgPointee<1>(resp), Return(w))); client.ResetStub(&stub); client.DoRequestStream(); } @@ -316,10 +317,10 @@ TEST_F(MockTest, ServerStream) { EchoResponse resp2; resp2.set_message("world"); - EXPECT_CALL(*r, Read(_)). - WillOnce(DoAll(SetArgPointee<0>(resp1), Return(true))). - WillOnce(DoAll(SetArgPointee<0>(resp2), Return(true))). - WillOnce(Return(false)); + EXPECT_CALL(*r, Read(_)) + .WillOnce(DoAll(SetArgPointee<0>(resp1), Return(true))) + .WillOnce(DoAll(SetArgPointee<0>(resp2), Return(true))) + .WillOnce(Return(false)); EXPECT_CALL(*r, Finish()).WillOnce(Return(Status::OK)); EXPECT_CALL(stub, ResponseStreamRaw(_, _)).WillOnce(Return(r)); @@ -328,9 +329,7 @@ TEST_F(MockTest, ServerStream) { client.DoResponseStream(); } -ACTION_P(copy, msg) { - arg0->set_message(msg->message()); -} +ACTION_P(copy, msg) { arg0->set_message(msg->message()); } TEST_F(MockTest, BidiStream) { ResetStub(); @@ -340,12 +339,14 @@ TEST_F(MockTest, BidiStream) { auto rw = new MockClientReaderWriter<EchoRequest, EchoResponse>(); EchoRequest msg; - EXPECT_CALL(*rw, Write(_, _)).Times(3).WillRepeatedly(DoAll(SaveArg<0>(&msg), Return(true))); - EXPECT_CALL(*rw, Read(_)). - WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))). - WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))). - WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))). - WillOnce(Return(false)); + EXPECT_CALL(*rw, Write(_, _)) + .Times(3) + .WillRepeatedly(DoAll(SaveArg<0>(&msg), Return(true))); + EXPECT_CALL(*rw, Read(_)) + .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))) + .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))) + .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true))) + .WillOnce(Return(false)); EXPECT_CALL(*rw, WritesDone()); EXPECT_CALL(*rw, Finish()).WillOnce(Return(Status::OK)); |