grpc 1.28.0-x86-mingw32 → 1.30.0.pre1-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/grpc_c.32.ruby +0 -0
 - data/grpc_c.64.ruby +0 -0
 - data/src/ruby/ext/grpc/rb_call.c +9 -1
 - data/src/ruby/lib/grpc/2.3/grpc_c.so +0 -0
 - data/src/ruby/lib/grpc/2.4/grpc_c.so +0 -0
 - data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
 - data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
 - data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
 - data/src/ruby/lib/grpc/errors.rb +103 -42
 - data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
 - data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
 - data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
 - data/src/ruby/lib/grpc/generic/service.rb +5 -4
 - data/src/ruby/lib/grpc/structs.rb +1 -1
 - data/src/ruby/lib/grpc/version.rb +1 -1
 - data/src/ruby/pb/generate_proto_ruby.sh +5 -3
 - data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
 - data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
 - data/src/ruby/pb/test/xds_client.rb +213 -0
 - data/src/ruby/spec/debug_message_spec.rb +134 -0
 - data/src/ruby/spec/generic/service_spec.rb +2 -0
 - data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
 - data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
 - data/src/ruby/spec/testdata/ca.pem +18 -13
 - data/src/ruby/spec/testdata/client.key +26 -14
 - data/src/ruby/spec/testdata/client.pem +18 -12
 - data/src/ruby/spec/testdata/server1.key +26 -14
 - data/src/ruby/spec/testdata/server1.pem +20 -14
 - metadata +39 -36
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 02cb545d0ad6c8a3ad5c6f7d33ee67349236bc5798b9fc14a15a914458969c14
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3dc120116685374f0e2a9b5fc011e7b5617e313d6a4c0c7d2e9c176f370a21fb
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ed74e7455dc7ac52081ce27b09204dfb12008d0cf28ee396ca1c95412656ba8a9335651b0a7ee1ccffc2c3fa9d1290b705fd720715bb493ce8fdca64f5f73c2a
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 85c7dd6cae98602f1f00963b10090b9ab1178537084980a46c07e4eac74eb6915e469ab7793b97e6934d382f14bdc0a9d6116538a2774336fae7e735e6ab7843
         
     | 
    
        data/grpc_c.32.ruby
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/grpc_c.64.ruby
    CHANGED
    
    | 
         Binary file 
     | 
    
        data/src/ruby/ext/grpc/rb_call.c
    CHANGED
    
    | 
         @@ -620,6 +620,7 @@ typedef struct run_batch_stack { 
     | 
|
| 
       620 
620 
     | 
    
         
             
              int recv_cancelled;
         
     | 
| 
       621 
621 
     | 
    
         
             
              grpc_status_code recv_status;
         
     | 
| 
       622 
622 
     | 
    
         
             
              grpc_slice recv_status_details;
         
     | 
| 
      
 623 
     | 
    
         
            +
              const char* recv_status_debug_error_string;
         
     | 
| 
       623 
624 
     | 
    
         
             
              unsigned write_flag;
         
     | 
| 
       624 
625 
     | 
    
         
             
              grpc_slice send_status_details;
         
     | 
| 
       625 
626 
     | 
    
         
             
            } run_batch_stack;
         
     | 
| 
         @@ -729,6 +730,8 @@ static void grpc_run_batch_stack_fill_ops(run_batch_stack* st, VALUE ops_hash) { 
     | 
|
| 
       729 
730 
     | 
    
         
             
                        &st->recv_status;
         
     | 
| 
       730 
731 
     | 
    
         
             
                    st->ops[st->op_num].data.recv_status_on_client.status_details =
         
     | 
| 
       731 
732 
     | 
    
         
             
                        &st->recv_status_details;
         
     | 
| 
      
 733 
     | 
    
         
            +
                    st->ops[st->op_num].data.recv_status_on_client.error_string =
         
     | 
| 
      
 734 
     | 
    
         
            +
                        &st->recv_status_debug_error_string;
         
     | 
| 
       732 
735 
     | 
    
         
             
                    break;
         
     | 
| 
       733 
736 
     | 
    
         
             
                  case GRPC_OP_RECV_CLOSE_ON_SERVER:
         
     | 
| 
       734 
737 
     | 
    
         
             
                    st->ops[st->op_num].data.recv_close_on_server.cancelled =
         
     | 
| 
         @@ -780,7 +783,12 @@ static VALUE grpc_run_batch_stack_build_result(run_batch_stack* st) { 
     | 
|
| 
       780 
783 
     | 
    
         
             
                            (GRPC_SLICE_START_PTR(st->recv_status_details) == NULL
         
     | 
| 
       781 
784 
     | 
    
         
             
                                 ? Qnil
         
     | 
| 
       782 
785 
     | 
    
         
             
                                 : grpc_rb_slice_to_ruby_string(st->recv_status_details)),
         
     | 
| 
       783 
     | 
    
         
            -
                            grpc_rb_md_ary_to_h(&st->recv_trailing_metadata), 
     | 
| 
      
 786 
     | 
    
         
            +
                            grpc_rb_md_ary_to_h(&st->recv_trailing_metadata),
         
     | 
| 
      
 787 
     | 
    
         
            +
                            st->recv_status_debug_error_string == NULL
         
     | 
| 
      
 788 
     | 
    
         
            +
                                ? Qnil
         
     | 
| 
      
 789 
     | 
    
         
            +
                                : rb_str_new_cstr(st->recv_status_debug_error_string),
         
     | 
| 
      
 790 
     | 
    
         
            +
                            NULL));
         
     | 
| 
      
 791 
     | 
    
         
            +
                    gpr_free((void*)st->recv_status_debug_error_string);
         
     | 
| 
       784 
792 
     | 
    
         
             
                    break;
         
     | 
| 
       785 
793 
     | 
    
         
             
                  case GRPC_OP_RECV_CLOSE_ON_SERVER:
         
     | 
| 
       786 
794 
     | 
    
         
             
                    rb_struct_aset(result, sym_send_close, Qtrue);
         
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
| 
         Binary file 
     | 
    
        data/src/ruby/lib/grpc/errors.rb
    CHANGED
    
    | 
         @@ -30,18 +30,26 @@ module GRPC 
     | 
|
| 
       30 
30 
     | 
    
         
             
              # https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/status.h
         
     | 
| 
       31 
31 
     | 
    
         
             
              # for detailed descriptions of each status code.
         
     | 
| 
       32 
32 
     | 
    
         
             
              class BadStatus < StandardError
         
     | 
| 
       33 
     | 
    
         
            -
                attr_reader :code, :details, :metadata
         
     | 
| 
      
 33 
     | 
    
         
            +
                attr_reader :code, :details, :metadata, :debug_error_string
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                include GRPC::Core::StatusCodes
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
       37 
37 
     | 
    
         
             
                # @param code [Numeric] the status code
         
     | 
| 
       38 
38 
     | 
    
         
             
                # @param details [String] the details of the exception
         
     | 
| 
       39 
39 
     | 
    
         
             
                # @param metadata [Hash] the error's metadata
         
     | 
