• 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 <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 "form_manager_access_client.h"
26 #undef private
27 #include "accesstoken_callback_stubs.h"
28 #include "callback_death_recipients.h"
29 #include "token_field_const.h"
30 #include "token_setproc.h"
31 #include "permission_data_brief.h"
32 
33 using namespace testing::ext;
34 
35 namespace OHOS {
36 namespace Security {
37 namespace AccessToken {
38 namespace {
39 static const std::string FORM_VISIBLE_NAME = "#1";
40 static constexpr int USER_ID = 100;
41 static constexpr int INST_INDEX = 0;
42 static constexpr int INVALID_IPC_CODE = 0;
43 
44 static PermissionStatus g_permState = {
45     .permissionName = "ohos.permission.CAMERA",
46     .grantStatus = PermissionState::PERMISSION_DENIED,
47     .grantFlag = 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 HapPolicy 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  */
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  */
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 
NotifyWhetherFormsVisible(const FormVisibilityType visibleType,const std::string & bundleName,std::vector<FormInstance> & formInstances)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  */
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     OHOS::MessageParcel data2;
157     ASSERT_EQ(true, data2.WriteInterfaceToken(IJsFormStateObserver::GetDescriptor()));
158     EXPECT_NE(RET_SUCCESS, callback.OnRemoteRequest(static_cast<uint32_t>(INVALID_IPC_CODE), data2, reply, option));
159 
160     MessageParcel data3;
161     data3.WriteInterfaceToken(IJsFormStateObserver::GetDescriptor());
162     data3.WriteInt32(0);
163     ASSERT_EQ(true, data3.WriteString(FORM_VISIBLE_NAME));
164     std::vector<FormInstance> formInstances;
165     FormInstance formInstance;
166     formInstances.emplace_back(formInstance);
167     ASSERT_EQ(true, data3.WriteInt32(formInstances.size()));
168     for (auto &parcelable: formInstances) {
169         ASSERT_EQ(true, data3.WriteParcelable(&parcelable));
170     }
171     EXPECT_EQ(RET_SUCCESS, callback.OnRemoteRequest(static_cast<uint32_t>(
172         IJsFormStateObserver::Message::FORM_STATE_OBSERVER_NOTIFY_WHETHER_FORMS_VISIBLE), data3, reply, option));
173 
174     uint32_t code = -1;
175     EXPECT_NE(RET_SUCCESS, callback.OnRemoteRequest(code, data3, reply, option));
176 }
177 
178 /**
179  * @tc.name: UpdateCapStateToDatabase001
180  * @tc.desc: Test AccessTokenInfoManager::UpdateCapStateToDatabase
181  * @tc.type: FUNC
182  * @tc.require:
183  */
184 HWTEST_F(PermissionRecordManagerCoverageTest, UpdateCapStateToDatabase001, TestSize.Level1)
185 {
186     AccessTokenIDEx tokenIdEx = {0};
187     ASSERT_EQ(RET_SUCCESS, AccessTokenInfoManager::GetInstance().CreateHapTokenInfo(g_info, g_policy, tokenIdEx));
188 
189     AccessTokenID tokenId = tokenIdEx.tokenIdExStruct.tokenID;
190     ASSERT_NE(INVALID_TOKENID, tokenId);
191     ASSERT_EQ(true, AccessTokenInfoManager::GetInstance().UpdateCapStateToDatabase(tokenId, false));
192 
193     AccessTokenInfoManager::GetInstance().RemoveHapTokenInfo(tokenId);
194 }
195 
196 /**
197  * @tc.name: RestorePermissionPolicy001
198  * @tc.desc: PermissionPolicySet::RestorePermissionPolicy function test
199  * @tc.type: FUNC
200  * @tc.require:
201  */
202 HWTEST_F(PermissionRecordManagerCoverageTest, RestorePermissionPolicy001, TestSize.Level1)
203 {
204     GenericValues value1;
205     value1.Put(TokenFiledConst::FIELD_TOKEN_ID, 123); // 123 is random input
206     value1.Put(TokenFiledConst::FIELD_PERMISSION_NAME, "ohos.permission.CAMERA");
207     value1.Put(TokenFiledConst::FIELD_GRANT_STATE, static_cast<PermissionState>(3));
208     value1.Put(TokenFiledConst::FIELD_GRANT_FLAG, PermissionFlag::PERMISSION_DEFAULT_FLAG);
209 
210     AccessTokenID tokenId = 123; // 123 is random input
211     std::vector<GenericValues> permStateRes1;
212     permStateRes1.emplace_back(value1);
213     std::vector<GenericValues> extendedPermRes1;
214     PermissionDataBrief::GetInstance().RestorePermissionBriefData(
215         tokenId, permStateRes1, extendedPermRes1); // ret != RET_SUCCESS
216     std::vector<BriefPermData> briefPermDataList;
217     ASSERT_EQ(RET_SUCCESS, PermissionDataBrief::GetInstance().GetBriefPermDataByTokenId(tokenId, briefPermDataList));
218 
219 
220     GenericValues value2;
221     value2.Put(TokenFiledConst::FIELD_TOKEN_ID, 123); // 123 is random input
222     value2.Put(TokenFiledConst::FIELD_PERMISSION_NAME, "ohos.permission.CAMERA");
223     value2.Put(TokenFiledConst::FIELD_GRANT_STATE, PermissionState::PERMISSION_DENIED);
224     value2.Put(TokenFiledConst::FIELD_GRANT_FLAG, PermissionFlag::PERMISSION_DEFAULT_FLAG);
225     GenericValues value3;
226     value3.Put(TokenFiledConst::FIELD_TOKEN_ID, 123); // 123 is random input
227     value3.Put(TokenFiledConst::FIELD_PERMISSION_NAME, "ohos.permission.MICROPHONE");
228     value3.Put(TokenFiledConst::FIELD_GRANT_STATE, PermissionState::PERMISSION_DENIED);
229     value3.Put(TokenFiledConst::FIELD_GRANT_FLAG, PermissionFlag::PERMISSION_DEFAULT_FLAG);
230 
231     std::vector<GenericValues> permStateRes2;
232     permStateRes2.emplace_back(value2);
233     permStateRes2.emplace_back(value3);
234     briefPermDataList.clear();
235     PermissionDataBrief::GetInstance().RestorePermissionBriefData(tokenId,
236         permStateRes2, extendedPermRes1); // state.permissionName == iter->permissionName
237     ASSERT_EQ(RET_SUCCESS, PermissionDataBrief::GetInstance().GetBriefPermDataByTokenId(tokenId, briefPermDataList));
238     ASSERT_EQ(static_cast<uint32_t>(2), briefPermDataList.size());
239 }
240 } // namespace AccessToken
241 } // namespace Security
242 } // namespace OHOS
243