1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci#include <chrono>
16d9f0492fSopenharmony_ci#include <thread>
17d9f0492fSopenharmony_ci#include <string>
18d9f0492fSopenharmony_ci#include <iostream>
19d9f0492fSopenharmony_ci#include <gtest/gtest.h>
20d9f0492fSopenharmony_ci
21d9f0492fSopenharmony_ci#include "accesstoken_kit.h"
22d9f0492fSopenharmony_ci#include "parameter.h"
23d9f0492fSopenharmony_ci#include "system_ability_definition.h"
24d9f0492fSopenharmony_ci#include "if_system_ability_manager.h"
25d9f0492fSopenharmony_ci#include "iservice_registry.h"
26d9f0492fSopenharmony_ci#include "parcel.h"
27d9f0492fSopenharmony_ci#include "string_ex.h"
28d9f0492fSopenharmony_ci#include "device_info_kits.h"
29d9f0492fSopenharmony_ci#include "device_info_load.h"
30d9f0492fSopenharmony_ci#include "device_info_proxy.h"
31d9f0492fSopenharmony_ci#include "idevice_info.h"
32d9f0492fSopenharmony_ci#include "device_info_stub.h"
33d9f0492fSopenharmony_ci#include "sysparam_errno.h"
34d9f0492fSopenharmony_ci#include "deviceinfoservice_ipc_interface_code.h"
35d9f0492fSopenharmony_ci
36d9f0492fSopenharmony_ciusing namespace testing::ext;
37d9f0492fSopenharmony_ciusing namespace std;
38d9f0492fSopenharmony_ciusing namespace OHOS;
39d9f0492fSopenharmony_ci
40d9f0492fSopenharmony_cistatic int g_tokenType = OHOS::Security::AccessToken::TOKEN_HAP;
41d9f0492fSopenharmony_cistatic int g_tokenVerifyResult = 0;
42d9f0492fSopenharmony_cinamespace OHOS {
43d9f0492fSopenharmony_cinamespace Security {
44d9f0492fSopenharmony_cinamespace AccessToken {
45d9f0492fSopenharmony_ciATokenTypeEnum AccessTokenKit::GetTokenTypeFlag(AccessTokenID tokenID)
46d9f0492fSopenharmony_ci{
47d9f0492fSopenharmony_ci    return static_cast<ATokenTypeEnum>(g_tokenType);
48d9f0492fSopenharmony_ci}
49d9f0492fSopenharmony_ciint AccessTokenKit::VerifyAccessToken(AccessTokenID tokenID, const std::string& permissionName)
50d9f0492fSopenharmony_ci{
51d9f0492fSopenharmony_ci    return g_tokenVerifyResult;
52d9f0492fSopenharmony_ci}
53d9f0492fSopenharmony_ci} // namespace AccessToken
54d9f0492fSopenharmony_ci} // namespace Security
55d9f0492fSopenharmony_ci} // namespace OHOS
56d9f0492fSopenharmony_ci
57d9f0492fSopenharmony_ciconst int UDID_LEN = 65;
58d9f0492fSopenharmony_cinamespace init_ut {
59d9f0492fSopenharmony_ciusing DeviceInfoServicePtr = OHOS::device_info::DeviceInfoService *;
60d9f0492fSopenharmony_ciclass DeviceInfoUnittest : public testing::Test {
61d9f0492fSopenharmony_cipublic:
62d9f0492fSopenharmony_ci    DeviceInfoUnittest() {};
63d9f0492fSopenharmony_ci    virtual ~DeviceInfoUnittest() {};
64d9f0492fSopenharmony_ci    static void SetUpTestCase(void) {};
65d9f0492fSopenharmony_ci    static void TearDownTestCase(void) {};
66d9f0492fSopenharmony_ci    void SetUp() {};
67d9f0492fSopenharmony_ci    void TearDown() {};
68d9f0492fSopenharmony_ci    void TestBody(void) {};
69d9f0492fSopenharmony_ci    DeviceInfoServicePtr GetDeviceInfoService()
70d9f0492fSopenharmony_ci    {
71d9f0492fSopenharmony_ci        static DeviceInfoServicePtr deviceInfoServicePtr = nullptr;
72d9f0492fSopenharmony_ci        if (deviceInfoServicePtr == nullptr) {
73d9f0492fSopenharmony_ci            deviceInfoServicePtr = new OHOS::device_info::DeviceInfoService(0, true);
74d9f0492fSopenharmony_ci            if (deviceInfoServicePtr == nullptr) {
75d9f0492fSopenharmony_ci                return nullptr;
76d9f0492fSopenharmony_ci            }
77d9f0492fSopenharmony_ci            deviceInfoServicePtr->OnStart();
78d9f0492fSopenharmony_ci        }
79d9f0492fSopenharmony_ci        return deviceInfoServicePtr;
80d9f0492fSopenharmony_ci    }
81d9f0492fSopenharmony_ci};
82d9f0492fSopenharmony_ci
83d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_DevInfoAgentTest_001, TestSize.Level1)
84d9f0492fSopenharmony_ci{
85d9f0492fSopenharmony_ci    OHOS::device_info::DeviceInfoKits &kits = OHOS::device_info::DeviceInfoKits::GetInstance();
86d9f0492fSopenharmony_ci    std::string serial = {};
87d9f0492fSopenharmony_ci    int ret = kits.GetSerialID(serial);
88d9f0492fSopenharmony_ci    EXPECT_EQ(ret, SYSPARAM_PERMISSION_DENIED);
89d9f0492fSopenharmony_ci    ret = kits.GetUdid(serial);
90d9f0492fSopenharmony_ci    EXPECT_EQ(ret, SYSPARAM_PERMISSION_DENIED);
91d9f0492fSopenharmony_ci}
92d9f0492fSopenharmony_ci
93d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_DevInfoDiedTest_001, TestSize.Level1)
94d9f0492fSopenharmony_ci{
95d9f0492fSopenharmony_ci    sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
96d9f0492fSopenharmony_ci    DINFO_CHECK(samgr != nullptr, return, "Get samgr failed");
97d9f0492fSopenharmony_ci    sptr<IRemoteObject> object = samgr->GetSystemAbility(SYSPARAM_DEVICE_SERVICE_ID);
98d9f0492fSopenharmony_ci    DINFO_CHECK(object != nullptr, return, "Get deviceinfo manager object from samgr failed");
99d9f0492fSopenharmony_ci    OHOS::device_info::DeviceInfoKits &kits = OHOS::device_info::DeviceInfoKits::GetInstance();
100d9f0492fSopenharmony_ci    if (kits.GetDeathRecipient() != nullptr) {
101d9f0492fSopenharmony_ci        kits.GetDeathRecipient()->OnRemoteDied(object);
102d9f0492fSopenharmony_ci    }
103d9f0492fSopenharmony_ci    std::string serial = {};
104d9f0492fSopenharmony_ci    int ret = kits.GetSerialID(serial);
105d9f0492fSopenharmony_ci    EXPECT_EQ(ret, SYSPARAM_PERMISSION_DENIED);
106d9f0492fSopenharmony_ci}
107d9f0492fSopenharmony_ci
108d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_DevInfoAgentFail_001, TestSize.Level1)
109d9f0492fSopenharmony_ci{
110d9f0492fSopenharmony_ci    sptr<OHOS::device_info::DeviceInfoLoad> deviceInfoLoad = new (std::nothrow) OHOS::device_info::DeviceInfoLoad();
111d9f0492fSopenharmony_ci    ASSERT_NE(deviceInfoLoad, nullptr);
112d9f0492fSopenharmony_ci    deviceInfoLoad->OnLoadSystemAbilityFail(SYSPARAM_DEVICE_SERVICE_ID);
113d9f0492fSopenharmony_ci    deviceInfoLoad->OnLoadSystemAbilityFail(SYSPARAM_DEVICE_SERVICE_ID + 1);
114d9f0492fSopenharmony_ci
115d9f0492fSopenharmony_ci    OHOS::device_info::DeviceInfoKits &kits = OHOS::device_info::DeviceInfoKits::GetInstance();
116d9f0492fSopenharmony_ci    kits.FinishStartSAFailed();
117d9f0492fSopenharmony_ci}
118d9f0492fSopenharmony_ci
119d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_DeviceInfoServiceInvalidTokenTest_001, TestSize.Level1)
120d9f0492fSopenharmony_ci{
121d9f0492fSopenharmony_ci    string result;
122d9f0492fSopenharmony_ci    DeviceInfoServicePtr deviceInfoService = GetDeviceInfoService();
123d9f0492fSopenharmony_ci    ASSERT_NE(deviceInfoService, nullptr);
124d9f0492fSopenharmony_ci    MessageParcel data;
125d9f0492fSopenharmony_ci    MessageParcel reply;
126d9f0492fSopenharmony_ci    MessageOption option;
127d9f0492fSopenharmony_ci    g_tokenType = OHOS::Security::AccessToken::TOKEN_INVALID;
128d9f0492fSopenharmony_ci    data.WriteInterfaceToken(OHOS::device_info::DeviceInfoStub::GetDescriptor());
129d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
130d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_UDID), data, reply, option);
131d9f0492fSopenharmony_ci}
132d9f0492fSopenharmony_ci
133d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_DeviceInfoServiceFailTest_001, TestSize.Level1)
134d9f0492fSopenharmony_ci{
135d9f0492fSopenharmony_ci    string result;
136d9f0492fSopenharmony_ci    DeviceInfoServicePtr deviceInfoService = GetDeviceInfoService();
137d9f0492fSopenharmony_ci    ASSERT_NE(deviceInfoService, nullptr);
138d9f0492fSopenharmony_ci    MessageParcel data;
139d9f0492fSopenharmony_ci    MessageParcel reply;
140d9f0492fSopenharmony_ci    MessageOption option;
141d9f0492fSopenharmony_ci    g_tokenType = OHOS::Security::AccessToken::TOKEN_HAP;
142d9f0492fSopenharmony_ci    g_tokenVerifyResult = OHOS::Security::AccessToken::TypePermissionState::PERMISSION_DENIED;
143d9f0492fSopenharmony_ci
144d9f0492fSopenharmony_ci    // udid
145d9f0492fSopenharmony_ci    data.WriteInterfaceToken(OHOS::device_info::DeviceInfoStub::GetDescriptor());
146d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
147d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_UDID),
148d9f0492fSopenharmony_ci        data, reply, option);
149d9f0492fSopenharmony_ci    // serial
150d9f0492fSopenharmony_ci    data.WriteInterfaceToken(OHOS::device_info::DeviceInfoStub::GetDescriptor());
151d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
152d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_SERIAL_ID),
153d9f0492fSopenharmony_ci        data, reply, option);
154d9f0492fSopenharmony_ci}
155d9f0492fSopenharmony_ci
156d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_DeviceInfoServiceTest_001, TestSize.Level1)
157d9f0492fSopenharmony_ci{
158d9f0492fSopenharmony_ci    string result;
159d9f0492fSopenharmony_ci    DeviceInfoServicePtr deviceInfoService = GetDeviceInfoService();
160d9f0492fSopenharmony_ci    ASSERT_NE(deviceInfoService, nullptr);
161d9f0492fSopenharmony_ci    MessageParcel data;
162d9f0492fSopenharmony_ci    MessageParcel reply;
163d9f0492fSopenharmony_ci    MessageOption option;
164d9f0492fSopenharmony_ci    g_tokenType = OHOS::Security::AccessToken::TOKEN_HAP;
165d9f0492fSopenharmony_ci    g_tokenVerifyResult = OHOS::Security::AccessToken::TypePermissionState::PERMISSION_GRANTED;
166d9f0492fSopenharmony_ci    data.WriteInterfaceToken(OHOS::device_info::DeviceInfoStub::GetDescriptor());
167d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
168d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_UDID),
169d9f0492fSopenharmony_ci        data, reply, option);
170d9f0492fSopenharmony_ci    data.WriteInterfaceToken(OHOS::device_info::DeviceInfoStub::GetDescriptor());
171d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
172d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_SERIAL_ID),
173d9f0492fSopenharmony_ci        data, reply, option);
174d9f0492fSopenharmony_ci    data.WriteInterfaceToken(OHOS::device_info::DeviceInfoStub::GetDescriptor());
175d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
176d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_SERIAL_ID) + 1,
177d9f0492fSopenharmony_ci        data, reply, option);
178d9f0492fSopenharmony_ci
179d9f0492fSopenharmony_ci    deviceInfoService->OnRemoteRequest
180d9f0492fSopenharmony_ci        (static_cast<uint32_t> (OHOS::device_info::DeviceInfoInterfaceCode::COMMAND_GET_SERIAL_ID) + 1,
181d9f0492fSopenharmony_ci        data, reply, option);
182d9f0492fSopenharmony_ci    std::this_thread::sleep_for(std::chrono::seconds(3)); // wait sa unload 3s
183d9f0492fSopenharmony_ci    deviceInfoService->GetUdid(result);
184d9f0492fSopenharmony_ci    deviceInfoService->GetSerialID(result);
185d9f0492fSopenharmony_ci    deviceInfoService->OnStop();
186d9f0492fSopenharmony_ci    std::vector<std::u16string> args = {};
187d9f0492fSopenharmony_ci    deviceInfoService->Dump(STDOUT_FILENO, args);
188d9f0492fSopenharmony_ci    deviceInfoService->Dump(-1, args);
189d9f0492fSopenharmony_ci}
190d9f0492fSopenharmony_ci
191d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_TestInterface_001, TestSize.Level1)
192d9f0492fSopenharmony_ci{
193d9f0492fSopenharmony_ci    char localDeviceId[UDID_LEN] = {0};
194d9f0492fSopenharmony_ci    int ret = AclGetDevUdid(nullptr, UDID_LEN);
195d9f0492fSopenharmony_ci    ASSERT_NE(ret, 0);
196d9f0492fSopenharmony_ci    ret = AclGetDevUdid(localDeviceId, 2); // 2 test
197d9f0492fSopenharmony_ci    ASSERT_NE(ret, 0);
198d9f0492fSopenharmony_ci
199d9f0492fSopenharmony_ci    ret = AclGetDevUdid(localDeviceId, UDID_LEN);
200d9f0492fSopenharmony_ci    const char *serialNumber = AclGetSerial();
201d9f0492fSopenharmony_ci    EXPECT_NE(nullptr, serialNumber);
202d9f0492fSopenharmony_ci}
203d9f0492fSopenharmony_ci
204d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_TestDeviceInfoProxy_001, TestSize.Level1)
205d9f0492fSopenharmony_ci{
206d9f0492fSopenharmony_ci    sptr<device_info::DeviceInfoProxy> proxy;
207d9f0492fSopenharmony_ci    {
208d9f0492fSopenharmony_ci        OHOS::device_info::DeviceInfoKits &kits = device_info::DeviceInfoKits::GetInstance();
209d9f0492fSopenharmony_ci        std::unique_lock<std::mutex> lock(kits.lock_);
210d9f0492fSopenharmony_ci        auto remotePtr = device_info::DeviceInfoKits::GetInstance().GetService(lock);
211d9f0492fSopenharmony_ci        ASSERT_NE(remotePtr, nullptr);
212d9f0492fSopenharmony_ci        auto remote = remotePtr->AsObject();
213d9f0492fSopenharmony_ci        proxy = new(std::nothrow) device_info::DeviceInfoProxy(remote);
214d9f0492fSopenharmony_ci        ASSERT_NE(proxy, nullptr);
215d9f0492fSopenharmony_ci    }
216d9f0492fSopenharmony_ci    device_info::DeviceInfoKits::GetInstance().FinishStartSASuccess(proxy->AsObject());
217d9f0492fSopenharmony_ci    std::string udid;
218d9f0492fSopenharmony_ci    std::string serialId;
219d9f0492fSopenharmony_ci    proxy->GetUdid(udid);
220d9f0492fSopenharmony_ci    proxy->GetSerialID(serialId);
221d9f0492fSopenharmony_ci
222d9f0492fSopenharmony_ci    char localDeviceId[UDID_LEN] = {0};
223d9f0492fSopenharmony_ci    (void)AclGetDevUdid(localDeviceId, UDID_LEN);
224d9f0492fSopenharmony_ci    const char *serialNumber = AclGetSerial();
225d9f0492fSopenharmony_ci    EXPECT_NE(nullptr, serialNumber);
226d9f0492fSopenharmony_ci}
227d9f0492fSopenharmony_ci
228d9f0492fSopenharmony_ciHWTEST_F(DeviceInfoUnittest, Init_TestDeviceInfoProxy_002, TestSize.Level1)
229d9f0492fSopenharmony_ci{
230d9f0492fSopenharmony_ci    sptr<device_info::DeviceInfoProxy> proxy = new(std::nothrow) device_info::DeviceInfoProxy(nullptr);
231d9f0492fSopenharmony_ci    ASSERT_NE(proxy, nullptr);
232d9f0492fSopenharmony_ci
233d9f0492fSopenharmony_ci    std::string udid;
234d9f0492fSopenharmony_ci    std::string serialId;
235d9f0492fSopenharmony_ci    proxy->GetUdid(udid);
236d9f0492fSopenharmony_ci    proxy->GetSerialID(serialId);
237d9f0492fSopenharmony_ci}
238d9f0492fSopenharmony_ci}  // namespace init_ut
239