diff options
author | Craig Tiller <ctiller@google.com> | 2015-01-13 12:39:00 -0800 |
---|---|---|
committer | Craig Tiller <ctiller@google.com> | 2015-01-13 12:39:00 -0800 |
commit | 1ee7cb0c0be1413f794c0e15003c2068016fb965 (patch) | |
tree | 598212e9a1df13f9161d4fe20ee5118c0adfa6fb /test/cpp | |
parent | 74768d3103107db02e3336c89ab5851e06fc8cf8 (diff) | |
parent | 52d4389009dedec185a8c07670d043b2e173f8d9 (diff) |
Merge github.com:google/grpc into format
Diffstat (limited to 'test/cpp')
-rw-r--r-- | test/cpp/client/channel_arguments_test.cc | 15 | ||||
-rw-r--r-- | test/cpp/client/credentials_test.cc | 1 | ||||
-rw-r--r-- | test/cpp/end2end/end2end_test.cc | 8 | ||||
-rw-r--r-- | test/cpp/end2end/sync_client_async_server_test.cc | 4 | ||||
-rw-r--r-- | test/cpp/qps/client.cc | 46 | ||||
-rw-r--r-- | test/cpp/qps/qpstest.proto | 158 | ||||
-rw-r--r-- | test/cpp/qps/server.cc | 24 |
7 files changed, 233 insertions, 23 deletions
diff --git a/test/cpp/client/channel_arguments_test.cc b/test/cpp/client/channel_arguments_test.cc index 86ed56cb29..3cd6add167 100644 --- a/test/cpp/client/channel_arguments_test.cc +++ b/test/cpp/client/channel_arguments_test.cc @@ -69,15 +69,12 @@ TEST_F(ChannelArgumentsTest, SetInt) { key = ""; SetChannelArgs(channel_args, &args); EXPECT_EQ(2, args.num_args); - bool found[2] = {false, false}; // We do not enforce order on the arguments. - for (int i = 0; i < args.num_args; i++) { + for (size_t i = 0; i < args.num_args; i++) { EXPECT_EQ(GRPC_ARG_INTEGER, args.args[i].type); if (grpc::string(args.args[i].key) == "key0") { - found[0] = true; EXPECT_EQ(0, args.args[i].value.integer); } else if (grpc::string(args.args[i].key) == "key1") { - found[1] = true; EXPECT_EQ(1, args.args[i].value.integer); } } @@ -107,15 +104,12 @@ TEST_F(ChannelArgumentsTest, SetString) { channel_args.SetString(key, val); SetChannelArgs(channel_args, &args); EXPECT_EQ(2, args.num_args); - bool found[2] = {false, false}; // We do not enforce order on the arguments. - for (int i = 0; i < args.num_args; i++) { + for (size_t i = 0; i < args.num_args; i++) { EXPECT_EQ(GRPC_ARG_STRING, args.args[i].type); if (grpc::string(args.args[i].key) == "key0") { - found[0] = true; EXPECT_STREQ("val0", args.args[i].value.string); } else if (grpc::string(args.args[i].key) == "key1") { - found[1] = true; EXPECT_STREQ("val1", args.args[i].value.string); } } @@ -124,4 +118,7 @@ TEST_F(ChannelArgumentsTest, SetString) { } // namespace testing } // namespace grpc -int main(int argc, char** argv) { return RUN_ALL_TESTS(); } +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index b05d66a510..ea088b87bd 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -65,6 +65,7 @@ TEST_F(CredentialsTest, InvalidServiceAccountCreds) { } // namespace grpc int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); grpc_init(); int ret = RUN_ALL_TESTS(); grpc_shutdown(); diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index 1c82e37c1d..e01a6efe82 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -34,7 +34,7 @@ #include <chrono> #include <thread> -#include "net/grpc/cpp/echo_duplicate_proto_cc.pb.h" +#include "test/cpp/util/echo_duplicate.pb.h" #include "test/cpp/util/echo.pb.h" #include "src/cpp/util/time.h" #include <grpc++/channel_arguments.h> @@ -47,7 +47,7 @@ #include <grpc++/server_context.h> #include <grpc++/status.h> #include <grpc++/stream.h> -#include "net/util/netutil.h" +#include "test/core/util/port.h" #include <gtest/gtest.h> #include <grpc/grpc.h> @@ -141,7 +141,7 @@ class TestServiceImplDupPkg class End2endTest : public ::testing::Test { protected: void SetUp() override { - int port = PickUnusedPortOrDie(); + int port = grpc_pick_unused_port_or_die(); server_address_ << "localhost:" << port; // Setup server ServerBuilder builder; @@ -187,7 +187,7 @@ TEST_F(End2endTest, SimpleRpc) { TEST_F(End2endTest, MultipleRpcs) { ResetStub(); - vector<std::thread*> threads; + std::vector<std::thread*> threads; for (int i = 0; i < 10; ++i) { threads.push_back(new std::thread(SendRpc, stub_.get(), 10)); } diff --git a/test/cpp/end2end/sync_client_async_server_test.cc b/test/cpp/end2end/sync_client_async_server_test.cc index 22b704be3a..9955eb306f 100644 --- a/test/cpp/end2end/sync_client_async_server_test.cc +++ b/test/cpp/end2end/sync_client_async_server_test.cc @@ -48,7 +48,7 @@ #include <grpc++/status.h> #include <grpc++/stream.h> #include "test/cpp/end2end/async_test_server.h" -#include "net/util/netutil.h" +#include "test/core/util/port.h" #include <gtest/gtest.h> using grpc::cpp::test::util::EchoRequest; @@ -72,7 +72,7 @@ void ServerLoop(void* s) { class End2endTest : public ::testing::Test { protected: void SetUp() override { - int port = PickUnusedPortOrDie(); + int port = grpc_pick_unused_port_or_die(); // TODO(yangg) protobuf has a StringPrintf, maybe use that std::ostringstream oss; oss << "[::]:" << port; diff --git a/test/cpp/qps/client.cc b/test/cpp/qps/client.cc index 48e36bc029..450373ecf8 100644 --- a/test/cpp/qps/client.cc +++ b/test/cpp/qps/client.cc @@ -45,7 +45,7 @@ #include <grpc++/client_context.h> #include <grpc++/status.h> #include "test/cpp/util/create_test_channel.h" -#include "test/cpp/interop/test.pb.h" +#include "test/cpp/qps/qpstest.pb.h" DEFINE_bool(enable_ssl, false, "Whether to use ssl/tls."); DEFINE_int32(server_port, 0, "Server port."); @@ -73,8 +73,10 @@ DEFINE_string(workload, "", "Workload parameters"); using grpc::ChannelInterface; using grpc::CreateTestChannel; +using grpc::testing::ServerStats; using grpc::testing::SimpleRequest; using grpc::testing::SimpleResponse; +using grpc::testing::StatsRequest; using grpc::testing::TestService; static double now() { @@ -119,6 +121,14 @@ void RunTest(const int client_threads, const int client_channels, std::vector<std::thread> threads; // Will add threads when ready to execute std::vector<::gpr_histogram *> thread_stats(client_threads); + TestService::Stub *stub_stats = channels[0].get_stub(); + grpc::ClientContext context_stats_begin; + StatsRequest stats_request; + ServerStats server_stats_begin; + stats_request.set_test_num(0); + grpc::Status status_beg = stub_stats->CollectServerStats( + &context_stats_begin, stats_request, &server_stats_begin); + for (int i = 0; i < client_threads; i++) { gpr_histogram *hist = gpr_histogram_create(0.01, 60e9); GPR_ASSERT(hist != NULL); @@ -160,9 +170,10 @@ void RunTest(const int client_threads, const int client_channels, } for (int i = 0; i < client_threads; i++) { gpr_histogram *h = thread_stats[i]; - gpr_log(GPR_INFO, "latency at thread %d (50/95/99/99.9): %f/%f/%f/%f", i, - gpr_histogram_percentile(h, 50), gpr_histogram_percentile(h, 95), - gpr_histogram_percentile(h, 99), gpr_histogram_percentile(h, 99.9)); + gpr_log(GPR_INFO, "latency at thread %d (50/90/95/99/99.9): %f/%f/%f/%f/%f", + i, gpr_histogram_percentile(h, 50), gpr_histogram_percentile(h, 90), + gpr_histogram_percentile(h, 95), gpr_histogram_percentile(h, 99), + gpr_histogram_percentile(h, 99.9)); gpr_histogram_merge(hist, h); gpr_histogram_destroy(h); } @@ -170,11 +181,32 @@ void RunTest(const int client_threads, const int client_channels, gpr_log( GPR_INFO, "latency across %d threads with %d channels and %d payload " - "(50/95/99/99.9): %f / %f / %f / %f", + "(50/90/95/99/99.9): %f / %f / %f / %f / %f", client_threads, client_channels, payload_size, - gpr_histogram_percentile(hist, 50), gpr_histogram_percentile(hist, 95), - gpr_histogram_percentile(hist, 99), gpr_histogram_percentile(hist, 99.9)); + gpr_histogram_percentile(hist, 50), gpr_histogram_percentile(hist, 90), + gpr_histogram_percentile(hist, 95), gpr_histogram_percentile(hist, 99), + gpr_histogram_percentile(hist, 99.9)); gpr_histogram_destroy(hist); + + grpc::ClientContext context_stats_end; + ServerStats server_stats_end; + grpc::Status status_end = stub_stats->CollectServerStats( + &context_stats_end, stats_request, &server_stats_end); + + double elapsed = server_stats_end.time_now() - server_stats_begin.time_now(); + int total_rpcs = client_threads * num_rpcs; + double utime = server_stats_end.time_user() - server_stats_begin.time_user(); + double stime = + server_stats_end.time_system() - server_stats_begin.time_system(); + gpr_log(GPR_INFO, + "Elapsed time: %.3f\n" + "RPC Count: %d\n" + "QPS: %.3f\n" + "System time: %.3f\n" + "User time: %.3f\n" + "Resource usage: %.1f%%\n", + elapsed, total_rpcs, total_rpcs / elapsed, stime, utime, + (stime + utime) / elapsed * 100.0); } int main(int argc, char **argv) { diff --git a/test/cpp/qps/qpstest.proto b/test/cpp/qps/qpstest.proto new file mode 100644 index 0000000000..8acbe19b19 --- /dev/null +++ b/test/cpp/qps/qpstest.proto @@ -0,0 +1,158 @@ +// An integration test service that covers all the method signature permutations +// of unary/streaming requests/responses. +syntax = "proto2"; + +package grpc.testing; + +enum PayloadType { + // Compressable text format. + COMPRESSABLE= 1; + + // Uncompressable binary format. + UNCOMPRESSABLE = 2; + + // Randomly chosen from all other formats defined in this enum. + RANDOM = 3; +} + +message StatsRequest { + // run number + optional int32 test_num = 1; +} + +message ServerStats { + // wall clock time for timestamp + required double time_now = 1; + + // user time used by the server process and threads + required double time_user = 2; + + // server time used by the server process and all threads + required double time_system = 3; + + // RPC count so far + optional int32 num_rpcs = 4; +} + +message Payload { + // The type of data in body. + optional PayloadType type = 1; + // Primary contents of payload. + optional bytes body = 2; +} + +message Latencies { + required double l_50 = 1; + required double l_90 = 2; + required double l_99 = 3; + required double l_999 = 4; +} + +message StartArgs { + required string server_host = 1; + required int32 server_port = 2; + optional bool enable_ssl = 3 [default = false]; + optional int32 client_threads = 4 [default = 1]; + optional int32 client_channels = 5 [default = -1]; + optional int32 num_rpcs = 6 [default = 1]; + optional int32 payload_size = 7 [default = 1]; +} + +message StartResult { + required Latencies latencies = 1; + required int32 num_rpcs = 2; + required double time_elapsed = 3; + required double time_user = 4; + required double time_system = 5; +} + +message SimpleRequest { + // Desired payload type in the response from the server. + // If response_type is RANDOM, server randomly chooses one from other formats. + optional PayloadType response_type = 1 [default=COMPRESSABLE]; + + // Desired payload size in the response from the server. + // If response_type is COMPRESSABLE, this denotes the size before compression. + optional int32 response_size = 2; + + // Optional input payload sent along with the request. + optional Payload payload = 3; +} + +message SimpleResponse { + optional Payload payload = 1; +} + +message StreamingInputCallRequest { + // Optional input payload sent along with the request. + optional Payload payload = 1; + + // Not expecting any payload from the response. +} + +message StreamingInputCallResponse { + // Aggregated size of payloads received from the client. + optional int32 aggregated_payload_size = 1; +} + +message ResponseParameters { + // Desired payload sizes in responses from the server. + // If response_type is COMPRESSABLE, this denotes the size before compression. + required int32 size = 1; + + // Desired interval between consecutive responses in the response stream in + // microseconds. + required int32 interval_us = 2; +} + +message StreamingOutputCallRequest { + // Desired payload type in the response from the server. + // If response_type is RANDOM, the payload from each response in the stream + // might be of different types. This is to simulate a mixed type of payload + // stream. + optional PayloadType response_type = 1 [default=COMPRESSABLE]; + + repeated ResponseParameters response_parameters = 2; + + // Optional input payload sent along with the request. + optional Payload payload = 3; +} + +message StreamingOutputCallResponse { + optional Payload payload = 1; +} + +service TestService { + // Start test with specified workload + rpc StartTest(StartArgs) returns (Latencies); + + // Collect stats from server, ignore request content + rpc CollectServerStats(StatsRequest) returns (ServerStats); + + // One request followed by one response. + // The server returns the client payload as-is. + rpc UnaryCall(SimpleRequest) returns (SimpleResponse); + + // One request followed by a sequence of responses (streamed download). + // The server returns the payload with client desired type and sizes. + rpc StreamingOutputCall(StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); + + // A sequence of requests followed by one response (streamed upload). + // The server returns the aggregated size of client payload as the result. + rpc StreamingInputCall(stream StreamingInputCallRequest) + returns (StreamingInputCallResponse); + + // A sequence of requests with each request served by the server immediately. + // As one request could lead to multiple responses, this interface + // demonstrates the idea of full duplexing. + rpc FullDuplexCall(stream StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); + + // A sequence of requests followed by a sequence of responses. + // The server buffers all the client requests and then serves them in order. A + // stream of responses are returned to the client when the server starts with + // first request. + rpc HalfDuplexCall(stream StreamingOutputCallRequest) + returns (stream StreamingOutputCallResponse); +} diff --git a/test/cpp/qps/server.cc b/test/cpp/qps/server.cc index 5e426127f0..b2a4cde59f 100644 --- a/test/cpp/qps/server.cc +++ b/test/cpp/qps/server.cc @@ -31,6 +31,8 @@ * */ +#include <sys/time.h> +#include <sys/resource.h> #include <thread> #include <google/gflags.h> @@ -41,7 +43,7 @@ #include <grpc++/server_builder.h> #include <grpc++/server_context.h> #include <grpc++/status.h> -#include "test/cpp/interop/test.pb.h" +#include "test/cpp/qps/qpstest.pb.h" #include <grpc/grpc.h> #include <grpc/support/log.h> @@ -54,11 +56,17 @@ using grpc::ServerBuilder; using grpc::ServerContext; using grpc::testing::Payload; using grpc::testing::PayloadType; +using grpc::testing::ServerStats; using grpc::testing::SimpleRequest; using grpc::testing::SimpleResponse; +using grpc::testing::StatsRequest; using grpc::testing::TestService; using grpc::Status; +static double time_double(struct timeval* tv) { + return tv->tv_sec + 1e-6 * tv->tv_usec; +} + bool SetPayload(PayloadType type, int size, Payload* payload) { PayloadType response_type = type; // TODO(yangg): Support UNCOMPRESSABLE payload. @@ -72,7 +80,21 @@ bool SetPayload(PayloadType type, int size, Payload* payload) { } class TestServiceImpl : public TestService::Service { + private: + int num_rpcs; + public: + Status CollectServerStats(ServerContext* context, const StatsRequest*, + ServerStats* response) { + struct rusage usage; + struct timeval tv; + gettimeofday(&tv, NULL); + getrusage(RUSAGE_SELF, &usage); + response->set_time_now(time_double(&tv)); + response->set_time_user(time_double(&usage.ru_utime)); + response->set_time_system(time_double(&usage.ru_stime)); + return Status::OK; + } Status UnaryCall(ServerContext* context, const SimpleRequest* request, SimpleResponse* response) { if (request->has_response_size() && request->response_size() > 0) { |