aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-01-13 12:39:00 -0800
committerGravatar Craig Tiller <ctiller@google.com>2015-01-13 12:39:00 -0800
commit1ee7cb0c0be1413f794c0e15003c2068016fb965 (patch)
tree598212e9a1df13f9161d4fe20ee5118c0adfa6fb /test
parent74768d3103107db02e3336c89ab5851e06fc8cf8 (diff)
parent52d4389009dedec185a8c07670d043b2e173f8d9 (diff)
Merge github.com:google/grpc into format
Diffstat (limited to 'test')
-rw-r--r--test/core/util/port.h10
-rw-r--r--test/cpp/client/channel_arguments_test.cc15
-rw-r--r--test/cpp/client/credentials_test.cc1
-rw-r--r--test/cpp/end2end/end2end_test.cc8
-rw-r--r--test/cpp/end2end/sync_client_async_server_test.cc4
-rw-r--r--test/cpp/qps/client.cc46
-rw-r--r--test/cpp/qps/qpstest.proto158
-rw-r--r--test/cpp/qps/server.cc24
8 files changed, 242 insertions, 24 deletions
diff --git a/test/core/util/port.h b/test/core/util/port.h
index 357bc76619..0ba895af43 100644
--- a/test/core/util/port.h
+++ b/test/core/util/port.h
@@ -34,6 +34,10 @@
#ifndef __GRPC_TEST_UTIL_PORT_H__
#define __GRPC_TEST_UTIL_PORT_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/* pick a port number that is currently unused by either tcp or udp. return
0 on failure. */
int grpc_pick_unused_port();
@@ -41,4 +45,8 @@ int grpc_pick_unused_port();
on failure. */
int grpc_pick_unused_port_or_die();
-#endif /* __GRPC_TEST_UTIL_PORT_H__ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GRPC_TEST_UTIL_PORT_H__ */
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) {