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 "accesstoken_kit.h"
17 #include <gtest/gtest.h>
18 #include "nativetoken_kit.h"
19 #include "token_setproc.h"
20 
21 #include "ddm_adapter.h"
22 #include "ddm_adapter_impl.h"
23 #include "devicestatus_define.h"
24 
25 #undef LOG_TAG
26 #define LOG_TAG "DDMAdapterTest"
27 
28 namespace OHOS {
29 namespace Msdp {
30 namespace DeviceStatus {
31 using namespace testing::ext;
32 namespace {
33 constexpr int32_t TIME_WAIT_FOR_OP_MS { 20 };
34 uint64_t g_tokenID { 0 };
35 const std::string SYSTEM_CORE { "system_core" };
36 const char* g_cores[] = { "ohos.permission.INPUT_MONITORING" };
37 } // namespace
38 
39 class DDMAdapterTest : public testing::Test {
40 public:
41     void SetUp();
42     void TearDown();
43     static void SetUpTestCase();
44     static void SetPermission(const std::string &level, const char** perms, size_t permAmount);
45     static void RemovePermission();
46 };
47 
SetPermission(const std::string & level,const char ** perms,size_t permAmount)48 void DDMAdapterTest::SetPermission(const std::string &level, const char** perms, size_t permAmount)
49 {
50     CALL_DEBUG_ENTER;
51     if (perms == nullptr || permAmount == 0) {
52         FI_HILOGE("The perms is empty");
53         return;
54     }
55 
56     NativeTokenInfoParams infoInstance = {
57         .dcapsNum = 0,
58         .permsNum = permAmount,
59         .aclsNum = 0,
60         .dcaps = nullptr,
61         .perms = perms,
62         .acls = nullptr,
63         .processName = "DDMAdapterTest",
64         .aplStr = level.c_str(),
65     };
66     g_tokenID = GetAccessTokenId(&infoInstance);
67     SetSelfTokenID(g_tokenID);
68     OHOS::Security::AccessToken::AccessTokenKit::AccessTokenKit::ReloadNativeTokenInfo();
69 }
70 
RemovePermission()71 void DDMAdapterTest::RemovePermission()
72 {
73     CALL_DEBUG_ENTER;
74     int32_t ret = OHOS::Security::AccessToken::AccessTokenKit::DeleteToken(g_tokenID);
75     if (ret != RET_OK) {
76         FI_HILOGE("Failed to remove permission");
77         return;
78     }
79 }
80 
SetUpTestCase()81 void DDMAdapterTest::SetUpTestCase() {}
82 
SetUp()83 void DDMAdapterTest::SetUp() {}
84 
TearDown()85 void DDMAdapterTest::TearDown()
86 {
87     std::this_thread::sleep_for(std::chrono::milliseconds(TIME_WAIT_FOR_OP_MS));
88 }
89 
90 /**
91  * @tc.name: DDMAdapterTest
92  * @tc.desc: Test Enable
93  * @tc.type: FUNC
94  * @tc.require:
95  */
96 HWTEST_F(DDMAdapterTest, TestEnable, TestSize.Level1)
97 {
98     CALL_TEST_DEBUG;
99     SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
100     DDMAdapter ddmAdapter;
101     ASSERT_NO_FATAL_FAILURE(ddmAdapter.Enable());
102     RemovePermission();
103 }
104 
105 /**
106  * @tc.name: DDMAdapterTest
107  * @tc.desc: Test Disable
108  * @tc.type: FUNC
109  * @tc.require:
110  */
111 HWTEST_F(DDMAdapterTest, TestDisable, TestSize.Level1)
112 {
113     CALL_TEST_DEBUG;
114     SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
115     DDMAdapter ddmAdapter;
116     ASSERT_NE(ddmAdapter.ddm_, nullptr);
117     std::shared_ptr<DDMAdapterImpl> ddm = std::static_pointer_cast<DDMAdapterImpl>(ddmAdapter.ddm_);
118     ddm->initCb_ = std::make_shared<DDMAdapterImpl::DmInitCb>();
119     ddm->boardStateCb_ = std::make_shared<DDMAdapterImpl::DmBoardStateCb>(ddm);
120     ASSERT_NO_FATAL_FAILURE(ddmAdapter.Disable());
121     RemovePermission();
122 }
123 
124 /**
125  * @tc.name: DDMAdapterTest
126  * @tc.desc: Test CheckSameAccountToLocal
127  * @tc.type: FUNC
128  * @tc.require:
129  */
130 HWTEST_F(DDMAdapterTest, TestCheckSameAccountToLocal, TestSize.Level1)
131 {
132     CALL_TEST_DEBUG;
133     SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
134     DDMAdapter ddmAdapter;
135     ASSERT_NO_FATAL_FAILURE(ddmAdapter.CheckSameAccountToLocal(""));
136     RemovePermission();
137 }
138 
139 /**
140  * @tc.name: DDMAdapterTest
141  * @tc.desc: Test OnBoardOnline
142  * @tc.type: FUNC
143  * @tc.require:
144  */
145 HWTEST_F(DDMAdapterTest, TestOnBoardOnline, TestSize.Level1)
146 {
147     CALL_TEST_DEBUG;
148     SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
149     DDMAdapterImpl ddmAdapterImpl;
150     ASSERT_NO_FATAL_FAILURE(ddmAdapterImpl.OnBoardOnline(""));
151     RemovePermission();
152 }
153 
154 /**
155  * @tc.name: DDMAdapterTest
156  * @tc.desc: Test OnBoardOffline
157  * @tc.type: FUNC
158  * @tc.require:
159  */
160 HWTEST_F(DDMAdapterTest, TestOnBoardOffline, TestSize.Level1)
161 {
162     CALL_TEST_DEBUG;
163     SetPermission(SYSTEM_CORE, g_cores, sizeof(g_cores) / sizeof(g_cores[0]));
164     DDMAdapterImpl ddmAdapterImpl;
165     ASSERT_NO_FATAL_FAILURE(ddmAdapterImpl.OnBoardOffline(""));
166     RemovePermission();
167 }
168 } // namespace DeviceStatus
169 } // namespace Msdp
170 } // namespace OHOS