blob: 66053e9ea253272be0c226d6609ce0321a98b8d4 [file] [log] [blame]
Primiano Tucci91cc11d2017-11-14 18:34:24 +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 "base/test/test_task_runner.h"
18#include "gmock/gmock.h"
19#include "gtest/gtest.h"
20#include "ipc/client.h"
21#include "ipc/host.h"
22
Primiano Tucci2ee254a2017-11-15 00:38:48 +000023#include "ipc/src/test/greeter_service.ipc.h"
24#include "ipc/src/test/greeter_service.pb.h"
Primiano Tucci91cc11d2017-11-14 18:34:24 +000025
26namespace ipc_test {
27namespace {
28
29using ::testing::_;
30using ::testing::Invoke;
31using ::perfetto::ipc::AsyncResult;
32using ::perfetto::ipc::Client;
33using ::perfetto::ipc::Deferred;
34using ::perfetto::ipc::Host;
35using ::perfetto::ipc::Service;
36using ::perfetto::ipc::ServiceProxy;
37
38constexpr char kSockName[] = "/tmp/perfetto_ipc_test.sock";
39
40class MockEventListener : public ServiceProxy::EventListener {
41 public:
42 MOCK_METHOD0(OnConnect, void());
43 MOCK_METHOD0(OnDisconnect, void());
44};
45
46class MockGreeterService : public ipc_test::Greeter {
47 public:
48 MOCK_METHOD2(OnSayHello,
49 void(const GreeterRequestMsg&, DeferredGreeterReplyMsg*));
50 void SayHello(const GreeterRequestMsg& request,
51 DeferredGreeterReplyMsg reply) override {
52 OnSayHello(request, &reply);
53 }
54
55 MOCK_METHOD2(OnWaveGoodbye,
56 void(const GreeterRequestMsg&, DeferredGreeterReplyMsg*));
57 void WaveGoodbye(const GreeterRequestMsg& request,
58 DeferredGreeterReplyMsg reply) override {
59 OnWaveGoodbye(request, &reply);
60 }
61};
62
63class IPCIntegrationTest : public ::testing::Test {
64 protected:
65 void SetUp() override { unlink(kSockName); }
66 void TearDown() override { unlink(kSockName); }
67
68 perfetto::base::TestTaskRunner task_runner_;
69 MockEventListener svc_proxy_events_;
70};
71
72TEST_F(IPCIntegrationTest, SayHelloWaveGoodbye) {
73 std::unique_ptr<Host> host = Host::CreateInstance(kSockName, &task_runner_);
74 ASSERT_TRUE(host);
75
76 MockGreeterService* svc = new MockGreeterService();
77 ASSERT_TRUE(host->ExposeService(std::unique_ptr<Service>(svc)));
78
79 auto on_connect = task_runner_.CreateCheckpoint("on_connect");
80 EXPECT_CALL(svc_proxy_events_, OnConnect()).WillOnce(Invoke(on_connect));
81 std::unique_ptr<Client> cli =
82 Client::CreateInstance(kSockName, &task_runner_);
83 std::unique_ptr<GreeterProxy> svc_proxy(new GreeterProxy(&svc_proxy_events_));
84 cli->BindService(svc_proxy->GetWeakPtr());
85 task_runner_.RunUntilCheckpoint("on_connect");
86
87 {
88 GreeterRequestMsg req;
89 req.set_name("Mr Bojangles");
90 auto on_reply = task_runner_.CreateCheckpoint("on_hello_reply");
91 Deferred<GreeterReplyMsg> deferred_reply(
92 [on_reply](AsyncResult<GreeterReplyMsg> reply) {
93 ASSERT_TRUE(reply.success());
94 ASSERT_FALSE(reply.has_more());
95 ASSERT_EQ("Hello Mr Bojangles", reply->message());
96 on_reply();
97 });
98
99 EXPECT_CALL(*svc, OnSayHello(_, _))
100 .WillOnce(Invoke([](const GreeterRequestMsg& host_req,
101 Deferred<GreeterReplyMsg>* host_reply) {
102 auto reply = AsyncResult<GreeterReplyMsg>::Create();
103 reply->set_message("Hello " + host_req.name());
104 host_reply->Resolve(std::move(reply));
105 }));
106 svc_proxy->SayHello(req, std::move(deferred_reply));
107 task_runner_.RunUntilCheckpoint("on_hello_reply");
108 }
109
110 {
111 GreeterRequestMsg req;
112 req.set_name("Mrs Bojangles");
113 auto on_reply = task_runner_.CreateCheckpoint("on_goodbye_reply");
114 Deferred<GreeterReplyMsg> deferred_reply(
115 [on_reply](AsyncResult<GreeterReplyMsg> reply) {
116 ASSERT_TRUE(reply.success());
117 ASSERT_FALSE(reply.has_more());
118 ASSERT_EQ("Goodbye Mrs Bojangles", reply->message());
119 on_reply();
120 });
121
122 EXPECT_CALL(*svc, OnWaveGoodbye(_, _))
123 .WillOnce(Invoke([](const GreeterRequestMsg& host_req,
124 Deferred<GreeterReplyMsg>* host_reply) {
125 auto reply = AsyncResult<GreeterReplyMsg>::Create();
126 reply->set_message("Goodbye " + host_req.name());
127 host_reply->Resolve(std::move(reply));
128 }));
129 svc_proxy->WaveGoodbye(req, std::move(deferred_reply));
130 task_runner_.RunUntilCheckpoint("on_goodbye_reply");
131 }
132}
133
134} // namespace
135} // namespace ipc_test