• 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 "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