Move to unique_ptr for all GRPC returned objects

pull/725/head
Craig Tiller 10 years ago
parent 7aef9e60f3
commit fd1b49b757
  1. 115
      src/compiler/cpp_generator.cc
  2. 2
      test/cpp/end2end/async_end2end_test.cc
  3. 25
      test/cpp/end2end/end2end_test.cc

@ -183,34 +183,40 @@ void PrintHeaderClientMethod(google::protobuf::io::Printer *printer,
printer->Print(*vars, printer->Print(*vars,
"::grpc::Status $Method$(::grpc::ClientContext* context, " "::grpc::Status $Method$(::grpc::ClientContext* context, "
"const $Request$& request, $Response$* response);\n"); "const $Request$& request, $Response$* response);\n");
printer->Print(*vars, printer->Print(
"::grpc::ClientAsyncResponseReader< $Response$>* " *vars,
"std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> "
"$Method$(::grpc::ClientContext* context, " "$Method$(::grpc::ClientContext* context, "
"const $Request$& request, " "const $Request$& request, "
"::grpc::CompletionQueue* cq, void* tag);\n"); "::grpc::CompletionQueue* cq, void* tag);\n");
} else if (ClientOnlyStreaming(method)) { } else if (ClientOnlyStreaming(method)) {
printer->Print(*vars, printer->Print(
"::grpc::ClientWriter< $Request$>* $Method$(" *vars,
"std::unique_ptr< ::grpc::ClientWriter< $Request$>> $Method$("
"::grpc::ClientContext* context, $Response$* response);\n"); "::grpc::ClientContext* context, $Response$* response);\n");
printer->Print(*vars, printer->Print(
"::grpc::ClientAsyncWriter< $Request$>* $Method$(" *vars,
"std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>> $Method$("
"::grpc::ClientContext* context, $Response$* response, " "::grpc::ClientContext* context, $Response$* response, "
"::grpc::CompletionQueue* cq, void* tag);\n"); "::grpc::CompletionQueue* cq, void* tag);\n");
} else if (ServerOnlyStreaming(method)) { } else if (ServerOnlyStreaming(method)) {
printer->Print( printer->Print(
*vars, *vars,
"::grpc::ClientReader< $Response$>* $Method$(" "std::unique_ptr< ::grpc::ClientReader< $Response$>> $Method$("
"::grpc::ClientContext* context, const $Request$& request);\n"); "::grpc::ClientContext* context, const $Request$& request);\n");
printer->Print(*vars, printer->Print(
"::grpc::ClientAsyncReader< $Response$>* $Method$(" *vars,
"std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>> $Method$("
"::grpc::ClientContext* context, const $Request$& request, " "::grpc::ClientContext* context, const $Request$& request, "
"::grpc::CompletionQueue* cq, void* tag);\n"); "::grpc::CompletionQueue* cq, void* tag);\n");
} else if (BidiStreaming(method)) { } else if (BidiStreaming(method)) {
printer->Print(*vars, printer->Print(
"::grpc::ClientReaderWriter< $Request$, $Response$>* " *vars,
"std::unique_ptr< ::grpc::ClientReaderWriter< $Request$, $Response$>> "
"$Method$(::grpc::ClientContext* context);\n"); "$Method$(::grpc::ClientContext* context);\n");
printer->Print(*vars, printer->Print(*vars,
"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* " "std::unique_ptr< ::grpc::ClientAsyncReaderWriter< "
"$Request$, $Response$>> "
"$Method$(::grpc::ClientContext* context, " "$Method$(::grpc::ClientContext* context, "
"::grpc::CompletionQueue* cq, void* tag);\n"); "::grpc::CompletionQueue* cq, void* tag);\n");
} }
@ -309,7 +315,8 @@ void PrintHeaderService(google::protobuf::io::Printer *printer,
printer->Outdent(); printer->Outdent();
printer->Print("};\n"); printer->Print("};\n");
printer->Print( printer->Print(
"static Stub* NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& " "static std::unique_ptr<Stub> NewStub(const std::shared_ptr< "
"::grpc::ChannelInterface>& "
"channel);\n"); "channel);\n");
printer->Print("\n"); printer->Print("\n");
@ -380,90 +387,100 @@ void PrintSourceClientMethod(google::protobuf::io::Printer *printer,
"::grpc::RpcMethod($Service$_method_names[$Idx$]), " "::grpc::RpcMethod($Service$_method_names[$Idx$]), "
"context, request, response);\n" "context, request, response);\n"
"}\n\n"); "}\n\n");
printer->Print(*vars, printer->Print(
"::grpc::ClientAsyncResponseReader< $Response$>* " *vars,
"std::unique_ptr< ::grpc::ClientAsyncResponseReader< $Response$>> "
"$Service$::Stub::$Method$(::grpc::ClientContext* context, " "$Service$::Stub::$Method$(::grpc::ClientContext* context, "
"const $Request$& request, " "const $Request$& request, "
"::grpc::CompletionQueue* cq, void* tag) {\n"); "::grpc::CompletionQueue* cq, void* tag) {\n");
printer->Print(*vars, printer->Print(*vars,
" return new ::grpc::ClientAsyncResponseReader< $Response$>(" " return std::unique_ptr< "
"::grpc::ClientAsyncResponseReader< $Response$>>(new "
"::grpc::ClientAsyncResponseReader< $Response$>("
"channel(), cq, " "channel(), cq, "
"::grpc::RpcMethod($Service$_method_names[$Idx$]), " "::grpc::RpcMethod($Service$_method_names[$Idx$]), "
"context, request, tag);\n" "context, request, tag));\n"
"}\n\n"); "}\n\n");
} else if (ClientOnlyStreaming(method)) { } else if (ClientOnlyStreaming(method)) {
printer->Print( printer->Print(*vars,
*vars, "std::unique_ptr< ::grpc::ClientWriter< $Request$>> "
"::grpc::ClientWriter< $Request$>* $Service$::Stub::$Method$(" "$Service$::Stub::$Method$("
"::grpc::ClientContext* context, $Response$* response) {\n"); "::grpc::ClientContext* context, $Response$* response) {\n");
printer->Print(*vars, printer->Print(*vars,
" return new ::grpc::ClientWriter< $Request$>(" " return std::unique_ptr< ::grpc::ClientWriter< "
"$Request$>>(new ::grpc::ClientWriter< $Request$>("
"channel()," "channel(),"
"::grpc::RpcMethod($Service$_method_names[$Idx$], " "::grpc::RpcMethod($Service$_method_names[$Idx$], "
"::grpc::RpcMethod::RpcType::CLIENT_STREAMING), " "::grpc::RpcMethod::RpcType::CLIENT_STREAMING), "
"context, response);\n" "context, response));\n"
"}\n\n"); "}\n\n");
printer->Print( printer->Print(*vars,
*vars, "std::unique_ptr< ::grpc::ClientAsyncWriter< $Request$>> "
"::grpc::ClientAsyncWriter< $Request$>* $Service$::Stub::$Method$(" "$Service$::Stub::$Method$("
"::grpc::ClientContext* context, $Response$* response, " "::grpc::ClientContext* context, $Response$* response, "
"::grpc::CompletionQueue* cq, void* tag) {\n"); "::grpc::CompletionQueue* cq, void* tag) {\n");
printer->Print(*vars, printer->Print(*vars,
" return new ::grpc::ClientAsyncWriter< $Request$>(" " return std::unique_ptr< ::grpc::ClientAsyncWriter< "
"$Request$>>(new ::grpc::ClientAsyncWriter< $Request$>("
"channel(), cq, " "channel(), cq, "
"::grpc::RpcMethod($Service$_method_names[$Idx$], " "::grpc::RpcMethod($Service$_method_names[$Idx$], "
"::grpc::RpcMethod::RpcType::CLIENT_STREAMING), " "::grpc::RpcMethod::RpcType::CLIENT_STREAMING), "
"context, response, tag);\n" "context, response, tag));\n"
"}\n\n"); "}\n\n");
} else if (ServerOnlyStreaming(method)) { } else if (ServerOnlyStreaming(method)) {
printer->Print( printer->Print(
*vars, *vars,
"::grpc::ClientReader< $Response$>* $Service$::Stub::$Method$(" "std::unique_ptr< ::grpc::ClientReader< $Response$>> "
"$Service$::Stub::$Method$("
"::grpc::ClientContext* context, const $Request$& request) {\n"); "::grpc::ClientContext* context, const $Request$& request) {\n");
printer->Print(*vars, printer->Print(*vars,
" return new ::grpc::ClientReader< $Response$>(" " return std::unique_ptr< ::grpc::ClientReader< "
"$Response$>>(new ::grpc::ClientReader< $Response$>("
"channel()," "channel(),"
"::grpc::RpcMethod($Service$_method_names[$Idx$], " "::grpc::RpcMethod($Service$_method_names[$Idx$], "
"::grpc::RpcMethod::RpcType::SERVER_STREAMING), " "::grpc::RpcMethod::RpcType::SERVER_STREAMING), "
"context, request);\n" "context, request));\n"
"}\n\n"); "}\n\n");
printer->Print( printer->Print(*vars,
*vars, "std::unique_ptr< ::grpc::ClientAsyncReader< $Response$>> "
"::grpc::ClientAsyncReader< $Response$>* $Service$::Stub::$Method$(" "$Service$::Stub::$Method$("
"::grpc::ClientContext* context, const $Request$& request, " "::grpc::ClientContext* context, const $Request$& request, "
"::grpc::CompletionQueue* cq, void* tag) {\n"); "::grpc::CompletionQueue* cq, void* tag) {\n");
printer->Print(*vars, printer->Print(*vars,
" return new ::grpc::ClientAsyncReader< $Response$>(" " return std::unique_ptr< ::grpc::ClientAsyncReader< "
"$Response$>>(new ::grpc::ClientAsyncReader< $Response$>("
"channel(), cq, " "channel(), cq, "
"::grpc::RpcMethod($Service$_method_names[$Idx$], " "::grpc::RpcMethod($Service$_method_names[$Idx$], "
"::grpc::RpcMethod::RpcType::SERVER_STREAMING), " "::grpc::RpcMethod::RpcType::SERVER_STREAMING), "
"context, request, tag);\n" "context, request, tag));\n"
"}\n\n"); "}\n\n");
} else if (BidiStreaming(method)) { } else if (BidiStreaming(method)) {
printer->Print( printer->Print(
*vars, *vars,
"::grpc::ClientReaderWriter< $Request$, $Response$>* " "std::unique_ptr< ::grpc::ClientReaderWriter< $Request$, $Response$>> "
"$Service$::Stub::$Method$(::grpc::ClientContext* context) {\n"); "$Service$::Stub::$Method$(::grpc::ClientContext* context) {\n");
printer->Print( printer->Print(*vars,
*vars, " return std::unique_ptr< ::grpc::ClientReaderWriter< "
" return new ::grpc::ClientReaderWriter< $Request$, $Response$>(" "$Request$, $Response$>>(new ::grpc::ClientReaderWriter< "
"$Request$, $Response$>("
"channel()," "channel(),"
"::grpc::RpcMethod($Service$_method_names[$Idx$], " "::grpc::RpcMethod($Service$_method_names[$Idx$], "
"::grpc::RpcMethod::RpcType::BIDI_STREAMING), " "::grpc::RpcMethod::RpcType::BIDI_STREAMING), "
"context);\n" "context));\n"
"}\n\n"); "}\n\n");
printer->Print( printer->Print(*vars,
*vars, "std::unique_ptr< ::grpc::ClientAsyncReaderWriter< "
"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>* " "$Request$, $Response$>> "
"$Service$::Stub::$Method$(::grpc::ClientContext* context, " "$Service$::Stub::$Method$(::grpc::ClientContext* context, "
"::grpc::CompletionQueue* cq, void* tag) {\n"); "::grpc::CompletionQueue* cq, void* tag) {\n");
printer->Print( printer->Print(*vars,
*vars, " return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< "
" return new ::grpc::ClientAsyncReaderWriter< $Request$, $Response$>(" "$Request$, $Response$>>(new "
"::grpc::ClientAsyncReaderWriter< $Request$, $Response$>("
"channel(), cq, " "channel(), cq, "
"::grpc::RpcMethod($Service$_method_names[$Idx$], " "::grpc::RpcMethod($Service$_method_names[$Idx$], "
"::grpc::RpcMethod::RpcType::BIDI_STREAMING), " "::grpc::RpcMethod::RpcType::BIDI_STREAMING), "
"context, tag);\n" "context, tag));\n"
"}\n\n"); "}\n\n");
} }
} }
@ -587,9 +604,9 @@ void PrintSourceService(google::protobuf::io::Printer *printer,
printer->Print( printer->Print(
*vars, *vars,
"$Service$::Stub* $Service$::NewStub(" "std::unique_ptr< $Service$::Stub> $Service$::NewStub("
"const std::shared_ptr< ::grpc::ChannelInterface>& channel) {\n" "const std::shared_ptr< ::grpc::ChannelInterface>& channel) {\n"
" $Service$::Stub* stub = new $Service$::Stub();\n" " std::unique_ptr< $Service$::Stub> stub(new $Service$::Stub());\n"
" stub->set_channel(channel);\n" " stub->set_channel(channel);\n"
" return stub;\n" " return stub;\n"
"};\n\n"); "};\n\n");

@ -106,7 +106,7 @@ class AsyncEnd2endTest : public ::testing::Test {
void ResetStub() { void ResetStub() {
std::shared_ptr<ChannelInterface> channel = std::shared_ptr<ChannelInterface> channel =
CreateChannel(server_address_.str(), ChannelArguments()); CreateChannel(server_address_.str(), ChannelArguments());
stub_.reset(grpc::cpp::test::util::TestService::NewStub(channel)); stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
} }
void server_ok(int i) { void server_ok(int i) {

@ -162,7 +162,7 @@ class End2endTest : public ::testing::Test {
void ResetStub() { void ResetStub() {
std::shared_ptr<ChannelInterface> channel = std::shared_ptr<ChannelInterface> channel =
CreateChannel(server_address_.str(), ChannelArguments()); CreateChannel(server_address_.str(), ChannelArguments());
stub_.reset(grpc::cpp::test::util::TestService::NewStub(channel)); stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
} }
std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_; std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
@ -292,15 +292,13 @@ TEST_F(End2endTest, RequestStreamOneRequest) {
EchoResponse response; EchoResponse response;
ClientContext context; ClientContext context;
ClientWriter<EchoRequest>* stream = stub_->RequestStream(&context, &response); auto stream = stub_->RequestStream(&context, &response);
request.set_message("hello"); request.set_message("hello");
EXPECT_TRUE(stream->Write(request)); EXPECT_TRUE(stream->Write(request));
stream->WritesDone(); stream->WritesDone();
Status s = stream->Finish(); Status s = stream->Finish();
EXPECT_EQ(response.message(), request.message()); EXPECT_EQ(response.message(), request.message());
EXPECT_TRUE(s.IsOk()); EXPECT_TRUE(s.IsOk());
delete stream;
} }
TEST_F(End2endTest, RequestStreamTwoRequests) { TEST_F(End2endTest, RequestStreamTwoRequests) {
@ -309,7 +307,7 @@ TEST_F(End2endTest, RequestStreamTwoRequests) {
EchoResponse response; EchoResponse response;
ClientContext context; ClientContext context;
ClientWriter<EchoRequest>* stream = stub_->RequestStream(&context, &response); auto stream = stub_->RequestStream(&context, &response);
request.set_message("hello"); request.set_message("hello");
EXPECT_TRUE(stream->Write(request)); EXPECT_TRUE(stream->Write(request));
EXPECT_TRUE(stream->Write(request)); EXPECT_TRUE(stream->Write(request));
@ -317,8 +315,6 @@ TEST_F(End2endTest, RequestStreamTwoRequests) {
Status s = stream->Finish(); Status s = stream->Finish();
EXPECT_EQ(response.message(), "hellohello"); EXPECT_EQ(response.message(), "hellohello");
EXPECT_TRUE(s.IsOk()); EXPECT_TRUE(s.IsOk());
delete stream;
} }
TEST_F(End2endTest, ResponseStream) { TEST_F(End2endTest, ResponseStream) {
@ -328,8 +324,7 @@ TEST_F(End2endTest, ResponseStream) {
ClientContext context; ClientContext context;
request.set_message("hello"); request.set_message("hello");
ClientReader<EchoResponse>* stream = auto stream = stub_->ResponseStream(&context, request);
stub_->ResponseStream(&context, request);
EXPECT_TRUE(stream->Read(&response)); EXPECT_TRUE(stream->Read(&response));
EXPECT_EQ(response.message(), request.message() + "0"); EXPECT_EQ(response.message(), request.message() + "0");
EXPECT_TRUE(stream->Read(&response)); EXPECT_TRUE(stream->Read(&response));
@ -340,8 +335,6 @@ TEST_F(End2endTest, ResponseStream) {
Status s = stream->Finish(); Status s = stream->Finish();
EXPECT_TRUE(s.IsOk()); EXPECT_TRUE(s.IsOk());
delete stream;
} }
TEST_F(End2endTest, BidiStream) { TEST_F(End2endTest, BidiStream) {
@ -351,8 +344,7 @@ TEST_F(End2endTest, BidiStream) {
ClientContext context; ClientContext context;
grpc::string msg("hello"); grpc::string msg("hello");
ClientReaderWriter<EchoRequest, EchoResponse>* stream = auto stream = stub_->BidiStream(&context);
stub_->BidiStream(&context);
request.set_message(msg + "0"); request.set_message(msg + "0");
EXPECT_TRUE(stream->Write(request)); EXPECT_TRUE(stream->Write(request));
@ -374,8 +366,6 @@ TEST_F(End2endTest, BidiStream) {
Status s = stream->Finish(); Status s = stream->Finish();
EXPECT_TRUE(s.IsOk()); EXPECT_TRUE(s.IsOk());
delete stream;
} }
// Talk to the two services with the same name but different package names. // Talk to the two services with the same name but different package names.
@ -426,14 +416,11 @@ TEST_F(End2endTest, BadCredentials) {
EXPECT_EQ("Rpc sent on a lame channel.", s.details()); EXPECT_EQ("Rpc sent on a lame channel.", s.details());
ClientContext context2; ClientContext context2;
ClientReaderWriter<EchoRequest, EchoResponse>* stream = auto stream = stub->BidiStream(&context2);
stub->BidiStream(&context2);
s = stream->Finish(); s = stream->Finish();
EXPECT_FALSE(s.IsOk()); EXPECT_FALSE(s.IsOk());
EXPECT_EQ(StatusCode::UNKNOWN, s.code()); EXPECT_EQ(StatusCode::UNKNOWN, s.code());
EXPECT_EQ("Rpc sent on a lame channel.", s.details()); EXPECT_EQ("Rpc sent on a lame channel.", s.details());
delete stream;
} }
} // namespace testing } // namespace testing

Loading…
Cancel
Save