• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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