1 #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 9 using android::pdx::BorrowedChannelHandle; 10 using android::pdx::BorrowedHandle; 11 using android::pdx::Channel; 12 using android::pdx::ChannelReference; 13 using android::pdx::ErrorStatus; 14 using android::pdx::FileReference; 15 using android::pdx::LocalChannelHandle; 16 using android::pdx::LocalHandle; 17 using android::pdx::Message; 18 using android::pdx::MessageInfo; 19 using android::pdx::MockEndpoint; 20 using android::pdx::RemoteChannelHandle; 21 using android::pdx::RemoteHandle; 22 using android::pdx::Service; 23 using android::pdx::Status; 24 25 using testing::A; 26 using testing::ByMove; 27 using testing::DoAll; 28 using testing::Invoke; 29 using testing::Matcher; 30 using testing::Ref; 31 using testing::Return; 32 using testing::SetArgPointee; 33 using testing::WithArg; 34 using testing::WithoutArgs; 35 using testing::_; 36 37 namespace { 38 39 // Helper functions to construct fake void pointers for tests. 40 inline 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))); 45 MATCHER_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}}))); 52 using IoVecArray = std::vector<iovec>; 53 MATCHER_P(IoVecMatcher, iovec_array, "") { 54 auto local_arg = arg; 55 for (const iovec& item : iovec_array) { 56 if (local_arg->iov_base != item.iov_base || local_arg->iov_len != item.iov_len) 57 return false; 58 local_arg++; 59 } 60 return true; 61 } 62 63 using IoVecData = std::vector<std::string>; 64 MATCHER_P(IoVecDataMatcher, iovec_data, "") { 65 auto local_arg = arg; 66 for (const std::string& item : iovec_data) { 67 std::string data{reinterpret_cast<const char*>(local_arg->iov_base), 68 local_arg->iov_len}; 69 if (data != item) 70 return false; 71 local_arg++; 72 } 73 return true; 74 } 75 76 MATCHER_P(FileHandleMatcher, value, "") { return arg.Get() == value; } 77 MATCHER_P(ChannelHandleMatcher, value, "") { return arg.value() == value; } 78 79 enum : int { 80 kTestPid = 1, 81 kTestTid, 82 kTestCid, 83 kTestMid, 84 kTestEuid, 85 kTestEgid, 86 kTestOp, 87 }; 88 89 class 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)); 95 MOCK_METHOD1(HandleMessage, Status<void>(Message& message)); 96 MOCK_METHOD1(HandleImpulse, void(Message& impulse)); 97 MOCK_METHOD0(OnSysPropChange, void()); 98 MOCK_METHOD1(DumpState, std::string(size_t max_length)); 99 }; 100 101 class ServiceTest : public testing::Test { 102 public: 103 ServiceTest() { 104 auto endpoint = std::make_unique<testing::StrictMock<MockEndpoint>>(); 105 EXPECT_CALL(*endpoint, SetService(_)) 106 .Times(2) 107 .WillRepeatedly(Return(Status<void>{})); 108 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() { 140 EXPECT_CALL(*endpoint(), MessageReply(_, -EOPNOTSUPP)) 141 .WillOnce(Return(Status<void>{})); 142 } 143 144 std::shared_ptr<MockService> service_; 145 void* kState = IntToPtr(123456); 146 }; 147 148 class 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 165 TEST_F(ServiceTest, IsInitialized) { 166 EXPECT_TRUE(service_->IsInitialized()); 167 service_ = std::make_shared<MockService>("MockSvc2", nullptr); 168 EXPECT_FALSE(service_->IsInitialized()); 169 } 170 171 TEST_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()); 185 EXPECT_EQ((unsigned) kTestEuid, message.GetEffectiveUserId()); 186 EXPECT_EQ((unsigned) kTestEgid, message.GetEffectiveGroupId()); 187 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 199 TEST_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 220 TEST_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())) 229 .WillOnce(Return(Status<void>{})); 230 EXPECT_CALL(*endpoint(), MessageReply(&message, 0)) 231 .WillOnce(Return(Status<void>{})); 232 233 EXPECT_TRUE(service_->Service::HandleMessage(message)); 234 } 235 236 TEST_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)); 245 EXPECT_CALL(*endpoint(), SetChannel(kTestCid, nullptr)) 246 .WillOnce(Return(Status<void>{})); 247 EXPECT_CALL(*endpoint(), MessageReply(&message, 0)) 248 .WillOnce(Return(Status<void>{})); 249 250 EXPECT_TRUE(service_->Service::HandleMessage(message)); 251 } 252 253 TEST_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()); 260 EXPECT_CALL(*endpoint(), MessageReply(&message, 0)) 261 .WillOnce(Return(Status<void>{})); 262 263 EXPECT_TRUE(service_->Service::HandleMessage(message)); 264 } 265 266 TEST_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())) 281 .WillOnce(Return(Status<void>{})); 282 283 EXPECT_TRUE(service_->Service::HandleMessage(message)); 284 } 285 286 TEST_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())) 302 .WillOnce(Return(Status<void>{})); 303 304 EXPECT_TRUE(service_->Service::HandleMessage(message)); 305 } 306 307 TEST_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)); 321 EXPECT_CALL(*endpoint(), MessageReply(&message, -EIO)) 322 .WillOnce(Return(Status<void>{})); 323 324 EXPECT_TRUE(service_->Service::HandleMessage(message)); 325 } 326 327 TEST_F(ServiceTest, HandleMessageCustom) { 328 MessageInfo info; 329 SetupMessageInfoAndDefaultExpectations(&info, kTestOp); 330 Message message{info}; 331 332 EXPECT_CALL(*endpoint(), MessageReply(&message, -EOPNOTSUPP)) 333 .WillOnce(Return(Status<void>{})); 334 335 EXPECT_TRUE(service_->Service::HandleMessage(message)); 336 } 337 338 TEST_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 349 EXPECT_EQ(EINVAL, message.Reply(12).error()); 350 } 351 352 TEST_F(ServiceTest, ReceiveAndDispatchMessage) { 353 MessageInfo info; 354 SetupMessageInfoAndDefaultExpectations(&info, kTestOp); 355 ExpectDefaultHandleMessage(); 356 357 auto on_receive = [&info](Message* message) -> Status<void> { 358 *message = Message{info}; 359 return {}; 360 }; 361 EXPECT_CALL(*endpoint(), MessageReceive(_)).WillOnce(Invoke(on_receive)); 362 EXPECT_CALL(*service_, HandleMessage(_)).WillOnce(Return(Status<void>{})); 363 364 EXPECT_TRUE(service_->ReceiveAndDispatch()); 365 } 366 367 TEST_F(ServiceTest, ReceiveAndDispatchImpulse) { 368 MessageInfo info; 369 SetupMessageInfoAndDefaultExpectations(&info, kTestOp, true); 370 371 auto on_receive = [&info](Message* message) -> Status<void> { 372 *message = Message{info}; 373 return {}; 374 }; 375 EXPECT_CALL(*endpoint(), MessageReceive(_)).WillOnce(Invoke(on_receive)); 376 EXPECT_CALL(*service_, HandleImpulse(_)); 377 378 EXPECT_TRUE(service_->ReceiveAndDispatch()); 379 } 380 381 TEST_F(ServiceTest, Cancel) { 382 EXPECT_CALL(*endpoint(), Cancel()).WillOnce(Return(Status<void>{})); 383 EXPECT_TRUE(service_->Cancel()); 384 } 385 386 /////////////////////////////////////////////////////////////////////////////// 387 // Message class tests 388 /////////////////////////////////////////////////////////////////////////////// 389 390 TEST_F(ServiceMessageTest, Reply) { 391 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), 12)) 392 .WillOnce(Return(Status<void>{})); 393 EXPECT_FALSE(message_->replied()); 394 EXPECT_TRUE(message_->Reply(12)); 395 EXPECT_TRUE(message_->replied()); 396 397 EXPECT_EQ(EINVAL, message_->Reply(12).error()); // Already replied. 398 } 399 400 TEST_F(ServiceMessageTest, ReplyFail) { 401 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), 12)) 402 .WillOnce(Return(ErrorStatus{EIO})); 403 EXPECT_EQ(EIO, message_->Reply(12).error()); 404 405 ExpectDefaultHandleMessage(); 406 } 407 408 TEST_F(ServiceMessageTest, ReplyError) { 409 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -12)) 410 .WillOnce(Return(Status<void>{})); 411 EXPECT_TRUE(message_->ReplyError(12)); 412 } 413 414 TEST_F(ServiceMessageTest, ReplyFileDescriptor) { 415 EXPECT_CALL(*endpoint(), MessageReplyFd(message_.get(), 5)) 416 .WillOnce(Return(Status<void>{})); 417 EXPECT_TRUE(message_->ReplyFileDescriptor(5)); 418 } 419 420 TEST_F(ServiceMessageTest, ReplyLocalFileHandle) { 421 const int kFakeFd = 12345; 422 LocalHandle handle{kFakeFd}; 423 EXPECT_CALL(*endpoint(), MessageReplyFd(message_.get(), kFakeFd)) 424 .WillOnce(Return(Status<void>{})); 425 EXPECT_TRUE(message_->Reply(handle)); 426 handle.Release(); // Make sure we do not close the fake file descriptor. 427 } 428 429 TEST_F(ServiceMessageTest, ReplyLocalFileHandleError) { 430 LocalHandle handle{-EINVAL}; 431 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -EINVAL)) 432 .WillOnce(Return(Status<void>{})); 433 EXPECT_TRUE(message_->Reply(handle)); 434 } 435 436 TEST_F(ServiceMessageTest, ReplyBorrowedFileHandle) { 437 const int kFakeFd = 12345; 438 BorrowedHandle handle{kFakeFd}; 439 EXPECT_CALL(*endpoint(), MessageReplyFd(message_.get(), kFakeFd)) 440 .WillOnce(Return(Status<void>{})); 441 EXPECT_TRUE(message_->Reply(handle)); 442 } 443 444 TEST_F(ServiceMessageTest, ReplyBorrowedFileHandleError) { 445 BorrowedHandle handle{-EACCES}; 446 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -EACCES)) 447 .WillOnce(Return(Status<void>{})); 448 EXPECT_TRUE(message_->Reply(handle)); 449 } 450 451 TEST_F(ServiceMessageTest, ReplyRemoteFileHandle) { 452 RemoteHandle handle{123}; 453 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), handle.Get())) 454 .WillOnce(Return(Status<void>{})); 455 EXPECT_TRUE(message_->Reply(handle)); 456 } 457 458 TEST_F(ServiceMessageTest, ReplyRemoteFileHandleError) { 459 RemoteHandle handle{-EIO}; 460 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -EIO)) 461 .WillOnce(Return(Status<void>{})); 462 EXPECT_TRUE(message_->Reply(handle)); 463 } 464 465 TEST_F(ServiceMessageTest, ReplyLocalChannelHandle) { 466 LocalChannelHandle handle{nullptr, 12345}; 467 EXPECT_CALL(*endpoint(), MessageReplyChannelHandle( 468 message_.get(), A<const LocalChannelHandle&>())) 469 .WillOnce(Return(Status<void>{})); 470 EXPECT_TRUE(message_->Reply(handle)); 471 } 472 473 TEST_F(ServiceMessageTest, ReplyBorrowedChannelHandle) { 474 BorrowedChannelHandle handle{12345}; 475 EXPECT_CALL(*endpoint(), 476 MessageReplyChannelHandle(message_.get(), 477 A<const BorrowedChannelHandle&>())) 478 .WillOnce(Return(Status<void>{})); 479 EXPECT_TRUE(message_->Reply(handle)); 480 } 481 482 TEST_F(ServiceMessageTest, ReplyRemoteChannelHandle) { 483 RemoteChannelHandle handle{12345}; 484 EXPECT_CALL(*endpoint(), MessageReplyChannelHandle( 485 message_.get(), A<const RemoteChannelHandle&>())) 486 .WillOnce(Return(Status<void>{})); 487 EXPECT_TRUE(message_->Reply(handle)); 488 } 489 490 TEST_F(ServiceMessageTest, ReplyStatusInt) { 491 Status<int> status{123}; 492 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), status.get())) 493 .WillOnce(Return(Status<void>{})); 494 EXPECT_TRUE(message_->Reply(status)); 495 } 496 497 TEST_F(ServiceMessageTest, ReplyStatusError) { 498 Status<int> status{ErrorStatus{EIO}}; 499 EXPECT_CALL(*endpoint(), MessageReply(message_.get(), -status.error())) 500 .WillOnce(Return(Status<void>{})); 501 EXPECT_TRUE(message_->Reply(status)); 502 } 503 504 TEST_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)) 512 .WillOnce(Return(ErrorStatus{EACCES})); 513 EXPECT_EQ(50u, message_->Read(kDataBuffer, kDataSize).get()); 514 EXPECT_EQ(EACCES, message_->Read(kDataBuffer, kDataSize).error()); 515 } 516 517 TEST_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)) 528 .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()); 532 } 533 534 TEST_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)) 542 .WillOnce(Return(ErrorStatus{EBADMSG})); 543 EXPECT_EQ(50u, message_->Write(kDataBuffer, kDataSize).get()); 544 EXPECT_EQ(EBADMSG, message_->Write(kDataBuffer, kDataSize).error()); 545 } 546 547 TEST_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)) 558 .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()); 562 } 563 564 TEST_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)) 572 .WillOnce(Return(ErrorStatus{EIO})); 573 EXPECT_EQ(12, message_->PushFileHandle(handle).get()); 574 EXPECT_EQ(EIO, message_->PushFileHandle(handle).error()); 575 handle.Release(); // Make sure we do not close the fake file descriptor. 576 } 577 578 TEST_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)) 586 .WillOnce(Return(ErrorStatus{EACCES})); 587 EXPECT_EQ(13, message_->PushFileHandle(handle).get()); 588 EXPECT_EQ(EACCES, message_->PushFileHandle(handle).error()); 589 } 590 591 TEST_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)) 599 .WillOnce(Return(ErrorStatus{EIO})); 600 EXPECT_EQ(kFakeFd, message_->PushFileHandle(handle).get()); 601 EXPECT_EQ(EIO, message_->PushFileHandle(handle).error()); 602 } 603 604 TEST_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)) 612 .WillOnce(Return(ErrorStatus{EIO})); 613 EXPECT_EQ(7, message_->PushChannelHandle(handle).get()); 614 EXPECT_EQ(EIO, message_->PushChannelHandle(handle).error()); 615 } 616 617 TEST_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)) 626 .WillOnce(Return(ErrorStatus{EIO})); 627 EXPECT_EQ(8, message_->PushChannelHandle(handle).get()); 628 EXPECT_EQ(EIO, message_->PushChannelHandle(handle).error()); 629 } 630 631 TEST_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)) 640 .WillOnce(Return(ErrorStatus{EIO})); 641 EXPECT_EQ(kValue, message_->PushChannelHandle(handle).get()); 642 EXPECT_EQ(EIO, message_->PushChannelHandle(handle).error()); 643 } 644 645 TEST_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 657 TEST_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 665 TEST_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 675 TEST_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 688 TEST_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 696 TEST_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 708 TEST_F(ServiceMessageTest, ModifyChannelEvents) { 709 ExpectDefaultHandleMessage(); 710 int kClearMask = 1; 711 int kSetMask = 2; 712 EXPECT_CALL(*endpoint(), ModifyChannelEvents(kTestCid, kClearMask, kSetMask)) 713 .WillOnce(Return(Status<void>{})); 714 EXPECT_TRUE(message_->ModifyChannelEvents(kClearMask, kSetMask)); 715 } 716 717 TEST_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 731 TEST_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 742 TEST_F(ServiceMessageTest, PushChannelDifferentService) { 743 ExpectDefaultHandleMessage(); 744 auto endpoint2 = std::make_unique<testing::StrictMock<MockEndpoint>>(); 745 EXPECT_CALL(*endpoint2, SetService(_)) 746 .Times(2) 747 .WillRepeatedly(Return(Status<void>{})); 748 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 765 TEST_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 779 TEST_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 790 TEST_F(ServiceMessageTest, CheckChannelDifferentService) { 791 ExpectDefaultHandleMessage(); 792 auto endpoint2 = std::make_unique<testing::StrictMock<MockEndpoint>>(); 793 EXPECT_CALL(*endpoint2, SetService(_)) 794 .Times(2) 795 .WillRepeatedly(Return(Status<void>{})); 796 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 } 810