1 /*
2 * Copyright (c) 2024 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
16 #include "fuzztest_utils.h"
17
18 #include "if_system_ability_manager.h"
19 #include "sam_mock_permission.h"
20 #include "system_ability_manager.h"
21 #include "iservice_registry.h"
22 #include "hisysevent_adapter.h"
23
24 #include <cinttypes>
25 #include <unistd.h>
26 #include <cstdlib>
27 #include <fcntl.h>
28
29 namespace OHOS {
30 namespace Samgr {
31
32 namespace {
33 constexpr int32_t INIT_TIME = 3;
34 constexpr int32_t RETRY_TIME_OUT_NUMBER = 10;
35 constexpr int32_t SLEEP_INTERVAL_TIME = 200000;
36 constexpr int32_t DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID = 4802;
37 unsigned int g_dumpLevel = 0;
38 const std::u16string SAMGR_INTERFACE_TOKEN = u"ohos.samgr.accessToken";
39 bool g_flag = false;
40 }
41
IsDmReady()42 bool FuzzTestUtils::IsDmReady()
43 {
44 auto dmProxy = SystemAbilityManager::GetInstance()->CheckSystemAbility(
45 DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID);
46 if (dmProxy != nullptr) {
47 IPCObjectProxy* proxy = reinterpret_cast<IPCObjectProxy*>(dmProxy.GetRefPtr());
48 if (proxy != nullptr && !proxy->IsObjectDead()) {
49 return true;
50 }
51 }
52 HILOGE("samgrFuzz:DM isn't ready");
53 return false;
54 }
55
AddDeviceManager()56 void FuzzTestUtils::AddDeviceManager()
57 {
58 if (IsDmReady()) {
59 return;
60 }
61 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
62 if (sm == nullptr) {
63 HILOGE("samgrFuzz:GetSystemAbilityManager fail");
64 return;
65 }
66 int32_t timeout = RETRY_TIME_OUT_NUMBER;
67 int64_t begin = OHOS::GetTickCount();
68 sptr<IRemoteObject> dmAbility = nullptr;
69 do {
70 dmAbility = sm->CheckSystemAbility(DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID);
71 if (dmAbility != nullptr) {
72 break;
73 }
74 usleep(SLEEP_INTERVAL_TIME);
75 } while (timeout--);
76 HILOGI("samgrFuzz:Add DM spend %{public}" PRId64 " ms", OHOS::GetTickCount() - begin);
77 if (dmAbility == nullptr) {
78 HILOGE("samgrFuzz:dmAbility is null");
79 return;
80 }
81 sptr<SystemAbilityManager> fuzzSAManager = SystemAbilityManager::GetInstance();
82 ISystemAbilityManager::SAExtraProp saExtra(false, g_dumpLevel, u"", u"");
83 int32_t ret = fuzzSAManager->AddSystemAbility(DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID, dmAbility, saExtra);
84 if (ret == ERR_OK) {
85 HILOGI("samgrFuzz:Add DM sucess");
86 return;
87 }
88 HILOGE("samgrFuzz:Add DM fail");
89 }
90
FuzzTestRemoteRequest(const uint8_t * rawData,size_t size,uint32_t code)91 void FuzzTestUtils::FuzzTestRemoteRequest(const uint8_t *rawData, size_t size, uint32_t code)
92 {
93 SamMockPermission::MockPermission();
94 MessageParcel data;
95 data.WriteInterfaceToken(SAMGR_INTERFACE_TOKEN);
96 data.WriteBuffer(rawData, size);
97 data.RewindRead(0);
98 MessageParcel reply;
99 MessageOption option;
100 sptr<SystemAbilityManager> manager = SystemAbilityManager::GetInstance();
101 if (!g_flag) {
102 HILOGI("TestRequest=%{public}u:Init", code);
103 manager->Init();
104 g_flag = true;
105 HILOGI("TestRequest=%{public}u:Init AddDeviceManager", code);
106 AddDeviceManager();
107 sleep(INIT_TIME);
108 } else {
109 HILOGI("TestRequest=%{public}u:SetFfrt", code);
110 manager->SetFfrt();
111 HILOGI("TestRequest=%{public}u:AddDeviceManager", code);
112 AddDeviceManager();
113 }
114 if (!IsDmReady()) {
115 HILOGE("TestRequest=%{public}u:dm no ready,return", code);
116 manager->CleanFfrt();
117 return;
118 }
119 int32_t ret = manager->OnRemoteRequest(code, data, reply, option);
120 HILOGI("TestRequest=%{public}u: ret=%{public}u", code, ret);
121 manager->CleanFfrt();
122 }
123
FuzzTestRemoteRequest(MessageParcel & data,uint32_t code)124 void FuzzTestUtils::FuzzTestRemoteRequest(MessageParcel& data, uint32_t code)
125 {
126 SamMockPermission::MockPermission();
127 MessageParcel reply;
128 MessageOption option;
129 sptr<SystemAbilityManager> manager = SystemAbilityManager::GetInstance();
130 if (!g_flag) {
131 HILOGI("FuzzTestRequest=%{public}u:Init", code);
132 manager->Init();
133 g_flag = true;
134 HILOGI("FuzzTestRequest=%{public}u:Init AddDeviceManager", code);
135 AddDeviceManager();
136 sleep(INIT_TIME);
137 } else {
138 HILOGI("FuzzTestRequest=%{public}u:SetFfrt", code);
139 manager->SetFfrt();
140 HILOGI("FuzzTestRequest=%{public}u:AddDeviceManager", code);
141 AddDeviceManager();
142 }
143 if (!IsDmReady()) {
144 HILOGE("FuzzTestRequest=%{public}u:dm no ready,return", code);
145 manager->CleanFfrt();
146 return;
147 }
148 int32_t ret = manager->OnRemoteRequest(code, data, reply, option);
149 HILOGI("FuzzTestRequest=%{public}u: ret=%{public}u", code, ret);
150 manager->CleanFfrt();
151 }
152 }
153 } // namespace OHOS
154