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