client_interceptors_spec.rb 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # Copyright 2017 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. require 'spec_helper'
  15. describe 'Client Interceptors' do
  16. let(:interceptor) { TestClientInterceptor.new }
  17. let(:interceptors_opts) { { interceptors: [interceptor] } }
  18. let(:request) { EchoMsg.new }
  19. let(:service) { EchoService }
  20. before(:each) do
  21. build_rpc_server
  22. end
  23. context 'when a client interceptor is added' do
  24. context 'with a request/response call' do
  25. it 'should be called', server: true do
  26. expect(interceptor).to receive(:request_response)
  27. .once.and_call_original
  28. run_services_on_server(@server, services: [service]) do
  29. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  30. expect_any_instance_of(GRPC::ActiveCall).to receive(:request_response)
  31. .once.and_call_original
  32. expect(stub.an_rpc(request)).to be_a(EchoMsg)
  33. end
  34. end
  35. it 'can modify outgoing metadata', server: true do
  36. expect(interceptor).to receive(:request_response)
  37. .once.and_call_original
  38. run_services_on_server(@server, services: [service]) do
  39. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  40. expect_any_instance_of(GRPC::ActiveCall).to receive(:request_response)
  41. .with(request, metadata: { 'foo' => 'bar_from_request_response' })
  42. .once.and_call_original
  43. expect(stub.an_rpc(request)).to be_a(EchoMsg)
  44. end
  45. end
  46. end
  47. context 'with a client streaming call' do
  48. it 'should be called', server: true do
  49. expect(interceptor).to receive(:client_streamer)
  50. .once.and_call_original
  51. run_services_on_server(@server, services: [service]) do
  52. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  53. expect_any_instance_of(GRPC::ActiveCall).to receive(:client_streamer)
  54. .once.and_call_original
  55. requests = [EchoMsg.new, EchoMsg.new]
  56. expect(stub.a_client_streaming_rpc(requests)).to be_a(EchoMsg)
  57. end
  58. end
  59. it 'can modify outgoing metadata', server: true do
  60. expect(interceptor).to receive(:client_streamer)
  61. .once.and_call_original
  62. run_services_on_server(@server, services: [service]) do
  63. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  64. requests = [EchoMsg.new, EchoMsg.new]
  65. expect_any_instance_of(GRPC::ActiveCall).to receive(:client_streamer)
  66. .with(requests, metadata: { 'foo' => 'bar_from_client_streamer' })
  67. .once.and_call_original
  68. expect(stub.a_client_streaming_rpc(requests)).to be_a(EchoMsg)
  69. end
  70. end
  71. end
  72. context 'with a server streaming call' do
  73. it 'should be called', server: true do
  74. expect(interceptor).to receive(:server_streamer)
  75. .once.and_call_original
  76. run_services_on_server(@server, services: [service]) do
  77. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  78. request = EchoMsg.new
  79. expect_any_instance_of(GRPC::ActiveCall).to receive(:server_streamer)
  80. .once.and_call_original
  81. responses = stub.a_server_streaming_rpc(request)
  82. responses.each do |r|
  83. expect(r).to be_a(EchoMsg)
  84. end
  85. end
  86. end
  87. it 'can modify outgoing metadata', server: true do
  88. expect(interceptor).to receive(:server_streamer)
  89. .once.and_call_original
  90. run_services_on_server(@server, services: [service]) do
  91. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  92. request = EchoMsg.new
  93. expect_any_instance_of(GRPC::ActiveCall).to receive(:server_streamer)
  94. .with(request, metadata: { 'foo' => 'bar_from_server_streamer' })
  95. .once.and_call_original
  96. responses = stub.a_server_streaming_rpc(request)
  97. responses.each do |r|
  98. expect(r).to be_a(EchoMsg)
  99. end
  100. end
  101. end
  102. end
  103. context 'with a bidi call' do
  104. it 'should be called', server: true do
  105. expect(interceptor).to receive(:bidi_streamer)
  106. .once.and_call_original
  107. run_services_on_server(@server, services: [service]) do
  108. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  109. expect_any_instance_of(GRPC::ActiveCall).to receive(:bidi_streamer)
  110. .once.and_call_original
  111. requests = [EchoMsg.new, EchoMsg.new]
  112. responses = stub.a_bidi_rpc(requests)
  113. responses.each do |r|
  114. expect(r).to be_a(EchoMsg)
  115. end
  116. end
  117. end
  118. it 'can modify outgoing metadata', server: true do
  119. expect(interceptor).to receive(:bidi_streamer)
  120. .once.and_call_original
  121. run_services_on_server(@server, services: [service]) do
  122. stub = build_insecure_stub(EchoStub, opts: interceptors_opts)
  123. requests = [EchoMsg.new, EchoMsg.new]
  124. expect_any_instance_of(GRPC::ActiveCall).to receive(:bidi_streamer)
  125. .with(requests, metadata: { 'foo' => 'bar_from_bidi_streamer' })
  126. .once.and_call_original
  127. responses = stub.a_bidi_rpc(requests)
  128. responses.each do |r|
  129. expect(r).to be_a(EchoMsg)
  130. end
  131. end
  132. end
  133. end
  134. end
  135. end