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