blob: 938d73774e8dc94d92fbcbf7fbcbbaf1d464fc6d [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#include <pdx/service.h>
2
3#include <memory>
4#include <string>
5
6#include <gmock/gmock.h>
7#include <pdx/mock_service_endpoint.h>
8
9using android::pdx::BorrowedChannelHandle;
10using android::pdx::BorrowedHandle;
11using android::pdx::Channel;
12using android::pdx::ChannelReference;
13using android::pdx::ErrorStatus;
14using android::pdx::FileReference;
15using android::pdx::LocalChannelHandle;
16using android::pdx::LocalHandle;
17using android::pdx::Message;
18using android::pdx::MessageInfo;
19using android::pdx::MockEndpoint;
20using android::pdx::RemoteChannelHandle;
21using android::pdx::RemoteHandle;
22using android::pdx::Service;
23using android::pdx::Status;
24
25using testing::A;
26using testing::ByMove;
27using testing::DoAll;
28using testing::Invoke;
29using testing::Matcher;
30using testing::Ref;
31using testing::Return;
32using testing::SetArgPointee;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080033using testing::WithArg;
34using testing::WithoutArgs;
35using testing::_;
36
37namespace {
38
39// Helper functions to construct fake void pointers for tests.
40inline void* IntToPtr(intptr_t addr) { return reinterpret_cast<void*>(addr); }
41
42// Helper matchers for working with iovec structures in tests.
43// Simple matcher for one element iovec array:
44// EXPECT_CALL(mock, method(IoVecMatcher(ptr, size)));
45MATCHER_P2(IoVecMatcher, ptr, size, "") {
46 return arg->iov_base == ptr && arg->iov_len == size;
47}
48
49// Matcher for an array of iovecs:
50// EXPECT_CALL(mock,
51// method(IoVecMatcher(IoVecArray{{ptr1, size1}, {ptr2, size2}})));
52using IoVecArray = std::vector<iovec>;
53MATCHER_P(IoVecMatcher, iovec_array, "") {
Haibo Huang21f36552018-07-10 19:48:18 -070054 auto local_arg = arg;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080055 for (const iovec& item : iovec_array) {
Haibo Huang21f36552018-07-10 19:48:18 -070056 if (local_arg->iov_base != item.iov_base || local_arg->iov_len != item.iov_len)
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080057 return false;
Haibo Huang21f36552018-07-10 19:48:18 -070058 local_arg++;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080059 }
60 return true;
61}
62
63using IoVecData = std::vector<std::string>;
64MATCHER_P(IoVecDataMatcher, iovec_data, "") {
Haibo Huang21f36552018-07-10 19:48:18 -070065 auto local_arg = arg;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080066 for (const std::string& item : iovec_data) {
Haibo Huang21f36552018-07-10 19:48:18 -070067 std::string data{reinterpret_cast<const char*>(local_arg->iov_base),
68 local_arg->iov_len};
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080069 if (data != item)
70 return false;
Haibo Huang21f36552018-07-10 19:48:18 -070071 local_arg++;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080072 }
73 return true;
74}
75
76MATCHER_P(FileHandleMatcher, value, "") { return arg.Get() == value; }
77MATCHER_P(ChannelHandleMatcher, value, "") { return arg.value() == value; }
78
79enum : int {
80 kTestPid = 1,
81 kTestTid,
82 kTestCid,
83 kTestMid,
84 kTestEuid,
85 kTestEgid,
86 kTestOp,
87};
88
89class MockService : public Service {
90 public:
91 using Service::Service;
92 MOCK_METHOD1(OnChannelOpen, std::shared_ptr<Channel>(Message& message));
93 MOCK_METHOD2(OnChannelClose,
94 void(Message& message, const std::shared_ptr<Channel>& channel));
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -070095 MOCK_METHOD1(HandleMessage, Status<void>(Message& message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080096 MOCK_METHOD1(HandleImpulse, void(Message& impulse));
97 MOCK_METHOD0(OnSysPropChange, void());
98 MOCK_METHOD1(DumpState, std::string(size_t max_length));
99};
100
101class ServiceTest : public testing::Test {
102 public:
103 ServiceTest() {
104 auto endpoint = std::make_unique<testing::StrictMock<MockEndpoint>>();
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700105 EXPECT_CALL(*endpoint, SetService(_))
106 .Times(2)
107 .WillRepeatedly(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800108 service_ = std::make_shared<MockService>("MockSvc", std::move(endpoint));
109 }
110
111 MockEndpoint* endpoint() {
112 return static_cast<MockEndpoint*>(service_->endpoint());
113 }
114
115 void SetupMessageInfo(MessageInfo* info, int32_t op, bool impulse = false) {
116 info->pid = kTestPid;
117 info->tid = kTestTid;
118 info->cid = kTestCid;
119 info->mid = impulse ? Message::IMPULSE_MESSAGE_ID : kTestMid;
120 info->euid = kTestEuid;
121 info->egid = kTestEgid;
122 info->op = op;
123 info->flags = 0;
124 info->service = service_.get();
125 info->channel = nullptr;
126 info->send_len = 0;
127 info->recv_len = 0;
128 info->fd_count = 0;
129 memset(info->impulse, 0, sizeof(info->impulse));
130 }
131
132 void SetupMessageInfoAndDefaultExpectations(MessageInfo* info, int32_t op,
133 bool impulse = false) {
134 SetupMessageInfo(info, op, impulse);
135 EXPECT_CALL(*endpoint(), AllocateMessageState()).WillOnce(Return(kState));
136 EXPECT_CALL(*endpoint(), FreeMessageState(kState));
137 }
138
139 void ExpectDefaultHandleMessage() {
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700140 EXPECT_CALL(*endpoint(), MessageReply(_, -EOPNOTSUPP))
141 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800142 }
143
144 std::shared_ptr<MockService> service_;
145 void* kState = IntToPtr(123456);
146};
147
148class ServiceMessageTest : public ServiceTest {
149 public:
150 ServiceMessageTest() {
151 MessageInfo info;
152 SetupMessageInfoAndDefaultExpectations(&info, kTestOp);
153 message_ = std::make_unique<Message>(info);
154 }
155
156 std::unique_ptr<Message> message_;
157};
158
159} // anonymous namespace
160
161///////////////////////////////////////////////////////////////////////////////
162// Service class tests
163///////////////////////////////////////////////////////////////////////////////
164
165TEST_F(ServiceTest, IsInitialized) {
166 EXPECT_TRUE(service_->IsInitialized());
167 service_ = std::make_shared<MockService>("MockSvc2", nullptr);
168 EXPECT_FALSE(service_->IsInitialized());
169}
170
171TEST_F(ServiceTest, ConstructMessage) {
172 MessageInfo info;
173 SetupMessageInfo(&info, kTestOp);
174 auto test_channel = std::make_shared<Channel>();
175 info.channel = test_channel.get();
176 EXPECT_CALL(*endpoint(), AllocateMessageState()).WillOnce(Return(kState));
177
178 Message message{info};
179
180 EXPECT_FALSE(message.IsImpulse());
181 EXPECT_EQ(kTestPid, message.GetProcessId());
182 EXPECT_EQ(kTestTid, message.GetThreadId());
183 EXPECT_EQ(kTestCid, message.GetChannelId());
184 EXPECT_EQ(kTestMid, message.GetMessageId());
Chih-Hung Hsieh2d777742018-01-16 01:12:05 -0800185 EXPECT_EQ((unsigned) kTestEuid, message.GetEffectiveUserId());
186 EXPECT_EQ((unsigned) kTestEgid, message.GetEffectiveGroupId());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800187 EXPECT_EQ(kTestOp, message.GetOp());
188 EXPECT_EQ(service_, message.GetService());
189 EXPECT_EQ(test_channel, message.GetChannel());
190 EXPECT_FALSE(message.replied());
191 EXPECT_FALSE(message.IsChannelExpired());
192 EXPECT_FALSE(message.IsServiceExpired());
193 EXPECT_EQ(kState, message.GetState());
194
195 ExpectDefaultHandleMessage();
196 EXPECT_CALL(*endpoint(), FreeMessageState(kState));
197}
198
199TEST_F(ServiceTest, ConstructImpulseMessage) {
200 MessageInfo info;
201 SetupMessageInfo(&info, kTestOp, true);
202 auto test_channel = std::make_shared<Channel>();
203 info.channel = test_channel.get();
204 EXPECT_CALL(*endpoint(), AllocateMessageState()).WillOnce(Return(nullptr));
205
206 Message message{info};
207
208 EXPECT_TRUE(message.IsImpulse());
209 EXPECT_EQ(kTestOp, message.GetOp());
210 EXPECT_EQ(service_, message.GetService());
211 EXPECT_EQ(test_channel, message.GetChannel());
212 EXPECT_TRUE(message.replied());
213 EXPECT_FALSE(message.IsChannelExpired());
214 EXPECT_FALSE(message.IsServiceExpired());
215
216 // DefaultHandleMessage should not be called here.
217 EXPECT_CALL(*endpoint(), FreeMessageState(nullptr));
218}
219
220TEST_F(ServiceTest, HandleMessageChannelOpen) {
221 MessageInfo info;
222 SetupMessageInfoAndDefaultExpectations(&info,
223 android::pdx::opcodes::CHANNEL_OPEN);
224 Message message{info};
225
226 auto channel = std::make_shared<Channel>();
227 EXPECT_CALL(*service_, OnChannelOpen(Ref(message))).WillOnce(Return(channel));
228 EXPECT_CALL(*endpoint(), SetChannel(kTestCid, channel.get()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700229 .WillOnce(Return(Status<void>{}));
230 EXPECT_CALL(*endpoint(), MessageReply(&message, 0))
231 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800232
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700233 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800234}
235
236TEST_F(ServiceTest, HandleMessageChannelClose) {
237 MessageInfo info;
238 SetupMessageInfoAndDefaultExpectations(&info,
239 android::pdx::opcodes::CHANNEL_CLOSE);
240 auto channel = std::make_shared<Channel>();
241 info.channel = channel.get();
242 Message message{info};
243
244 EXPECT_CALL(*service_, OnChannelClose(Ref(message), channel));
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700245 EXPECT_CALL(*endpoint(), SetChannel(kTestCid, nullptr))
246 .WillOnce(Return(Status<void>{}));
247 EXPECT_CALL(*endpoint(), MessageReply(&message, 0))
248 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800249
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700250 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800251}
252
253TEST_F(ServiceTest, HandleMessageOnSysPropChange) {
254 MessageInfo info;
255 SetupMessageInfoAndDefaultExpectations(
256 &info, android::pdx::opcodes::REPORT_SYSPROP_CHANGE);
257 Message message{info};
258
259 EXPECT_CALL(*service_, OnSysPropChange());
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700260 EXPECT_CALL(*endpoint(), MessageReply(&message, 0))
261 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800262
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700263 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800264}
265
266TEST_F(ServiceTest, HandleMessageOnDumpState) {
267 const size_t kRecvBufSize = 1000;
268 MessageInfo info;
269 SetupMessageInfoAndDefaultExpectations(&info,
270 android::pdx::opcodes::DUMP_STATE);
271 info.recv_len = kRecvBufSize;
272 Message message{info};
273
274 const std::string kReply = "foo";
275 EXPECT_CALL(*service_, DumpState(kRecvBufSize)).WillOnce(Return(kReply));
276 EXPECT_CALL(
277 *endpoint(),
278 WriteMessageData(&message, IoVecDataMatcher(IoVecData{kReply}), 1))
279 .WillOnce(Return(kReply.size()));
280 EXPECT_CALL(*endpoint(), MessageReply(&message, kReply.size()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700281 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800282
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700283 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800284}
285
286TEST_F(ServiceTest, HandleMessageOnDumpStateTooLarge) {
287 const size_t kRecvBufSize = 3;
288 MessageInfo info;
289 SetupMessageInfoAndDefaultExpectations(&info,
290 android::pdx::opcodes::DUMP_STATE);
291 info.recv_len = kRecvBufSize;
292 Message message{info};
293
294 const std::string kReply = "0123456789";
295 const std::string kActualReply = kReply.substr(0, kRecvBufSize);
296 EXPECT_CALL(*service_, DumpState(kRecvBufSize)).WillOnce(Return(kReply));
297 EXPECT_CALL(
298 *endpoint(),
299 WriteMessageData(&message, IoVecDataMatcher(IoVecData{kActualReply}), 1))
300 .WillOnce(Return(kActualReply.size()));
301 EXPECT_CALL(*endpoint(), MessageReply(&message, kActualReply.size()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700302 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800303
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700304 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800305}
306
307TEST_F(ServiceTest, HandleMessageOnDumpStateFail) {
308 const size_t kRecvBufSize = 1000;
309 MessageInfo info;
310 SetupMessageInfoAndDefaultExpectations(&info,
311 android::pdx::opcodes::DUMP_STATE);
312 info.recv_len = kRecvBufSize;
313 Message message{info};
314
315 const std::string kReply = "foo";
316 EXPECT_CALL(*service_, DumpState(kRecvBufSize)).WillOnce(Return(kReply));
317 EXPECT_CALL(
318 *endpoint(),
319 WriteMessageData(&message, IoVecDataMatcher(IoVecData{kReply}), 1))
320 .WillOnce(Return(1));
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700321 EXPECT_CALL(*endpoint(), MessageReply(&message, -EIO))
322 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800323
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700324 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800325}
326
327TEST_F(ServiceTest, HandleMessageCustom) {
328 MessageInfo info;
329 SetupMessageInfoAndDefaultExpectations(&info, kTestOp);
330 Message message{info};
331
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700332 EXPECT_CALL(*endpoint(), MessageReply(&message, -EOPNOTSUPP))
333 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800334
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700335 EXPECT_TRUE(service_->Service::HandleMessage(message));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800336}
337
338TEST_F(ServiceTest, ReplyMessageWithoutService) {
339 MessageInfo info;
340 SetupMessageInfo(&info, kTestOp);
341 EXPECT_CALL(*endpoint(), AllocateMessageState()).WillOnce(Return(nullptr));
342
343 Message message{info};
344
345 EXPECT_FALSE(message.IsServiceExpired());
346 service_.reset();
347 EXPECT_TRUE(message.IsServiceExpired());
348
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700349 EXPECT_EQ(EINVAL, message.Reply(12).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800350}
351
352TEST_F(ServiceTest, ReceiveAndDispatchMessage) {
353 MessageInfo info;
354 SetupMessageInfoAndDefaultExpectations(&info, kTestOp);
355 ExpectDefaultHandleMessage();
356
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700357 auto on_receive = [&info](Message* message) -> Status<void> {
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800358 *message = Message{info};
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700359 return {};
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800360 };
361 EXPECT_CALL(*endpoint(), MessageReceive(_)).WillOnce(Invoke(on_receive));
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700362 EXPECT_CALL(*service_, HandleMessage(_)).WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800363
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700364 EXPECT_TRUE(service_->ReceiveAndDispatch());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800365}
366
367TEST_F(ServiceTest, ReceiveAndDispatchImpulse) {
368 MessageInfo info;
369 SetupMessageInfoAndDefaultExpectations(&info, kTestOp, true);
370
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700371 auto on_receive = [&info](Message* message) -> Status<void> {
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800372 *message = Message{info};
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700373 return {};
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800374 };
375 EXPECT_CALL(*endpoint(), MessageReceive(_)).WillOnce(Invoke(on_receive));
376 EXPECT_CALL(*service_, HandleImpulse(_));
377
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700378 EXPECT_TRUE(service_->ReceiveAndDispatch());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800379}
380
381TEST_F(ServiceTest, Cancel) {
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700382 EXPECT_CALL(*endpoint(), Cancel()).WillOnce(Return(Status<void>{}));
383 EXPECT_TRUE(service_->Cancel());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800384}
385
386///////////////////////////////////////////////////////////////////////////////
387// Message class tests
388///////////////////////////////////////////////////////////////////////////////
389
390TEST_F(ServiceMessageTest, Reply) {
391 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), 12))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700392 .WillOnce(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800393 EXPECT_FALSE(message_->replied());
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700394 EXPECT_TRUE(message_->Reply(12));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800395 EXPECT_TRUE(message_->replied());
396
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700397 EXPECT_EQ(EINVAL, message_->Reply(12).error()); // Already replied.
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800398}
399
400TEST_F(ServiceMessageTest, ReplyFail) {
401 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), 12))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700402 .WillOnce(Return(ErrorStatus{EIO}));
403 EXPECT_EQ(EIO, message_->Reply(12).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800404
405 ExpectDefaultHandleMessage();
406}
407
408TEST_F(ServiceMessageTest, ReplyError) {
409 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -12))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700410 .WillOnce(Return(Status<void>{}));
411 EXPECT_TRUE(message_->ReplyError(12));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800412}
413
414TEST_F(ServiceMessageTest, ReplyFileDescriptor) {
415 EXPECT_CALL(*endpoint(), MessageReplyFd(message_.get(), 5))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700416 .WillOnce(Return(Status<void>{}));
417 EXPECT_TRUE(message_->ReplyFileDescriptor(5));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800418}
419
420TEST_F(ServiceMessageTest, ReplyLocalFileHandle) {
421 const int kFakeFd = 12345;
422 LocalHandle handle{kFakeFd};
423 EXPECT_CALL(*endpoint(), MessageReplyFd(message_.get(), kFakeFd))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700424 .WillOnce(Return(Status<void>{}));
425 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800426 handle.Release(); // Make sure we do not close the fake file descriptor.
427}
428
429TEST_F(ServiceMessageTest, ReplyLocalFileHandleError) {
430 LocalHandle handle{-EINVAL};
431 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -EINVAL))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700432 .WillOnce(Return(Status<void>{}));
433 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800434}
435
436TEST_F(ServiceMessageTest, ReplyBorrowedFileHandle) {
437 const int kFakeFd = 12345;
438 BorrowedHandle handle{kFakeFd};
439 EXPECT_CALL(*endpoint(), MessageReplyFd(message_.get(), kFakeFd))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700440 .WillOnce(Return(Status<void>{}));
441 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800442}
443
444TEST_F(ServiceMessageTest, ReplyBorrowedFileHandleError) {
445 BorrowedHandle handle{-EACCES};
446 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -EACCES))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700447 .WillOnce(Return(Status<void>{}));
448 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800449}
450
451TEST_F(ServiceMessageTest, ReplyRemoteFileHandle) {
452 RemoteHandle handle{123};
453 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), handle.Get()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700454 .WillOnce(Return(Status<void>{}));
455 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800456}
457
458TEST_F(ServiceMessageTest, ReplyRemoteFileHandleError) {
459 RemoteHandle handle{-EIO};
460 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -EIO))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700461 .WillOnce(Return(Status<void>{}));
462 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800463}
464
465TEST_F(ServiceMessageTest, ReplyLocalChannelHandle) {
466 LocalChannelHandle handle{nullptr, 12345};
467 EXPECT_CALL(*endpoint(), MessageReplyChannelHandle(
468 message_.get(), A<const LocalChannelHandle&>()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700469 .WillOnce(Return(Status<void>{}));
470 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800471}
472
473TEST_F(ServiceMessageTest, ReplyBorrowedChannelHandle) {
474 BorrowedChannelHandle handle{12345};
475 EXPECT_CALL(*endpoint(),
476 MessageReplyChannelHandle(message_.get(),
477 A<const BorrowedChannelHandle&>()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700478 .WillOnce(Return(Status<void>{}));
479 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800480}
481
482TEST_F(ServiceMessageTest, ReplyRemoteChannelHandle) {
483 RemoteChannelHandle handle{12345};
484 EXPECT_CALL(*endpoint(), MessageReplyChannelHandle(
485 message_.get(), A<const RemoteChannelHandle&>()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700486 .WillOnce(Return(Status<void>{}));
487 EXPECT_TRUE(message_->Reply(handle));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800488}
489
490TEST_F(ServiceMessageTest, ReplyStatusInt) {
491 Status<int> status{123};
492 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), status.get()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700493 .WillOnce(Return(Status<void>{}));
494 EXPECT_TRUE(message_->Reply(status));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800495}
496
497TEST_F(ServiceMessageTest, ReplyStatusError) {
498 Status<int> status{ErrorStatus{EIO}};
499 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -status.error()))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700500 .WillOnce(Return(Status<void>{}));
501 EXPECT_TRUE(message_->Reply(status));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800502}
503
504TEST_F(ServiceMessageTest, Read) {
505 ExpectDefaultHandleMessage();
506 void* const kDataBuffer = IntToPtr(12345);
507 const size_t kDataSize = 100;
508 EXPECT_CALL(
509 *endpoint(),
510 ReadMessageData(message_.get(), IoVecMatcher(kDataBuffer, kDataSize), 1))
511 .WillOnce(Return(50))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700512 .WillOnce(Return(ErrorStatus{EACCES}));
513 EXPECT_EQ(50u, message_->Read(kDataBuffer, kDataSize).get());
514 EXPECT_EQ(EACCES, message_->Read(kDataBuffer, kDataSize).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800515}
516
517TEST_F(ServiceMessageTest, ReadVector) {
518 ExpectDefaultHandleMessage();
519 char buffer1[10];
520 char buffer2[20];
521 iovec vec[] = {{buffer1, sizeof(buffer1)}, {buffer2, sizeof(buffer2)}};
522 EXPECT_CALL(*endpoint(),
523 ReadMessageData(
524 message_.get(),
525 IoVecMatcher(IoVecArray{std::begin(vec), std::end(vec)}), 2))
526 .WillOnce(Return(30))
527 .WillOnce(Return(15))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700528 .WillOnce(Return(ErrorStatus{EBADF}));
529 EXPECT_EQ(30u, message_->ReadVector(vec, 2).get());
530 EXPECT_EQ(15u, message_->ReadVector(vec).get());
531 EXPECT_EQ(EBADF, message_->ReadVector(vec).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800532}
533
534TEST_F(ServiceMessageTest, Write) {
535 ExpectDefaultHandleMessage();
536 void* const kDataBuffer = IntToPtr(12345);
537 const size_t kDataSize = 100;
538 EXPECT_CALL(
539 *endpoint(),
540 WriteMessageData(message_.get(), IoVecMatcher(kDataBuffer, kDataSize), 1))
541 .WillOnce(Return(50))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700542 .WillOnce(Return(ErrorStatus{EBADMSG}));
543 EXPECT_EQ(50u, message_->Write(kDataBuffer, kDataSize).get());
544 EXPECT_EQ(EBADMSG, message_->Write(kDataBuffer, kDataSize).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800545}
546
547TEST_F(ServiceMessageTest, WriteVector) {
548 ExpectDefaultHandleMessage();
549 char buffer1[10];
550 char buffer2[20];
551 iovec vec[] = {{buffer1, sizeof(buffer1)}, {buffer2, sizeof(buffer2)}};
552 EXPECT_CALL(*endpoint(),
553 WriteMessageData(
554 message_.get(),
555 IoVecMatcher(IoVecArray{std::begin(vec), std::end(vec)}), 2))
556 .WillOnce(Return(30))
557 .WillOnce(Return(15))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700558 .WillOnce(Return(ErrorStatus{EIO}));
559 EXPECT_EQ(30u, message_->WriteVector(vec, 2).get());
560 EXPECT_EQ(15u, message_->WriteVector(vec).get());
561 EXPECT_EQ(EIO, message_->WriteVector(vec, 2).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800562}
563
564TEST_F(ServiceMessageTest, PushLocalFileHandle) {
565 ExpectDefaultHandleMessage();
566 const int kFakeFd = 12345;
567 LocalHandle handle{kFakeFd};
568 EXPECT_CALL(*endpoint(),
569 PushFileHandle(message_.get(), Matcher<const LocalHandle&>(
570 FileHandleMatcher(kFakeFd))))
571 .WillOnce(Return(12))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700572 .WillOnce(Return(ErrorStatus{EIO}));
573 EXPECT_EQ(12, message_->PushFileHandle(handle).get());
574 EXPECT_EQ(EIO, message_->PushFileHandle(handle).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800575 handle.Release(); // Make sure we do not close the fake file descriptor.
576}
577
578TEST_F(ServiceMessageTest, PushBorrowedFileHandle) {
579 ExpectDefaultHandleMessage();
580 const int kFakeFd = 12345;
581 BorrowedHandle handle{kFakeFd};
582 EXPECT_CALL(*endpoint(),
583 PushFileHandle(message_.get(), Matcher<const BorrowedHandle&>(
584 FileHandleMatcher(kFakeFd))))
585 .WillOnce(Return(13))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700586 .WillOnce(Return(ErrorStatus{EACCES}));
587 EXPECT_EQ(13, message_->PushFileHandle(handle).get());
588 EXPECT_EQ(EACCES, message_->PushFileHandle(handle).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800589}
590
591TEST_F(ServiceMessageTest, PushRemoteFileHandle) {
592 ExpectDefaultHandleMessage();
593 const int kFakeFd = 12345;
594 RemoteHandle handle{kFakeFd};
595 EXPECT_CALL(*endpoint(),
596 PushFileHandle(message_.get(), Matcher<const RemoteHandle&>(
597 FileHandleMatcher(kFakeFd))))
598 .WillOnce(Return(kFakeFd))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700599 .WillOnce(Return(ErrorStatus{EIO}));
600 EXPECT_EQ(kFakeFd, message_->PushFileHandle(handle).get());
601 EXPECT_EQ(EIO, message_->PushFileHandle(handle).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800602}
603
604TEST_F(ServiceMessageTest, PushLocalChannelHandle) {
605 ExpectDefaultHandleMessage();
606 int32_t kValue = 12345;
607 LocalChannelHandle handle{nullptr, kValue};
608 EXPECT_CALL(*endpoint(), PushChannelHandle(message_.get(),
609 Matcher<const LocalChannelHandle&>(
610 ChannelHandleMatcher(kValue))))
611 .WillOnce(Return(7))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700612 .WillOnce(Return(ErrorStatus{EIO}));
613 EXPECT_EQ(7, message_->PushChannelHandle(handle).get());
614 EXPECT_EQ(EIO, message_->PushChannelHandle(handle).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800615}
616
617TEST_F(ServiceMessageTest, PushBorrowedChannelHandle) {
618 ExpectDefaultHandleMessage();
619 int32_t kValue = 12345;
620 BorrowedChannelHandle handle{kValue};
621 EXPECT_CALL(
622 *endpoint(),
623 PushChannelHandle(message_.get(), Matcher<const BorrowedChannelHandle&>(
624 ChannelHandleMatcher(kValue))))
625 .WillOnce(Return(8))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700626 .WillOnce(Return(ErrorStatus{EIO}));
627 EXPECT_EQ(8, message_->PushChannelHandle(handle).get());
628 EXPECT_EQ(EIO, message_->PushChannelHandle(handle).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800629}
630
631TEST_F(ServiceMessageTest, PushRemoteChannelHandle) {
632 ExpectDefaultHandleMessage();
633 int32_t kValue = 12345;
634 RemoteChannelHandle handle{kValue};
635 EXPECT_CALL(
636 *endpoint(),
637 PushChannelHandle(message_.get(), Matcher<const RemoteChannelHandle&>(
638 ChannelHandleMatcher(kValue))))
639 .WillOnce(Return(kValue))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700640 .WillOnce(Return(ErrorStatus{EIO}));
641 EXPECT_EQ(kValue, message_->PushChannelHandle(handle).get());
642 EXPECT_EQ(EIO, message_->PushChannelHandle(handle).error());
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800643}
644
645TEST_F(ServiceMessageTest, GetFileHandle) {
646 ExpectDefaultHandleMessage();
647 auto make_file_handle = [](FileReference ref) { return LocalHandle{ref}; };
648 EXPECT_CALL(*endpoint(), GetFileHandle(message_.get(), _))
649 .WillOnce(WithArg<1>(Invoke(make_file_handle)));
650 LocalHandle handle;
651 FileReference kRef = 12345;
652 EXPECT_TRUE(message_->GetFileHandle(kRef, &handle));
653 EXPECT_EQ(kRef, handle.Get());
654 handle.Release(); // Make sure we do not close the fake file descriptor.
655}
656
657TEST_F(ServiceMessageTest, GetFileHandleInvalid) {
658 ExpectDefaultHandleMessage();
659 LocalHandle handle;
660 FileReference kRef = -12;
661 EXPECT_TRUE(message_->GetFileHandle(kRef, &handle));
662 EXPECT_EQ(kRef, handle.Get());
663}
664
665TEST_F(ServiceMessageTest, GetFileHandleError) {
666 ExpectDefaultHandleMessage();
667 EXPECT_CALL(*endpoint(), GetFileHandle(message_.get(), _))
668 .WillOnce(WithoutArgs(Invoke([] { return LocalHandle{-EIO}; })));
669 LocalHandle handle;
670 FileReference kRef = 12345;
671 EXPECT_FALSE(message_->GetFileHandle(kRef, &handle));
672 EXPECT_EQ(-EIO, handle.Get());
673}
674
675TEST_F(ServiceMessageTest, GetChannelHandle) {
676 ExpectDefaultHandleMessage();
677 auto make_channel_handle = [](ChannelReference ref) {
678 return LocalChannelHandle{nullptr, ref};
679 };
680 EXPECT_CALL(*endpoint(), GetChannelHandle(message_.get(), _))
681 .WillOnce(WithArg<1>(Invoke(make_channel_handle)));
682 LocalChannelHandle handle;
683 ChannelReference kRef = 12345;
684 EXPECT_TRUE(message_->GetChannelHandle(kRef, &handle));
685 EXPECT_EQ(kRef, handle.value());
686}
687
688TEST_F(ServiceMessageTest, GetChannelHandleInvalid) {
689 ExpectDefaultHandleMessage();
690 LocalChannelHandle handle;
691 ChannelReference kRef = -12;
692 EXPECT_TRUE(message_->GetChannelHandle(kRef, &handle));
693 EXPECT_EQ(-12, handle.value());
694}
695
696TEST_F(ServiceMessageTest, GetChannelHandleError) {
697 ExpectDefaultHandleMessage();
698 EXPECT_CALL(*endpoint(), GetChannelHandle(message_.get(), _))
699 .WillOnce(WithoutArgs(Invoke([] {
700 return LocalChannelHandle{nullptr, -EIO};
701 })));
702 LocalChannelHandle handle;
703 ChannelReference kRef = 12345;
704 EXPECT_FALSE(message_->GetChannelHandle(kRef, &handle));
705 EXPECT_EQ(-EIO, handle.value());
706}
707
708TEST_F(ServiceMessageTest, ModifyChannelEvents) {
709 ExpectDefaultHandleMessage();
710 int kClearMask = 1;
711 int kSetMask = 2;
712 EXPECT_CALL(*endpoint(), ModifyChannelEvents(kTestCid, kClearMask, kSetMask))
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700713 .WillOnce(Return(Status<void>{}));
714 EXPECT_TRUE(message_->ModifyChannelEvents(kClearMask, kSetMask));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800715}
716
717TEST_F(ServiceMessageTest, PushChannelSameService) {
718 ExpectDefaultHandleMessage();
719 int kFlags = 123;
720 int32_t kValue = 12;
721 EXPECT_CALL(*endpoint(), PushChannel(message_.get(), kFlags, nullptr, _))
722 .WillOnce(DoAll(SetArgPointee<3>(kTestCid),
723 Return(ByMove(RemoteChannelHandle{kValue}))));
724 int channel_id = -1;
725 auto status = message_->PushChannel(kFlags, nullptr, &channel_id);
726 ASSERT_TRUE(status);
727 EXPECT_EQ(kValue, status.get().value());
728 EXPECT_EQ(kTestCid, channel_id);
729}
730
731TEST_F(ServiceMessageTest, PushChannelFailure) {
732 ExpectDefaultHandleMessage();
733 int kFlags = 123;
734 EXPECT_CALL(*endpoint(), PushChannel(message_.get(), kFlags, nullptr, _))
735 .WillOnce(Return(ByMove(ErrorStatus{EIO})));
736 int channel_id = -1;
737 auto status = message_->PushChannel(kFlags, nullptr, &channel_id);
738 ASSERT_FALSE(status);
739 EXPECT_EQ(EIO, status.error());
740}
741
742TEST_F(ServiceMessageTest, PushChannelDifferentService) {
743 ExpectDefaultHandleMessage();
744 auto endpoint2 = std::make_unique<testing::StrictMock<MockEndpoint>>();
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700745 EXPECT_CALL(*endpoint2, SetService(_))
746 .Times(2)
747 .WillRepeatedly(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800748 auto service2 =
749 std::make_shared<MockService>("MockSvc2", std::move(endpoint2));
750
751 int kFlags = 123;
752 int32_t kValue = 12;
753 EXPECT_CALL(*static_cast<MockEndpoint*>(service2->endpoint()),
754 PushChannel(message_.get(), kFlags, nullptr, _))
755 .WillOnce(DoAll(SetArgPointee<3>(kTestCid),
756 Return(ByMove(RemoteChannelHandle{kValue}))));
757 int channel_id = -1;
758 auto status =
759 message_->PushChannel(service2.get(), kFlags, nullptr, &channel_id);
760 ASSERT_TRUE(status);
761 EXPECT_EQ(kValue, status.get().value());
762 EXPECT_EQ(kTestCid, channel_id);
763}
764
765TEST_F(ServiceMessageTest, CheckChannelSameService) {
766 ExpectDefaultHandleMessage();
767
768 auto test_channel = std::make_shared<Channel>();
769 ChannelReference kRef = 123;
770 EXPECT_CALL(*endpoint(), CheckChannel(message_.get(), kRef, _))
771 .WillOnce(DoAll(SetArgPointee<2>(test_channel.get()), Return(kTestCid)));
772 std::shared_ptr<Channel> channel;
773 auto status = message_->CheckChannel(kRef, &channel);
774 ASSERT_TRUE(status);
775 EXPECT_EQ(kTestCid, status.get());
776 EXPECT_EQ(test_channel, channel);
777}
778
779TEST_F(ServiceMessageTest, CheckChannelFailure) {
780 ExpectDefaultHandleMessage();
781 ChannelReference kRef = 123;
782 EXPECT_CALL(*endpoint(), CheckChannel(message_.get(), kRef, _))
783 .WillOnce(Return(ByMove(ErrorStatus{EOPNOTSUPP})));
784 std::shared_ptr<Channel> channel;
785 auto status = message_->CheckChannel(kRef, &channel);
786 ASSERT_FALSE(status);
787 EXPECT_EQ(EOPNOTSUPP, status.error());
788}
789
790TEST_F(ServiceMessageTest, CheckChannelDifferentService) {
791 ExpectDefaultHandleMessage();
792 auto endpoint2 = std::make_unique<testing::StrictMock<MockEndpoint>>();
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700793 EXPECT_CALL(*endpoint2, SetService(_))
794 .Times(2)
795 .WillRepeatedly(Return(Status<void>{}));
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800796 auto service2 =
797 std::make_shared<MockService>("MockSvc2", std::move(endpoint2));
798
799 auto test_channel = std::make_shared<Channel>();
800 ChannelReference kRef = 123;
801 EXPECT_CALL(*static_cast<MockEndpoint*>(service2->endpoint()),
802 CheckChannel(message_.get(), kRef, _))
803 .WillOnce(DoAll(SetArgPointee<2>(test_channel.get()), Return(kTestCid)));
804 std::shared_ptr<Channel> channel;
805 auto status = message_->CheckChannel(service2.get(), kRef, &channel);
806 ASSERT_TRUE(status);
807 EXPECT_EQ(kTestCid, status.get());
808 EXPECT_EQ(test_channel, channel);
809}