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 <cstdint>
17 #include <gtest/gtest.h>
18
19 #include "access_token.h"
20 #include "accesstoken_kit.h"
21 #include "access_token_error.h"
22 #define private public
23 #include "accesstoken_id_manager.h"
24 #include "accesstoken_info_manager.h"
25 #include "permission_definition_cache.h"
26 #include "form_manager_access_client.h"
27 #undef private
28 #include "accesstoken_callback_stubs.h"
29 #include "callback_death_recipients.h"
30 #include "token_setproc.h"
31
32 using namespace testing::ext;
33
34 namespace OHOS {
35 namespace Security {
36 namespace AccessToken {
37 namespace {
38 static const std::string FORM_VISIBLE_NAME = "#1";
39 static constexpr int USER_ID = 100;
40 static constexpr int INST_INDEX = 0;
41
42 static PermissionStateFull g_permState = {
43 .permissionName = "ohos.permission.CAMERA",
44 .isGeneral = true,
45 .resDeviceID = {"dev-001"},
46 .grantStatus = {PermissionState::PERMISSION_DENIED},
47 .grantFlags = {PermissionFlag::PERMISSION_DEFAULT_FLAG}
48 };
49
50 static HapInfoParams g_info = {
51 .userID = USER_ID,
52 .bundleName = "accesstoken_test",
53 .instIndex = INST_INDEX,
54 .appIDDesc = "testtesttesttest"
55 };
56
57 static HapPolicyParams g_policy = {
58 .apl = APL_NORMAL,
59 .domain = "test.domain",
60 .permStateList = {g_permState}
61 };
62 }
63 class PermissionRecordManagerCoverageTest : public testing::Test {
64 public:
65 static void SetUpTestCase();
66
67 static void TearDownTestCase();
68
69 void SetUp();
70
71 void TearDown();
72 };
73
SetUpTestCase()74 void PermissionRecordManagerCoverageTest::SetUpTestCase()
75 {
76 AccessTokenInfoManager::GetInstance().Init();
77 }
78
TearDownTestCase()79 void PermissionRecordManagerCoverageTest::TearDownTestCase() {}
80
SetUp()81 void PermissionRecordManagerCoverageTest::SetUp() {}
82
TearDown()83 void PermissionRecordManagerCoverageTest::TearDown() {}
84
85 /*
86 * @tc.name: RegisterAddObserverTest001
87 * @tc.desc: regist form observer
88 * @tc.type: FUNC
89 * @tc.require: issueI5RWXF
90 */
HWTEST_F(PermissionRecordManagerCoverageTest, RegisterAddObserverTest001, TestSize.Level1)91 HWTEST_F(PermissionRecordManagerCoverageTest, RegisterAddObserverTest001, TestSize.Level1)
92 {
93 AccessTokenID selfTokenId = GetSelfTokenID();
94 AccessTokenID nativeToken = AccessTokenInfoManager::GetInstance().GetNativeTokenId("privacy_service");
95 EXPECT_EQ(RET_SUCCESS, SetSelfTokenID(nativeToken));
96 sptr<FormStateObserverStub> formStateObserver = new (std::nothrow) FormStateObserverStub();
97 ASSERT_NE(formStateObserver, nullptr);
98 ASSERT_EQ(RET_SUCCESS,
99 FormManagerAccessClient::GetInstance().RegisterAddObserver(FORM_VISIBLE_NAME, formStateObserver));
100 ASSERT_EQ(RET_FAILED,
101 FormManagerAccessClient::GetInstance().RegisterAddObserver(FORM_VISIBLE_NAME, nullptr));
102
103 ASSERT_EQ(RET_FAILED,
104 FormManagerAccessClient::GetInstance().RegisterRemoveObserver(FORM_VISIBLE_NAME, nullptr));
105 ASSERT_EQ(RET_SUCCESS,
106 FormManagerAccessClient::GetInstance().RegisterRemoveObserver(FORM_VISIBLE_NAME, formStateObserver));
107 EXPECT_EQ(RET_SUCCESS, SetSelfTokenID(selfTokenId));
108 }
109
110 /*
111 * @tc.name: FormMgrDiedHandle001
112 * @tc.desc: test form manager remote die
113 * @tc.type: FUNC
114 * @tc.require: issueI5RWXF
115 */
HWTEST_F(PermissionRecordManagerCoverageTest, FormMgrDiedHandle001, TestSize.Level1)116 HWTEST_F(PermissionRecordManagerCoverageTest, FormMgrDiedHandle001, TestSize.Level1)
117 {
118 FormManagerAccessClient::GetInstance().OnRemoteDiedHandle();
119 ASSERT_EQ(nullptr, FormManagerAccessClient::GetInstance().proxy_);
120 ASSERT_EQ(nullptr, FormManagerAccessClient::GetInstance().serviceDeathObserver_);
121 }
122
123 class PermissionRecordManagerCoverTestCb1 : public FormStateObserverStub {
124 public:
PermissionRecordManagerCoverTestCb1()125 PermissionRecordManagerCoverTestCb1()
126 {}
127
~PermissionRecordManagerCoverTestCb1()128 ~PermissionRecordManagerCoverTestCb1()
129 {}
130
131 virtual int32_t NotifyWhetherFormsVisible(const FormVisibilityType visibleType,
132 const std::string &bundleName, std::vector<FormInstance> &formInstances) override
133 {
134 return 0;
135 }
136 };
137
138 /**
139 * @tc.name: OnRemoteRequest001
140 * @tc.desc: FormStateObserverStub::OnRemoteRequest function test
141 * @tc.type: FUNC
142 * @tc.require:
143 */
HWTEST_F(PermissionRecordManagerCoverageTest, OnRemoteRequest001, TestSize.Level1)144 HWTEST_F(PermissionRecordManagerCoverageTest, OnRemoteRequest001, TestSize.Level1)
145 {
146 PermissionRecordManagerCoverTestCb1 callback;
147
148 OHOS::MessageParcel reply;
149 OHOS::MessageOption option(OHOS::MessageOption::TF_SYNC);
150
151 OHOS::MessageParcel data1;
152 ASSERT_EQ(true, data1.WriteInterfaceToken(IJsFormStateObserver::GetDescriptor()));
153 EXPECT_EQ(RET_SUCCESS, callback.OnRemoteRequest(static_cast<uint32_t>(
154 IJsFormStateObserver::Message::FORM_STATE_OBSERVER_NOTIFY_WHETHER_FORMS_VISIBLE), data1, reply, option));
155
156 MessageParcel data2;
157 data2.WriteInterfaceToken(IJsFormStateObserver::GetDescriptor());
158 ASSERT_EQ(true, data2.WriteString(FORM_VISIBLE_NAME));
159 std::vector<FormInstance> formInstances;
160 FormInstance formInstance;
161 formInstances.emplace_back(formInstance);
162 ASSERT_EQ(true, data2.WriteInt32(formInstances.size()));
163 for (auto &parcelable: formInstances) {
164 ASSERT_EQ(true, data2.WriteParcelable(&parcelable));
165 }
166 EXPECT_EQ(RET_SUCCESS, callback.OnRemoteRequest(static_cast<uint32_t>(
167 IJsFormStateObserver::Message::FORM_STATE_OBSERVER_NOTIFY_WHETHER_FORMS_VISIBLE), data2, reply, option));
168
169 uint32_t code = -1;
170 EXPECT_NE(RET_SUCCESS, callback.OnRemoteRequest(code, data2, reply, option));
171 }
172
173 /**
174 * @tc.name: UpdateStatesToDatabase001
175 * @tc.desc: Test AccessTokenInfoManager::UpdateStatesToDatabase
176 * @tc.type: FUNC
177 * @tc.require:
178 */
HWTEST_F(PermissionRecordManagerCoverageTest, UpdateStatesToDatabase001, TestSize.Level1)179 HWTEST_F(PermissionRecordManagerCoverageTest, UpdateStatesToDatabase001, TestSize.Level1)
180 {
181 AccessTokenIDEx tokenIdEx = {0};
182 ASSERT_EQ(RET_SUCCESS, AccessTokenInfoManager::GetInstance().CreateHapTokenInfo(g_info, g_policy, tokenIdEx));
183
184 AccessTokenID tokenId = tokenIdEx.tokenIdExStruct.tokenID;
185 ASSERT_NE(INVALID_TOKENID, tokenId);
186 std::vector<PermissionStateFull> stateChangeList = {g_permState};
187 ASSERT_EQ(true, AccessTokenInfoManager::GetInstance().UpdateStatesToDatabase(tokenId, stateChangeList));
188
189 AccessTokenInfoManager::GetInstance().RemoveHapTokenInfo(tokenId);
190 }
191
192 /**
193 * @tc.name: UpdateCapStateToDatabase001
194 * @tc.desc: Test AccessTokenInfoManager::UpdateCapStateToDatabase
195 * @tc.type: FUNC
196 * @tc.require:
197 */
HWTEST_F(PermissionRecordManagerCoverageTest, UpdateCapStateToDatabase001, TestSize.Level1)198 HWTEST_F(PermissionRecordManagerCoverageTest, UpdateCapStateToDatabase001, TestSize.Level1)
199 {
200 AccessTokenIDEx tokenIdEx = {0};
201 ASSERT_EQ(RET_SUCCESS, AccessTokenInfoManager::GetInstance().CreateHapTokenInfo(g_info, g_policy, tokenIdEx));
202
203 AccessTokenID tokenId = tokenIdEx.tokenIdExStruct.tokenID;
204 ASSERT_NE(INVALID_TOKENID, tokenId);
205 ASSERT_EQ(true, AccessTokenInfoManager::GetInstance().UpdateCapStateToDatabase(tokenId, false));
206
207 AccessTokenInfoManager::GetInstance().RemoveHapTokenInfo(tokenId);
208 }
209 } // namespace AccessToken
210 } // namespace Security
211 } // namespace OHOS
212