blob: 9a299c30b0eab4f37390b95e201a5a4a336444d3 [file] [log] [blame]
Primiano Tucci4f9b6d72017-12-05 20:59:16 +00001/*
2 * Copyright (C) 2017 The Android Open foo 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"
Primiano Tuccib03ba362017-12-06 09:47:41 +000022#include "src/ipc/test/test_socket.h"
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000023
24#include "src/ipc/test/greeter_service.ipc.h"
25#include "src/ipc/test/greeter_service.pb.h"
26
27namespace ipc_test {
28namespace {
29
30using ::testing::_;
31using ::testing::Invoke;
32using ::perfetto::ipc::AsyncResult;
33using ::perfetto::ipc::Client;
34using ::perfetto::ipc::Deferred;
35using ::perfetto::ipc::Host;
36using ::perfetto::ipc::Service;
37using ::perfetto::ipc::ServiceProxy;
38
Primiano Tuccib03ba362017-12-06 09:47:41 +000039constexpr char kSockName[] = TEST_SOCK_NAME("ipc_integrationtest");
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000040
41class MockEventListener : public ServiceProxy::EventListener {
42 public:
43 MOCK_METHOD0(OnConnect, void());
44 MOCK_METHOD0(OnDisconnect, void());
45};
46
47class MockGreeterService : public ipc_test::Greeter {
48 public:
49 MOCK_METHOD2(OnSayHello,
50 void(const GreeterRequestMsg&, DeferredGreeterReplyMsg*));
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*));
58 void WaveGoodbye(const GreeterRequestMsg& request,
59 DeferredGreeterReplyMsg reply) override {
60 OnWaveGoodbye(request, &reply);
61 }
62};
63
64class IPCIntegrationTest : public ::testing::Test {
65 protected:
Primiano Tuccib03ba362017-12-06 09:47:41 +000066 void SetUp() override { DESTROY_TEST_SOCK(kSockName); }
67 void TearDown() override { DESTROY_TEST_SOCK(kSockName); }
Primiano Tucci4f9b6d72017-12-05 20:59:16 +000068
69 perfetto::base::TestTaskRunner task_runner_;
70 MockEventListener svc_proxy_events_;
71};
72
73TEST_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