Index: third_party/grpc/src/ruby/spec/pb/health/checker_spec.rb |
diff --git a/third_party/grpc/src/ruby/spec/pb/health/checker_spec.rb b/third_party/grpc/src/ruby/spec/pb/health/checker_spec.rb |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9bb79bb4cae057c8a5ebab92467570d570076e2d |
--- /dev/null |
+++ b/third_party/grpc/src/ruby/spec/pb/health/checker_spec.rb |
@@ -0,0 +1,218 @@ |
+# Copyright 2015-2016, 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 'grpc/health/v1/health' |
+require 'grpc/health/checker' |
+require 'open3' |
+require 'tmpdir' |
+ |
+def can_run_codegen_check |
+ system('which grpc_ruby_plugin') && system('which protoc') |
+end |
+ |
+describe 'Health protobuf code generation' do |
+ context 'the health service file used by grpc/health/checker' do |
+ if !can_run_codegen_check |
+ skip 'protoc || grpc_ruby_plugin missing, cannot verify health code-gen' |
+ else |
+ it 'should already be loaded indirectly i.e, used by the other specs' do |
+ expect(require('grpc/health/v1/health_services')).to be(false) |
+ end |
+ |
+ it 'should have the same content as created by code generation' do |
+ root_dir = File.join(File.dirname(__FILE__), '..', '..', '..', '..') |
+ pb_dir = File.join(root_dir, 'proto') |
+ |
+ # Get the current content |
+ service_path = File.join(root_dir, 'ruby', 'pb', 'grpc', |
+ 'health', 'v1', 'health_services.rb') |
+ want = nil |
+ File.open(service_path) { |f| want = f.read } |
+ |
+ # Regenerate it |
+ plugin, = Open3.capture2('which', 'grpc_ruby_plugin') |
+ plugin = plugin.strip |
+ got = nil |
+ Dir.mktmpdir do |tmp_dir| |
+ gen_out = File.join(tmp_dir, 'grpc', 'health', 'v1', |
+ 'health_services.rb') |
+ pid = spawn( |
+ 'protoc', |
+ '-I.', |
+ 'grpc/health/v1/health.proto', |
+ "--grpc_out=#{tmp_dir}", |
+ "--plugin=protoc-gen-grpc=#{plugin}", |
+ chdir: pb_dir) |
+ Process.wait(pid) |
+ File.open(gen_out) { |f| got = f.read } |
+ end |
+ expect(got).to eq(want) |
+ end |
+ end |
+ end |
+end |
+ |
+describe Grpc::Health::Checker do |
+ StatusCodes = GRPC::Core::StatusCodes |
+ ServingStatus = Grpc::Health::V1::HealthCheckResponse::ServingStatus |
+ HCResp = Grpc::Health::V1::HealthCheckResponse |
+ HCReq = Grpc::Health::V1::HealthCheckRequest |
+ success_tests = |
+ [ |
+ { |
+ desc: 'the service is not specified', |
+ service: '' |
+ }, { |
+ desc: 'the service is specified', |
+ service: 'fake-service-1' |
+ } |
+ ] |
+ |
+ context 'initialization' do |
+ it 'can be constructed with no args' do |
+ expect(subject).to_not be(nil) |
+ end |
+ end |
+ |
+ context 'method `add_status` and `check`' do |
+ success_tests.each do |t| |
+ it "should succeed when #{t[:desc]}" do |
+ subject.add_status(t[:service], ServingStatus::NOT_SERVING) |
+ got = subject.check(HCReq.new(service: t[:service]), nil) |
+ want = HCResp.new(status: ServingStatus::NOT_SERVING) |
+ expect(got).to eq(want) |
+ end |
+ end |
+ end |
+ |
+ context 'method `check`' do |
+ success_tests.each do |t| |
+ it "should fail with NOT_FOUND when #{t[:desc]}" do |
+ blk = proc do |
+ subject.check(HCReq.new(service: t[:service]), nil) |
+ end |
+ expected_msg = /#{StatusCodes::NOT_FOUND}/ |
+ expect(&blk).to raise_error GRPC::BadStatus, expected_msg |
+ end |
+ end |
+ end |
+ |
+ context 'method `clear_status`' do |
+ success_tests.each do |t| |
+ it "should fail after clearing status when #{t[:desc]}" do |
+ subject.add_status(t[:service], ServingStatus::NOT_SERVING) |
+ got = subject.check(HCReq.new(service: t[:service]), nil) |
+ want = HCResp.new(status: ServingStatus::NOT_SERVING) |
+ expect(got).to eq(want) |
+ |
+ subject.clear_status(t[:service]) |
+ blk = proc do |
+ subject.check(HCReq.new(service: t[:service]), nil) |
+ end |
+ expected_msg = /#{StatusCodes::NOT_FOUND}/ |
+ expect(&blk).to raise_error GRPC::BadStatus, expected_msg |
+ end |
+ end |
+ end |
+ |
+ context 'method `clear_all`' do |
+ it 'should return NOT_FOUND after being invoked' do |
+ success_tests.each do |t| |
+ subject.add_status(t[:service], ServingStatus::NOT_SERVING) |
+ got = subject.check(HCReq.new(service: t[:service]), nil) |
+ want = HCResp.new(status: ServingStatus::NOT_SERVING) |
+ expect(got).to eq(want) |
+ end |
+ |
+ subject.clear_all |
+ |
+ success_tests.each do |t| |
+ blk = proc do |
+ subject.check(HCReq.new(service: t[:service]), nil) |
+ end |
+ expected_msg = /#{StatusCodes::NOT_FOUND}/ |
+ expect(&blk).to raise_error GRPC::BadStatus, expected_msg |
+ end |
+ end |
+ end |
+ |
+ describe 'running on RpcServer' do |
+ RpcServer = GRPC::RpcServer |
+ CheckerStub = Grpc::Health::Checker.rpc_stub_class |
+ |
+ before(:each) do |
+ @server_queue = GRPC::Core::CompletionQueue.new |
+ server_host = '0.0.0.0:0' |
+ @server = GRPC::Core::Server.new(@server_queue, nil) |
+ server_port = @server.add_http2_port(server_host, :this_port_is_insecure) |
+ @host = "localhost:#{server_port}" |
+ @ch = GRPC::Core::Channel.new(@host, nil, :this_channel_is_insecure) |
+ @client_opts = { channel_override: @ch } |
+ server_opts = { |
+ server_override: @server, |
+ completion_queue_override: @server_queue, |
+ poll_period: 1 |
+ } |
+ @srv = RpcServer.new(**server_opts) |
+ end |
+ |
+ after(:each) do |
+ @srv.stop |
+ end |
+ |
+ it 'should receive the correct status', server: true do |
+ @srv.handle(subject) |
+ subject.add_status('', ServingStatus::NOT_SERVING) |
+ t = Thread.new { @srv.run } |
+ @srv.wait_till_running |
+ |
+ stub = CheckerStub.new(@host, :this_channel_is_insecure, **@client_opts) |
+ got = stub.check(HCReq.new) |
+ want = HCResp.new(status: ServingStatus::NOT_SERVING) |
+ expect(got).to eq(want) |
+ @srv.stop |
+ t.join |
+ end |
+ |
+ it 'should fail on unknown services', server: true do |
+ @srv.handle(subject) |
+ t = Thread.new { @srv.run } |
+ @srv.wait_till_running |
+ blk = proc do |
+ stub = CheckerStub.new(@host, :this_channel_is_insecure, **@client_opts) |
+ stub.check(HCReq.new(service: 'unknown')) |
+ end |
+ expected_msg = /#{StatusCodes::NOT_FOUND}/ |
+ expect(&blk).to raise_error GRPC::BadStatus, expected_msg |
+ @srv.stop |
+ t.join |
+ end |
+ end |
+end |