aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/cpp
diff options
context:
space:
mode:
authorGravatar Yuchen Zeng <zyc@google.com>2016-08-26 16:23:29 -0700
committerGravatar Yuchen Zeng <zyc@google.com>2016-08-26 16:23:29 -0700
commit94d786fd4ca5e7898648a838ad1d23581077e1a4 (patch)
tree3196457e19b8c6e1cebd170e2fb8d141f5d0a8c6 /test/cpp
parentc931305c398e7e87013da52a5c2697d0fb14ad7f (diff)
Add type command
Diffstat (limited to 'test/cpp')
-rw-r--r--test/cpp/util/grpc_tool.cc35
-rw-r--r--test/cpp/util/grpc_tool_test.cc47
2 files changed, 77 insertions, 5 deletions
diff --git a/test/cpp/util/grpc_tool.cc b/test/cpp/util/grpc_tool.cc
index f06053ca23..4feb2dcbaa 100644
--- a/test/cpp/util/grpc_tool.cc
+++ b/test/cpp/util/grpc_tool.cc
@@ -75,11 +75,11 @@ class GrpcTool {
GrpcToolOutputCallback callback);
bool CallMethod(int argc, const char** argv, CliCredentials cred,
GrpcToolOutputCallback callback);
+ bool PrintType(int argc, const char** argv, CliCredentials cred,
+ GrpcToolOutputCallback callback);
// TODO(zyc): implement the following methods
// bool ListServices(int argc, const char** argv, GrpcToolOutputCallback
// callback);
- // bool PrintType(int argc, const char** argv, GrpcToolOutputCallback
- // callback);
// bool PrintTypeId(int argc, const char** argv, GrpcToolOutputCallback
// callback);
// bool ParseMessage(int argc, const char** argv, GrpcToolOutputCallback
@@ -168,7 +168,7 @@ const Command ops[] = {
// {"ls", BindWith5Args(&GrpcTool::ListServices), 1, 3},
// {"list", BindWith5Args(&GrpcTool::ListServices), 1, 3},
{"call", BindWith5Args(&GrpcTool::CallMethod), 2, 3},
- // {"type", BindWith5Args(&GrpcTool::PrintType), 2, 2},
+ {"type", BindWith5Args(&GrpcTool::PrintType), 2, 2},
// {"parse", BindWith5Args(&GrpcTool::ParseMessage), 2, 3},
// {"totext", BindWith5Args(&GrpcTool::ToText), 2, 3},
// {"tobinary", BindWith5Args(&GrpcTool::ToBinary), 2, 3},
@@ -180,7 +180,7 @@ void Usage(const grpc::string& msg) {
"%s\n"
// " grpc_cli ls ... ; List services\n"
" grpc_cli call ... ; Call method\n"
- // " grpc_cli type ... ; Print type\n"
+ " grpc_cli type ... ; Print type\n"
// " grpc_cli parse ... ; Parse message\n"
// " grpc_cli totext ... ; Convert binary message to text\n"
// " grpc_cli tobinary ... ; Convert text message to binary\n"
@@ -257,6 +257,33 @@ bool GrpcTool::Help(int argc, const char** argv, const CliCredentials cred,
return true;
}
+bool GrpcTool::PrintType(int argc, const char** argv, CliCredentials cred,
+ GrpcToolOutputCallback callback) {
+ CommandUsage(
+ "Print type\n"
+ " grpc_cli type <address> <type>\n"
+ " <address> ; host:port\n"
+ " <type> ; Protocol buffer type name\n" +
+ cred.GetCredentialUsage());
+
+ grpc::string server_address(argv[0]);
+ std::shared_ptr<grpc::Channel> channel =
+ grpc::CreateChannel(server_address, cred.GetCredentials());
+ grpc::ProtoReflectionDescriptorDatabase desc_db(channel);
+ grpc::protobuf::DescriptorPool desc_pool(&desc_db);
+
+ grpc::string output;
+ const grpc::protobuf::Descriptor* descriptor =
+ desc_pool.FindMessageTypeByName(argv[1]);
+ if (descriptor != nullptr) {
+ output = descriptor->DebugString();
+ } else {
+ fprintf(stderr, "Type %s not found.\n", argv[1]);
+ return false;
+ }
+ return callback(output);
+}
+
bool GrpcTool::CallMethod(int argc, const char** argv,
const CliCredentials cred,
GrpcToolOutputCallback callback) {
diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc
index b96afaf50c..1d790c6e0b 100644
--- a/test/cpp/util/grpc_tool_test.cc
+++ b/test/cpp/util/grpc_tool_test.cc
@@ -109,13 +109,21 @@ class GrpcToolTest : public ::testing::Test {
void ShutdownServer() { server_->Shutdown(); }
+ void ExitWhenError(int argc, const char** argv, const CliCredentials cred,
+ GrpcToolOutputCallback callback) {
+ int result = GrpcToolMainLib(argc, argv, cred, callback);
+ if (result) {
+ exit(result);
+ }
+ }
+
std::unique_ptr<Server> server_;
TestServiceImpl service_;
reflection::ProtoServerReflectionPlugin plugin_;
};
static bool PrintStream(std::stringstream* ss, const grpc::string& output) {
- (*ss) << output << std::endl;
+ (*ss) << output;
return true;
}
@@ -168,6 +176,43 @@ TEST_F(GrpcToolTest, HelpCommand) {
EXPECT_TRUE(0 == output_stream.tellp());
}
+TEST_F(GrpcToolTest, TypeCommand) {
+ // Test input "grpc_cli type localhost:<port> grpc.testing.EchoRequest"
+ std::stringstream output_stream;
+
+ const grpc::string server_address = SetUpServer();
+ const char* argv[] = {"grpc_cli", "type", server_address.c_str(),
+ "grpc.testing.EchoRequest"};
+
+ EXPECT_TRUE(0 == GrpcToolMainLib(ArraySize(argv), argv, TestCliCredentials(),
+ std::bind(PrintStream, &output_stream,
+ std::placeholders::_1)));
+ const grpc::protobuf::Descriptor* desc =
+ grpc::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(
+ "grpc.testing.EchoRequest");
+ // Expected output: the DebugString of grpc.testing.EchoRequest
+ EXPECT_TRUE(0 ==
+ strcmp(output_stream.str().c_str(), desc->DebugString().c_str()));
+
+ ShutdownServer();
+}
+
+TEST_F(GrpcToolTest, TypeNotFound) {
+ // Test input "grpc_cli type localhost:<port> grpc.testing.DummyRequest"
+ std::stringstream output_stream;
+
+ const grpc::string server_address = SetUpServer();
+ const char* argv[] = {"grpc_cli", "type", server_address.c_str(),
+ "grpc.testing.DummyRequest"};
+
+ EXPECT_DEATH(ExitWhenError(ArraySize(argv), argv, TestCliCredentials(),
+ std::bind(PrintStream, &output_stream,
+ std::placeholders::_1)),
+ ".*Type grpc.testing.DummyRequest not found.*");
+
+ ShutdownServer();
+}
+
TEST_F(GrpcToolTest, CallCommand) {
// Test input "grpc_cli call Echo"
std::stringstream output_stream;