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