1*cc02d7e2SAndroid Build Coastguard Worker /*
2*cc02d7e2SAndroid Build Coastguard Worker *
3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2023 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 */
18*cc02d7e2SAndroid Build Coastguard Worker #include <condition_variable>
19*cc02d7e2SAndroid Build Coastguard Worker #include <iostream>
20*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
21*cc02d7e2SAndroid Build Coastguard Worker #include <mutex>
22*cc02d7e2SAndroid Build Coastguard Worker #include <string>
23*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
26*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/parse.h"
27*cc02d7e2SAndroid Build Coastguard Worker
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/grpcpp.h>
29*cc02d7e2SAndroid Build Coastguard Worker
30*cc02d7e2SAndroid Build Coastguard Worker #ifdef BAZEL_BUILD
31*cc02d7e2SAndroid Build Coastguard Worker #include "examples/protos/helloworld.grpc.pb.h"
32*cc02d7e2SAndroid Build Coastguard Worker #include "examples/protos/route_guide.grpc.pb.h"
33*cc02d7e2SAndroid Build Coastguard Worker #else
34*cc02d7e2SAndroid Build Coastguard Worker #include "helloworld.grpc.pb.h"
35*cc02d7e2SAndroid Build Coastguard Worker #include "route_guide.grpc.pb.h"
36*cc02d7e2SAndroid Build Coastguard Worker #endif
37*cc02d7e2SAndroid Build Coastguard Worker
38*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::string, target, "localhost:50051", "Server address");
39*cc02d7e2SAndroid Build Coastguard Worker
40*cc02d7e2SAndroid Build Coastguard Worker using grpc::Channel;
41*cc02d7e2SAndroid Build Coastguard Worker using grpc::ClientContext;
42*cc02d7e2SAndroid Build Coastguard Worker using grpc::Status;
43*cc02d7e2SAndroid Build Coastguard Worker
main(int argc,char ** argv)44*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
45*cc02d7e2SAndroid Build Coastguard Worker absl::ParseCommandLine(argc, argv);
46*cc02d7e2SAndroid Build Coastguard Worker // Instantiate the client. It requires a channel, out of which the actual RPCs
47*cc02d7e2SAndroid Build Coastguard Worker // are created. This channel models a connection to an endpoint specified by
48*cc02d7e2SAndroid Build Coastguard Worker // the argument "--target=" which is the only expected argument.
49*cc02d7e2SAndroid Build Coastguard Worker std::string target_str = absl::GetFlag(FLAGS_target);
50*cc02d7e2SAndroid Build Coastguard Worker // We indicate that the channel isn't authenticated (use of
51*cc02d7e2SAndroid Build Coastguard Worker // InsecureChannelCredentials()).
52*cc02d7e2SAndroid Build Coastguard Worker auto channel =
53*cc02d7e2SAndroid Build Coastguard Worker grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials());
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard Worker std::mutex mu;
56*cc02d7e2SAndroid Build Coastguard Worker std::condition_variable cv;
57*cc02d7e2SAndroid Build Coastguard Worker int done_count = 0;
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Worker // Callbacks will be called on background threads
60*cc02d7e2SAndroid Build Coastguard Worker std::unique_lock<std::mutex> lock(mu);
61*cc02d7e2SAndroid Build Coastguard Worker
62*cc02d7e2SAndroid Build Coastguard Worker ClientContext hello_context;
63*cc02d7e2SAndroid Build Coastguard Worker helloworld::HelloRequest hello_request;
64*cc02d7e2SAndroid Build Coastguard Worker helloworld::HelloReply hello_response;
65*cc02d7e2SAndroid Build Coastguard Worker Status hello_status;
66*cc02d7e2SAndroid Build Coastguard Worker
67*cc02d7e2SAndroid Build Coastguard Worker ClientContext feature_context;
68*cc02d7e2SAndroid Build Coastguard Worker routeguide::Point feature_request;
69*cc02d7e2SAndroid Build Coastguard Worker routeguide::Feature feature_response;
70*cc02d7e2SAndroid Build Coastguard Worker Status feature_status;
71*cc02d7e2SAndroid Build Coastguard Worker // Request to a Greeter service
72*cc02d7e2SAndroid Build Coastguard Worker hello_request.set_name("user");
73*cc02d7e2SAndroid Build Coastguard Worker helloworld::Greeter::NewStub(channel)->async()->SayHello(
74*cc02d7e2SAndroid Build Coastguard Worker &hello_context, &hello_request, &hello_response, [&](Status status) {
75*cc02d7e2SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mu);
76*cc02d7e2SAndroid Build Coastguard Worker done_count++;
77*cc02d7e2SAndroid Build Coastguard Worker hello_status = std::move(status);
78*cc02d7e2SAndroid Build Coastguard Worker cv.notify_all();
79*cc02d7e2SAndroid Build Coastguard Worker });
80*cc02d7e2SAndroid Build Coastguard Worker // Request to a RouteGuide service
81*cc02d7e2SAndroid Build Coastguard Worker feature_request.set_latitude(50);
82*cc02d7e2SAndroid Build Coastguard Worker feature_request.set_longitude(100);
83*cc02d7e2SAndroid Build Coastguard Worker routeguide::RouteGuide::NewStub(channel)->async()->GetFeature(
84*cc02d7e2SAndroid Build Coastguard Worker &feature_context, &feature_request, &feature_response,
85*cc02d7e2SAndroid Build Coastguard Worker [&](Status status) {
86*cc02d7e2SAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mu);
87*cc02d7e2SAndroid Build Coastguard Worker done_count++;
88*cc02d7e2SAndroid Build Coastguard Worker feature_status = std::move(status);
89*cc02d7e2SAndroid Build Coastguard Worker cv.notify_all();
90*cc02d7e2SAndroid Build Coastguard Worker });
91*cc02d7e2SAndroid Build Coastguard Worker // Wait for both requests to finish
92*cc02d7e2SAndroid Build Coastguard Worker cv.wait(lock, [&]() { return done_count == 2; });
93*cc02d7e2SAndroid Build Coastguard Worker if (hello_status.ok()) {
94*cc02d7e2SAndroid Build Coastguard Worker std::cout << "Greeter received: " << hello_response.message() << std::endl;
95*cc02d7e2SAndroid Build Coastguard Worker } else {
96*cc02d7e2SAndroid Build Coastguard Worker std::cerr << "Greeter failed: " << hello_status.error_message()
97*cc02d7e2SAndroid Build Coastguard Worker << std::endl;
98*cc02d7e2SAndroid Build Coastguard Worker }
99*cc02d7e2SAndroid Build Coastguard Worker if (feature_status.ok()) {
100*cc02d7e2SAndroid Build Coastguard Worker std::cout << "Found feature: " << feature_response.name() << std::endl;
101*cc02d7e2SAndroid Build Coastguard Worker } else {
102*cc02d7e2SAndroid Build Coastguard Worker std::cerr << "Getting feature failed: " << feature_status.error_message()
103*cc02d7e2SAndroid Build Coastguard Worker << std::endl;
104*cc02d7e2SAndroid Build Coastguard Worker }
105*cc02d7e2SAndroid Build Coastguard Worker return 0;
106*cc02d7e2SAndroid Build Coastguard Worker }
107