From a0a59537d2a8d25124cc1fe21cee10713012bceb Mon Sep 17 00:00:00 2001 From: ncteisen Date: Thu, 28 Jun 2018 18:26:22 -0700 Subject: s/CodegenGeneric/Raw/g --- CMakeLists.txt | 82 ++-- Makefile | 96 ++--- build.yaml | 26 +- include/grpcpp/impl/codegen/rpc_service_method.h | 8 +- include/grpcpp/impl/codegen/service_type.h | 13 +- src/compiler/cpp_generator.cc | 24 +- test/cpp/codegen/compiler_test_golden | 40 +- test/cpp/end2end/BUILD | 20 + test/cpp/end2end/codegen_generic_end2end_test.cc | 465 --------------------- test/cpp/end2end/hybrid_end2end_test.cc | 43 +- test/cpp/end2end/raw_end2end_test.cc | 463 ++++++++++++++++++++ tools/run_tests/generated/sources_and_headers.json | 38 +- tools/run_tests/generated/tests.json | 48 +-- 13 files changed, 689 insertions(+), 677 deletions(-) delete mode 100644 test/cpp/end2end/codegen_generic_end2end_test.cc create mode 100644 test/cpp/end2end/raw_end2end_test.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index b95023f6ed..2bce42c85b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -559,7 +559,6 @@ add_dependencies(buildtests_cxx client_crash_test) endif() add_dependencies(buildtests_cxx client_crash_test_server) add_dependencies(buildtests_cxx client_lb_end2end_test) -add_dependencies(buildtests_cxx codegen_generic_end2end_test) add_dependencies(buildtests_cxx codegen_test_full) add_dependencies(buildtests_cxx codegen_test_minimal) add_dependencies(buildtests_cxx credentials_test) @@ -617,6 +616,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx qps_openloop_test) endif() add_dependencies(buildtests_cxx qps_worker) +add_dependencies(buildtests_cxx raw_end2end_test) add_dependencies(buildtests_cxx reconnect_interop_client) add_dependencies(buildtests_cxx reconnect_interop_server) add_dependencies(buildtests_cxx ref_counted_ptr_test) @@ -11225,46 +11225,6 @@ target_link_libraries(client_lb_end2end_test endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) -add_executable(codegen_generic_end2end_test - test/cpp/end2end/codegen_generic_end2end_test.cc - third_party/googletest/googletest/src/gtest-all.cc - third_party/googletest/googlemock/src/gmock-all.cc -) - - -target_include_directories(codegen_generic_end2end_test - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include - PRIVATE ${_gRPC_SSL_INCLUDE_DIR} - PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR} - PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR} - PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR} - PRIVATE ${_gRPC_CARES_INCLUDE_DIR} - PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR} - PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR} - PRIVATE third_party/googletest/googletest/include - PRIVATE third_party/googletest/googletest - PRIVATE third_party/googletest/googlemock/include - PRIVATE third_party/googletest/googlemock - PRIVATE ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(codegen_generic_end2end_test - ${_gRPC_PROTOBUF_LIBRARIES} - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc++_test_util - grpc_test_util - grpc++ - grpc - gpr_test_util - gpr - ${_gRPC_GFLAGS_LIBRARIES} -) - -endif (gRPC_BUILD_TESTS) -if (gRPC_BUILD_TESTS) - add_executable(codegen_test_full ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/control.grpc.pb.cc @@ -13314,6 +13274,46 @@ target_link_libraries(qps_worker endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) +add_executable(raw_end2end_test + test/cpp/end2end/raw_end2end_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + + +target_include_directories(raw_end2end_test + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + PRIVATE ${_gRPC_SSL_INCLUDE_DIR} + PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR} + PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR} + PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR} + PRIVATE ${_gRPC_CARES_INCLUDE_DIR} + PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR} + PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR} + PRIVATE third_party/googletest/googletest/include + PRIVATE third_party/googletest/googletest + PRIVATE third_party/googletest/googlemock/include + PRIVATE third_party/googletest/googlemock + PRIVATE ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(raw_end2end_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr_test_util + gpr + ${_gRPC_GFLAGS_LIBRARIES} +) + +endif (gRPC_BUILD_TESTS) +if (gRPC_BUILD_TESTS) + add_executable(reconnect_interop_client ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/empty.grpc.pb.cc diff --git a/Makefile b/Makefile index 9a41d12f05..bbaa3e79e5 100644 --- a/Makefile +++ b/Makefile @@ -1151,7 +1151,6 @@ client_channel_stress_test: $(BINDIR)/$(CONFIG)/client_channel_stress_test client_crash_test: $(BINDIR)/$(CONFIG)/client_crash_test client_crash_test_server: $(BINDIR)/$(CONFIG)/client_crash_test_server client_lb_end2end_test: $(BINDIR)/$(CONFIG)/client_lb_end2end_test -codegen_generic_end2end_test: $(BINDIR)/$(CONFIG)/codegen_generic_end2end_test codegen_test_full: $(BINDIR)/$(CONFIG)/codegen_test_full codegen_test_minimal: $(BINDIR)/$(CONFIG)/codegen_test_minimal credentials_test: $(BINDIR)/$(CONFIG)/credentials_test @@ -1200,6 +1199,7 @@ qps_interarrival_test: $(BINDIR)/$(CONFIG)/qps_interarrival_test qps_json_driver: $(BINDIR)/$(CONFIG)/qps_json_driver qps_openloop_test: $(BINDIR)/$(CONFIG)/qps_openloop_test qps_worker: $(BINDIR)/$(CONFIG)/qps_worker +raw_end2end_test: $(BINDIR)/$(CONFIG)/raw_end2end_test reconnect_interop_client: $(BINDIR)/$(CONFIG)/reconnect_interop_client reconnect_interop_server: $(BINDIR)/$(CONFIG)/reconnect_interop_server ref_counted_ptr_test: $(BINDIR)/$(CONFIG)/ref_counted_ptr_test @@ -1647,7 +1647,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/client_crash_test \ $(BINDIR)/$(CONFIG)/client_crash_test_server \ $(BINDIR)/$(CONFIG)/client_lb_end2end_test \ - $(BINDIR)/$(CONFIG)/codegen_generic_end2end_test \ $(BINDIR)/$(CONFIG)/codegen_test_full \ $(BINDIR)/$(CONFIG)/codegen_test_minimal \ $(BINDIR)/$(CONFIG)/credentials_test \ @@ -1689,6 +1688,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/qps_json_driver \ $(BINDIR)/$(CONFIG)/qps_openloop_test \ $(BINDIR)/$(CONFIG)/qps_worker \ + $(BINDIR)/$(CONFIG)/raw_end2end_test \ $(BINDIR)/$(CONFIG)/reconnect_interop_client \ $(BINDIR)/$(CONFIG)/reconnect_interop_server \ $(BINDIR)/$(CONFIG)/ref_counted_ptr_test \ @@ -1825,7 +1825,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/client_crash_test \ $(BINDIR)/$(CONFIG)/client_crash_test_server \ $(BINDIR)/$(CONFIG)/client_lb_end2end_test \ - $(BINDIR)/$(CONFIG)/codegen_generic_end2end_test \ $(BINDIR)/$(CONFIG)/codegen_test_full \ $(BINDIR)/$(CONFIG)/codegen_test_minimal \ $(BINDIR)/$(CONFIG)/credentials_test \ @@ -1867,6 +1866,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/qps_json_driver \ $(BINDIR)/$(CONFIG)/qps_openloop_test \ $(BINDIR)/$(CONFIG)/qps_worker \ + $(BINDIR)/$(CONFIG)/raw_end2end_test \ $(BINDIR)/$(CONFIG)/reconnect_interop_client \ $(BINDIR)/$(CONFIG)/reconnect_interop_server \ $(BINDIR)/$(CONFIG)/ref_counted_ptr_test \ @@ -2275,8 +2275,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/client_crash_test || ( echo test client_crash_test failed ; exit 1 ) $(E) "[RUN] Testing client_lb_end2end_test" $(Q) $(BINDIR)/$(CONFIG)/client_lb_end2end_test || ( echo test client_lb_end2end_test failed ; exit 1 ) - $(E) "[RUN] Testing codegen_generic_end2end_test" - $(Q) $(BINDIR)/$(CONFIG)/codegen_generic_end2end_test || ( echo test codegen_generic_end2end_test failed ; exit 1 ) $(E) "[RUN] Testing codegen_test_full" $(Q) $(BINDIR)/$(CONFIG)/codegen_test_full || ( echo test codegen_test_full failed ; exit 1 ) $(E) "[RUN] Testing codegen_test_minimal" @@ -2339,6 +2337,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/proto_utils_test || ( echo test proto_utils_test failed ; exit 1 ) $(E) "[RUN] Testing qps_openloop_test" $(Q) $(BINDIR)/$(CONFIG)/qps_openloop_test || ( echo test qps_openloop_test failed ; exit 1 ) + $(E) "[RUN] Testing raw_end2end_test" + $(Q) $(BINDIR)/$(CONFIG)/raw_end2end_test || ( echo test raw_end2end_test failed ; exit 1 ) $(E) "[RUN] Testing ref_counted_ptr_test" $(Q) $(BINDIR)/$(CONFIG)/ref_counted_ptr_test || ( echo test ref_counted_ptr_test failed ; exit 1 ) $(E) "[RUN] Testing ref_counted_test" @@ -16943,49 +16943,6 @@ endif endif -CODEGEN_GENERIC_END2END_TEST_SRC = \ - test/cpp/end2end/codegen_generic_end2end_test.cc \ - -CODEGEN_GENERIC_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CODEGEN_GENERIC_END2END_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/codegen_generic_end2end_test: openssl_dep_error - -else - - - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. - -$(BINDIR)/$(CONFIG)/codegen_generic_end2end_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/codegen_generic_end2end_test: $(PROTOBUF_DEP) $(CODEGEN_GENERIC_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(CODEGEN_GENERIC_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/codegen_generic_end2end_test - -endif - -endif - -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/codegen_generic_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - -deps_codegen_generic_end2end_test: $(CODEGEN_GENERIC_END2END_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(CODEGEN_GENERIC_END2END_TEST_OBJS:.o=.dep) -endif -endif - - CODEGEN_TEST_FULL_SRC = \ $(GENDIR)/src/proto/grpc/testing/control.pb.cc $(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ @@ -19006,6 +18963,49 @@ endif endif +RAW_END2END_TEST_SRC = \ + test/cpp/end2end/raw_end2end_test.cc \ + +RAW_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(RAW_END2END_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/raw_end2end_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/raw_end2end_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/raw_end2end_test: $(PROTOBUF_DEP) $(RAW_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(RAW_END2END_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/raw_end2end_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/raw_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_raw_end2end_test: $(RAW_END2END_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(RAW_END2END_TEST_OBJS:.o=.dep) +endif +endif + + RECONNECT_INTEROP_CLIENT_SRC = \ $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc \ diff --git a/build.yaml b/build.yaml index c22c9e04aa..77d0ca3267 100644 --- a/build.yaml +++ b/build.yaml @@ -4422,19 +4422,6 @@ targets: - grpc - gpr_test_util - gpr -- name: codegen_generic_end2end_test - gtest: true - build: test - language: c++ - src: - - test/cpp/end2end/codegen_generic_end2end_test.cc - deps: - - grpc++_test_util - - grpc_test_util - - grpc++ - - grpc - - gpr_test_util - - gpr - name: codegen_test_full gtest: true build: test @@ -5111,6 +5098,19 @@ targets: - gpr_test_util - gpr - grpc++_test_config +- name: raw_end2end_test + gtest: true + build: test + language: c++ + src: + - test/cpp/end2end/raw_end2end_test.cc + deps: + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr_test_util + - gpr - name: reconnect_interop_client build: test run: false diff --git a/include/grpcpp/impl/codegen/rpc_service_method.h b/include/grpcpp/impl/codegen/rpc_service_method.h index 0f26cbe485..92c66bbf15 100644 --- a/include/grpcpp/impl/codegen/rpc_service_method.h +++ b/include/grpcpp/impl/codegen/rpc_service_method.h @@ -67,7 +67,7 @@ class RpcServiceMethod : public RpcMethod { enum class AsyncType { UNSET, ASYNC, - CODEGEN_GENERIC, + RAW, }; void set_server_tag(void* tag) { server_tag_ = tag; } @@ -81,7 +81,7 @@ class RpcServiceMethod : public RpcMethod { handler_.reset(); } else { // this is not an error condition, as it allows users to declare a server - // like WithCodegenGenericMethod_foo. However since it + // like WithRawMethod_foo. However since it // overwrites behavior, it should be logged. gpr_log( GPR_INFO, @@ -104,8 +104,8 @@ class RpcServiceMethod : public RpcMethod { return "unset"; case AsyncType::ASYNC: return "async"; - case AsyncType::CODEGEN_GENERIC: - return "codegen generic"; + case AsyncType::RAW: + return "raw"; default: GPR_UNREACHABLE_CODE(return "unknown"); } diff --git a/include/grpcpp/impl/codegen/service_type.h b/include/grpcpp/impl/codegen/service_type.h index dc63b9dc21..a0bbd659e2 100644 --- a/include/grpcpp/impl/codegen/service_type.h +++ b/include/grpcpp/impl/codegen/service_type.h @@ -134,15 +134,14 @@ class Service { internal::RpcServiceMethod::AsyncType::ASYNC); } - void MarkMethodCodegenGeneric(int index) { + void MarkMethodRaw(int index) { // This does not have to be a hard error, however no one has approached us // with a use case yet. Please file an issue if you believe you have one. - GPR_CODEGEN_ASSERT( - methods_[index].get() != nullptr && - "Cannot mark the method as 'codegen generic' because it has already " - "been marked as 'generic'."); + GPR_CODEGEN_ASSERT(methods_[index].get() != nullptr && + "Cannot mark the method as 'raw' because it has already " + "been marked as 'generic'."); methods_[index]->SetServerAsyncType( - internal::RpcServiceMethod::AsyncType::CODEGEN_GENERIC); + internal::RpcServiceMethod::AsyncType::RAW); } void MarkMethodGeneric(int index) { @@ -151,7 +150,7 @@ class Service { GPR_CODEGEN_ASSERT( methods_[index]->handler() != nullptr && "Cannot mark the method as 'generic' because it has already been " - "marked as 'async' or 'codegen generic'."); + "marked as 'async' or 'raw'."); methods_[index].reset(); } diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index f01f279a44..1e0c36451b 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -591,7 +591,7 @@ void PrintHeaderServerMethodSync(grpc_generator::Printer* printer, // Helper generator. Disabled the sync API for Request and Response, then adds // in an async API for RealRequest and RealResponse types. This is to be used -// to generate async and codegen generic APIs. +// to generate async and raw APIs. void PrintHeaderServerAsyncMethodsHelper( grpc_generator::Printer* printer, const grpc_generator::Method* method, std::map* vars) { @@ -892,30 +892,29 @@ void PrintHeaderServerMethodGeneric( printer->Print(*vars, "};\n"); } -void PrintHeaderServerMethodCodegenGeneric( - grpc_generator::Printer* printer, const grpc_generator::Method* method, - std::map* vars) { +void PrintHeaderServerMethodRaw(grpc_generator::Printer* printer, + const grpc_generator::Method* method, + std::map* vars) { (*vars)["Method"] = method->name(); // These will be disabled (*vars)["Request"] = method->input_type_name(); (*vars)["Response"] = method->output_type_name(); - // These will be used for codegen generic API + // These will be used for raw API (*vars)["RealRequest"] = "::grpc::ByteBuffer"; (*vars)["RealResponse"] = "::grpc::ByteBuffer"; printer->Print(*vars, "template \n"); - printer->Print( - *vars, "class WithCodegenGenericMethod_$Method$ : public BaseClass {\n"); + printer->Print(*vars, "class WithRawMethod_$Method$ : public BaseClass {\n"); printer->Print( " private:\n" " void BaseClassMustBeDerivedFromService(const Service *service) {}\n"); printer->Print(" public:\n"); printer->Indent(); printer->Print(*vars, - "WithCodegenGenericMethod_$Method$() {\n" - " ::grpc::Service::MarkMethodCodegenGeneric($Idx$);\n" + "WithRawMethod_$Method$() {\n" + " ::grpc::Service::MarkMethodRaw($Idx$);\n" "}\n"); printer->Print(*vars, - "~WithCodegenGenericMethod_$Method$() override {\n" + "~WithRawMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" "}\n"); PrintHeaderServerAsyncMethodsHelper(printer, method, vars); @@ -1027,11 +1026,10 @@ void PrintHeaderService(grpc_generator::Printer* printer, PrintHeaderServerMethodGeneric(printer, service->method(i).get(), vars); } - // Server side - CodegenGeneric + // Server side - Raw for (int i = 0; i < service->method_count(); ++i) { (*vars)["Idx"] = as_string(i); - PrintHeaderServerMethodCodegenGeneric(printer, service->method(i).get(), - vars); + PrintHeaderServerMethodRaw(printer, service->method(i).get(), vars); } // Server side - Streamed Unary diff --git a/test/cpp/codegen/compiler_test_golden b/test/cpp/codegen/compiler_test_golden index 90dabb5cb7..756f6a0224 100644 --- a/test/cpp/codegen/compiler_test_golden +++ b/test/cpp/codegen/compiler_test_golden @@ -346,14 +346,14 @@ class ServiceA final { } }; template - class WithCodegenGenericMethod_MethodA1 : public BaseClass { + class WithRawMethod_MethodA1 : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: - WithCodegenGenericMethod_MethodA1() { - ::grpc::Service::MarkMethodCodegenGeneric(0); + WithRawMethod_MethodA1() { + ::grpc::Service::MarkMethodRaw(0); } - ~WithCodegenGenericMethod_MethodA1() override { + ~WithRawMethod_MethodA1() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method @@ -366,14 +366,14 @@ class ServiceA final { } }; template - class WithCodegenGenericMethod_MethodA2 : public BaseClass { + class WithRawMethod_MethodA2 : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: - WithCodegenGenericMethod_MethodA2() { - ::grpc::Service::MarkMethodCodegenGeneric(1); + WithRawMethod_MethodA2() { + ::grpc::Service::MarkMethodRaw(1); } - ~WithCodegenGenericMethod_MethodA2() override { + ~WithRawMethod_MethodA2() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method @@ -386,14 +386,14 @@ class ServiceA final { } }; template - class WithCodegenGenericMethod_MethodA3 : public BaseClass { + class WithRawMethod_MethodA3 : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: - WithCodegenGenericMethod_MethodA3() { - ::grpc::Service::MarkMethodCodegenGeneric(2); + WithRawMethod_MethodA3() { + ::grpc::Service::MarkMethodRaw(2); } - ~WithCodegenGenericMethod_MethodA3() override { + ~WithRawMethod_MethodA3() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method @@ -406,14 +406,14 @@ class ServiceA final { } }; template - class WithCodegenGenericMethod_MethodA4 : public BaseClass { + class WithRawMethod_MethodA4 : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: - WithCodegenGenericMethod_MethodA4() { - ::grpc::Service::MarkMethodCodegenGeneric(3); + WithRawMethod_MethodA4() { + ::grpc::Service::MarkMethodRaw(3); } - ~WithCodegenGenericMethod_MethodA4() override { + ~WithRawMethod_MethodA4() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method @@ -558,14 +558,14 @@ class ServiceB final { } }; template - class WithCodegenGenericMethod_MethodB1 : public BaseClass { + class WithRawMethod_MethodB1 : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: - WithCodegenGenericMethod_MethodB1() { - ::grpc::Service::MarkMethodCodegenGeneric(0); + WithRawMethod_MethodB1() { + ::grpc::Service::MarkMethodRaw(0); } - ~WithCodegenGenericMethod_MethodB1() override { + ~WithRawMethod_MethodB1() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index 8ab0811ffa..23dde69dd0 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -241,6 +241,26 @@ grpc_cc_test( ], ) +grpc_cc_test( + name = "raw_end2end_test", + srcs = ["raw_end2end_test.cc"], + external_deps = [ + "gtest", + ], + deps = [ + ":test_service_impl", + "//:gpr", + "//:grpc", + "//:grpc++", + "//src/proto/grpc/testing:echo_messages_proto", + "//src/proto/grpc/testing:echo_proto", + "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", + "//test/core/util:gpr_test_util", + "//test/core/util:grpc_test_util", + "//test/cpp/util:test_util", + ], +) + grpc_cc_test( name = "mock_test", srcs = ["mock_test.cc"], diff --git a/test/cpp/end2end/codegen_generic_end2end_test.cc b/test/cpp/end2end/codegen_generic_end2end_test.cc deleted file mode 100644 index 6bb5712eb2..0000000000 --- a/test/cpp/end2end/codegen_generic_end2end_test.cc +++ /dev/null @@ -1,465 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/core/lib/gpr/env.h" -#include "src/core/lib/iomgr/port.h" -#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h" -#include "src/proto/grpc/testing/echo.grpc.pb.h" -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/byte_buffer_proto_helper.h" -#include "test/cpp/util/string_ref_helper.h" - -#include - -using grpc::testing::EchoRequest; -using grpc::testing::EchoResponse; - -namespace grpc { -namespace testing { - -namespace { - -void* tag(int i) { return (void*)static_cast(i); } -int detag(void* p) { return static_cast(reinterpret_cast(p)); } - -class Verifier { - public: - Verifier() : lambda_run_(false) {} - // Expect sets the expected ok value for a specific tag - Verifier& Expect(int i, bool expect_ok) { - return ExpectUnless(i, expect_ok, false); - } - // ExpectUnless sets the expected ok value for a specific tag - // unless the tag was already marked seen (as a result of ExpectMaybe) - Verifier& ExpectUnless(int i, bool expect_ok, bool seen) { - if (!seen) { - expectations_[tag(i)] = expect_ok; - } - return *this; - } - // ExpectMaybe sets the expected ok value for a specific tag, but does not - // require it to appear - // If it does, sets *seen to true - Verifier& ExpectMaybe(int i, bool expect_ok, bool* seen) { - if (!*seen) { - maybe_expectations_[tag(i)] = MaybeExpect{expect_ok, seen}; - } - return *this; - } - - // Next waits for 1 async tag to complete, checks its - // expectations, and returns the tag - int Next(CompletionQueue* cq, bool ignore_ok) { - bool ok; - void* got_tag; - EXPECT_TRUE(cq->Next(&got_tag, &ok)); - GotTag(got_tag, ok, ignore_ok); - return detag(got_tag); - } - - template - CompletionQueue::NextStatus DoOnceThenAsyncNext( - CompletionQueue* cq, void** got_tag, bool* ok, T deadline, - std::function lambda) { - if (lambda_run_) { - return cq->AsyncNext(got_tag, ok, deadline); - } else { - lambda_run_ = true; - return cq->DoThenAsyncNext(lambda, got_tag, ok, deadline); - } - } - - // Verify keeps calling Next until all currently set - // expected tags are complete - void Verify(CompletionQueue* cq) { Verify(cq, false); } - - // This version of Verify allows optionally ignoring the - // outcome of the expectation - void Verify(CompletionQueue* cq, bool ignore_ok) { - GPR_ASSERT(!expectations_.empty() || !maybe_expectations_.empty()); - while (!expectations_.empty()) { - Next(cq, ignore_ok); - } - } - - // This version of Verify stops after a certain deadline - void Verify(CompletionQueue* cq, - std::chrono::system_clock::time_point deadline) { - if (expectations_.empty()) { - bool ok; - void* got_tag; - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), - CompletionQueue::TIMEOUT); - } else { - while (!expectations_.empty()) { - bool ok; - void* got_tag; - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), - CompletionQueue::GOT_EVENT); - GotTag(got_tag, ok, false); - } - } - } - - // This version of Verify stops after a certain deadline, and uses the - // DoThenAsyncNext API - // to call the lambda - void Verify(CompletionQueue* cq, - std::chrono::system_clock::time_point deadline, - std::function lambda) { - if (expectations_.empty()) { - bool ok; - void* got_tag; - EXPECT_EQ(DoOnceThenAsyncNext(cq, &got_tag, &ok, deadline, lambda), - CompletionQueue::TIMEOUT); - } else { - while (!expectations_.empty()) { - bool ok; - void* got_tag; - EXPECT_EQ(DoOnceThenAsyncNext(cq, &got_tag, &ok, deadline, lambda), - CompletionQueue::GOT_EVENT); - GotTag(got_tag, ok, false); - } - } - } - - private: - void GotTag(void* got_tag, bool ok, bool ignore_ok) { - auto it = expectations_.find(got_tag); - if (it != expectations_.end()) { - if (!ignore_ok) { - EXPECT_EQ(it->second, ok); - } - expectations_.erase(it); - } else { - auto it2 = maybe_expectations_.find(got_tag); - if (it2 != maybe_expectations_.end()) { - if (it2->second.seen != nullptr) { - EXPECT_FALSE(*it2->second.seen); - *it2->second.seen = true; - } - if (!ignore_ok) { - EXPECT_EQ(it2->second.ok, ok); - } - } else { - gpr_log(GPR_ERROR, "Unexpected tag: %p", tag); - abort(); - } - } - } - - struct MaybeExpect { - bool ok; - bool* seen; - }; - - std::map expectations_; - std::map maybe_expectations_; - bool lambda_run_; -}; - -class CodegenGenericEnd2EndTest : public ::testing::Test { - protected: - CodegenGenericEnd2EndTest() {} - - void SetUp() override { - port_ = grpc_pick_unused_port_or_die(); - server_address_ << "localhost:" << port_; - } - - void TearDown() override { - server_->Shutdown(); - void* ignored_tag; - bool ignored_ok; - cq_->Shutdown(); - while (cq_->Next(&ignored_tag, &ignored_ok)) - ; - stub_.reset(); - grpc_recycle_unused_port(port_); - } - - template - std::unique_ptr BuildAndStartServer() { - ServerBuilder builder; - builder.AddListeningPort(server_address_.str(), - grpc::InsecureServerCredentials()); - std::unique_ptr service(new ServerType()); - builder.RegisterService(service.get()); - cq_ = builder.AddCompletionQueue(); - server_ = builder.BuildAndStart(); - return service; - } - - void ResetStub() { - ChannelArguments args; - std::shared_ptr channel = CreateChannel( - server_address_.str(), grpc::InsecureChannelCredentials()); - stub_ = grpc::testing::EchoTestService::NewStub(channel); - } - - std::unique_ptr cq_; - std::unique_ptr stub_; - std::unique_ptr server_; - std::ostringstream server_address_; - int port_; - - // For the client application to populate and send to server. - EchoRequest send_request_; - ::grpc::ByteBuffer send_request_buffer_; - - // For the server to give to gRPC to be populated by incoming request - // from client. - EchoRequest recv_request_; - ::grpc::ByteBuffer recv_request_buffer_; - - // For the server application to populate and send back to client. - EchoResponse send_response_; - ::grpc::ByteBuffer send_response_buffer_; - - // For the client to give to gRPC to be populated by incoming response - // from server. - EchoResponse recv_response_; - ::grpc::ByteBuffer recv_response_buffer_; - Status recv_status_; - - // Both sides need contexts - ClientContext cli_ctx_; - ServerContext srv_ctx_; -}; - -// Regular Async, both peers use proto -TEST_F(CodegenGenericEnd2EndTest, PureAsyncService) { - typedef grpc::testing::EchoTestService::AsyncService SType; - ResetStub(); - auto service = BuildAndStartServer(); - grpc::ServerAsyncResponseWriter response_writer(&srv_ctx_); - - send_request_.set_message("hello"); - std::unique_ptr> response_reader( - stub_->AsyncEcho(&cli_ctx_, send_request_, cq_.get())); - service->RequestEcho(&srv_ctx_, &recv_request_, &response_writer, cq_.get(), - cq_.get(), tag(2)); - response_reader->Finish(&recv_response_, &recv_status_, tag(4)); - Verifier().Expect(2, true).Verify(cq_.get()); - EXPECT_EQ(send_request_.message(), recv_request_.message()); - send_response_.set_message(recv_request_.message()); - response_writer.Finish(send_response_, Status::OK, tag(3)); - Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); - - EXPECT_EQ(send_response_.message(), recv_response_.message()); - EXPECT_TRUE(recv_status_.ok()); -} - -// Client uses proto, server uses generic codegen, unary -TEST_F(CodegenGenericEnd2EndTest, CodegenGenericServerUnary) { - typedef grpc::testing::EchoTestService::WithCodegenGenericMethod_Echo< - grpc::testing::EchoTestService::Service> - SType; - ResetStub(); - auto service = BuildAndStartServer(); - grpc::GenericServerAsyncResponseWriter response_writer(&srv_ctx_); - - send_request_.set_message("hello unary"); - std::unique_ptr> response_reader( - stub_->AsyncEcho(&cli_ctx_, send_request_, cq_.get())); - service->RequestEcho(&srv_ctx_, &recv_request_buffer_, &response_writer, - cq_.get(), cq_.get(), tag(2)); - response_reader->Finish(&recv_response_, &recv_status_, tag(4)); - Verifier().Expect(2, true).Verify(cq_.get()); - EXPECT_TRUE(ParseFromByteBuffer(&recv_request_buffer_, &recv_request_)); - EXPECT_EQ(send_request_.message(), recv_request_.message()); - send_response_.set_message(recv_request_.message()); - EXPECT_TRUE( - SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_)); - response_writer.Finish(send_response_buffer_, Status::OK, tag(3)); - Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); - - EXPECT_EQ(send_response_.message(), recv_response_.message()); - EXPECT_TRUE(recv_status_.ok()); -} - -// Client uses proto, server uses generic codegen, client streaming -TEST_F(CodegenGenericEnd2EndTest, CodegenGenericServerClientStreaming) { - typedef grpc::testing::EchoTestService:: - WithCodegenGenericMethod_RequestStream< - grpc::testing::EchoTestService::Service> - SType; - ResetStub(); - auto service = BuildAndStartServer(); - - grpc::GenericServerAsyncReader srv_stream(&srv_ctx_); - - send_request_.set_message("hello client streaming"); - std::unique_ptr> cli_stream( - stub_->AsyncRequestStream(&cli_ctx_, &recv_response_, cq_.get(), tag(1))); - - service->RequestRequestStream(&srv_ctx_, &srv_stream, cq_.get(), cq_.get(), - tag(2)); - - Verifier().Expect(2, true).Expect(1, true).Verify(cq_.get()); - - cli_stream->Write(send_request_, tag(3)); - srv_stream.Read(&recv_request_buffer_, tag(4)); - Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); - ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); - EXPECT_EQ(send_request_.message(), recv_request_.message()); - - cli_stream->Write(send_request_, tag(5)); - srv_stream.Read(&recv_request_buffer_, tag(6)); - Verifier().Expect(5, true).Expect(6, true).Verify(cq_.get()); - - ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); - EXPECT_EQ(send_request_.message(), recv_request_.message()); - cli_stream->WritesDone(tag(7)); - srv_stream.Read(&recv_request_buffer_, tag(8)); - Verifier().Expect(7, true).Expect(8, false).Verify(cq_.get()); - - ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); - send_response_.set_message(recv_request_.message()); - SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_); - srv_stream.Finish(send_response_buffer_, Status::OK, tag(9)); - cli_stream->Finish(&recv_status_, tag(10)); - Verifier().Expect(9, true).Expect(10, true).Verify(cq_.get()); - - EXPECT_EQ(send_response_.message(), recv_response_.message()); - EXPECT_TRUE(recv_status_.ok()); -} - -// Client uses proto, server uses generic codegen, server streaming -TEST_F(CodegenGenericEnd2EndTest, CodegenGenericServerServerStreaming) { - typedef grpc::testing::EchoTestService:: - WithCodegenGenericMethod_ResponseStream< - grpc::testing::EchoTestService::Service> - SType; - ResetStub(); - auto service = BuildAndStartServer(); - grpc::GenericServerAsyncWriter srv_stream(&srv_ctx_); - - send_request_.set_message("hello server streaming"); - std::unique_ptr> cli_stream( - stub_->AsyncResponseStream(&cli_ctx_, send_request_, cq_.get(), tag(1))); - - service->RequestResponseStream(&srv_ctx_, &recv_request_buffer_, &srv_stream, - cq_.get(), cq_.get(), tag(2)); - - Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get()); - ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); - EXPECT_EQ(send_request_.message(), recv_request_.message()); - - send_response_.set_message(recv_request_.message()); - SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_); - srv_stream.Write(send_response_buffer_, tag(3)); - cli_stream->Read(&recv_response_, tag(4)); - Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); - EXPECT_EQ(send_response_.message(), recv_response_.message()); - - srv_stream.Write(send_response_buffer_, tag(5)); - cli_stream->Read(&recv_response_, tag(6)); - Verifier().Expect(5, true).Expect(6, true).Verify(cq_.get()); - EXPECT_EQ(send_response_.message(), recv_response_.message()); - - srv_stream.Finish(Status::OK, tag(7)); - cli_stream->Read(&recv_response_, tag(8)); - Verifier().Expect(7, true).Expect(8, false).Verify(cq_.get()); - - cli_stream->Finish(&recv_status_, tag(9)); - Verifier().Expect(9, true).Verify(cq_.get()); - - EXPECT_TRUE(recv_status_.ok()); -} - -// Client uses proto, server uses generic codegen, bidi streaming -TEST_F(CodegenGenericEnd2EndTest, CodegenGenericServerBidiStreaming) { - typedef grpc::testing::EchoTestService::WithCodegenGenericMethod_BidiStream< - grpc::testing::EchoTestService::Service> - SType; - ResetStub(); - auto service = BuildAndStartServer(); - - grpc::GenericServerAsyncReaderWriter srv_stream(&srv_ctx_); - - send_request_.set_message("hello bidi streaming"); - std::unique_ptr> - cli_stream(stub_->AsyncBidiStream(&cli_ctx_, cq_.get(), tag(1))); - - service->RequestBidiStream(&srv_ctx_, &srv_stream, cq_.get(), cq_.get(), - tag(2)); - - Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get()); - - cli_stream->Write(send_request_, tag(3)); - srv_stream.Read(&recv_request_buffer_, tag(4)); - Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); - ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); - EXPECT_EQ(send_request_.message(), recv_request_.message()); - - send_response_.set_message(recv_request_.message()); - SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_); - srv_stream.Write(send_response_buffer_, tag(5)); - cli_stream->Read(&recv_response_, tag(6)); - Verifier().Expect(5, true).Expect(6, true).Verify(cq_.get()); - EXPECT_EQ(send_response_.message(), recv_response_.message()); - - cli_stream->WritesDone(tag(7)); - srv_stream.Read(&recv_request_buffer_, tag(8)); - Verifier().Expect(7, true).Expect(8, false).Verify(cq_.get()); - - srv_stream.Finish(Status::OK, tag(9)); - cli_stream->Finish(&recv_status_, tag(10)); - Verifier().Expect(9, true).Expect(10, true).Verify(cq_.get()); - - EXPECT_TRUE(recv_status_.ok()); -} - -// Testing that this pattern compiles -TEST_F(CodegenGenericEnd2EndTest, CompileTest) { - typedef grpc::testing::EchoTestService::WithCodegenGenericMethod_Echo< - grpc::testing::EchoTestService::AsyncService> - SType; - ResetStub(); - auto service = BuildAndStartServer(); -} - -} // namespace -} // namespace testing -} // namespace grpc - -int main(int argc, char** argv) { - // Change the backup poll interval from 5s to 100ms to speed up the - // ReconnectChannel test - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - int ret = RUN_ALL_TESTS(); - return ret; -} diff --git a/test/cpp/end2end/hybrid_end2end_test.cc b/test/cpp/end2end/hybrid_end2end_test.cc index 4238c59380..339eadde92 100644 --- a/test/cpp/end2end/hybrid_end2end_test.cc +++ b/test/cpp/end2end/hybrid_end2end_test.cc @@ -74,12 +74,12 @@ void HandleEcho(Service* service, ServerCompletionQueue* cq, bool dup_service) { Verify(cq, 2, true); } -// Handlers to handle codegen generic request at a server. To be run in a +// Handlers to handle raw request at a server. To be run in a // separate thread. Note that this is the same as the async version, except // that the req/resp are ByteBuffers template -void HandleCodegenGenericEcho(Service* service, ServerCompletionQueue* cq, - bool dup_service) { +void HandleRawEcho(Service* service, ServerCompletionQueue* cq, + bool dup_service) { ServerContext srv_ctx; GenericServerAsyncResponseWriter response_writer(&srv_ctx); ByteBuffer recv_buffer; @@ -114,8 +114,7 @@ void HandleClientStreaming(Service* service, ServerCompletionQueue* cq) { } template -void HandleCodegenGenericClientStreaming(Service* service, - ServerCompletionQueue* cq) { +void HandleRawClientStreaming(Service* service, ServerCompletionQueue* cq) { ServerContext srv_ctx; ByteBuffer recv_buffer; EchoRequest recv_request; @@ -425,32 +424,30 @@ TEST_F(HybridEnd2endTest, AsyncEcho) { echo_handler_thread.join(); } -TEST_F(HybridEnd2endTest, CodegenGenericEcho) { - typedef EchoTestService::WithCodegenGenericMethod_Echo SType; +TEST_F(HybridEnd2endTest, RawEcho) { + typedef EchoTestService::WithRawMethod_Echo SType; SType service; SetUpServer(&service, nullptr, nullptr); ResetStub(); - std::thread echo_handler_thread(HandleCodegenGenericEcho, &service, - cqs_[0].get(), false); + std::thread echo_handler_thread(HandleRawEcho, &service, cqs_[0].get(), + false); TestAllMethods(); echo_handler_thread.join(); } -TEST_F(HybridEnd2endTest, CodegenGenericRequestStream) { - typedef EchoTestService::WithCodegenGenericMethod_RequestStream< - TestServiceImpl> - SType; +TEST_F(HybridEnd2endTest, RawRequestStream) { + typedef EchoTestService::WithRawMethod_RequestStream SType; SType service; SetUpServer(&service, nullptr, nullptr); ResetStub(); - std::thread request_stream_handler_thread( - HandleCodegenGenericClientStreaming, &service, cqs_[0].get()); + std::thread request_stream_handler_thread(HandleRawClientStreaming, + &service, cqs_[0].get()); TestAllMethods(); request_stream_handler_thread.join(); } -TEST_F(HybridEnd2endTest, AsyncEchoCodegenGenericRequestStream) { - typedef EchoTestService::WithCodegenGenericMethod_RequestStream< +TEST_F(HybridEnd2endTest, AsyncEchoRawRequestStream) { + typedef EchoTestService::WithRawMethod_RequestStream< EchoTestService::WithAsyncMethod_Echo> SType; SType service; @@ -458,15 +455,15 @@ TEST_F(HybridEnd2endTest, AsyncEchoCodegenGenericRequestStream) { ResetStub(); std::thread echo_handler_thread(HandleEcho, &service, cqs_[0].get(), false); - std::thread request_stream_handler_thread( - HandleCodegenGenericClientStreaming, &service, cqs_[1].get()); + std::thread request_stream_handler_thread(HandleRawClientStreaming, + &service, cqs_[1].get()); TestAllMethods(); request_stream_handler_thread.join(); echo_handler_thread.join(); } -TEST_F(HybridEnd2endTest, GenericEchoCodegenGenericRequestStream) { - typedef EchoTestService::WithCodegenGenericMethod_RequestStream< +TEST_F(HybridEnd2endTest, GenericEchoRawRequestStream) { + typedef EchoTestService::WithRawMethod_RequestStream< EchoTestService::WithGenericMethod_Echo> SType; SType service; @@ -475,8 +472,8 @@ TEST_F(HybridEnd2endTest, GenericEchoCodegenGenericRequestStream) { ResetStub(); std::thread generic_handler_thread(HandleGenericCall, &generic_service, cqs_[0].get()); - std::thread request_stream_handler_thread( - HandleCodegenGenericClientStreaming, &service, cqs_[1].get()); + std::thread request_stream_handler_thread(HandleRawClientStreaming, + &service, cqs_[1].get()); TestAllMethods(); generic_handler_thread.join(); request_stream_handler_thread.join(); diff --git a/test/cpp/end2end/raw_end2end_test.cc b/test/cpp/end2end/raw_end2end_test.cc new file mode 100644 index 0000000000..37fdc423fd --- /dev/null +++ b/test/cpp/end2end/raw_end2end_test.cc @@ -0,0 +1,463 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/iomgr/port.h" +#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h" +#include "src/proto/grpc/testing/echo.grpc.pb.h" +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/byte_buffer_proto_helper.h" +#include "test/cpp/util/string_ref_helper.h" + +#include + +using grpc::testing::EchoRequest; +using grpc::testing::EchoResponse; + +namespace grpc { +namespace testing { + +namespace { + +void* tag(int i) { return (void*)static_cast(i); } +int detag(void* p) { return static_cast(reinterpret_cast(p)); } + +class Verifier { + public: + Verifier() : lambda_run_(false) {} + // Expect sets the expected ok value for a specific tag + Verifier& Expect(int i, bool expect_ok) { + return ExpectUnless(i, expect_ok, false); + } + // ExpectUnless sets the expected ok value for a specific tag + // unless the tag was already marked seen (as a result of ExpectMaybe) + Verifier& ExpectUnless(int i, bool expect_ok, bool seen) { + if (!seen) { + expectations_[tag(i)] = expect_ok; + } + return *this; + } + // ExpectMaybe sets the expected ok value for a specific tag, but does not + // require it to appear + // If it does, sets *seen to true + Verifier& ExpectMaybe(int i, bool expect_ok, bool* seen) { + if (!*seen) { + maybe_expectations_[tag(i)] = MaybeExpect{expect_ok, seen}; + } + return *this; + } + + // Next waits for 1 async tag to complete, checks its + // expectations, and returns the tag + int Next(CompletionQueue* cq, bool ignore_ok) { + bool ok; + void* got_tag; + EXPECT_TRUE(cq->Next(&got_tag, &ok)); + GotTag(got_tag, ok, ignore_ok); + return detag(got_tag); + } + + template + CompletionQueue::NextStatus DoOnceThenAsyncNext( + CompletionQueue* cq, void** got_tag, bool* ok, T deadline, + std::function lambda) { + if (lambda_run_) { + return cq->AsyncNext(got_tag, ok, deadline); + } else { + lambda_run_ = true; + return cq->DoThenAsyncNext(lambda, got_tag, ok, deadline); + } + } + + // Verify keeps calling Next until all currently set + // expected tags are complete + void Verify(CompletionQueue* cq) { Verify(cq, false); } + + // This version of Verify allows optionally ignoring the + // outcome of the expectation + void Verify(CompletionQueue* cq, bool ignore_ok) { + GPR_ASSERT(!expectations_.empty() || !maybe_expectations_.empty()); + while (!expectations_.empty()) { + Next(cq, ignore_ok); + } + } + + // This version of Verify stops after a certain deadline + void Verify(CompletionQueue* cq, + std::chrono::system_clock::time_point deadline) { + if (expectations_.empty()) { + bool ok; + void* got_tag; + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), + CompletionQueue::TIMEOUT); + } else { + while (!expectations_.empty()) { + bool ok; + void* got_tag; + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), + CompletionQueue::GOT_EVENT); + GotTag(got_tag, ok, false); + } + } + } + + // This version of Verify stops after a certain deadline, and uses the + // DoThenAsyncNext API + // to call the lambda + void Verify(CompletionQueue* cq, + std::chrono::system_clock::time_point deadline, + std::function lambda) { + if (expectations_.empty()) { + bool ok; + void* got_tag; + EXPECT_EQ(DoOnceThenAsyncNext(cq, &got_tag, &ok, deadline, lambda), + CompletionQueue::TIMEOUT); + } else { + while (!expectations_.empty()) { + bool ok; + void* got_tag; + EXPECT_EQ(DoOnceThenAsyncNext(cq, &got_tag, &ok, deadline, lambda), + CompletionQueue::GOT_EVENT); + GotTag(got_tag, ok, false); + } + } + } + + private: + void GotTag(void* got_tag, bool ok, bool ignore_ok) { + auto it = expectations_.find(got_tag); + if (it != expectations_.end()) { + if (!ignore_ok) { + EXPECT_EQ(it->second, ok); + } + expectations_.erase(it); + } else { + auto it2 = maybe_expectations_.find(got_tag); + if (it2 != maybe_expectations_.end()) { + if (it2->second.seen != nullptr) { + EXPECT_FALSE(*it2->second.seen); + *it2->second.seen = true; + } + if (!ignore_ok) { + EXPECT_EQ(it2->second.ok, ok); + } + } else { + gpr_log(GPR_ERROR, "Unexpected tag: %p", tag); + abort(); + } + } + } + + struct MaybeExpect { + bool ok; + bool* seen; + }; + + std::map expectations_; + std::map maybe_expectations_; + bool lambda_run_; +}; + +class RawEnd2EndTest : public ::testing::Test { + protected: + RawEnd2EndTest() {} + + void SetUp() override { + port_ = grpc_pick_unused_port_or_die(); + server_address_ << "localhost:" << port_; + } + + void TearDown() override { + server_->Shutdown(); + void* ignored_tag; + bool ignored_ok; + cq_->Shutdown(); + while (cq_->Next(&ignored_tag, &ignored_ok)) + ; + stub_.reset(); + grpc_recycle_unused_port(port_); + } + + template + std::unique_ptr BuildAndStartServer() { + ServerBuilder builder; + builder.AddListeningPort(server_address_.str(), + grpc::InsecureServerCredentials()); + std::unique_ptr service(new ServerType()); + builder.RegisterService(service.get()); + cq_ = builder.AddCompletionQueue(); + server_ = builder.BuildAndStart(); + return service; + } + + void ResetStub() { + ChannelArguments args; + std::shared_ptr channel = CreateChannel( + server_address_.str(), grpc::InsecureChannelCredentials()); + stub_ = grpc::testing::EchoTestService::NewStub(channel); + } + + std::unique_ptr cq_; + std::unique_ptr stub_; + std::unique_ptr server_; + std::ostringstream server_address_; + int port_; + + // For the client application to populate and send to server. + EchoRequest send_request_; + ::grpc::ByteBuffer send_request_buffer_; + + // For the server to give to gRPC to be populated by incoming request + // from client. + EchoRequest recv_request_; + ::grpc::ByteBuffer recv_request_buffer_; + + // For the server application to populate and send back to client. + EchoResponse send_response_; + ::grpc::ByteBuffer send_response_buffer_; + + // For the client to give to gRPC to be populated by incoming response + // from server. + EchoResponse recv_response_; + ::grpc::ByteBuffer recv_response_buffer_; + Status recv_status_; + + // Both sides need contexts + ClientContext cli_ctx_; + ServerContext srv_ctx_; +}; + +// Regular Async, both peers use proto +TEST_F(RawEnd2EndTest, PureAsyncService) { + typedef grpc::testing::EchoTestService::AsyncService SType; + ResetStub(); + auto service = BuildAndStartServer(); + grpc::ServerAsyncResponseWriter response_writer(&srv_ctx_); + + send_request_.set_message("hello"); + std::unique_ptr> response_reader( + stub_->AsyncEcho(&cli_ctx_, send_request_, cq_.get())); + service->RequestEcho(&srv_ctx_, &recv_request_, &response_writer, cq_.get(), + cq_.get(), tag(2)); + response_reader->Finish(&recv_response_, &recv_status_, tag(4)); + Verifier().Expect(2, true).Verify(cq_.get()); + EXPECT_EQ(send_request_.message(), recv_request_.message()); + send_response_.set_message(recv_request_.message()); + response_writer.Finish(send_response_, Status::OK, tag(3)); + Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); + + EXPECT_EQ(send_response_.message(), recv_response_.message()); + EXPECT_TRUE(recv_status_.ok()); +} + +// Client uses proto, server uses generic codegen, unary +TEST_F(RawEnd2EndTest, RawServerUnary) { + typedef grpc::testing::EchoTestService::WithRawMethod_Echo< + grpc::testing::EchoTestService::Service> + SType; + ResetStub(); + auto service = BuildAndStartServer(); + grpc::GenericServerAsyncResponseWriter response_writer(&srv_ctx_); + + send_request_.set_message("hello unary"); + std::unique_ptr> response_reader( + stub_->AsyncEcho(&cli_ctx_, send_request_, cq_.get())); + service->RequestEcho(&srv_ctx_, &recv_request_buffer_, &response_writer, + cq_.get(), cq_.get(), tag(2)); + response_reader->Finish(&recv_response_, &recv_status_, tag(4)); + Verifier().Expect(2, true).Verify(cq_.get()); + EXPECT_TRUE(ParseFromByteBuffer(&recv_request_buffer_, &recv_request_)); + EXPECT_EQ(send_request_.message(), recv_request_.message()); + send_response_.set_message(recv_request_.message()); + EXPECT_TRUE( + SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_)); + response_writer.Finish(send_response_buffer_, Status::OK, tag(3)); + Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); + + EXPECT_EQ(send_response_.message(), recv_response_.message()); + EXPECT_TRUE(recv_status_.ok()); +} + +// Client uses proto, server uses generic codegen, client streaming +TEST_F(RawEnd2EndTest, RawServerClientStreaming) { + typedef grpc::testing::EchoTestService::WithRawMethod_RequestStream< + grpc::testing::EchoTestService::Service> + SType; + ResetStub(); + auto service = BuildAndStartServer(); + + grpc::GenericServerAsyncReader srv_stream(&srv_ctx_); + + send_request_.set_message("hello client streaming"); + std::unique_ptr> cli_stream( + stub_->AsyncRequestStream(&cli_ctx_, &recv_response_, cq_.get(), tag(1))); + + service->RequestRequestStream(&srv_ctx_, &srv_stream, cq_.get(), cq_.get(), + tag(2)); + + Verifier().Expect(2, true).Expect(1, true).Verify(cq_.get()); + + cli_stream->Write(send_request_, tag(3)); + srv_stream.Read(&recv_request_buffer_, tag(4)); + Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); + ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); + EXPECT_EQ(send_request_.message(), recv_request_.message()); + + cli_stream->Write(send_request_, tag(5)); + srv_stream.Read(&recv_request_buffer_, tag(6)); + Verifier().Expect(5, true).Expect(6, true).Verify(cq_.get()); + + ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); + EXPECT_EQ(send_request_.message(), recv_request_.message()); + cli_stream->WritesDone(tag(7)); + srv_stream.Read(&recv_request_buffer_, tag(8)); + Verifier().Expect(7, true).Expect(8, false).Verify(cq_.get()); + + ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); + send_response_.set_message(recv_request_.message()); + SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_); + srv_stream.Finish(send_response_buffer_, Status::OK, tag(9)); + cli_stream->Finish(&recv_status_, tag(10)); + Verifier().Expect(9, true).Expect(10, true).Verify(cq_.get()); + + EXPECT_EQ(send_response_.message(), recv_response_.message()); + EXPECT_TRUE(recv_status_.ok()); +} + +// Client uses proto, server uses generic codegen, server streaming +TEST_F(RawEnd2EndTest, RawServerServerStreaming) { + typedef grpc::testing::EchoTestService::WithRawMethod_ResponseStream< + grpc::testing::EchoTestService::Service> + SType; + ResetStub(); + auto service = BuildAndStartServer(); + grpc::GenericServerAsyncWriter srv_stream(&srv_ctx_); + + send_request_.set_message("hello server streaming"); + std::unique_ptr> cli_stream( + stub_->AsyncResponseStream(&cli_ctx_, send_request_, cq_.get(), tag(1))); + + service->RequestResponseStream(&srv_ctx_, &recv_request_buffer_, &srv_stream, + cq_.get(), cq_.get(), tag(2)); + + Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get()); + ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); + EXPECT_EQ(send_request_.message(), recv_request_.message()); + + send_response_.set_message(recv_request_.message()); + SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_); + srv_stream.Write(send_response_buffer_, tag(3)); + cli_stream->Read(&recv_response_, tag(4)); + Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); + EXPECT_EQ(send_response_.message(), recv_response_.message()); + + srv_stream.Write(send_response_buffer_, tag(5)); + cli_stream->Read(&recv_response_, tag(6)); + Verifier().Expect(5, true).Expect(6, true).Verify(cq_.get()); + EXPECT_EQ(send_response_.message(), recv_response_.message()); + + srv_stream.Finish(Status::OK, tag(7)); + cli_stream->Read(&recv_response_, tag(8)); + Verifier().Expect(7, true).Expect(8, false).Verify(cq_.get()); + + cli_stream->Finish(&recv_status_, tag(9)); + Verifier().Expect(9, true).Verify(cq_.get()); + + EXPECT_TRUE(recv_status_.ok()); +} + +// Client uses proto, server uses generic codegen, bidi streaming +TEST_F(RawEnd2EndTest, RawServerBidiStreaming) { + typedef grpc::testing::EchoTestService::WithRawMethod_BidiStream< + grpc::testing::EchoTestService::Service> + SType; + ResetStub(); + auto service = BuildAndStartServer(); + + grpc::GenericServerAsyncReaderWriter srv_stream(&srv_ctx_); + + send_request_.set_message("hello bidi streaming"); + std::unique_ptr> + cli_stream(stub_->AsyncBidiStream(&cli_ctx_, cq_.get(), tag(1))); + + service->RequestBidiStream(&srv_ctx_, &srv_stream, cq_.get(), cq_.get(), + tag(2)); + + Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get()); + + cli_stream->Write(send_request_, tag(3)); + srv_stream.Read(&recv_request_buffer_, tag(4)); + Verifier().Expect(3, true).Expect(4, true).Verify(cq_.get()); + ParseFromByteBuffer(&recv_request_buffer_, &recv_request_); + EXPECT_EQ(send_request_.message(), recv_request_.message()); + + send_response_.set_message(recv_request_.message()); + SerializeToByteBufferInPlace(&send_response_, &send_response_buffer_); + srv_stream.Write(send_response_buffer_, tag(5)); + cli_stream->Read(&recv_response_, tag(6)); + Verifier().Expect(5, true).Expect(6, true).Verify(cq_.get()); + EXPECT_EQ(send_response_.message(), recv_response_.message()); + + cli_stream->WritesDone(tag(7)); + srv_stream.Read(&recv_request_buffer_, tag(8)); + Verifier().Expect(7, true).Expect(8, false).Verify(cq_.get()); + + srv_stream.Finish(Status::OK, tag(9)); + cli_stream->Finish(&recv_status_, tag(10)); + Verifier().Expect(9, true).Expect(10, true).Verify(cq_.get()); + + EXPECT_TRUE(recv_status_.ok()); +} + +// Testing that this pattern compiles +TEST_F(RawEnd2EndTest, CompileTest) { + typedef grpc::testing::EchoTestService::WithRawMethod_Echo< + grpc::testing::EchoTestService::AsyncService> + SType; + ResetStub(); + auto service = BuildAndStartServer(); +} + +} // namespace +} // namespace testing +} // namespace grpc + +int main(int argc, char** argv) { + // Change the backup poll interval from 5s to 100ms to speed up the + // ReconnectChannel test + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + int ret = RUN_ALL_TESTS(); + return ret; +} diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 7c1b845565..cb863e7d21 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -3327,25 +3327,6 @@ "third_party": false, "type": "target" }, - { - "deps": [ - "gpr", - "gpr_test_util", - "grpc", - "grpc++", - "grpc++_test_util", - "grpc_test_util" - ], - "headers": [], - "is_filegroup": false, - "language": "c++", - "name": "codegen_generic_end2end_test", - "src": [ - "test/cpp/end2end/codegen_generic_end2end_test.cc" - ], - "third_party": false, - "type": "target" - }, { "deps": [ "gpr", @@ -4299,6 +4280,25 @@ "third_party": false, "type": "target" }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc++", + "grpc++_test_util", + "grpc_test_util" + ], + "headers": [], + "is_filegroup": false, + "language": "c++", + "name": "raw_end2end_test", + "src": [ + "test/cpp/end2end/raw_end2end_test.cc" + ], + "third_party": false, + "type": "target" + }, { "deps": [ "gpr", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index a954a8d2d5..9aff58351f 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -3945,30 +3945,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "codegen_generic_end2end_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, @@ -4733,6 +4709,30 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "raw_end2end_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, { "args": [], "benchmark": false, -- cgit v1.2.3