xref: /aosp_15_r20/external/grpc-grpc/src/ruby/bin/math_client.rb (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker#!/usr/bin/env ruby
2*cc02d7e2SAndroid Build Coastguard Worker
3*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker#
5*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker#
9*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker#
11*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker
17*cc02d7e2SAndroid Build Coastguard Worker# Sample app that accesses a Calc service running on a Ruby gRPC server and
18*cc02d7e2SAndroid Build Coastguard Worker# helps validate RpcServer as a gRPC server using proto2 serialization.
19*cc02d7e2SAndroid Build Coastguard Worker#
20*cc02d7e2SAndroid Build Coastguard Worker# Usage: $ path/to/math_client.rb
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Workerthis_dir = File.expand_path(File.dirname(__FILE__))
23*cc02d7e2SAndroid Build Coastguard Workerlib_dir = File.join(File.dirname(this_dir), 'lib')
24*cc02d7e2SAndroid Build Coastguard Worker$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
25*cc02d7e2SAndroid Build Coastguard Worker$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir)
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Workerrequire 'grpc'
28*cc02d7e2SAndroid Build Coastguard Workerrequire 'math_services_pb'
29*cc02d7e2SAndroid Build Coastguard Workerrequire 'optparse'
30*cc02d7e2SAndroid Build Coastguard Workerrequire 'logger'
31*cc02d7e2SAndroid Build Coastguard Worker
32*cc02d7e2SAndroid Build Coastguard Workerinclude GRPC::Core::TimeConsts
33*cc02d7e2SAndroid Build Coastguard Worker
34*cc02d7e2SAndroid Build Coastguard Workermodule StdoutLogger
35*cc02d7e2SAndroid Build Coastguard Worker  def logger
36*cc02d7e2SAndroid Build Coastguard Worker    LOGGER
37*cc02d7e2SAndroid Build Coastguard Worker  end
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard Worker  LOGGER = Logger.new(STDOUT)
40*cc02d7e2SAndroid Build Coastguard Workerend
41*cc02d7e2SAndroid Build Coastguard Worker
42*cc02d7e2SAndroid Build Coastguard WorkerGRPC.extend(StdoutLogger)
43*cc02d7e2SAndroid Build Coastguard Worker
44*cc02d7e2SAndroid Build Coastguard Workerdef do_div(stub)
45*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('request_response')
46*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('----------------')
47*cc02d7e2SAndroid Build Coastguard Worker  req = Math::DivArgs.new(dividend: 7, divisor: 3)
48*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info("div(7/3): req=#{req.inspect}")
49*cc02d7e2SAndroid Build Coastguard Worker  resp = stub.div(req)
50*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info("Answer: #{resp.inspect}")
51*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('----------------')
52*cc02d7e2SAndroid Build Coastguard Workerend
53*cc02d7e2SAndroid Build Coastguard Worker
54*cc02d7e2SAndroid Build Coastguard Workerdef do_sum(stub)
55*cc02d7e2SAndroid Build Coastguard Worker  # to make client streaming requests, pass an enumerable of the inputs
56*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('client_streamer')
57*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('---------------')
58*cc02d7e2SAndroid Build Coastguard Worker  reqs = [1, 2, 3, 4, 5].map { |x| Math::Num.new(num: x) }
59*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info("sum(1, 2, 3, 4, 5): reqs=#{reqs.inspect}")
60*cc02d7e2SAndroid Build Coastguard Worker  resp = stub.sum(reqs)  # reqs.is_a?(Enumerable)
61*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info("Answer: #{resp.inspect}")
62*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('---------------')
63*cc02d7e2SAndroid Build Coastguard Workerend
64*cc02d7e2SAndroid Build Coastguard Worker
65*cc02d7e2SAndroid Build Coastguard Workerdef do_fib(stub)
66*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('server_streamer')
67*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('----------------')
68*cc02d7e2SAndroid Build Coastguard Worker  req = Math::FibArgs.new(limit: 11)
69*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info("fib(11): req=#{req.inspect}")
70*cc02d7e2SAndroid Build Coastguard Worker  resp = stub.fib(req)
71*cc02d7e2SAndroid Build Coastguard Worker  resp.each do |r|
72*cc02d7e2SAndroid Build Coastguard Worker    GRPC.logger.info("Answer: #{r.inspect}")
73*cc02d7e2SAndroid Build Coastguard Worker  end
74*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('----------------')
75*cc02d7e2SAndroid Build Coastguard Workerend
76*cc02d7e2SAndroid Build Coastguard Worker
77*cc02d7e2SAndroid Build Coastguard Workerdef do_div_many(stub)
78*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('bidi_streamer')
79*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('-------------')
80*cc02d7e2SAndroid Build Coastguard Worker  reqs = []
81*cc02d7e2SAndroid Build Coastguard Worker  reqs << Math::DivArgs.new(dividend: 7, divisor: 3)
82*cc02d7e2SAndroid Build Coastguard Worker  reqs << Math::DivArgs.new(dividend: 5, divisor: 2)
83*cc02d7e2SAndroid Build Coastguard Worker  reqs << Math::DivArgs.new(dividend: 7, divisor: 2)
84*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info("div(7/3), div(5/2), div(7/2): reqs=#{reqs.inspect}")
85*cc02d7e2SAndroid Build Coastguard Worker  resp = stub.div_many(reqs)
86*cc02d7e2SAndroid Build Coastguard Worker  resp.each do |r|
87*cc02d7e2SAndroid Build Coastguard Worker    GRPC.logger.info("Answer: #{r.inspect}")
88*cc02d7e2SAndroid Build Coastguard Worker  end
89*cc02d7e2SAndroid Build Coastguard Worker  GRPC.logger.info('----------------')
90*cc02d7e2SAndroid Build Coastguard Workerend
91*cc02d7e2SAndroid Build Coastguard Worker
92*cc02d7e2SAndroid Build Coastguard Workerdef load_test_certs
93*cc02d7e2SAndroid Build Coastguard Worker  this_dir = File.expand_path(File.dirname(__FILE__))
94*cc02d7e2SAndroid Build Coastguard Worker  data_dir = File.join(File.dirname(this_dir), 'spec/testdata')
95*cc02d7e2SAndroid Build Coastguard Worker  files = ['ca.pem', 'server1.key', 'server1.pem']
96*cc02d7e2SAndroid Build Coastguard Worker  files.map { |f| File.open(File.join(data_dir, f)).read }
97*cc02d7e2SAndroid Build Coastguard Workerend
98*cc02d7e2SAndroid Build Coastguard Worker
99*cc02d7e2SAndroid Build Coastguard Workerdef test_creds
100*cc02d7e2SAndroid Build Coastguard Worker  certs = load_test_certs
101*cc02d7e2SAndroid Build Coastguard Worker  GRPC::Core::ChannelCredentials.new(certs[0])
102*cc02d7e2SAndroid Build Coastguard Workerend
103*cc02d7e2SAndroid Build Coastguard Worker
104*cc02d7e2SAndroid Build Coastguard Workerdef main
105*cc02d7e2SAndroid Build Coastguard Worker  options = {
106*cc02d7e2SAndroid Build Coastguard Worker    'host' => 'localhost:7071',
107*cc02d7e2SAndroid Build Coastguard Worker    'secure' => false
108*cc02d7e2SAndroid Build Coastguard Worker  }
109*cc02d7e2SAndroid Build Coastguard Worker  OptionParser.new do |opts|
110*cc02d7e2SAndroid Build Coastguard Worker    opts.banner = 'Usage: [--host <hostname>:<port>] [--secure|-s]'
111*cc02d7e2SAndroid Build Coastguard Worker    opts.on('--host HOST', '<hostname>:<port>') do |v|
112*cc02d7e2SAndroid Build Coastguard Worker      options['host'] = v
113*cc02d7e2SAndroid Build Coastguard Worker    end
114*cc02d7e2SAndroid Build Coastguard Worker    opts.on('-s', '--secure', 'access using test creds') do |v|
115*cc02d7e2SAndroid Build Coastguard Worker      options['secure'] = v
116*cc02d7e2SAndroid Build Coastguard Worker    end
117*cc02d7e2SAndroid Build Coastguard Worker  end.parse!
118*cc02d7e2SAndroid Build Coastguard Worker
119*cc02d7e2SAndroid Build Coastguard Worker  # The Math::Math:: module occurs because the service has the same name as its
120*cc02d7e2SAndroid Build Coastguard Worker  # package. That practice should be avoided by defining real services.
121*cc02d7e2SAndroid Build Coastguard Worker  if options['secure']
122*cc02d7e2SAndroid Build Coastguard Worker    stub_opts = {
123*cc02d7e2SAndroid Build Coastguard Worker      :creds => test_creds,
124*cc02d7e2SAndroid Build Coastguard Worker      GRPC::Core::Channel::SSL_TARGET => 'foo.test.google.fr',
125*cc02d7e2SAndroid Build Coastguard Worker      timeout: INFINITE_FUTURE,
126*cc02d7e2SAndroid Build Coastguard Worker    }
127*cc02d7e2SAndroid Build Coastguard Worker    stub = Math::Math::Stub.new(options['host'], **stub_opts)
128*cc02d7e2SAndroid Build Coastguard Worker    GRPC.logger.info("... connecting securely on #{options['host']}")
129*cc02d7e2SAndroid Build Coastguard Worker  else
130*cc02d7e2SAndroid Build Coastguard Worker    stub = Math::Math::Stub.new(options['host'], :this_channel_is_insecure, timeout: INFINITE_FUTURE)
131*cc02d7e2SAndroid Build Coastguard Worker    GRPC.logger.info("... connecting insecurely on #{options['host']}")
132*cc02d7e2SAndroid Build Coastguard Worker  end
133*cc02d7e2SAndroid Build Coastguard Worker
134*cc02d7e2SAndroid Build Coastguard Worker  do_div(stub)
135*cc02d7e2SAndroid Build Coastguard Worker  do_sum(stub)
136*cc02d7e2SAndroid Build Coastguard Worker  do_fib(stub)
137*cc02d7e2SAndroid Build Coastguard Worker  do_div_many(stub)
138*cc02d7e2SAndroid Build Coastguard Workerend
139*cc02d7e2SAndroid Build Coastguard Worker
140*cc02d7e2SAndroid Build Coastguard Workermain
141