1 /*
2 * Copyright (c) 2023 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 <gtest/gtest.h>
17 #include <gtest/hwext/gtest-multithread.h>
18
19 #include "cm_test_common.h"
20
21 #include "cert_manager_api.h"
22
23 using namespace testing::ext;
24 using namespace testing::mt;
25 using namespace CertmanagerTest;
26 namespace {
27 static constexpr uint32_t DEFAULT_AUTH_URI_LEN = 256;
28 static constexpr uint32_t DEFAULT_APP_ID = 1000;
29 static constexpr uint32_t REMOVE_TWICE = 2;
30 static constexpr uint32_t REMOVE_ONCE = 1;
31 static constexpr uint32_t REMOVE_NOT_EXIST_ID = 1001;
32 static constexpr uint32_t MULTI_THREAD_NUM = 10;
33 static uint32_t g_removeAppUid = 0;
34 static uint32_t g_removeCount = 0;
35
36 class CmRemoveGrantMultiThreadTest : public testing::Test {
37 public:
38 static void SetUpTestCase(void);
39
40 static void TearDownTestCase(void);
41
42 void SetUp();
43
44 void TearDown();
45 };
46
SetUpTestCase(void)47 void CmRemoveGrantMultiThreadTest::SetUpTestCase(void)
48 {
49 SetATPermission();
50 }
51
TearDownTestCase(void)52 void CmRemoveGrantMultiThreadTest::TearDownTestCase(void)
53 {
54 }
55
SetUp()56 void CmRemoveGrantMultiThreadTest::SetUp()
57 {
58 }
59
TearDown()60 void CmRemoveGrantMultiThreadTest::TearDown()
61 {
62 }
63
TestRemoveGrantPreAction(void)64 static void TestRemoveGrantPreAction(void)
65 {
66 uint8_t aliasData[] = "TestRemoveGrant";
67 struct CmBlob alias = { sizeof(aliasData), aliasData };
68 int32_t ret = TestGenerateAppCert(&alias, CERT_KEY_ALG_RSA, CM_CREDENTIAL_STORE);
69 EXPECT_EQ(ret, CM_SUCCESS) << "TestGenerateAppCert failed, retcode:" << ret;
70
71 uint8_t uriData[] = "oh:t=ak;o=TestRemoveGrant;u=0;a=0";
72 struct CmBlob keyUri = { sizeof(uriData), uriData };
73 uint8_t authUriData[DEFAULT_AUTH_URI_LEN] = {0};
74 struct CmBlob authUri = { DEFAULT_AUTH_URI_LEN, authUriData };
75 uint32_t appId = DEFAULT_APP_ID;
76
77 ret = CmGrantAppCertificate(&keyUri, appId, &authUri);
78 EXPECT_EQ(ret, CM_SUCCESS) << "CmGrantAppCertificate failed, retcode:" << ret;
79 }
80
TestRemoveGrant(void)81 static void TestRemoveGrant(void)
82 {
83 int32_t ret = 0;
84 uint8_t uriData[] = "oh:t=ak;o=TestRemoveGrant;u=0;a=0";
85 struct CmBlob keyUri = { sizeof(uriData), uriData };
86
87 for (uint32_t i = 0; i < g_removeCount; ++i) {
88 ret = CmRemoveGrantedApp(&keyUri, g_removeAppUid);
89 EXPECT_EQ(ret, CM_SUCCESS) << "CmRemoveGrantedApp failed, index:" << i << ", retcode:" << ret;
90 }
91 }
92
TestRemoveGrantAfterAction(void)93 static void TestRemoveGrantAfterAction(void)
94 {
95 uint8_t uriData[] = "oh:t=ak;o=TestRemoveGrant;u=0;a=0";
96 struct CmBlob keyUri = { sizeof(uriData), uriData };
97
98 int32_t ret = CmUninstallAppCert(&keyUri, CM_CREDENTIAL_STORE);
99 EXPECT_EQ(ret, CM_SUCCESS) << "CmUninstallAppCert failed, retcode:" << ret;
100 }
101
102 /**
103 * @tc.name: CmRemoveGrantMultiThreadTest001
104 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri is NULL
105 * @tc.type: FUNC
106 * @tc.require: AR000H0MIA /SR000H09NA
107 */
108 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest001, TestSize.Level0, MULTI_THREAD_NUM)
109 {
110 struct CmBlob *keyUri = nullptr; /* keyUri is NULL */
111 uint32_t appId = 0;
112 int32_t ret = CmRemoveGrantedApp(keyUri, appId);
113 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
114 }
115
116 /**
117 * @tc.name: CmRemoveGrantMultiThreadTest002
118 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri size is 0
119 * @tc.type: FUNC
120 * @tc.require: AR000H0MIA /SR000H09NA
121 */
122 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest002, TestSize.Level0, MULTI_THREAD_NUM)
123 {
124 uint8_t uriData[] = "oh:t=ak;o=keyA;u=0;a=0";
125 struct CmBlob keyUri = { 0, uriData }; /* keyUri size is 0 */
126 uint32_t appId = 0;
127 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
128 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
129 }
130
131 /**
132 * @tc.name: CmRemoveGrantMultiThreadTest003
133 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri data is null
134 * @tc.type: FUNC
135 * @tc.require: AR000H0MIA /SR000H09NA
136 */
137 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest003, TestSize.Level0, MULTI_THREAD_NUM)
138 {
139 uint8_t uriData[] = "oh:t=ak;o=keyA;u=0;a=0";
140 struct CmBlob keyUri = { sizeof(uriData), nullptr }; /* keyUri data is null */
141 uint32_t appId = 0;
142 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
143 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
144 }
145
146 /**
147 * @tc.name: CmRemoveGrantMultiThreadTest004
148 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri data not end of '\0'
149 * @tc.type: FUNC
150 * @tc.require: AR000H0MIA /SR000H09NA
151 */
152 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest004, TestSize.Level0, MULTI_THREAD_NUM)
153 {
154 uint8_t uriData[] = "oh:t=ak;o=keyA;u=0;a=0";
155 struct CmBlob keyUri = { strlen((char *)uriData), uriData }; /* keyUri data not end of '\0' */
156 uint32_t appId = 0;
157 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
158 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
159 }
160
161 /**
162 * @tc.name: CmRemoveGrantMultiThreadTest005
163 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri data has no app
164 * @tc.type: FUNC
165 * @tc.require: AR000H0MIA /SR000H09NA
166 */
167 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest005, TestSize.Level0, MULTI_THREAD_NUM)
168 {
169 /* keyUri data has no app */
170 uint8_t uriData[] = "oh:t=ak;o=keyA;u=0";
171 struct CmBlob keyUri = { sizeof(uriData), uriData };
172 uint32_t appId = 0;
173 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
174 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
175 }
176
177 /**
178 * @tc.name: CmRemoveGrantMultiThreadTest006
179 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri data has no user
180 * @tc.type: FUNC
181 * @tc.require: AR000H0MIA /SR000H09NA
182 */
183 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest006, TestSize.Level0, MULTI_THREAD_NUM)
184 {
185 /* keyUri data has no user */
186 uint8_t uriData[] = "oh:t=ak;o=keyA;a=0";
187 struct CmBlob keyUri = { sizeof(uriData), uriData };
188 uint32_t appId = 0;
189 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
190 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
191 }
192
193 /**
194 * @tc.name: CmRemoveGrantMultiThreadTest007
195 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri data has no object
196 * @tc.type: FUNC
197 * @tc.require: AR000H0MIA /SR000H09NA
198 */
199 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest007, TestSize.Level0, MULTI_THREAD_NUM)
200 {
201 /* keyUri data has no object */
202 uint8_t uriData[] = "oh:t=ak;u=0;a=0";
203 struct CmBlob keyUri = { sizeof(uriData), uriData };
204 uint32_t appId = 0;
205 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
206 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
207 }
208
209 /**
210 * @tc.name: CmRemoveGrantMultiThreadTest008
211 * @tc.desc: Test CmRemoveGrantMultiThreadTest keyUri data type not ak
212 * @tc.type: FUNC
213 * @tc.require: AR000H0MIA /SR000H09NA
214 */
215 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest008, TestSize.Level0, MULTI_THREAD_NUM)
216 {
217 /* keyUri data type not ak */
218 uint8_t uriData[] = "oh:t=m;o=keyA;u=0;a=0";
219 struct CmBlob keyUri = { sizeof(uriData), uriData };
220 uint32_t appId = 0;
221 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
222 EXPECT_EQ(ret, CMR_ERROR_INVALID_ARGUMENT);
223 }
224
225 /**
226 * @tc.name: CmRemoveGrantMultiThreadTest009
227 * @tc.desc: Test CmRemoveGrantMultiThreadTest remove while keyUri not exist
228 * @tc.type: FUNC
229 * @tc.require: AR000H0MIA /SR000H09NA
230 */
231 HWMTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest009, TestSize.Level0, MULTI_THREAD_NUM)
232 {
233 uint8_t uriData[] = "oh:t=ak;o=keyA;u=0;a=0";
234 struct CmBlob keyUri = { sizeof(uriData), uriData };
235 uint32_t appId = DEFAULT_APP_ID;
236 int32_t ret = CmRemoveGrantedApp(&keyUri, appId);
237 EXPECT_EQ(ret, CM_SUCCESS);
238 }
239
240 /**
241 * @tc.name: CmRemoveGrantMultiThreadTest010
242 * @tc.desc: Test CmRemoveGrantMultiThreadTest remove while app uid not exist
243 * @tc.type: FUNC
244 * @tc.require: AR000H0MIA /SR000H09NA
245 */
246 HWTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest010, TestSize.Level0)
247 {
248 TestRemoveGrantPreAction();
249 g_removeAppUid = REMOVE_NOT_EXIST_ID;
250 g_removeCount = REMOVE_ONCE;
251 SET_THREAD_NUM(MULTI_THREAD_NUM);
252 GTEST_RUN_TASK(TestRemoveGrant); /* remove not exist app uid */
253 TestRemoveGrantAfterAction();
254 }
255
256 /**
257 * @tc.name: CmRemoveGrantMultiThreadTest011
258 * @tc.desc: Test CmRemoveGrantMultiThreadTest remove while app uid exist
259 * @tc.type: FUNC
260 * @tc.require: AR000H0MIA /SR000H09NA
261 */
262 HWTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest011, TestSize.Level0)
263 {
264 TestRemoveGrantPreAction();
265 g_removeAppUid = DEFAULT_APP_ID;
266 g_removeCount = REMOVE_ONCE;
267 SET_THREAD_NUM(MULTI_THREAD_NUM);
268 GTEST_RUN_TASK(TestRemoveGrant); /* remove exist app uid */
269 TestRemoveGrantAfterAction();
270 }
271
272 /**
273 * @tc.name: CmRemoveGrantMultiThreadTest012
274 * @tc.desc: Test CmRemoveGrantMultiThreadTest remove same app uid twice
275 * @tc.type: FUNC
276 * @tc.require: AR000H0MIA /SR000H09NA
277 */
278 HWTEST_F(CmRemoveGrantMultiThreadTest, CmRemoveGrantMultiThreadTest012, TestSize.Level0)
279 {
280 TestRemoveGrantPreAction();
281 g_removeAppUid = DEFAULT_APP_ID;
282 g_removeCount = REMOVE_TWICE;
283 SET_THREAD_NUM(MULTI_THREAD_NUM);
284 GTEST_RUN_TASK(TestRemoveGrant); /* remove same app uid twice */
285 TestRemoveGrantAfterAction();
286 }
287 } // end of namespace
288