• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "gmock/gmock.h"
18 #include "gtest/gtest.h"
19 #include "perfetto/ipc/client.h"
20 #include "perfetto/ipc/host.h"
21 #include "src/base/test/test_task_runner.h"
22 #include "src/ipc/test/test_socket.h"
23 
24 #include "src/ipc/test/greeter_service.ipc.h"
25 #include "src/ipc/test/greeter_service.pb.h"
26 
27 namespace ipc_test {
28 namespace {
29 
30 using ::testing::_;
31 using ::testing::Invoke;
32 using ::perfetto::ipc::AsyncResult;
33 using ::perfetto::ipc::Client;
34 using ::perfetto::ipc::Deferred;
35 using ::perfetto::ipc::Host;
36 using ::perfetto::ipc::Service;
37 using ::perfetto::ipc::ServiceProxy;
38 
39 constexpr char kSockName[] = TEST_SOCK_NAME("ipc_integrationtest");
40 
41 class MockEventListener : public ServiceProxy::EventListener {
42  public:
43   MOCK_METHOD0(OnConnect, void());
44   MOCK_METHOD0(OnDisconnect, void());
45 };
46 
47 class MockGreeterService : public ipc_test::Greeter {
48  public:
49   MOCK_METHOD2(OnSayHello,
50                void(const GreeterRequestMsg&, DeferredGreeterReplyMsg*));
SayHello(const GreeterRequestMsg & request,DeferredGreeterReplyMsg reply)51   void SayHello(const GreeterRequestMsg& request,
52                 DeferredGreeterReplyMsg reply) override {
53     OnSayHello(request, &reply);
54   }
55 
56   MOCK_METHOD2(OnWaveGoodbye,
57                void(const GreeterRequestMsg&, DeferredGreeterReplyMsg*));
WaveGoodbye(const GreeterRequestMsg & request,DeferredGreeterReplyMsg reply)58   void WaveGoodbye(const GreeterRequestMsg& request,
59                    DeferredGreeterReplyMsg reply) override {
60     OnWaveGoodbye(request, &reply);
61   }
62 };
63 
64 class IPCIntegrationTest : public ::testing::Test {
65  protected:
SetUp()66   void SetUp() override { DESTROY_TEST_SOCK(kSockName); }
TearDown()67   void TearDown() override { DESTROY_TEST_SOCK(kSockName); }
68 
69   perfetto::base::TestTaskRunner task_runner_;
70   MockEventListener svc_proxy_events_;
71 };
72 
TEST_F(IPCIntegrationTest,SayHelloWaveGoodbye)73 TEST_F(IPCIntegrationTest, SayHelloWaveGoodbye) {
74   std::unique_ptr<Host> host = Host::CreateInstance(kSockName, &task_runner_);
75   ASSERT_TRUE(host);
76 
77   MockGreeterService* svc = new MockGreeterService();
78   ASSERT_TRUE(host->ExposeService(std::unique_ptr<Service>(svc)));
79 
80   auto on_connect = task_runner_.CreateCheckpoint("on_connect");
81   EXPECT_CALL(svc_proxy_events_, OnConnect()).WillOnce(Invoke(on_connect));
82   std::unique_ptr<Client> cli =
83       Client::CreateInstance(kSockName, &task_runner_);
84   std::unique_ptr<GreeterProxy> svc_proxy(new GreeterProxy(&svc_proxy_events_));
85   cli->BindService(svc_proxy->GetWeakPtr());
86   task_runner_.RunUntilCheckpoint("on_connect");
87 
88   {
89     GreeterRequestMsg req;
90     req.set_name("Mr Bojangles");
91     auto on_reply = task_runner_.CreateCheckpoint("on_hello_reply");
92     Deferred<GreeterReplyMsg> deferred_reply(
93         [on_reply](AsyncResult<GreeterReplyMsg> reply) {
94           ASSERT_TRUE(reply.success());
95           ASSERT_FALSE(reply.has_more());
96           ASSERT_EQ("Hello Mr Bojangles", reply->message());
97           on_reply();
98         });
99 
100     EXPECT_CALL(*svc, OnSayHello(_, _))
101         .WillOnce(Invoke([](const GreeterRequestMsg& host_req,
102                             Deferred<GreeterReplyMsg>* host_reply) {
103           auto reply = AsyncResult<GreeterReplyMsg>::Create();
104           reply->set_message("Hello " + host_req.name());
105           host_reply->Resolve(std::move(reply));
106         }));
107     svc_proxy->SayHello(req, std::move(deferred_reply));
108     task_runner_.RunUntilCheckpoint("on_hello_reply");
109   }
110 
111   {
112     GreeterRequestMsg req;
113     req.set_name("Mrs Bojangles");
114     auto on_reply = task_runner_.CreateCheckpoint("on_goodbye_reply");
115     Deferred<GreeterReplyMsg> deferred_reply(
116         [on_reply](AsyncResult<GreeterReplyMsg> reply) {
117           ASSERT_TRUE(reply.success());
118           ASSERT_FALSE(reply.has_more());
119           ASSERT_EQ("Goodbye Mrs Bojangles", reply->message());
120           on_reply();
121         });
122 
123     EXPECT_CALL(*svc, OnWaveGoodbye(_, _))
124         .WillOnce(Invoke([](const GreeterRequestMsg& host_req,
125                             Deferred<GreeterReplyMsg>* host_reply) {
126           auto reply = AsyncResult<GreeterReplyMsg>::Create();
127           reply->set_message("Goodbye " + host_req.name());
128           host_reply->Resolve(std::move(reply));
129         }));
130     svc_proxy->WaveGoodbye(req, std::move(deferred_reply));
131     task_runner_.RunUntilCheckpoint("on_goodbye_reply");
132   }
133 }
134 
135 }  // namespace
136 }  // namespace ipc_test
137