| 
       40 
     | 
    
         
            -
                def initialize(code, 
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
                def initialize(code,
         
     | 
| 
      
 41 
     | 
    
         
            +
                               details = 'unknown cause',
         
     | 
| 
      
 42 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 43 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  exception_message = "#{code}:#{details}"
         
     | 
| 
      
 45 
     | 
    
         
            +
                  if debug_error_string
         
     | 
| 
      
 46 
     | 
    
         
            +
                    exception_message += ". debug_error_string:#{debug_error_string}"
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  super(exception_message)
         
     | 
| 
       42 
49 
     | 
    
         
             
                  @code = code
         
     | 
| 
       43 
50 
     | 
    
         
             
                  @details = details
         
     | 
| 
       44 
51 
     | 
    
         
             
                  @metadata = metadata
         
     | 
| 
      
 52 
     | 
    
         
            +
                  @debug_error_string = debug_error_string
         
     | 
| 
       45 
53 
     | 
    
         
             
                end
         
     | 
| 
       46 
54 
     | 
    
         | 
| 
       47 
55 
     | 
    
         
             
                # Converts the exception to a {Struct::Status} for use in the networking
         
     | 
| 
         @@ -49,7 +57,7 @@ module GRPC 
     | 
|
| 
       49 
57 
     | 
    
         
             
                #
         
     | 
| 
       50 
58 
     | 
    
         
             
                # @return [Struct::Status] with the same code and details
         
     | 
| 
       51 
59 
     | 
    
         
             
                def to_status
         
     | 
| 
       52 
     | 
    
         
            -
                  Struct::Status.new(code, details, metadata)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  Struct::Status.new(code, details, metadata, debug_error_string)
         
     | 
| 
       53 
61 
     | 
    
         
             
                end
         
     | 
| 
       54 
62 
     | 
    
         | 
| 
       55 
63 
     | 
    
         
             
                # Converts the exception to a deserialized {Google::Rpc::Status} object.
         
     | 
| 
         @@ -66,8 +74,10 @@ module GRPC 
     | 
|
| 
       66 
74 
     | 
    
         
             
                  nil
         
     | 
| 
       67 
75 
     | 
    
         
             
                end
         
     | 
| 
       68 
76 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
                def self.new_status_exception(code, 
     | 
| 
       70 
     | 
    
         
            -
                                               
     | 
| 
      
 77 
     | 
    
         
            +
                def self.new_status_exception(code,
         
     | 
| 
      
 78 
     | 
    
         
            +
                                              details = 'unknown cause',
         
     | 
| 
      
 79 
     | 
    
         
            +
                                              metadata = {},
         
     | 
| 
      
 80 
     | 
    
         
            +
                                              debug_error_string = nil)
         
     | 
| 
       71 
81 
     | 
    
         
             
                  codes = {}
         
     | 
| 
       72 
82 
     | 
    
         
             
                  codes[OK] = Ok
         
     | 
| 
       73 
83 
     | 
    
         
             
                  codes[CANCELLED] = Cancelled
         
     | 
| 
         @@ -88,129 +98,180 @@ module GRPC 
     | 
|
| 
       88 
98 
     | 
    
         
             
                  codes[DATA_LOSS] = DataLoss
         
     | 
| 
       89 
99 
     | 
    
         | 
| 
       90 
100 
     | 
    
         
             
                  if codes[code].nil?
         
     | 
| 
       91 
     | 
    
         
            -
                    BadStatus.new(code, details, metadata)
         
     | 
| 
      
 101 
     | 
    
         
            +
                    BadStatus.new(code, details, metadata, debug_error_string)
         
     | 
| 
       92 
102 
     | 
    
         
             
                  else
         
     | 
| 
       93 
     | 
    
         
            -
                    codes[code].new(details, metadata)
         
     | 
| 
      
 103 
     | 
    
         
            +
                    codes[code].new(details, metadata, debug_error_string)
         
     | 
| 
       94 
104 
     | 
    
         
             
                  end
         
     | 
| 
       95 
105 
     | 
    
         
             
                end
         
     | 
| 
       96 
106 
     | 
    
         
             
              end
         
     | 
| 
       97 
107 
     | 
    
         | 
| 
       98 
108 
     | 
    
         
             
              # GRPC status code corresponding to status OK
         
     | 
| 
       99 
109 
     | 
    
         
             
              class Ok < BadStatus
         
     | 
| 
       100 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
      
 110 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 111 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 112 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 113 
     | 
    
         
            +
                  super(Core::StatusCodes::OK,
         
     | 
| 
      
 114 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       102 
115 
     | 
    
         
             
                end
         
     | 
| 
       103 
116 
     | 
    
         
             
              end
         
     | 
| 
       104 
117 
     | 
    
         | 
| 
       105 
118 
     | 
    
         
             
              # GRPC status code corresponding to status CANCELLED
         
     | 
| 
       106 
119 
     | 
    
         
             
              class Cancelled < BadStatus
         
     | 
| 
       107 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       108 
     | 
    
         
            -
             
     | 
| 
      
 120 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 121 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 122 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 123 
     | 
    
         
            +
                  super(Core::StatusCodes::CANCELLED,
         
     | 
| 
      
 124 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       109 
125 
     | 
    
         
             
                end
         
     | 
| 
       110 
126 
     | 
    
         
             
              end
         
     | 
| 
       111 
127 
     | 
    
         | 
| 
       112 
128 
     | 
    
         
             
              # GRPC status code corresponding to status UNKNOWN
         
     | 
| 
       113 
129 
     | 
    
         
             
              class Unknown < BadStatus
         
     | 
| 
       114 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
      
 130 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 131 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 132 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 133 
     | 
    
         
            +
                  super(Core::StatusCodes::UNKNOWN,
         
     | 
| 
      
 134 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       116 
135 
     | 
    
         
             
                end
         
     | 
| 
       117 
136 
     | 
    
         
             
              end
         
     | 
| 
       118 
137 
     | 
    
         | 
| 
       119 
138 
     | 
    
         
             
              # GRPC status code corresponding to status INVALID_ARGUMENT
         
     | 
| 
       120 
139 
     | 
    
         
             
              class InvalidArgument < BadStatus
         
     | 
| 
       121 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
      
 140 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 141 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 142 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 143 
     | 
    
         
            +
                  super(Core::StatusCodes::INVALID_ARGUMENT,
         
     | 
| 
      
 144 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       123 
145 
     | 
    
         
             
                end
         
     | 
| 
       124 
146 
     | 
    
         
             
              end
         
     | 
| 
       125 
147 
     | 
    
         | 
| 
       126 
148 
     | 
    
         
             
              # GRPC status code corresponding to status DEADLINE_EXCEEDED
         
     | 
| 
       127 
149 
     | 
    
         
             
              class DeadlineExceeded < BadStatus
         
     | 
| 
       128 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
      
 150 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 151 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 152 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 153 
     | 
    
         
            +
                  super(Core::StatusCodes::DEADLINE_EXCEEDED,
         
     | 
| 
      
 154 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       130 
155 
     | 
    
         
             
                end
         
     | 
| 
       131 
156 
     | 
    
         
             
              end
         
     | 
| 
       132 
157 
     | 
    
         | 
| 
       133 
158 
     | 
    
         
             
              # GRPC status code corresponding to status NOT_FOUND
         
     | 
| 
       134 
159 
     | 
    
         
             
              class NotFound < BadStatus
         
     | 
| 
       135 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
      
 160 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 161 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 162 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 163 
     | 
    
         
            +
                  super(Core::StatusCodes::NOT_FOUND,
         
     | 
| 
      
 164 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       137 
165 
     | 
    
         
             
                end
         
     | 
| 
       138 
166 
     | 
    
         
             
              end
         
     | 
| 
       139 
167 
     | 
    
         | 
| 
       140 
168 
     | 
    
         
             
              # GRPC status code corresponding to status ALREADY_EXISTS
         
     | 
| 
       141 
169 
     | 
    
         
             
              class AlreadyExists < BadStatus
         
     | 
| 
       142 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
      
 170 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 171 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 172 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 173 
     | 
    
         
            +
                  super(Core::StatusCodes::ALREADY_EXISTS,
         
     | 
| 
      
 174 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       144 
175 
     | 
    
         
             
                end
         
     | 
| 
       145 
176 
     | 
    
         
             
              end
         
     | 
| 
       146 
177 
     | 
    
         | 
| 
       147 
178 
     | 
    
         
             
              # GRPC status code corresponding to status PERMISSION_DENIED
         
     | 
| 
       148 
179 
     | 
    
         
             
              class PermissionDenied < BadStatus
         
     | 
| 
       149 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
      
 180 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 181 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 182 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 183 
     | 
    
         
            +
                  super(Core::StatusCodes::PERMISSION_DENIED,
         
     | 
| 
      
 184 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       151 
185 
     | 
    
         
             
                end
         
     | 
| 
       152 
186 
     | 
    
         
             
              end
         
     | 
| 
       153 
187 
     | 
    
         | 
| 
       154 
188 
     | 
    
         
             
              # GRPC status code corresponding to status UNAUTHENTICATED
         
     | 
| 
       155 
189 
     | 
    
         
             
              class Unauthenticated < BadStatus
         
     | 
| 
       156 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
      
 190 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 191 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 192 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 193 
     | 
    
         
            +
                  super(Core::StatusCodes::UNAUTHENTICATED,
         
     | 
| 
      
 194 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       158 
195 
     | 
    
         
             
                end
         
     | 
| 
       159 
196 
     | 
    
         
             
              end
         
     | 
| 
       160 
197 
     | 
    
         | 
| 
       161 
198 
     | 
    
         
             
              # GRPC status code corresponding to status RESOURCE_EXHAUSTED
         
     | 
| 
       162 
199 
     | 
    
         
             
              class ResourceExhausted < BadStatus
         
     | 
| 
       163 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
      
 200 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 201 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 202 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 203 
     | 
    
         
            +
                  super(Core::StatusCodes::RESOURCE_EXHAUSTED,
         
     | 
| 
      
 204 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       165 
205 
     | 
    
         
             
                end
         
     | 
| 
       166 
206 
     | 
    
         
             
              end
         
     | 
| 
       167 
207 
     | 
    
         | 
| 
       168 
208 
     | 
    
         
             
              # GRPC status code corresponding to status FAILED_PRECONDITION
         
     | 
| 
       169 
209 
     | 
    
         
             
              class FailedPrecondition < BadStatus
         
     | 
| 
       170 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
      
 210 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 211 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 212 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 213 
     | 
    
         
            +
                  super(Core::StatusCodes::FAILED_PRECONDITION,
         
     | 
| 
      
 214 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       172 
215 
     | 
    
         
             
                end
         
     | 
| 
       173 
216 
     | 
    
         
             
              end
         
     | 
| 
       174 
217 
     | 
    
         | 
| 
       175 
218 
     | 
    
         
             
              # GRPC status code corresponding to status ABORTED
         
     | 
| 
       176 
219 
     | 
    
         
             
              class Aborted < BadStatus
         
     | 
| 
       177 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
      
 220 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 221 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 222 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 223 
     | 
    
         
            +
                  super(Core::StatusCodes::ABORTED,
         
     | 
| 
      
 224 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       179 
225 
     | 
    
         
             
                end
         
     | 
| 
       180 
226 
     | 
    
         
             
              end
         
     | 
| 
       181 
227 
     | 
    
         | 
| 
       182 
228 
     | 
    
         
             
              # GRPC status code corresponding to status OUT_OF_RANGE
         
     | 
| 
       183 
229 
     | 
    
         
             
              class OutOfRange < BadStatus
         
     | 
| 
       184 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       185 
     | 
    
         
            -
             
     | 
| 
      
 230 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 231 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 232 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 233 
     | 
    
         
            +
                  super(Core::StatusCodes::OUT_OF_RANGE,
         
     | 
| 
      
 234 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       186 
235 
     | 
    
         
             
                end
         
     | 
| 
       187 
236 
     | 
    
         
             
              end
         
     | 
| 
       188 
237 
     | 
    
         | 
| 
       189 
238 
     | 
    
         
             
              # GRPC status code corresponding to status UNIMPLEMENTED
         
     | 
| 
       190 
239 
     | 
    
         
             
              class Unimplemented < BadStatus
         
     | 
| 
       191 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
      
 240 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 241 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 242 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 243 
     | 
    
         
            +
                  super(Core::StatusCodes::UNIMPLEMENTED,
         
     | 
| 
      
 244 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       193 
245 
     | 
    
         
             
                end
         
     | 
| 
       194 
246 
     | 
    
         
             
              end
         
     | 
| 
       195 
247 
     | 
    
         | 
| 
       196 
248 
     | 
    
         
             
              # GRPC status code corresponding to status INTERNAL
         
     | 
| 
       197 
249 
     | 
    
         
             
              class Internal < BadStatus
         
     | 
| 
       198 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       199 
     | 
    
         
            -
             
     | 
| 
      
 250 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 251 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 252 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 253 
     | 
    
         
            +
                  super(Core::StatusCodes::INTERNAL,
         
     | 
| 
      
 254 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       200 
255 
     | 
    
         
             
                end
         
     | 
| 
       201 
256 
     | 
    
         
             
              end
         
     | 
| 
       202 
257 
     | 
    
         | 
| 
       203 
258 
     | 
    
         
             
              # GRPC status code corresponding to status UNAVAILABLE
         
     | 
| 
       204 
259 
     | 
    
         
             
              class Unavailable < BadStatus
         
     | 
| 
       205 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
      
 260 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 261 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 262 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 263 
     | 
    
         
            +
                  super(Core::StatusCodes::UNAVAILABLE,
         
     | 
| 
      
 264 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       207 
265 
     | 
    
         
             
                end
         
     | 
| 
       208 
266 
     | 
    
         
             
              end
         
     | 
| 
       209 
267 
     | 
    
         | 
| 
       210 
268 
     | 
    
         
             
              # GRPC status code corresponding to status DATA_LOSS
         
     | 
| 
       211 
269 
     | 
    
         
             
              class DataLoss < BadStatus
         
     | 
| 
       212 
     | 
    
         
            -
                def initialize(details = 'unknown cause', 
     | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
      
 270 
     | 
    
         
            +
                def initialize(details = 'unknown cause',
         
     | 
| 
      
 271 
     | 
    
         
            +
                               metadata = {},
         
     | 
| 
      
 272 
     | 
    
         
            +
                               debug_error_string = nil)
         
     | 
| 
      
 273 
     | 
    
         
            +
                  super(Core::StatusCodes::DATA_LOSS,
         
     | 
| 
      
 274 
     | 
    
         
            +
                        details, metadata, debug_error_string)
         
     | 
| 
       214 
275 
     | 
    
         
             
                end
         
     | 
| 
       215 
276 
     | 
    
         
             
              end
         
     | 
| 
       216 
277 
     | 
    
         
             
            end
         
     | 
| 
         @@ -23,13 +23,12 @@ class Struct 
     | 
|
| 
       23 
23 
     | 
    
         
             
                # is non-nil and not OK.
         
     | 
| 
       24 
24 
     | 
    
         
             
                def check_status
         
     | 
| 
       25 
25 
     | 
    
         
             
                  return nil if status.nil?
         
     | 
| 
       26 
     | 
    
         
            -
                  fail GRPC::Cancelled if status.code == GRPC::Core::StatusCodes::CANCELLED
         
     | 
| 
       27 
26 
     | 
    
         
             
                  if status.code != GRPC::Core::StatusCodes::OK
         
     | 
| 
       28 
27 
     | 
    
         
             
                    GRPC.logger.debug("Failing with status #{status}")
         
     | 
| 
       29 
28 
     | 
    
         
             
                    # raise BadStatus, propagating the metadata if present.
         
     | 
| 
       30 
     | 
    
         
            -
                    md = status.metadata
         
     | 
| 
       31 
29 
     | 
    
         
             
                    fail GRPC::BadStatus.new_status_exception(
         
     | 
| 
       32 
     | 
    
         
            -
                      status.code, status.details,  
     | 
| 
      
 30 
     | 
    
         
            +
                      status.code, status.details, status.metadata,
         
     | 
| 
      
 31 
     | 
    
         
            +
                      status.debug_error_string)
         
     | 
| 
       33 
32 
     | 
    
         
             
                  end
         
     | 
| 
       34 
33 
     | 
    
         
             
                  status
         
     | 
| 
       35 
34 
     | 
    
         
             
                end
         
     | 
| 
         @@ -38,7 +38,7 @@ module GRPC 
     | 
|
| 
       38 
38 
     | 
    
         
             
                #
         
     | 
| 
       39 
39 
     | 
    
         
             
                # @param [Object] request
         
     | 
| 
       40 
40 
     | 
    
         
             
                # @param [GRPC::ActiveCall] call
         
     | 
| 
       41 
     | 
    
         
            -
                # @param [ 
     | 
| 
      
 41 
     | 
    
         
            +
                # @param [String] method
         
     | 
| 
       42 
42 
     | 
    
         
             
                # @param [Hash] metadata
         
     | 
| 
       43 
43 
     | 
    
         
             
                #
         
     | 
| 
       44 
44 
     | 
    
         
             
                def request_response(request: nil, call: nil, method: nil, metadata: nil)
         
     | 
| 
         @@ -52,7 +52,7 @@ module GRPC 
     | 
|
| 
       52 
52 
     | 
    
         
             
                #
         
     | 
| 
       53 
53 
     | 
    
         
             
                # @param [Enumerable] requests
         
     | 
| 
       54 
54 
     | 
    
         
             
                # @param [GRPC::ActiveCall] call
         
     | 
| 
       55 
     | 
    
         
            -
                # @param [ 
     | 
| 
      
 55 
     | 
    
         
            +
                # @param [String] method
         
     | 
| 
       56 
56 
     | 
    
         
             
                # @param [Hash] metadata
         
     | 
| 
       57 
57 
     | 
    
         
             
                #
         
     | 
| 
       58 
58 
     | 
    
         
             
                def client_streamer(requests: nil, call: nil, method: nil, metadata: nil)
         
     | 
| 
         @@ -66,7 +66,7 @@ module GRPC 
     | 
|
| 
       66 
66 
     | 
    
         
             
                #
         
     | 
| 
       67 
67 
     | 
    
         
             
                # @param [Object] request
         
     | 
| 
       68 
68 
     | 
    
         
             
                # @param [GRPC::ActiveCall] call
         
     | 
| 
       69 
     | 
    
         
            -
                # @param [ 
     | 
| 
      
 69 
     | 
    
         
            +
                # @param [String] method
         
     | 
| 
       70 
70 
     | 
    
         
             
                # @param [Hash] metadata
         
     | 
| 
       71 
71 
     | 
    
         
             
                #
         
     | 
| 
       72 
72 
     | 
    
         
             
                def server_streamer(request: nil, call: nil, method: nil, metadata: nil)
         
     | 
| 
         @@ -80,7 +80,7 @@ module GRPC 
     | 
|
| 
       80 
80 
     | 
    
         
             
                #
         
     | 
| 
       81 
81 
     | 
    
         
             
                # @param [Enumerable] requests
         
     | 
| 
       82 
82 
     | 
    
         
             
                # @param [GRPC::ActiveCall] call
         
     | 
| 
       83 
     | 
    
         
            -
                # @param [ 
     | 
| 
      
 83 
     | 
    
         
            +
                # @param [String] method
         
     | 
| 
       84 
84 
     | 
    
         
             
                # @param [Hash] metadata
         
     | 
| 
       85 
85 
     | 
    
         
             
                #
         
     | 
| 
       86 
86 
     | 
    
         
             
                def bidi_streamer(requests: nil, call: nil, method: nil, metadata: nil)
         
     | 
| 
         @@ -391,22 +391,21 @@ module GRPC 
     | 
|
| 
       391 
391 
     | 
    
         
             
                  # register signal handlers
         
     | 
| 
       392 
392 
     | 
    
         
             
                  signals.each do |sig|
         
     | 
| 
       393 
393 
     | 
    
         
             
                    # input validation
         
     | 
| 
       394 
     | 
    
         
            -
                    if sig.class == String
         
     | 
| 
       395 
     | 
    
         
            -
             
     | 
| 
       396 
     | 
    
         
            -
             
     | 
| 
       397 
     | 
    
         
            -
             
     | 
| 
       398 
     | 
    
         
            -
             
     | 
| 
       399 
     | 
    
         
            -
             
     | 
| 
       400 
     | 
    
         
            -
                    end
         
     | 
| 
      
 394 
     | 
    
         
            +
                    target_sig = if sig.class == String
         
     | 
| 
      
 395 
     | 
    
         
            +
                                   # cut out the SIG prefix to see if valid signal
         
     | 
| 
      
 396 
     | 
    
         
            +
                                   sig.upcase.start_with?('SIG') ? sig.upcase[3..-1] : sig.upcase
         
     | 
| 
      
 397 
     | 
    
         
            +
                                 else
         
     | 
| 
      
 398 
     | 
    
         
            +
                                   sig
         
     | 
| 
      
 399 
     | 
    
         
            +
                                 end
         
     | 
| 
       401 
400 
     | 
    
         | 
| 
       402 
401 
     | 
    
         
             
                    # register signal traps for all valid signals
         
     | 
| 
       403 
     | 
    
         
            -
                    if valid_signals.value?( 
     | 
| 
       404 
     | 
    
         
            -
                      Signal.trap( 
     | 
| 
      
 402 
     | 
    
         
            +
                    if valid_signals.value?(target_sig) || valid_signals.key?(target_sig)
         
     | 
| 
      
 403 
     | 
    
         
            +
                      Signal.trap(target_sig) do
         
     | 
| 
       405 
404 
     | 
    
         
             
                        @stop_server = true
         
     | 
| 
       406 
405 
     | 
    
         
             
                        @stop_server_cv.broadcast
         
     | 
| 
       407 
406 
     | 
    
         
             
                      end
         
     | 
| 
       408 
407 
     | 
    
         
             
                    else
         
     | 
| 
       409 
     | 
    
         
            -
                      fail "#{ 
     | 
| 
      
 408 
     | 
    
         
            +
                      fail "#{target_sig} not a valid signal"
         
     | 
| 
       410 
409 
     | 
    
         
             
                    end
         
     | 
| 
       411 
410 
     | 
    
         
             
                  end
         
     | 
| 
       412 
411 
     | 
    
         | 
| 
         @@ -31,6 +31,7 @@ module GRPC 
     | 
|
| 
       31 
31 
     | 
    
         
             
                #
         
     | 
| 
       32 
32 
     | 
    
         
             
                # @param s [String] the string to be converted.
         
     | 
| 
       33 
33 
     | 
    
         
             
                def self.underscore(s)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  s = +s # Avoid mutating the argument, as it might be frozen.
         
     | 
| 
       34 
35 
     | 
    
         
             
                  s.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
         
     | 
| 
       35 
36 
     | 
    
         
             
                  s.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
         
     | 
| 
       36 
37 
     | 
    
         
             
                  s.tr!('-', '_')
         
     | 
| 
         @@ -167,22 +168,22 @@ module GRPC 
     | 
|
| 
       167 
168 
     | 
    
         
             
                        if desc.request_response?
         
     | 
| 
       168 
169 
     | 
    
         
             
                          define_method(mth_name) do |req, metadata = {}|
         
     | 
| 
       169 
170 
     | 
    
         
             
                            GRPC.logger.debug("calling #{@host}:#{route}")
         
     | 
| 
       170 
     | 
    
         
            -
                            request_response(route, req, marshal, unmarshal, metadata)
         
     | 
| 
      
 171 
     | 
    
         
            +
                            request_response(route, req, marshal, unmarshal, **metadata)
         
     | 
| 
       171 
172 
     | 
    
         
             
                          end
         
     | 
| 
       172 
173 
     | 
    
         
             
                        elsif desc.client_streamer?
         
     | 
| 
       173 
174 
     | 
    
         
             
                          define_method(mth_name) do |reqs, metadata = {}|
         
     | 
| 
       174 
175 
     | 
    
         
             
                            GRPC.logger.debug("calling #{@host}:#{route}")
         
     | 
| 
       175 
     | 
    
         
            -
                            client_streamer(route, reqs, marshal, unmarshal, metadata)
         
     | 
| 
      
 176 
     | 
    
         
            +
                            client_streamer(route, reqs, marshal, unmarshal, **metadata)
         
     | 
| 
       176 
177 
     | 
    
         
             
                          end
         
     | 
| 
       177 
178 
     | 
    
         
             
                        elsif desc.server_streamer?
         
     | 
| 
       178 
179 
     | 
    
         
             
                          define_method(mth_name) do |req, metadata = {}, &blk|
         
     | 
| 
       179 
180 
     | 
    
         
             
                            GRPC.logger.debug("calling #{@host}:#{route}")
         
     | 
| 
       180 
     | 
    
         
            -
                            server_streamer(route, req, marshal, unmarshal, metadata, &blk)
         
     | 
| 
      
 181 
     | 
    
         
            +
                            server_streamer(route, req, marshal, unmarshal, **metadata, &blk)
         
     | 
| 
       181 
182 
     | 
    
         
             
                          end
         
     | 
| 
       182 
183 
     | 
    
         
             
                        else  # is a bidi_stream
         
     | 
| 
       183 
184 
     | 
    
         
             
                          define_method(mth_name) do |reqs, metadata = {}, &blk|
         
     | 
| 
       184 
185 
     | 
    
         
             
                            GRPC.logger.debug("calling #{@host}:#{route}")
         
     | 
| 
       185 
     | 
    
         
            -
                            bidi_streamer(route, reqs, marshal, unmarshal, metadata, &blk)
         
     | 
| 
      
 186 
     | 
    
         
            +
                            bidi_streamer(route, reqs, marshal, unmarshal, **metadata, &blk)
         
     | 
| 
       186 
187 
     | 
    
         
             
                          end
         
     | 
| 
       187 
188 
     | 
    
         
             
                        end
         
     | 
| 
       188 
189 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -14,11 +14,13 @@ 
     | 
|
| 
       14 
14 
     | 
    
         
             
            # limitations under the License.
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
            # Regenerates gRPC service stubs from proto files.
         
     | 
| 
       17 
     | 
    
         
            -
            set  
     | 
| 
      
 17 
     | 
    
         
            +
            set -e
         
     | 
| 
       18 
18 
     | 
    
         
             
            cd $(dirname $0)/../../..
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 20 
     | 
    
         
            +
            # protoc and grpc_*_plugin binaries can be obtained by running
         
     | 
| 
      
 21 
     | 
    
         
            +
            # $ bazel build @com_google_protobuf//:protoc //src/compiler:all
         
     | 
| 
      
 22 
     | 
    
         
            +
            PROTOC=bazel-bin/external/com_google_protobuf/protoc
         
     | 
| 
      
 23 
     | 
    
         
            +
            PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_ruby_plugin
         
     | 
| 
       22 
24 
     | 
    
         | 
| 
       23 
25 
     | 
    
         
             
            $PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \
         
     | 
| 
       24 
26 
     | 
    
         
             
                --grpc_out=src/ruby/pb \
         
     | 
| 
         @@ -34,6 +34,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do 
     | 
|
| 
       34 
34 
     | 
    
         
             
                  optional :oauth_scope, :string, 3
         
     | 
| 
       35 
35 
     | 
    
         
             
                  optional :server_id, :string, 4
         
     | 
| 
       36 
36 
     | 
    
         
             
                  optional :grpclb_route_type, :enum, 5, "grpc.testing.GrpclbRouteType"
         
     | 
| 
      
 37 
     | 
    
         
            +
                  optional :hostname, :string, 6
         
     | 
| 
       37 
38 
     | 
    
         
             
                end
         
     | 
| 
       38 
39 
     | 
    
         
             
                add_message "grpc.testing.StreamingInputCallRequest" do
         
     | 
| 
       39 
40 
     | 
    
         
             
                  optional :payload, :message, 1, "grpc.testing.Payload"
         
     | 
| 
         @@ -63,6 +64,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do 
     | 
|
| 
       63 
64 
     | 
    
         
             
                  optional :passed, :bool, 1
         
     | 
| 
       64 
65 
     | 
    
         
             
                  repeated :backoff_ms, :int32, 2
         
     | 
| 
       65 
66 
     | 
    
         
             
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                add_message "grpc.testing.LoadBalancerStatsRequest" do
         
     | 
| 
      
 68 
     | 
    
         
            +
                  optional :num_rpcs, :int32, 1
         
     | 
| 
      
 69 
     | 
    
         
            +
                  optional :timeout_sec, :int32, 2
         
     | 
| 
      
 70 
     | 
    
         
            +
                end
         
     | 
| 
      
 71 
     | 
    
         
            +
                add_message "grpc.testing.LoadBalancerStatsResponse" do
         
     | 
| 
      
 72 
     | 
    
         
            +
                  map :rpcs_by_peer, :string, :int32, 1
         
     | 
| 
      
 73 
     | 
    
         
            +
                  optional :num_failures, :int32, 2
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
       66 
75 
     | 
    
         
             
                add_enum "grpc.testing.PayloadType" do
         
     | 
| 
       67 
76 
     | 
    
         
             
                  value :COMPRESSABLE, 0
         
     | 
| 
       68 
77 
     | 
    
         
             
                end
         
     | 
| 
         @@ -88,6 +97,8 @@ module Grpc 
     | 
|
| 
       88 
97 
     | 
    
         
             
                StreamingOutputCallResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingOutputCallResponse").msgclass
         
     | 
| 
       89 
98 
     | 
    
         
             
                ReconnectParams = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectParams").msgclass
         
     | 
| 
       90 
99 
     | 
    
         
             
                ReconnectInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectInfo").msgclass
         
     | 
| 
      
 100 
     | 
    
         
            +
                LoadBalancerStatsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsRequest").msgclass
         
     | 
| 
      
 101 
     | 
    
         
            +
                LoadBalancerStatsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsResponse").msgclass
         
     | 
| 
       91 
102 
     | 
    
         
             
                PayloadType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PayloadType").enummodule
         
     | 
| 
       92 
103 
     | 
    
         
             
                GrpclbRouteType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.GrpclbRouteType").enummodule
         
     | 
| 
       93 
104 
     | 
    
         
             
              end
         
     | 
| 
         @@ -96,6 +96,22 @@ module Grpc 
     | 
|
| 
       96 
96 
     | 
    
         
             
                    rpc :Stop, Empty, ReconnectInfo
         
     | 
| 
       97 
97 
     | 
    
         
             
                  end
         
     | 
| 
       98 
98 
     | 
    
         | 
| 
      
 99 
     | 
    
         
            +
                  Stub = Service.rpc_stub_class
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
                module LoadBalancerStatsService
         
     | 
| 
      
 102 
     | 
    
         
            +
                  # A service used to obtain stats for verifying LB behavior.
         
     | 
| 
      
 103 
     | 
    
         
            +
                  class Service
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                    include GRPC::GenericService
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                    self.marshal_class_method = :encode
         
     | 
| 
      
 108 
     | 
    
         
            +
                    self.unmarshal_class_method = :decode
         
     | 
| 
      
 109 
     | 
    
         
            +
                    self.service_name = 'grpc.testing.LoadBalancerStatsService'
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                    # Gets the backend distribution for RPCs sent by a test client.
         
     | 
| 
      
 112 
     | 
    
         
            +
                    rpc :GetClientStats, LoadBalancerStatsRequest, LoadBalancerStatsResponse
         
     | 
| 
      
 113 
     | 
    
         
            +
                  end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
       99 
115 
     | 
    
         
             
                  Stub = Service.rpc_stub_class
         
     | 
| 
       100 
116 
     | 
    
         
             
                end
         
     | 
| 
       101 
117 
     | 
    
         
             
              end
         
     | 
| 
         @@ -0,0 +1,213 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #!/usr/bin/env ruby
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # Copyright 2015 gRPC authors.
         
     | 
| 
      
 4 
     | 
    
         
            +
            #
         
     | 
| 
      
 5 
     | 
    
         
            +
            # Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
      
 6 
     | 
    
         
            +
            # you may not use this file except in compliance with the License.
         
     | 
| 
      
 7 
     | 
    
         
            +
            # You may obtain a copy of the License at
         
     | 
| 
      
 8 
     | 
    
         
            +
            #
         
     | 
| 
      
 9 
     | 
    
         
            +
            #     http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
      
 11 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing, software
         
     | 
| 
      
 12 
     | 
    
         
            +
            # distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
      
 13 
     | 
    
         
            +
            # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
      
 14 
     | 
    
         
            +
            # See the License for the specific language governing permissions and
         
     | 
| 
      
 15 
     | 
    
         
            +
            # limitations under the License.
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            # This is the xDS interop test Ruby client. This is meant to be run by
         
     | 
| 
      
 18 
     | 
    
         
            +
            # the run_xds_tests.py test runner.
         
     | 
| 
      
 19 
     | 
    
         
            +
            #
         
     | 
| 
      
 20 
     | 
    
         
            +
            # Usage: $ tools/run_tests/run_xds_tests.py --test_case=... ...
         
     | 
| 
      
 21 
     | 
    
         
            +
            #    --client_cmd="path/to/xds_client.rb --server=<hostname> \
         
     | 
| 
      
 22 
     | 
    
         
            +
            #                                        --stats_port=<port> \
         
     | 
| 
      
 23 
     | 
    
         
            +
            #                                        --qps=<qps>"
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            # These lines are required for the generated files to load grpc
         
     | 
| 
      
 26 
     | 
    
         
            +
            this_dir = File.expand_path(File.dirname(__FILE__))
         
     | 
| 
      
 27 
     | 
    
         
            +
            lib_dir = File.join(File.dirname(File.dirname(this_dir)), 'lib')
         
     | 
| 
      
 28 
     | 
    
         
            +
            pb_dir = File.dirname(this_dir)
         
     | 
| 
      
 29 
     | 
    
         
            +
            $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
         
     | 
| 
      
 30 
     | 
    
         
            +
            $LOAD_PATH.unshift(pb_dir) unless $LOAD_PATH.include?(pb_dir)
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            require 'optparse'
         
     | 
| 
      
 33 
     | 
    
         
            +
            require 'logger'
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            require_relative '../../lib/grpc'
         
     | 
| 
      
 36 
     | 
    
         
            +
            require 'google/protobuf'
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            require_relative '../src/proto/grpc/testing/empty_pb'
         
     | 
| 
      
 39 
     | 
    
         
            +
            require_relative '../src/proto/grpc/testing/messages_pb'
         
     | 
| 
      
 40 
     | 
    
         
            +
            require_relative '../src/proto/grpc/testing/test_services_pb'
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            # Some global variables to be shared by server and client
         
     | 
| 
      
 43 
     | 
    
         
            +
            $watchers = Array.new
         
     | 
| 
      
 44 
     | 
    
         
            +
            $watchers_mutex = Mutex.new
         
     | 
| 
      
 45 
     | 
    
         
            +
            $watchers_cv = ConditionVariable.new
         
     | 
| 
      
 46 
     | 
    
         
            +
            $shutdown = false
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            # RubyLogger defines a logger for gRPC based on the standard ruby logger.
         
     | 
| 
      
 49 
     | 
    
         
            +
            module RubyLogger
         
     | 
| 
      
 50 
     | 
    
         
            +
              def logger
         
     | 
| 
      
 51 
     | 
    
         
            +
                LOGGER
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              LOGGER = Logger.new(STDOUT)
         
     | 
| 
      
 55 
     | 
    
         
            +
              LOGGER.level = Logger::INFO
         
     | 
| 
      
 56 
     | 
    
         
            +
            end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            # GRPC is the general RPC module
         
     | 
| 
      
 59 
     | 
    
         
            +
            module GRPC
         
     | 
| 
      
 60 
     | 
    
         
            +
              # Inject the noop #logger if no module-level logger method has been injected.
         
     | 
| 
      
 61 
     | 
    
         
            +
              extend RubyLogger
         
     | 
| 
      
 62 
     | 
    
         
            +
            end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            # creates a test stub
         
     | 
| 
      
 65 
     | 
    
         
            +
            def create_stub(opts)
         
     | 
| 
      
 66 
     | 
    
         
            +
              address = "#{opts.server}"
         
     | 
| 
      
 67 
     | 
    
         
            +
              GRPC.logger.info("... connecting insecurely to #{address}")
         
     | 
| 
      
 68 
     | 
    
         
            +
              Grpc::Testing::TestService::Stub.new(
         
     | 
| 
      
 69 
     | 
    
         
            +
                address,
         
     | 
| 
      
 70 
     | 
    
         
            +
                :this_channel_is_insecure,
         
     | 
| 
      
 71 
     | 
    
         
            +
              )
         
     | 
| 
      
 72 
     | 
    
         
            +
            end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            # This implements LoadBalancerStatsService required by the test runner
         
     | 
| 
      
 75 
     | 
    
         
            +
            class TestTarget < Grpc::Testing::LoadBalancerStatsService::Service
         
     | 
| 
      
 76 
     | 
    
         
            +
              include Grpc::Testing
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              def get_client_stats(req, _call)
         
     | 
| 
      
 79 
     | 
    
         
            +
                finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) +
         
     | 
| 
      
 80 
     | 
    
         
            +
                              req['timeout_sec']
         
     | 
| 
      
 81 
     | 
    
         
            +
                watcher = {}
         
     | 
| 
      
 82 
     | 
    
         
            +
                $watchers_mutex.synchronize do
         
     | 
| 
      
 83 
     | 
    
         
            +
                  watcher = {
         
     | 
| 
      
 84 
     | 
    
         
            +
                    "rpcs_by_peer" => Hash.new(0),
         
     | 
| 
      
 85 
     | 
    
         
            +
                    "rpcs_needed" => req['num_rpcs'],
         
     | 
| 
      
 86 
     | 
    
         
            +
                    "no_remote_peer" => 0
         
     | 
| 
      
 87 
     | 
    
         
            +
                  }
         
     | 
| 
      
 88 
     | 
    
         
            +
                  $watchers << watcher
         
     | 
| 
      
 89 
     | 
    
         
            +
                  seconds_remaining = finish_time -
         
     | 
| 
      
 90 
     | 
    
         
            +
                                      Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
      
 91 
     | 
    
         
            +
                  while watcher['rpcs_needed'] > 0 && seconds_remaining > 0
         
     | 
| 
      
 92 
     | 
    
         
            +
                    $watchers_cv.wait($watchers_mutex, seconds_remaining)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    seconds_remaining = finish_time -
         
     | 
| 
      
 94 
     | 
    
         
            +
                                        Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  end
         
     | 
| 
      
 96 
     | 
    
         
            +
                  $watchers.delete_at($watchers.index(watcher))
         
     | 
| 
      
 97 
     | 
    
         
            +
                end
         
     | 
| 
      
 98 
     | 
    
         
            +
                LoadBalancerStatsResponse.new(
         
     | 
| 
      
 99 
     | 
    
         
            +
                  rpcs_by_peer: watcher['rpcs_by_peer'],
         
     | 
| 
      
 100 
     | 
    
         
            +
                  num_failures: watcher['no_remote_peer'] + watcher['rpcs_needed']
         
     | 
| 
      
 101 
     | 
    
         
            +
                );
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
      
 103 
     | 
    
         
            +
            end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
            # send 1 rpc every 1/qps second
         
     | 
| 
      
 106 
     | 
    
         
            +
            def run_test_loop(stub, target_seconds_between_rpcs, fail_on_failed_rpcs)
         
     | 
| 
      
 107 
     | 
    
         
            +
              include Grpc::Testing
         
     | 
| 
      
 108 
     | 
    
         
            +
              req = SimpleRequest.new()
         
     | 
| 
      
 109 
     | 
    
         
            +
              target_next_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
      
 110 
     | 
    
         
            +
              while !$shutdown
         
     | 
| 
      
 111 
     | 
    
         
            +
                now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
         
     | 
| 
      
 112 
     | 
    
         
            +
                sleep_seconds = target_next_start - now
         
     | 
| 
      
 113 
     | 
    
         
            +
                if sleep_seconds < 0
         
     | 
| 
      
 114 
     | 
    
         
            +
                  target_next_start = now + target_seconds_between_rpcs
         
     | 
| 
      
 115 
     | 
    
         
            +
                  GRPC.logger.info(
         
     | 
| 
      
 116 
     | 
    
         
            +
                    "ruby xds: warning, rpc takes too long to finish. " \
         
     | 
| 
      
 117 
     | 
    
         
            +
                    "Deficit = %.1fms. " \
         
     | 
| 
      
 118 
     | 
    
         
            +
                    "If you consistently see this, the qps is too high." \
         
     | 
| 
      
 119 
     | 
    
         
            +
                    % [(sleep_seconds * 1000).abs().round(1)])
         
     | 
| 
      
 120 
     | 
    
         
            +
                else
         
     | 
| 
      
 121 
     | 
    
         
            +
                  target_next_start += target_seconds_between_rpcs
         
     | 
| 
      
 122 
     | 
    
         
            +
                  sleep(sleep_seconds)
         
     | 
| 
      
 123 
     | 
    
         
            +
                end
         
     | 
| 
      
 124 
     | 
    
         
            +
                begin
         
     | 
| 
      
 125 
     | 
    
         
            +
                  deadline = GRPC::Core::TimeConsts::from_relative_time(30) # 30 seconds
         
     | 
| 
      
 126 
     | 
    
         
            +
                  resp = stub.unary_call(req, deadline: deadline)
         
     | 
| 
      
 127 
     | 
    
         
            +
                  remote_peer = resp.hostname
         
     | 
| 
      
 128 
     | 
    
         
            +
                rescue GRPC::BadStatus => e
         
     | 
| 
      
 129 
     | 
    
         
            +
                  remote_peer = ""
         
     | 
| 
      
 130 
     | 
    
         
            +
                  GRPC.logger.info("ruby xds: rpc failed:|#{e.message}|, " \
         
     | 
| 
      
 131 
     | 
    
         
            +
                                   "this may or may not be expected")
         
     | 
| 
      
 132 
     | 
    
         
            +
                  if fail_on_failed_rpcs
         
     | 
| 
      
 133 
     | 
    
         
            +
                    raise e
         
     | 
| 
      
 134 
     | 
    
         
            +
                  end
         
     | 
| 
      
 135 
     | 
    
         
            +
                end
         
     | 
| 
      
 136 
     | 
    
         
            +
                $watchers_mutex.synchronize do
         
     | 
| 
      
 137 
     | 
    
         
            +
                  $watchers.each do |watcher|
         
     | 
| 
      
 138 
     | 
    
         
            +
                    watcher['rpcs_needed'] -= 1
         
     | 
| 
      
 139 
     | 
    
         
            +
                    if remote_peer.strip.empty?
         
     | 
| 
      
 140 
     | 
    
         
            +
                      watcher['no_remote_peer'] += 1
         
     | 
| 
      
 141 
     | 
    
         
            +
                    else
         
     | 
| 
      
 142 
     | 
    
         
            +
                      watcher['rpcs_by_peer'][remote_peer] += 1
         
     | 
| 
      
 143 
     | 
    
         
            +
                    end
         
     | 
| 
      
 144 
     | 
    
         
            +
                  end
         
     | 
| 
      
 145 
     | 
    
         
            +
                  $watchers_cv.broadcast
         
     | 
| 
      
 146 
     | 
    
         
            +
                end
         
     | 
| 
      
 147 
     | 
    
         
            +
              end
         
     | 
| 
      
 148 
     | 
    
         
            +
            end
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
            # Args is used to hold the command line info.
         
     | 
| 
      
 151 
     | 
    
         
            +
            Args = Struct.new(:fail_on_failed_rpcs, :num_channels,
         
     | 
| 
      
 152 
     | 
    
         
            +
                              :server, :stats_port, :qps)
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
            # validates the command line options, returning them as a Hash.
         
     | 
| 
      
 155 
     | 
    
         
            +
            def parse_args
         
     | 
| 
      
 156 
     | 
    
         
            +
              args = Args.new
         
     | 
| 
      
 157 
     | 
    
         
            +
              args['fail_on_failed_rpcs'] = false
         
     | 
| 
      
 158 
     | 
    
         
            +
              args['num_channels'] = 1
         
     | 
| 
      
 159 
     | 
    
         
            +
              OptionParser.new do |opts|
         
     | 
| 
      
 160 
     | 
    
         
            +
                opts.on('--fail_on_failed_rpcs BOOL', ['false', 'true']) do |v|
         
     | 
| 
      
 161 
     | 
    
         
            +
                  args['fail_on_failed_rpcs'] = v == 'true'
         
     | 
| 
      
 162 
     | 
    
         
            +
                end
         
     | 
| 
      
 163 
     | 
    
         
            +
                opts.on('--num_channels CHANNELS', 'number of channels') do |v|
         
     | 
| 
      
 164 
     | 
    
         
            +
                  args['num_channels'] = v.to_i
         
     | 
| 
      
 165 
     | 
    
         
            +
                end
         
     | 
| 
      
 166 
     | 
    
         
            +
                opts.on('--server SERVER_HOST', 'server hostname') do |v|
         
     | 
| 
      
 167 
     | 
    
         
            +
                  GRPC.logger.info("ruby xds: server address is #{v}")
         
     | 
| 
      
 168 
     | 
    
         
            +
                  args['server'] = v
         
     | 
| 
      
 169 
     | 
    
         
            +
                end
         
     | 
| 
      
 170 
     | 
    
         
            +
                opts.on('--stats_port STATS_PORT', 'stats port') do |v|
         
     | 
| 
      
 171 
     | 
    
         
            +
                  GRPC.logger.info("ruby xds: stats port is #{v}")
         
     | 
| 
      
 172 
     | 
    
         
            +
                  args['stats_port'] = v
         
     | 
| 
      
 173 
     | 
    
         
            +
                end
         
     | 
| 
      
 174 
     | 
    
         
            +
                opts.on('--qps QPS', 'qps') do |v|
         
     | 
| 
      
 175 
     | 
    
         
            +
                  GRPC.logger.info("ruby xds: qps is #{v}")
         
     | 
| 
      
 176 
     | 
    
         
            +
                  args['qps'] = v
         
     | 
| 
      
 177 
     | 
    
         
            +
                end
         
     | 
| 
      
 178 
     | 
    
         
            +
              end.parse!
         
     | 
| 
      
 179 
     | 
    
         
            +
              args
         
     | 
| 
      
 180 
     | 
    
         
            +
            end
         
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
            def main
         
     | 
| 
      
 183 
     | 
    
         
            +
              opts = parse_args
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
              # This server hosts the LoadBalancerStatsService
         
     | 
| 
      
 186 
     | 
    
         
            +
              host = "0.0.0.0:#{opts['stats_port']}"
         
     | 
| 
      
 187 
     | 
    
         
            +
              s = GRPC::RpcServer.new
         
     | 
| 
      
 188 
     | 
    
         
            +
              s.add_http2_port(host, :this_port_is_insecure)
         
     | 
| 
      
 189 
     | 
    
         
            +
              s.handle(TestTarget)
         
     | 
| 
      
 190 
     | 
    
         
            +
              server_thread = Thread.new {
         
     | 
| 
      
 191 
     | 
    
         
            +
                # run the server until the main test runner terminates this process
         
     | 
| 
      
 192 
     | 
    
         
            +
                s.run_till_terminated_or_interrupted(['TERM'])
         
     | 
| 
      
 193 
     | 
    
         
            +
              }
         
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
              # The client just sends unary rpcs continuously in a regular interval
         
     | 
| 
      
 196 
     | 
    
         
            +
              stub = create_stub(opts)
         
     | 
| 
      
 197 
     | 
    
         
            +
              target_seconds_between_rpcs = (1.0 / opts['qps'].to_f)
         
     | 
| 
      
 198 
     | 
    
         
            +
              client_threads = Array.new
         
     | 
| 
      
 199 
     | 
    
         
            +
              opts['num_channels'].times {
         
     | 
| 
      
 200 
     | 
    
         
            +
                client_threads << Thread.new {
         
     | 
| 
      
 201 
     | 
    
         
            +
                  run_test_loop(stub, target_seconds_between_rpcs,
         
     | 
| 
      
 202 
     | 
    
         
            +
                                opts['fail_on_failed_rpcs'])
         
     | 
| 
      
 203 
     | 
    
         
            +
                }
         
     | 
| 
      
 204 
     | 
    
         
            +
              }
         
     | 
| 
      
 205 
     | 
    
         
            +
             
     | 
| 
      
 206 
     | 
    
         
            +
              server_thread.join
         
     | 
| 
      
 207 
     | 
    
         
            +
              $shutdown = true
         
     | 
| 
      
 208 
     | 
    
         
            +
              client_threads.each { |thd| thd.join }
         
     | 
| 
      
 209 
     | 
    
         
            +
            end
         
     | 
| 
      
 210 
     | 
    
         
            +
             
     | 
| 
      
 211 
     | 
    
         
            +
            if __FILE__ == $0
         
     | 
| 
      
 212 
     | 
    
         
            +
              main
         
     | 
| 
      
 213 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,134 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Copyright 2015 gRPC authors.
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            # Licensed under the Apache License, Version 2.0 (the "License");
         
     | 
| 
      
 4 
     | 
    
         
            +
            # you may not use this file except in compliance with the License.
         
     | 
| 
      
 5 
     | 
    
         
            +
            # You may obtain a copy of the License at
         
     | 
| 
      
 6 
     | 
    
         
            +
            #
         
     | 
| 
      
 7 
     | 
    
         
            +
            #     http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 8 
     | 
    
         
            +
            #
         
     | 
| 
      
 9 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing, software
         
     | 
| 
      
 10 
     | 
    
         
            +
            # distributed under the License is distributed on an "AS IS" BASIS,
         
     | 
| 
      
 11 
     | 
    
         
            +
            # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         
     | 
| 
      
 12 
     | 
    
         
            +
            # See the License for the specific language governing permissions and
         
     | 
| 
      
 13 
     | 
    
         
            +
            # limitations under the License.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            TEST_DEBUG_MESSAGE = 'raised by test server'.freeze
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            # a test service that checks the cert of its peer
         
     | 
| 
      
 20 
     | 
    
         
            +
            class DebugMessageTestService
         
     | 
| 
      
 21 
     | 
    
         
            +
              include GRPC::GenericService
         
     | 
| 
      
 22 
     | 
    
         
            +
              rpc :an_rpc_raises_abort, EchoMsg, EchoMsg
         
     | 
| 
      
 23 
     | 
    
         
            +
              rpc :an_rpc_raises_standarderror, EchoMsg, EchoMsg
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
              def an_rpc_raises_abort(_req, _call)
         
     | 
| 
      
 26 
     | 
    
         
            +
                fail GRPC::Aborted.new(
         
     | 
| 
      
 27 
     | 
    
         
            +
                  'aborted',
         
     | 
| 
      
 28 
     | 
    
         
            +
                  {},
         
     | 
| 
      
 29 
     | 
    
         
            +
                  TEST_DEBUG_MESSAGE)
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              def an_rpc_raises_standarderror(_req, _call)
         
     | 
| 
      
 33 
     | 
    
         
            +
                fail(StandardError, TEST_DEBUG_MESSAGE)
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            DebugMessageTestServiceStub = DebugMessageTestService.rpc_stub_class
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            describe 'surfacing and transmitting of debug messages' do
         
     | 
| 
      
 40 
     | 
    
         
            +
              RpcServer = GRPC::RpcServer
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              before(:all) do
         
     | 
| 
      
 43 
     | 
    
         
            +
                server_opts = {
         
     | 
| 
      
 44 
     | 
    
         
            +
                  poll_period: 1
         
     | 
| 
      
 45 
     | 
    
         
            +
                }
         
     | 
| 
      
 46 
     | 
    
         
            +
                @srv = new_rpc_server_for_testing(**server_opts)
         
     | 
| 
      
 47 
     | 
    
         
            +
                @port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
         
     | 
| 
      
 48 
     | 
    
         
            +
                @srv.handle(DebugMessageTestService)
         
     | 
| 
      
 49 
     | 
    
         
            +
                @srv_thd = Thread.new { @srv.run }
         
     | 
| 
      
 50 
     | 
    
         
            +
                @srv.wait_till_running
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              after(:all) do
         
     | 
| 
      
 54 
     | 
    
         
            +
                expect(@srv.stopped?).to be(false)
         
     | 
| 
      
 55 
     | 
    
         
            +
                @srv.stop
         
     | 
| 
      
 56 
     | 
    
         
            +
                @srv_thd.join
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              it 'debug error message is not present BadStatus exceptions that dont set it' do
         
     | 
| 
      
 60 
     | 
    
         
            +
                exception_message = ''
         
     | 
| 
      
 61 
     | 
    
         
            +
                begin
         
     | 
| 
      
 62 
     | 
    
         
            +
                  fail GRPC::Unavailable('unavailable', {})
         
     | 
| 
      
 63 
     | 
    
         
            +
                rescue StandardError => e
         
     | 
| 
      
 64 
     | 
    
         
            +
                  p "Got exception: #{e.message}"
         
     | 
| 
      
 65 
     | 
    
         
            +
                  exception_message = e.message
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                expect(exception_message.empty?).to be(false)
         
     | 
| 
      
 68 
     | 
    
         
            +
                expect(exception_message.include?('debug_error_string')).to be(false)
         
     | 
| 
      
 69 
     | 
    
         
            +
              end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
              it 'debug error message is present in locally generated errors' do
         
     | 
| 
      
 72 
     | 
    
         
            +
                # Create a secure channel. This is just one way to force a
         
     | 
| 
      
 73 
     | 
    
         
            +
                # connection handshake error, which shoud result in C-core
         
     | 
| 
      
 74 
     | 
    
         
            +
                # generating a status and error message and surfacing them up.
         
     | 
| 
      
 75 
     | 
    
         
            +
                test_root = File.join(File.dirname(__FILE__), 'testdata')
         
     | 
| 
      
 76 
     | 
    
         
            +
                files = ['ca.pem', 'client.key', 'client.pem']
         
     | 
| 
      
 77 
     | 
    
         
            +
                creds = files.map { |f| File.open(File.join(test_root, f)).read }
         
     | 
| 
      
 78 
     | 
    
         
            +
                creds = GRPC::Core::ChannelCredentials.new(creds[0], creds[1], creds[2])
         
     | 
| 
      
 79 
     | 
    
         
            +
                stub = DebugMessageTestServiceStub.new(
         
     | 
| 
      
 80 
     | 
    
         
            +
                  "localhost:#{@port}", creds)
         
     | 
| 
      
 81 
     | 
    
         
            +
                begin
         
     | 
| 
      
 82 
     | 
    
         
            +
                  stub.an_rpc_raises_abort(EchoMsg.new)
         
     | 
| 
      
 83 
     | 
    
         
            +
                rescue StandardError => e
         
     | 
| 
      
 84 
     | 
    
         
            +
                  p "Got exception: #{e.message}"
         
     | 
| 
      
 85 
     | 
    
         
            +
                  exception_message = e.message
         
     | 
| 
      
 86 
     | 
    
         
            +
                  # check that the RPC did actually result in a BadStatus exception
         
     | 
| 
      
 87 
     | 
    
         
            +
                  expect(e.is_a?(GRPC::BadStatus)).to be(true)
         
     | 
| 
      
 88 
     | 
    
         
            +
                end
         
     | 
| 
      
 89 
     | 
    
         
            +
                # just check that the debug_error_string is non-empty (we know that
         
     | 
| 
      
 90 
     | 
    
         
            +
                # it's a JSON object, so the first character is '{').
         
     | 
| 
      
 91 
     | 
    
         
            +
                expect(exception_message.include?('. debug_error_string:{')).to be(true)
         
     | 
| 
      
 92 
     | 
    
         
            +
              end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              it 'debug message is not transmitted from server to client' do
         
     | 
| 
      
 95 
     | 
    
         
            +
                # in order to not accidentally leak internal details about a
         
     | 
| 
      
 96 
     | 
    
         
            +
                # server to untrusted clients, avoid including the debug_error_string
         
     | 
| 
      
 97 
     | 
    
         
            +
                # field of a BadStatusException raised at a server in the
         
     | 
| 
      
 98 
     | 
    
         
            +
                # RPC status that it sends to clients.
         
     | 
| 
      
 99 
     | 
    
         
            +
                stub = DebugMessageTestServiceStub.new(
         
     | 
| 
      
 100 
     | 
    
         
            +
                  "localhost:#{@port}", :this_channel_is_insecure)
         
     | 
| 
      
 101 
     | 
    
         
            +
                exception_message = ''
         
     | 
| 
      
 102 
     | 
    
         
            +
                begin
         
     | 
| 
      
 103 
     | 
    
         
            +
                  stub.an_rpc_raises_abort(EchoMsg.new)
         
     | 
| 
      
 104 
     | 
    
         
            +
                rescue StandardError => e
         
     | 
| 
      
 105 
     | 
    
         
            +
                  p "Got exception: #{e.message}"
         
     | 
| 
      
 106 
     | 
    
         
            +
                  exception_message = e.message
         
     | 
| 
      
 107 
     | 
    
         
            +
                  # check that the status was aborted is an indirect way to
         
     | 
| 
      
 108 
     | 
    
         
            +
                  # tell that the RPC did actually get handled by the server
         
     | 
| 
      
 109 
     | 
    
         
            +
                  expect(e.is_a?(GRPC::Aborted)).to be(true)
         
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
                # just assert that the contents of the server-side BadStatus
         
     | 
| 
      
 112 
     | 
    
         
            +
                # debug_error_string field were *not* propagated to the client.
         
     | 
| 
      
 113 
     | 
    
         
            +
                expect(exception_message.include?('. debug_error_string:{')).to be(true)
         
     | 
| 
      
 114 
     | 
    
         
            +
                expect(exception_message.include?(TEST_DEBUG_MESSAGE)).to be(false)
         
     | 
| 
      
 115 
     | 
    
         
            +
              end
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
              it 'standard_error messages are transmitted from server to client' do
         
     | 
| 
      
 118 
     | 
    
         
            +
                # this test exists mostly in order to understand the test case
         
     | 
| 
      
 119 
     | 
    
         
            +
                # above, by comparison.
         
     | 
| 
      
 120 
     | 
    
         
            +
                stub = DebugMessageTestServiceStub.new(
         
     | 
| 
      
 121 
     | 
    
         
            +
                  "localhost:#{@port}", :this_channel_is_insecure)
         
     | 
| 
      
 122 
     | 
    
         
            +
                exception_message = ''
         
     | 
| 
      
 123 
     | 
    
         
            +
                begin
         
     | 
| 
      
 124 
     | 
    
         
            +
                  stub.an_rpc_raises_standarderror(EchoMsg.new)
         
     | 
| 
      
 125 
     | 
    
         
            +
                rescue StandardError => e
         
     | 
| 
      
 126 
     | 
    
         
            +
                  p "Got exception: #{e.message}"
         
     | 
| 
      
 127 
     | 
    
         
            +
                  exception_message = e.message
         
     | 
| 
      
 128 
     | 
    
         
            +
                  expect(e.is_a?(GRPC::BadStatus)).to be(true)
         
     | 
| 
      
 129 
     | 
    
         
            +
                end
         
     | 
| 
      
 130 
     | 
    
         
            +
                # assert that the contents of the StandardError exception message
         
     | 
| 
      
 131 
     | 
    
         
            +
                # are propagated to the client.
         
     | 
| 
      
 132 
     | 
    
         
            +
                expect(exception_message.include?(TEST_DEBUG_MESSAGE)).to be(true)
         
     | 
| 
      
 133 
     | 
    
         
            +
              end
         
     | 
| 
      
 134 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -55,6 +55,8 @@ describe GenericService do 
     | 
|
| 
       55 
55 
     | 
    
         
             
                  expect(GenericService.underscore('AMethod')).to eq('a_method')
         
     | 
| 
       56 
56 
     | 
    
         
             
                  expect(GenericService.underscore('PrintHTML')).to eq('print_html')
         
     | 
| 
       57 
57 
     | 
    
         
             
                  expect(GenericService.underscore('SeeHTMLBooks')).to eq('see_html_books')
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                  expect(GenericService.underscore('SeeHTMLBooks'.freeze)).to eq('see_html_books')
         
     | 
| 
       58 
60 
     | 
    
         
             
                end
         
     | 
| 
       59 
61 
     | 
    
         
             
              end
         
     | 
| 
       60 
62 
     | 
    
         | 
| 
         @@ -27,8 +27,13 @@ message AnotherTestResponse { } 
     | 
|
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
            message Foo { }
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
      
 30 
     | 
    
         
            +
            message Bar {
         
     | 
| 
      
 31 
     | 
    
         
            +
              message Baz { }
         
     | 
| 
      
 32 
     | 
    
         
            +
            }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
       30 
34 
     | 
    
         
             
            service AnotherTestService {
         
     | 
| 
       31 
35 
     | 
    
         
             
              rpc GetTest(AnotherTestRequest) returns (AnotherTestResponse) { }
         
     | 
| 
       32 
36 
     | 
    
         
             
              rpc OtherTest(Thing) returns (Thing) { }
         
     | 
| 
       33 
37 
     | 
    
         
             
              rpc FooTest(Foo) returns (Foo) { }
         
     | 
| 
      
 38 
     | 
    
         
            +
              rpc NestedMessageTest(Foo) returns (Bar.Baz) { }
         
     | 
| 
       34 
39 
     | 
    
         
             
            }
         
     | 
| 
         @@ -40,6 +40,8 @@ describe 'Code Generation Options' do 
     | 
|
| 
       40 
40 
     | 
    
         
             
                  expect(services[:OtherTest].output).to eq(A::Other::Thing)
         
     | 
| 
       41 
41 
     | 
    
         
             
                  expect(services[:FooTest].input).to eq(RPC::Test::New::Package::Options::Foo)
         
     | 
| 
       42 
42 
     | 
    
         
             
                  expect(services[:FooTest].output).to eq(RPC::Test::New::Package::Options::Foo)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  expect(services[:NestedMessageTest].input).to eq(RPC::Test::New::Package::Options::Foo)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  expect(services[:NestedMessageTest].output).to eq(RPC::Test::New::Package::Options::Bar::Baz)
         
     | 
| 
       43 
45 
     | 
    
         
             
                end
         
     | 
| 
       44 
46 
     | 
    
         
             
              end
         
     | 
| 
       45 
47 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,15 +1,20 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            -----BEGIN CERTIFICATE-----
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            + 
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL
         
     | 
| 
      
 3 
     | 
    
         
            +
            BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
         
     | 
| 
      
 4 
     | 
    
         
            +
            GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw
         
     | 
| 
      
 5 
     | 
    
         
            +
            MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV
         
     | 
| 
      
 6 
     | 
    
         
            +
            BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
         
     | 
| 
      
 7 
     | 
    
         
            +
            ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
         
     | 
| 
      
 8 
     | 
    
         
            +
            AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01
         
     | 
| 
      
 9 
     | 
    
         
            +
            diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO
         
     | 
| 
      
 10 
     | 
    
         
            +
            Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k
         
     | 
| 
      
 11 
     | 
    
         
            +
            QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c
         
     | 
| 
      
 12 
     | 
    
         
            +
            qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV
         
     | 
| 
      
 13 
     | 
    
         
            +
            LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud
         
     | 
| 
      
 14 
     | 
    
         
            +
            DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a
         
     | 
| 
      
 15 
     | 
    
         
            +
            THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S
         
     | 
| 
      
 16 
     | 
    
         
            +
            CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9
         
     | 
| 
      
 17 
     | 
    
         
            +
            /OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt
         
     | 
| 
      
 18 
     | 
    
         
            +
            bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw
         
     | 
| 
      
 19 
     | 
    
         
            +
            eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw==
         
     | 
| 
       15 
20 
     | 
    
         
             
            -----END CERTIFICATE-----
         
     | 
| 
         @@ -1,16 +1,28 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            -----BEGIN PRIVATE KEY-----
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyqYRp+DXVp72N
         
     | 
| 
      
 3 
     | 
    
         
            +
            FbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBGZV+ELiHrmCX5zfaI
         
     | 
| 
      
 4 
     | 
    
         
            +
            Lr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+Ag3KzKTyerXWjKcvy
         
     | 
| 
      
 5 
     | 
    
         
            +
            KVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHOxzRVSYeYLYp5Yn7K
         
     | 
| 
      
 6 
     | 
    
         
            +
            rtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABYJMyrbNhHUQfv0fza
         
     | 
| 
      
 7 
     | 
    
         
            +
            Z0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukRFiPxWBJhjHQ70GqT
         
     | 
| 
      
 8 
     | 
    
         
            +
            FQY19RbhAgMBAAECggEAIL8JUhL4awyvpWhQ8xPgTSlWwbEn8BE0TacJnCILuhNM
         
     | 
| 
      
 9 
     | 
    
         
            +
            BRdf8LlRk/8PKQwVpVF3TFbYSMI+U6b4hMVssfv3HVQc/083dHq+3XOwUCVlUstR
         
     | 
| 
      
 10 
     | 
    
         
            +
            SAzTE2E5EDMr1stdh0SQhV4Nilfos9s5Uk1Z6IGSztoz1GgOErIc/mGPy/aA/hbr
         
     | 
| 
      
 11 
     | 
    
         
            +
            fRWHvTp35+MbCJSvZuOeevX2iLs0dNzqdk6DiOWIH/BVGirVPtO6ykrkuTj1FWiN
         
     | 
| 
      
 12 
     | 
    
         
            +
            hyZ3MBChShlNH2poNX46ntOc7nEus0qteOgxBK8lummFEtlehCA7hd/8xuvYlP0k
         
     | 
| 
      
 13 
     | 
    
         
            +
            7aN684LCRDajmAGpoZO57NSDYQhAFGZeUZ93SMFucQKBgQDe7GGkzZFEiv91u1q9
         
     | 
| 
      
 14 
     | 
    
         
            +
            lgMy1h5dZjIZKgQaOarPC6wCQMUdqCf6cSLsAPr4T8EDoWsnY7dSnrTZ6YCIFL1T
         
     | 
| 
      
 15 
     | 
    
         
            +
            idg8M3BQXipICCJkFORS76pKKZ0wMn3/NgkSepsmNct91WHr6okvx4tOaoRCtdzU
         
     | 
| 
      
 16 
     | 
    
         
            +
            g7jt4Mr3sfLCiZtqTQyySdMUEwKBgQDNK+ZFKL0XhkWZP+PGKjWG8LWpPiK3d78/
         
     | 
| 
      
 17 
     | 
    
         
            +
            wYBFXzSTGlkr6FvRmYtZeNwXWRYLB4UxZ9At4hbJVEdi/2dITOz/sehVDyCAjjs3
         
     | 
| 
      
 18 
     | 
    
         
            +
            gycsc3UJqiZbcw5XKhI5TWBuWxkKENdbMSayogVbp2aSYoRblH764//t0ACmbfTW
         
     | 
| 
      
 19 
     | 
    
         
            +
            KUQRQPB/uwKBgQC5QjjjfPL8w4cJkGoYpFKELO2PMR7xSrmeEc6hwlFwjeNCgjy3
         
     | 
| 
      
 20 
     | 
    
         
            +
            JM6g0y++rIj7O2qRkY0IXFxvvF3UuWedxTCu1xC/uYHp2ti506LsScB7YZoAM/YB
         
     | 
| 
      
 21 
     | 
    
         
            +
            4iYn9Tx6xLoYGP0H0iGwU2SyBlNkHT8oXU+SYP5MWtYkVbeS3/VtNWz1gQKBgQCA
         
     | 
| 
      
 22 
     | 
    
         
            +
            6Nk4kN0mH7YxEKRzSOfyzeDF4oV7kuB2FYUbkTL+TirC3K58JiYY5Egc31trOKFm
         
     | 
| 
      
 23 
     | 
    
         
            +
            Jlz1xz0b6DkmKWTiV3r9OPHKJ8P7IeJxAZWmZzCdDuwkv0i+WW+z0zsIe3JjEavN
         
     | 
| 
      
 24 
     | 
    
         
            +
            3zb6O7R0HtziksWoqMeTqZeO+wa9iw6vVKQw1wWEqwKBgFHfahFs0DZ5cUTpGpBt
         
     | 
| 
      
 25 
     | 
    
         
            +
            F/AQG7ukgipB6N6AkB9kDbgCs1FLgd199MQrEncug5hfpq8QerbyMatmA+GXoGMb
         
     | 
| 
      
 26 
     | 
    
         
            +
            7vztKEH85yzp4n02FNL6H7xL4VVILvyZHdolmiORJ4qT2hZnl8pEQ2TYuF4RlHUd
         
     | 
| 
      
 27 
     | 
    
         
            +
            nSwXX+2o0J/nF85fm4AwWKAc
         
     | 
| 
       16 
28 
     | 
    
         
             
            -----END PRIVATE KEY-----
         
     | 
| 
         @@ -1,14 +1,20 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            -----BEGIN CERTIFICATE-----
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            MIIDNzCCAh8CFGyX00RCepOv/qCJ1oVdTtY92U83MA0GCSqGSIb3DQEBCwUAMFYx
         
     | 
| 
      
 3 
     | 
    
         
            +
            CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
         
     | 
| 
      
 4 
     | 
    
         
            +
            cm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBnRlc3RjYTAeFw0yMDAzMTgw
         
     | 
| 
      
 5 
     | 
    
         
            +
            MTA2MTBaFw0zMDAzMTYwMTA2MTBaMFoxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApT
         
     | 
| 
      
 6 
     | 
    
         
            +
            b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEzAR
         
     | 
| 
      
 7 
     | 
    
         
            +
            BgNVBAMMCnRlc3RjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
         
     | 
| 
      
 8 
     | 
    
         
            +
            AQCyqYRp+DXVp72NFbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBG
         
     | 
| 
      
 9 
     | 
    
         
            +
            ZV+ELiHrmCX5zfaILr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+A
         
     | 
| 
      
 10 
     | 
    
         
            +
            g3KzKTyerXWjKcvyKVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHO
         
     | 
| 
      
 11 
     | 
    
         
            +
            xzRVSYeYLYp5Yn7KrtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABY
         
     | 
| 
      
 12 
     | 
    
         
            +
            JMyrbNhHUQfv0fzaZ0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukR
         
     | 
| 
      
 13 
     | 
    
         
            +
            FiPxWBJhjHQ70GqTFQY19RbhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFXCewK8
         
     | 
| 
      
 14 
     | 
    
         
            +
            cWT+zWxXyGFnouFSBzTi0BMBJRrhsiNoiQxkqityJHWFExiQZie+7CA+EabXCQUB
         
     | 
| 
      
 15 
     | 
    
         
            +
            +JwMSWM29j3mSw10DTfmC3rhheQqGxy304BZyUpdpvI2dt3p/mcsE7O+p4sQrSep
         
     | 
| 
      
 16 
     | 
    
         
            +
            gijiDssKAfxTAmUM93N6+Q8yJK5immxlbeYfijoBvmkzyB/B+qNRPsx0n7aFGnfv
         
     | 
| 
      
 17 
     | 
    
         
            +
            oWfkW296iPhWLiwknpC3xB6oK3vRbK4Zj1OaGb0grK7VN8EyhBix2xVF61i4dzCK
         
     | 
| 
      
 18 
     | 
    
         
            +
            kMIpl7CUpw1Mb2z8q3F2bHBS7iF7g1Ccn5VGcO+aJ+6PWydaeqJ6VEBF0Nwv9woe
         
     | 
| 
      
 19 
     | 
    
         
            +
            mL5AluNRLaqjZvE=
         
     | 
| 
       14 
20 
     | 
    
         
             
            -----END CERTIFICATE-----
         
     | 
| 
         @@ -1,16 +1,28 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            -----BEGIN PRIVATE KEY-----
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq
         
     | 
| 
      
 3 
     | 
    
         
            +
            6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+
         
     | 
| 
      
 4 
     | 
    
         
            +
            WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t
         
     | 
| 
      
 5 
     | 
    
         
            +
            PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86
         
     | 
| 
      
 6 
     | 
    
         
            +
            qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh
         
     | 
| 
      
 7 
     | 
    
         
            +
            23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte
         
     | 
| 
      
 8 
     | 
    
         
            +
            MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU
         
     | 
| 
      
 9 
     | 
    
         
            +
            koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj
         
     | 
| 
      
 10 
     | 
    
         
            +
            1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5
         
     | 
| 
      
 11 
     | 
    
         
            +
            nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB
         
     | 
| 
      
 12 
     | 
    
         
            +
            8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi
         
     | 
| 
      
 13 
     | 
    
         
            +
            y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t
         
     | 
| 
      
 14 
     | 
    
         
            +
            sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB
         
     | 
| 
      
 15 
     | 
    
         
            +
            gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y
         
     | 
| 
      
 16 
     | 
    
         
            +
            biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC
         
     | 
| 
      
 17 
     | 
    
         
            +
            Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l
         
     | 
| 
      
 18 
     | 
    
         
            +
            dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP
         
     | 
| 
      
 19 
     | 
    
         
            +
            V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp
         
     | 
| 
      
 20 
     | 
    
         
            +
            Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1
         
     | 
| 
      
 21 
     | 
    
         
            +
            QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA
         
     | 
| 
      
 22 
     | 
    
         
            +
            xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys
         
     | 
| 
      
 23 
     | 
    
         
            +
            DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83
         
     | 
| 
      
 24 
     | 
    
         
            +
            FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv
         
     | 
| 
      
 25 
     | 
    
         
            +
            nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH
         
     | 
| 
      
 26 
     | 
    
         
            +
            awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r
         
     | 
| 
      
 27 
     | 
    
         
            +
            uGIYs9Ek7YXlXIRVrzMwcsrt1w==
         
     | 
| 
       16 
28 
     | 
    
         
             
            -----END PRIVATE KEY-----
         
     | 
| 
         @@ -1,16 +1,22 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            -----BEGIN CERTIFICATE-----
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 2 
     | 
    
         
            +
            MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL
         
     | 
| 
      
 3 
     | 
    
         
            +
            BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
         
     | 
| 
      
 4 
     | 
    
         
            +
            GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw
         
     | 
| 
      
 5 
     | 
    
         
            +
            MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV
         
     | 
| 
      
 6 
     | 
    
         
            +
            BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl
         
     | 
| 
      
 7 
     | 
    
         
            +
            LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B
         
     | 
| 
      
 8 
     | 
    
         
            +
            AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz
         
     | 
| 
      
 9 
     | 
    
         
            +
            Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY
         
     | 
| 
      
 10 
     | 
    
         
            +
            GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe
         
     | 
| 
      
 11 
     | 
    
         
            +
            8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c
         
     | 
| 
      
 12 
     | 
    
         
            +
            6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV
         
     | 
| 
      
 13 
     | 
    
         
            +
            YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV
         
     | 
| 
      
 14 
     | 
    
         
            +
            HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy
         
     | 
| 
      
 15 
     | 
    
         
            +
            ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE
         
     | 
| 
      
 16 
     | 
    
         
            +
            wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv
         
     | 
| 
      
 17 
     | 
    
         
            +
            C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH
         
     | 
| 
      
 18 
     | 
    
         
            +
            Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM
         
     | 
| 
      
 19 
     | 
    
         
            +
            wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr
         
     | 
| 
      
 20 
     | 
    
         
            +
            9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ
         
     | 
| 
      
 21 
     | 
    
         
            +
            gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg==
         
     | 
| 
       16 
22 
     | 
    
         
             
            -----END CERTIFICATE-----
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: grpc
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.30.0.pre1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: x86-mingw32
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - gRPC Authors
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: src/ruby/bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-06-05 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: google-protobuf
         
     | 
| 
         @@ -16,14 +16,14 @@ dependencies: 
     | 
|
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
17 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version: '3. 
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '3.12'
         
     | 
| 
       20 
20 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       21 
21 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
22 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
23 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
24 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version: '3. 
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '3.12'
         
     | 
| 
       27 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
28 
     | 
    
         
             
              name: googleapis-common-protos-types
         
     | 
| 
       29 
29 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -199,7 +199,7 @@ dependencies: 
     | 
|
| 
       199 
199 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       200 
200 
     | 
    
         
             
                    version: '0.10'
         
     | 
| 
       201 
201 
     | 
    
         
             
            description: Send RPCs from Ruby using GRPC
         
     | 
| 
       202 
     | 
    
         
            -
            email:  
     | 
| 
      
 202 
     | 
    
         
            +
            email: grpc-io@googlegroups.com
         
     | 
| 
       203 
203 
     | 
    
         
             
            executables: []
         
     | 
| 
       204 
204 
     | 
    
         
             
            extensions: []
         
     | 
| 
       205 
205 
     | 
    
         
             
            extra_rdoc_files: []
         
     | 
| 
         @@ -282,6 +282,7 @@ files: 
     | 
|
| 
       282 
282 
     | 
    
         
             
            - src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb
         
     | 
| 
       283 
283 
     | 
    
         
             
            - src/ruby/pb/test/client.rb
         
     | 
| 
       284 
284 
     | 
    
         
             
            - src/ruby/pb/test/server.rb
         
     | 
| 
      
 285 
     | 
    
         
            +
            - src/ruby/pb/test/xds_client.rb
         
     | 
| 
       285 
286 
     | 
    
         
             
            - src/ruby/spec/call_credentials_spec.rb
         
     | 
| 
       286 
287 
     | 
    
         
             
            - src/ruby/spec/call_spec.rb
         
     | 
| 
       287 
288 
     | 
    
         
             
            - src/ruby/spec/channel_connection_spec.rb
         
     | 
| 
         @@ -290,6 +291,7 @@ files: 
     | 
|
| 
       290 
291 
     | 
    
         
             
            - src/ruby/spec/client_auth_spec.rb
         
     | 
| 
       291 
292 
     | 
    
         
             
            - src/ruby/spec/client_server_spec.rb
         
     | 
| 
       292 
293 
     | 
    
         
             
            - src/ruby/spec/compression_options_spec.rb
         
     | 
| 
      
 294 
     | 
    
         
            +
            - src/ruby/spec/debug_message_spec.rb
         
     | 
| 
       293 
295 
     | 
    
         
             
            - src/ruby/spec/error_sanity_spec.rb
         
     | 
| 
       294 
296 
     | 
    
         
             
            - src/ruby/spec/errors_spec.rb
         
     | 
| 
       295 
297 
     | 
    
         
             
            - src/ruby/spec/generic/active_call_spec.rb
         
     | 
| 
         @@ -340,50 +342,51 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       340 
342 
     | 
    
         
             
                  version: 2.8.dev
         
     | 
| 
       341 
343 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       342 
344 
     | 
    
         
             
              requirements:
         
     | 
| 
       343 
     | 
    
         
            -
              - - " 
     | 
| 
      
 345 
     | 
    
         
            +
              - - ">"
         
     | 
| 
       344 
346 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       345 
     | 
    
         
            -
                  version:  
     | 
| 
      
 347 
     | 
    
         
            +
                  version: 1.3.1
         
     | 
| 
       346 
348 
     | 
    
         
             
            requirements: []
         
     | 
| 
       347 
     | 
    
         
            -
            rubygems_version: 3.1. 
     | 
| 
      
 349 
     | 
    
         
            +
            rubygems_version: 3.1.4
         
     | 
| 
       348 
350 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       349 
351 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       350 
352 
     | 
    
         
             
            summary: GRPC system in Ruby
         
     | 
| 
       351 
353 
     | 
    
         
             
            test_files:
         
     | 
| 
       352 
354 
     | 
    
         
             
            - src/ruby/spec/time_consts_spec.rb
         
     | 
| 
       353 
355 
     | 
    
         
             
            - src/ruby/spec/client_auth_spec.rb
         
     | 
| 
       354 
     | 
    
         
            -
            - src/ruby/spec/generic/client_stub_spec.rb
         
     | 
| 
       355 
     | 
    
         
            -
            - src/ruby/spec/generic/rpc_desc_spec.rb
         
     | 
| 
       356 
     | 
    
         
            -
            - src/ruby/spec/generic/client_interceptors_spec.rb
         
     | 
| 
       357 
     | 
    
         
            -
            - src/ruby/spec/generic/interceptor_registry_spec.rb
         
     | 
| 
       358 
     | 
    
         
            -
            - src/ruby/spec/generic/service_spec.rb
         
     | 
| 
       359 
     | 
    
         
            -
            - src/ruby/spec/generic/rpc_server_pool_spec.rb
         
     | 
| 
       360 
     | 
    
         
            -
            - src/ruby/spec/generic/active_call_spec.rb
         
     | 
| 
       361 
     | 
    
         
            -
            - src/ruby/spec/generic/rpc_server_spec.rb
         
     | 
| 
       362 
     | 
    
         
            -
            - src/ruby/spec/generic/server_interceptors_spec.rb
         
     | 
| 
       363 
     | 
    
         
            -
            - src/ruby/spec/support/helpers.rb
         
     | 
| 
       364 
     | 
    
         
            -
            - src/ruby/spec/support/services.rb
         
     | 
| 
       365 
356 
     | 
    
         
             
            - src/ruby/spec/spec_helper.rb
         
     | 
| 
       366 
     | 
    
         
            -
            - src/ruby/spec/server_credentials_spec.rb
         
     | 
| 
       367 
     | 
    
         
            -
            - src/ruby/spec/channel_spec.rb
         
     | 
| 
       368 
     | 
    
         
            -
            - src/ruby/spec/call_spec.rb
         
     | 
| 
       369 
     | 
    
         
            -
            - src/ruby/spec/channel_connection_spec.rb
         
     | 
| 
       370 
357 
     | 
    
         
             
            - src/ruby/spec/channel_credentials_spec.rb
         
     | 
| 
      
 358 
     | 
    
         
            +
            - src/ruby/spec/channel_connection_spec.rb
         
     | 
| 
      
 359 
     | 
    
         
            +
            - src/ruby/spec/error_sanity_spec.rb
         
     | 
| 
       371 
360 
     | 
    
         
             
            - src/ruby/spec/client_server_spec.rb
         
     | 
| 
       372 
     | 
    
         
            -
            - src/ruby/spec/compression_options_spec.rb
         
     | 
| 
       373 
     | 
    
         
            -
            - src/ruby/spec/pb/duplicate/codegen_spec.rb
         
     | 
| 
       374 
     | 
    
         
            -
            - src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto
         
     | 
| 
       375 
     | 
    
         
            -
            - src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto
         
     | 
| 
       376 
     | 
    
         
            -
            - src/ruby/spec/pb/codegen/grpc/testing/package_options.proto
         
     | 
| 
       377 
     | 
    
         
            -
            - src/ruby/spec/pb/codegen/package_option_spec.rb
         
     | 
| 
       378 
     | 
    
         
            -
            - src/ruby/spec/pb/health/checker_spec.rb
         
     | 
| 
       379 
     | 
    
         
            -
            - src/ruby/spec/testdata/client.key
         
     | 
| 
       380 
     | 
    
         
            -
            - src/ruby/spec/testdata/server1.pem
         
     | 
| 
       381 
361 
     | 
    
         
             
            - src/ruby/spec/testdata/README
         
     | 
| 
       382 
     | 
    
         
            -
            - src/ruby/spec/testdata/client.pem
         
     | 
| 
       383 
362 
     | 
    
         
             
            - src/ruby/spec/testdata/ca.pem
         
     | 
| 
      
 363 
     | 
    
         
            +
            - src/ruby/spec/testdata/client.pem
         
     | 
| 
      
 364 
     | 
    
         
            +
            - src/ruby/spec/testdata/server1.pem
         
     | 
| 
      
 365 
     | 
    
         
            +
            - src/ruby/spec/testdata/client.key
         
     | 
| 
       384 
366 
     | 
    
         
             
            - src/ruby/spec/testdata/server1.key
         
     | 
| 
       385 
     | 
    
         
            -
            - src/ruby/spec/ 
     | 
| 
       386 
     | 
    
         
            -
            - src/ruby/spec/ 
     | 
| 
      
 367 
     | 
    
         
            +
            - src/ruby/spec/channel_spec.rb
         
     | 
| 
      
 368 
     | 
    
         
            +
            - src/ruby/spec/server_credentials_spec.rb
         
     | 
| 
       387 
369 
     | 
    
         
             
            - src/ruby/spec/google_rpc_status_utils_spec.rb
         
     | 
| 
       388 
     | 
    
         
            -
            - src/ruby/spec/ 
     | 
| 
      
 370 
     | 
    
         
            +
            - src/ruby/spec/debug_message_spec.rb
         
     | 
| 
      
 371 
     | 
    
         
            +
            - src/ruby/spec/pb/codegen/package_option_spec.rb
         
     | 
| 
      
 372 
     | 
    
         
            +
            - src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto
         
     | 
| 
      
 373 
     | 
    
         
            +
            - src/ruby/spec/pb/codegen/grpc/testing/package_options.proto
         
     | 
| 
      
 374 
     | 
    
         
            +
            - src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto
         
     | 
| 
      
 375 
     | 
    
         
            +
            - src/ruby/spec/pb/health/checker_spec.rb
         
     | 
| 
      
 376 
     | 
    
         
            +
            - src/ruby/spec/pb/duplicate/codegen_spec.rb
         
     | 
| 
      
 377 
     | 
    
         
            +
            - src/ruby/spec/errors_spec.rb
         
     | 
| 
      
 378 
     | 
    
         
            +
            - src/ruby/spec/support/helpers.rb
         
     | 
| 
      
 379 
     | 
    
         
            +
            - src/ruby/spec/support/services.rb
         
     | 
| 
      
 380 
     | 
    
         
            +
            - src/ruby/spec/compression_options_spec.rb
         
     | 
| 
       389 
381 
     | 
    
         
             
            - src/ruby/spec/call_credentials_spec.rb
         
     | 
| 
      
 382 
     | 
    
         
            +
            - src/ruby/spec/server_spec.rb
         
     | 
| 
      
 383 
     | 
    
         
            +
            - src/ruby/spec/call_spec.rb
         
     | 
| 
      
 384 
     | 
    
         
            +
            - src/ruby/spec/generic/rpc_server_spec.rb
         
     | 
| 
      
 385 
     | 
    
         
            +
            - src/ruby/spec/generic/client_interceptors_spec.rb
         
     | 
| 
      
 386 
     | 
    
         
            +
            - src/ruby/spec/generic/client_stub_spec.rb
         
     | 
| 
      
 387 
     | 
    
         
            +
            - src/ruby/spec/generic/interceptor_registry_spec.rb
         
     | 
| 
      
 388 
     | 
    
         
            +
            - src/ruby/spec/generic/rpc_desc_spec.rb
         
     | 
| 
      
 389 
     | 
    
         
            +
            - src/ruby/spec/generic/service_spec.rb
         
     | 
| 
      
 390 
     | 
    
         
            +
            - src/ruby/spec/generic/rpc_server_pool_spec.rb
         
     | 
| 
      
 391 
     | 
    
         
            +
            - src/ruby/spec/generic/server_interceptors_spec.rb
         
     | 
| 
      
 392 
     | 
    
         
            +
            - src/ruby/spec/generic/active_call_spec.rb
         
     |