From c44c16e330a8532c8c917c2aa64ffd1aeafe0126 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 14 Mar 2017 17:44:21 -0700 Subject: add initial framework for full end2end tests outside of rspec --- src/ruby/end2end/lib/client_control_pb.rb | 21 +++++++++ src/ruby/end2end/lib/client_control_services_pb.rb | 54 ++++++++++++++++++++++ src/ruby/end2end/lib/echo_pb.rb | 18 ++++++++ src/ruby/end2end/lib/echo_services_pb.rb | 52 +++++++++++++++++++++ 4 files changed, 145 insertions(+) create mode 100644 src/ruby/end2end/lib/client_control_pb.rb create mode 100644 src/ruby/end2end/lib/client_control_services_pb.rb create mode 100644 src/ruby/end2end/lib/echo_pb.rb create mode 100644 src/ruby/end2end/lib/echo_services_pb.rb (limited to 'src/ruby/end2end/lib') diff --git a/src/ruby/end2end/lib/client_control_pb.rb b/src/ruby/end2end/lib/client_control_pb.rb new file mode 100644 index 0000000000..866095a80a --- /dev/null +++ b/src/ruby/end2end/lib/client_control_pb.rb @@ -0,0 +1,21 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: client_control.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "client_control.DoEchoRpcRequest" do + optional :request, :string, 1 + end + add_message "client_control.CreateClientStubRequest" do + optional :server_address, :string, 1 + end + add_message "client_control.Void" do + end +end + +module ClientControl + DoEchoRpcRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.DoEchoRpcRequest").msgclass + CreateClientStubRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.CreateClientStubRequest").msgclass + Void = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.Void").msgclass +end diff --git a/src/ruby/end2end/lib/client_control_services_pb.rb b/src/ruby/end2end/lib/client_control_services_pb.rb new file mode 100644 index 0000000000..4c31f3e590 --- /dev/null +++ b/src/ruby/end2end/lib/client_control_services_pb.rb @@ -0,0 +1,54 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: client_control.proto for package 'client_control' +# Original file comments: +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'grpc' +require 'client_control_pb' + +module ClientControl + module ClientController + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'client_control.ClientController' + + rpc :DoEchoRpc, DoEchoRpcRequest, Void + rpc :CreateClientStub, CreateClientStubRequest, Void + rpc :Shutdown, Void, Void + end + + Stub = Service.rpc_stub_class + end +end diff --git a/src/ruby/end2end/lib/echo_pb.rb b/src/ruby/end2end/lib/echo_pb.rb new file mode 100644 index 0000000000..c62adc0753 --- /dev/null +++ b/src/ruby/end2end/lib/echo_pb.rb @@ -0,0 +1,18 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: echo.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "echo.EchoRequest" do + optional :request, :string, 1 + end + add_message "echo.EchoReply" do + optional :response, :string, 1 + end +end + +module Echo + EchoRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("echo.EchoRequest").msgclass + EchoReply = Google::Protobuf::DescriptorPool.generated_pool.lookup("echo.EchoReply").msgclass +end diff --git a/src/ruby/end2end/lib/echo_services_pb.rb b/src/ruby/end2end/lib/echo_services_pb.rb new file mode 100644 index 0000000000..c66e975bf3 --- /dev/null +++ b/src/ruby/end2end/lib/echo_services_pb.rb @@ -0,0 +1,52 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: echo.proto for package 'echo' +# Original file comments: +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'grpc' +require 'echo_pb' + +module Echo + module EchoServer + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'echo.EchoServer' + + rpc :Echo, EchoRequest, EchoReply + end + + Stub = Service.rpc_stub_class + end +end -- cgit v1.2.3 From f8dc32e9e2153b2ea97091b611d8c83cbc37c05e Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 00:04:33 -0700 Subject: make end2end test ports dynamic and slight refactor --- src/ruby/end2end/echo_server.rb | 68 -------------- src/ruby/end2end/end2end_common.rb | 102 +++++++++++++++++++++ src/ruby/end2end/lib/client_control_pb.rb | 4 - src/ruby/end2end/lib/client_control_services_pb.rb | 1 - src/ruby/end2end/protos/client_control.proto | 5 - src/ruby/end2end/sig_handling_client.rb | 29 ++---- src/ruby/end2end/sig_handling_driver.rb | 38 +------- 7 files changed, 117 insertions(+), 130 deletions(-) delete mode 100755 src/ruby/end2end/echo_server.rb create mode 100755 src/ruby/end2end/end2end_common.rb (limited to 'src/ruby/end2end/lib') diff --git a/src/ruby/end2end/echo_server.rb b/src/ruby/end2end/echo_server.rb deleted file mode 100755 index 5e80740aa0..0000000000 --- a/src/ruby/end2end/echo_server.rb +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env ruby - -# Copyright 2015, Google Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -this_dir = File.expand_path(File.dirname(__FILE__)) -protos_lib_dir = File.join(this_dir, 'lib') -grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') -$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) -$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) -$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) - -require 'grpc' -require 'echo_services_pb' - -# GreeterServer is simple server that implements the Helloworld Greeter server. -class EchoServerImpl < Echo::EchoServer::Service - # say_hello implements the SayHello rpc method. - def echo(echo_req, _) - Echo::EchoReply.new(response: echo_req.request) - end -end - -class ServerRunner - def initialize(port) - @port = port - end - def run - @srv = GRPC::RpcServer.new - @thd = Thread.new do - @srv.add_http2_port("localhost:#{@port}", :this_port_is_insecure) - @srv.handle(EchoServerImpl) - @srv.run - end - @srv.wait_till_running - end - def stop - @srv.stop - @thd.join - raise "server not stopped" unless @srv.stopped? - end -end diff --git a/src/ruby/end2end/end2end_common.rb b/src/ruby/end2end/end2end_common.rb new file mode 100755 index 0000000000..67961cdf97 --- /dev/null +++ b/src/ruby/end2end/end2end_common.rb @@ -0,0 +1,102 @@ +#!/usr/bin/env ruby + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +this_dir = File.expand_path(File.dirname(__FILE__)) +protos_lib_dir = File.join(this_dir, 'lib') +grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) +$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'grpc' +require 'echo_services_pb' +require 'client_control_services_pb' +require 'socket' +require 'optparse' +require 'thread' + +# GreeterServer is simple server that implements the Helloworld Greeter server. +class EchoServerImpl < Echo::EchoServer::Service + # say_hello implements the SayHello rpc method. + def echo(echo_req, _) + Echo::EchoReply.new(response: echo_req.request) + end +end + +class ServerRunner + def initialize + end + def run + @srv = GRPC::RpcServer.new + port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure) + @srv.handle(EchoServerImpl) + + @thd = Thread.new do + @srv.run + end + @srv.wait_till_running + port + end + def stop + @srv.stop + @thd.join + raise "server not stopped" unless @srv.stopped? + end +end + +def start_client(client_main, server_port) + this_dir = File.expand_path(File.dirname(__FILE__)) + + tmp_server = TCPServer.new(0) + client_control_port = tmp_server.local_address.ip_port + tmp_server.close + + client_path = File.join(this_dir, client_main) + client_pid = Process.spawn(RbConfig.ruby, client_path, + "--client_control_port=#{client_control_port}", + "--server_port=#{server_port}") + sleep 1 + control_stub = ClientControl::ClientController::Stub.new("localhost:#{client_control_port}", :this_channel_is_insecure) + return control_stub, client_pid +end + +def cleanup(control_stub, server_runner) + control_stub.shutdown(ClientControl::Void.new) + Process.wait(client_pid) + + client_exit_code = $?.exitstatus + + if client_exit_code != 0 + raise "term sig test failure: client exit code: #{client_exit_code}" + end + + server_runner.stop +end diff --git a/src/ruby/end2end/lib/client_control_pb.rb b/src/ruby/end2end/lib/client_control_pb.rb index 866095a80a..1a938f1b5a 100644 --- a/src/ruby/end2end/lib/client_control_pb.rb +++ b/src/ruby/end2end/lib/client_control_pb.rb @@ -7,15 +7,11 @@ Google::Protobuf::DescriptorPool.generated_pool.build do add_message "client_control.DoEchoRpcRequest" do optional :request, :string, 1 end - add_message "client_control.CreateClientStubRequest" do - optional :server_address, :string, 1 - end add_message "client_control.Void" do end end module ClientControl DoEchoRpcRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.DoEchoRpcRequest").msgclass - CreateClientStubRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.CreateClientStubRequest").msgclass Void = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.Void").msgclass end diff --git a/src/ruby/end2end/lib/client_control_services_pb.rb b/src/ruby/end2end/lib/client_control_services_pb.rb index 4c31f3e590..04b2291bc7 100644 --- a/src/ruby/end2end/lib/client_control_services_pb.rb +++ b/src/ruby/end2end/lib/client_control_services_pb.rb @@ -45,7 +45,6 @@ module ClientControl self.service_name = 'client_control.ClientController' rpc :DoEchoRpc, DoEchoRpcRequest, Void - rpc :CreateClientStub, CreateClientStubRequest, Void rpc :Shutdown, Void, Void end diff --git a/src/ruby/end2end/protos/client_control.proto b/src/ruby/end2end/protos/client_control.proto index 5e11876cb4..f985bb486d 100644 --- a/src/ruby/end2end/protos/client_control.proto +++ b/src/ruby/end2end/protos/client_control.proto @@ -33,7 +33,6 @@ package client_control; service ClientController { rpc DoEchoRpc (DoEchoRpcRequest) returns (Void) {} - rpc CreateClientStub(CreateClientStubRequest) returns (Void) {} rpc Shutdown(Void) returns (Void) {} } @@ -41,8 +40,4 @@ message DoEchoRpcRequest { string request = 1; } -message CreateClientStubRequest { - string server_address = 1; -} - message Void{} diff --git a/src/ruby/end2end/sig_handling_client.rb b/src/ruby/end2end/sig_handling_client.rb index 860c6b5f0d..f0b2ba61ca 100755 --- a/src/ruby/end2end/sig_handling_client.rb +++ b/src/ruby/end2end/sig_handling_client.rb @@ -29,32 +29,18 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -this_dir = File.expand_path(File.dirname(__FILE__)) -protos_lib_dir = File.join(this_dir, 'lib') -grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') -$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) -$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) -$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) - -require 'grpc' -require 'echo_services_pb' -require 'client_control_services_pb' -require 'optparse' -require 'thread' +require_relative './end2end_common' class SigHandlingClientController < ClientControl::ClientController::Service - def initialize(srv) + def initialize(srv, stub) @srv = srv + @stub = stub end def do_echo_rpc(req, _) response = @stub.echo(Echo::EchoRequest.new(request: req.request)) raise "bad response" unless response.response == req.request ClientControl::Void.new end - def create_client_stub(req, _) - @stub = Echo::EchoServer::Stub.new(req.server_address, :this_channel_is_insecure) - ClientControl::Void.new - end def shutdown(_, _) Thread.new do #TODO(apolcyn) There is a race between stopping the server and the "shutdown" rpc completing, @@ -68,10 +54,14 @@ end def main client_control_port = '' + server_port = '' OptionParser.new do |opts| opts.on('--client_control_port=P', String) do |p| client_control_port = p end + opts.on('--server_port=P', String) do |p| + server_port = p + end end.parse! Signal.trap("TERM") do @@ -83,8 +73,9 @@ def main end srv = GRPC::RpcServer.new - srv.add_http2_port("localhost:#{client_control_port}", :this_port_is_insecure) - srv.handle(SigHandlingClientController.new(srv)) + srv.add_http2_port("0.0.0.0:#{client_control_port}", :this_port_is_insecure) + stub = Echo::EchoServer::Stub.new("localhost:#{server_port}", :this_channel_is_insecure) + srv.handle(SigHandlingClientController.new(srv, stub)) srv.run end diff --git a/src/ruby/end2end/sig_handling_driver.rb b/src/ruby/end2end/sig_handling_driver.rb index 524f0cebe8..bda5c03c16 100755 --- a/src/ruby/end2end/sig_handling_driver.rb +++ b/src/ruby/end2end/sig_handling_driver.rb @@ -32,39 +32,20 @@ # smoke test for a grpc-using app that receives and # handles process-ending signals -this_dir = File.expand_path(File.dirname(__FILE__)) -protos_lib_dir = File.join(this_dir, 'lib') -grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') -$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) -$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) -$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) - -require 'grpc' -require 'echo_server' -require 'client_control_services_pb' +require_relative './end2end_common' def main - this_dir = File.expand_path(File.dirname(__FILE__)) - lib_dir = File.join(File.dirname(this_dir), 'lib') - - server_port = '50051' STDERR.puts "start server" - server_runner = ServerRunner.new(server_port) - server_runner.run + server_runner = ServerRunner.new + server_port = server_runner.run sleep 1 - client_control_port = '50052' - STDERR.puts "start client" - client_path = File.join(this_dir, "sig_handling_client.rb") - client_pid = Process.spawn(RbConfig.ruby, client_path, "--client_control_port=#{client_control_port}") - control_stub = ClientControl::ClientController::Stub.new("localhost:#{client_control_port}", :this_channel_is_insecure) + control_stub, client_pid = start_client("sig_handling_client.rb", server_port) sleep 1 - control_stub.create_client_stub(ClientControl::CreateClientStubRequest.new(server_address: "localhost:#{server_port}")) - count = 0 while count < 5 control_stub.do_echo_rpc(ClientControl::DoEchoRpcRequest.new(request: 'hello')) @@ -73,16 +54,7 @@ def main count += 1 end - control_stub.shutdown(ClientControl::Void.new) - Process.wait(client_pid) - - client_exit_code = $?.exitstatus - - if client_exit_code != 0 - raise "term sig test failure: client exit code: #{client_exit_code}" - end - - server_runner.stop + cleanup(control_stub, server_runner) end main -- cgit v1.2.3