Merge github.com:google/grpc into format

pull/14/head
Craig Tiller 10 years ago
commit 1ee7cb0c0b
  1. 638
      Makefile
  2. 15
      build.json
  3. 4
      src/compiler/go_generator.cc
  4. 2
      src/compiler/go_generator.h
  5. 3
      src/ruby/bin/interop/interop_client.rb
  6. 4
      src/ruby/bin/interop/interop_server.rb
  7. 5
      src/ruby/bin/math_client.rb
  8. 4
      src/ruby/bin/math_server.rb
  9. 3
      src/ruby/bin/noproto_client.rb
  10. 3
      src/ruby/bin/noproto_server.rb
  11. 24
      templates/Makefile.template
  12. 8
      test/core/util/port.h
  13. 15
      test/cpp/client/channel_arguments_test.cc
  14. 1
      test/cpp/client/credentials_test.cc
  15. 8
      test/cpp/end2end/end2end_test.cc
  16. 4
      test/cpp/end2end/sync_client_async_server_test.cc
  17. 46
      test/cpp/qps/client.cc
  18. 158
      test/cpp/qps/qpstest.proto
  19. 24
      test/cpp/qps/server.cc
  20. 8
      tools/run_tests/run_tests.py

File diff suppressed because one or more lines are too long

@ -1341,6 +1341,7 @@
"test/cpp/end2end/sync_client_async_server_test.cc"
],
"deps": [
"grpc++_test_util",
"grpc_test_util",
"grpc++",
"grpc",
@ -1353,9 +1354,7 @@
"build": "test",
"c++": true,
"src": [
"test/cpp/interop/empty.proto",
"test/cpp/interop/messages.proto",
"test/cpp/interop/test.proto",
"test/cpp/qps/qpstest.proto",
"test/cpp/qps/client.cc"
],
"deps": [
@ -1372,9 +1371,7 @@
"build": "test",
"c++": true,
"src": [
"test/cpp/interop/empty.proto",
"test/cpp/interop/messages.proto",
"test/cpp/interop/test.proto",
"test/cpp/qps/qpstest.proto",
"test/cpp/qps/server.cc"
],
"deps": [
@ -1451,7 +1448,8 @@
],
"deps": [
"grpc++",
"grpc"
"grpc",
"gpr"
]
},
{
@ -1463,7 +1461,8 @@
],
"deps": [
"grpc++",
"grpc"
"grpc",
"gpr"
]
},
{

@ -31,8 +31,6 @@
*
*/
using namespace std;
#include "src/compiler/go_generator.h"
#include <cctype>
@ -42,6 +40,8 @@ using namespace std;
#include <google/protobuf/descriptor.pb.h>
#include <google/protobuf/descriptor.h>
using namespace std;
namespace grpc_go_generator {
bool NoStreaming(const google::protobuf::MethodDescriptor* method) {

@ -44,7 +44,7 @@ class FileDescriptor;
namespace grpc_go_generator {
string GetServices(const google::protobuf::FileDescriptor* file);
std::string GetServices(const google::protobuf::FileDescriptor* file);
} // namespace grpc_go_generator

@ -1,3 +1,5 @@
#!/usr/bin/env ruby
# Copyright 2014, Google Inc.
# All rights reserved.
#
@ -27,7 +29,6 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env ruby
# interop_client is a testing tool that accesses a gRPC interop testing
# server and runs a test on it.
#

@ -1,3 +1,5 @@
#!/usr/bin/env ruby
# Copyright 2014, Google Inc.
# All rights reserved.
#
@ -27,8 +29,6 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env ruby
#
# interop_server is a Testing app that runs a gRPC interop testing server.
#
# It helps validate interoperation b/w gRPC in different environments

@ -1,3 +1,5 @@
#!/usr/bin/env ruby
# Copyright 2014, Google Inc.
# All rights reserved.
#
@ -27,8 +29,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env ruby
#
# Sample app that accesses a Calc service running on a Ruby gRPC server and
# helps validate RpcServer as a gRPC server using proto2 serialization.
#

@ -1,3 +1,5 @@
#!/usr/bin/env ruby
# Copyright 2014, Google Inc.
# All rights reserved.
#
@ -27,8 +29,6 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env ruby
#
# Sample gRPC Ruby server that implements the Math::Calc service and helps
# validate GRPC::RpcServer as GRPC implementation using proto2 serialization.
#

@ -1,3 +1,5 @@
#!/usr/bin/env ruby
# Copyright 2014, Google Inc.
# All rights reserved.
#
@ -27,7 +29,6 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env ruby
# Sample app that helps validate RpcServer without protobuf serialization.
#
# Usage: $ ruby -S path/to/noproto_client.rb

@ -1,3 +1,5 @@
#!/usr/bin/env ruby
# Copyright 2014, Google Inc.
# All rights reserved.
#
@ -27,7 +29,6 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#!/usr/bin/env ruby
# Sample app that helps validate RpcServer without protobuf serialization.
#
# Usage: $ path/to/noproto_server.rb

@ -2,6 +2,7 @@
# This currently builds C and C++ code.
<%!
import re
import os
proto_re = re.compile('(.*)\\.proto')
@ -355,7 +356,7 @@ buildtests_c: bins_dep_c privatelibs_c\
buildtests_cxx: bins_dep_cxx privatelibs_cxx\
% for tgt in targets:
% if tgt.build == 'test' and tgt.get('c++', False):
bins/${tgt.name}\
bins/$(CONFIG)/${tgt.name}\
% endif
% endfor
@ -687,6 +688,7 @@ libs/$(CONFIG)/lib${lib.name}.a: $(LIB${lib.name.upper()}_OBJS)
$(Q) $(AR) rcs libs/$(CONFIG)/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS)
% if lib.get('baselib', False):
% if lib.get('secure', True):
$(Q) rm -rf tmp-merge
$(Q) mkdir tmp-merge
$(Q) ( cd tmp-merge ; $(AR) x ../libs/$(CONFIG)/lib${lib.name}.a )
$(Q) for l in $(OPENSSL_MERGE_LIBS) ; do ( cd tmp-merge ; <%text>ar x ../$${l}</%text> ) ; done
@ -760,6 +762,18 @@ endif
endif
% endif
% for src in lib.src:
% if not proto_re.match(src):
objs/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
% for src2 in lib.src:
% if proto_re.match(src2):
${proto_to_cc(src2)}\
% endif
% endfor
% endif
% endfor
clean_lib${lib.name}:
$(E) "[CLEAN] Cleaning lib${lib.name} files"
$(Q) $(RM) $(LIB${lib.name.upper()}_OBJS)
@ -836,6 +850,14 @@ bins/$(CONFIG)/${tgt.name}: $(${tgt.name.upper()}_OBJS)\
endif
% endif
% for src in tgt.src:
objs/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
% for dep in tgt.deps:
libs/$(CONFIG)/lib${dep}.a\
% endfor
% endfor
deps_${tgt.name}: $(${tgt.name.upper()}_DEPS)
% if tgt.get('secure', True):

@ -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();
#ifdef __cplusplus
}
#endif
#endif /* __GRPC_TEST_UTIL_PORT_H__ */

@ -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();
}

@ -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();

@ -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));
}

@ -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;

@ -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) {

@ -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);
}

@ -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) {

@ -11,7 +11,6 @@ import time
import jobset
import watch_dirs
# SimpleConfig: just compile with CONFIG=config, and run the binary to test
class SimpleConfig(object):
def __init__(self, config):
@ -42,6 +41,7 @@ _CONFIGS = {
_DEFAULT = ['dbg', 'opt']
_MAKE_TEST_TARGETS = ['buildtests_c', 'buildtests_cxx']
# parse command line
argp = argparse.ArgumentParser(description='Run grpc tests.')
@ -74,9 +74,11 @@ def _build_and_run(check_cancelled):
if not jobset.run(
(['make',
'-j', '%d' % (multiprocessing.cpu_count() + 1),
'buildtests_c',
target,
'CONFIG=%s' % cfg]
for cfg in build_configs), check_cancelled, maxjobs=1):
for cfg in build_configs
for target in _MAKE_TEST_TARGETS),
check_cancelled, maxjobs=1):
sys.exit(1)
# run all the tests

Loading…
Cancel
Save