1 /* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #include <iostream> 16 #define private public 17 #include "mock_dbinder_base_invoker.h" 18 #undef private 19 20 using namespace testing::ext; 21 using namespace OHOS; 22 using namespace OHOS::HiviewDFX; 23 24 class DBinderBaseInvokerUnitTest : public testing::Test { 25 public: SetUpTestCase(void)26 static void SetUpTestCase(void) {} TearDownTestCase(void)27 static void TearDownTestCase(void) {} SetUp()28 void SetUp() {} TearDown()29 void TearDown() {} 30 }; 31 32 /** 33 * @tc.name: ProcessTransactionAbnormalBranch001 34 * @tc.desc: Mock IRemoteObjectTranslateWhenRcv translate remote object fail 35 * @tc.type: FUNC 36 */ 37 HWTEST_F(DBinderBaseInvokerUnitTest, ProcessTransactionAbnormalBranch001, TestSize.Level1) 38 { 39 std::shared_ptr<MockDBinderBaseInvoker> invoker = std::make_shared<MockDBinderBaseInvoker>(); 40 EXPECT_TRUE(invoker != nullptr); 41 int32_t listenFd = 0; 42 /** |-----tr->buffer_size-----|---tr->offsets_size------| 43 * |* sizeof(dbinder_transaction_data) *|* sizeof(binder_size_t) *|* sizeof(binder_size_t) *| 44 * tr->buffer tr->buffer + tr->offsets 45 */ 46 size_t pkgSize = sizeof(dbinder_transaction_data) + sizeof(binder_size_t) + sizeof(binder_size_t); 47 std::shared_ptr<dbinder_transaction_data> tr(reinterpret_cast<dbinder_transaction_data *>( 48 ::operator new(pkgSize))); 49 EXPECT_TRUE(tr != nullptr); 50 tr->sizeOfSelf = pkgSize; 51 tr->magic = DBINDER_MAGICWORD; 52 tr->version = SUPPORT_TOKENID_VERSION_NUM; 53 tr->cmd = BC_TRANSACTION; 54 tr->code = 0; 55 tr->flags = MessageOption::TF_STATUS_CODE; 56 tr->seqNumber = 0; 57 tr->buffer_size = sizeof(binder_size_t); 58 tr->offsets = tr->buffer_size; 59 tr->offsets_size = sizeof(binder_size_t); 60 binder_size_t *binderObjectOffsets = reinterpret_cast<binder_size_t *>(tr->buffer + tr->offsets); 61 binderObjectOffsets[0] = tr->buffer_size; // To make IsValidRemoteObjectOffset function fail 62 bool ret = invoker->CheckTransactionData(tr.get()); 63 ASSERT_TRUE(ret); 64 invoker->ProcessTransaction(tr.get(), listenFd); 65 EXPECT_EQ(invoker->result_, RPC_BASE_INVOKER_TRANSLATE_ERR); 66 } 67 68 /** 69 * @tc.name: ProcessTransactionAbnormalBranch002 70 * @tc.desc: Mock CheckAndSetCallerInfo return err branch 71 * @tc.type: FUNC 72 */ 73 HWTEST_F(DBinderBaseInvokerUnitTest, ProcessTransactionAbnormalBranch002, TestSize.Level1) 74 { 75 std::shared_ptr<MockDBinderBaseInvoker> invoker = std::make_shared<MockDBinderBaseInvoker>(); 76 EXPECT_TRUE(invoker != nullptr); 77 int32_t listenFd = 0; 78 /** |-----tr->buffer_size-----|--tr->offsets_size--| 79 * |* sizeof(dbinder_transaction_data) *|* sizeof(binder_size_t) *|* empty *| 80 * tr->buffer tr->buffer + tr->offsets 81 */ 82 size_t pkgSize = sizeof(dbinder_transaction_data) + sizeof(binder_size_t); 83 std::shared_ptr<dbinder_transaction_data> tr(reinterpret_cast<dbinder_transaction_data *>( 84 ::operator new(pkgSize))); 85 EXPECT_TRUE(tr != nullptr); 86 tr->sizeOfSelf = pkgSize; 87 tr->magic = DBINDER_MAGICWORD; 88 tr->version = SUPPORT_TOKENID_VERSION_NUM; 89 tr->cmd = BC_TRANSACTION; 90 tr->code = 0; 91 tr->flags = MessageOption::TF_STATUS_CODE; 92 tr->seqNumber = 0; 93 tr->buffer_size = sizeof(binder_size_t); 94 tr->offsets = tr->buffer_size; 95 tr->offsets_size = 0; 96 97 bool ret = invoker->CheckTransactionData(tr.get()); 98 ASSERT_TRUE(ret); 99 100 EXPECT_CALL(*invoker, 101 CheckAndSetCallerInfo(testing::_, testing::_)).WillOnce(testing::Return(RPC_DATABUS_INVOKER_INVALID_DATA_ERR)); 102 invoker->ProcessTransaction(tr.get(), listenFd); 103 EXPECT_EQ(invoker->result_, RPC_DATABUS_INVOKER_INVALID_DATA_ERR); 104 } 105 106 /** 107 * @tc.name: StartProcessLoopAbnormalBranch001 108 * @tc.desc: Mock StartProcessLoop can not get the IPCProcessSkeleton instance 109 * @tc.type: FUNC 110 */ 111 HWTEST_F(DBinderBaseInvokerUnitTest, StartProcessLoopAbnormalBranch001, TestSize.Level1) 112 { 113 testing::NiceMock<MockDBinderBaseInvoker> mock; 114 int32_t socketId = 0; 115 std::shared_ptr<dbinder_transaction_data> tr(new dbinder_transaction_data); 116 EXPECT_TRUE(tr != nullptr); 117 uint32_t size = sizeof(dbinder_transaction_data) + sizeof(binder_size_t); 118 119 tr->magic = DBINDER_MAGICWORD; 120 tr->flags = MessageOption::TF_STATUS_CODE; 121 tr->offsets = sizeof(binder_size_t); 122 tr->buffer_size = sizeof(binder_size_t); 123 tr->sizeOfSelf = sizeof(dbinder_transaction_data) + sizeof(binder_size_t); 124 125 IPCProcessSkeleton::exitFlag_ = true; 126 IPCProcessSkeleton::instance_ = nullptr; 127 128 mock.StartProcessLoop(socketId, reinterpret_cast<const char*>(tr.get()), size); 129 EXPECT_EQ(mock.result_, RPC_BASE_INVOKER_CURRENT_NULL_ERR); 130 131 IPCProcessSkeleton::exitFlag_ = false; 132 } 133 134 /** 135 * @tc.name: StartProcessLoopAbnormalBranch002 136 * @tc.desc: Mock StartProcessLoop can not get the IPCProcessSkeleton instance 137 * @tc.type: FUNC 138 */ 139 HWTEST_F(DBinderBaseInvokerUnitTest, StartProcessLoopAbnormalBranch002, TestSize.Level1) 140 { 141 testing::NiceMock<MockDBinderBaseInvoker> mock; 142 int32_t socketId = 0; 143 std::shared_ptr<dbinder_transaction_data> tr(new dbinder_transaction_data); 144 EXPECT_TRUE(tr != nullptr); 145 uint32_t size = SOCKET_MAX_BUFF_SIZE + 1; 146 147 tr->magic = DBINDER_MAGICWORD; 148 tr->flags = MessageOption::TF_STATUS_CODE; 149 tr->offsets = sizeof(binder_size_t); 150 tr->buffer_size = sizeof(binder_size_t); 151 tr->sizeOfSelf = sizeof(dbinder_transaction_data) + sizeof(binder_size_t); 152 153 mock.StartProcessLoop(socketId, reinterpret_cast<const char*>(tr.get()), size); 154 EXPECT_EQ(mock.result_, RPC_BASE_INVOKER_MALLOC_ERR); 155 } 156