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 <cinttypes>
17 #include <gtest/gtest.h>
18 #include <securec.h>
19 #include <sys/time.h>
20 
21 #include "auth_common.h"
22 #include "auth_session_key.h"
23 #include "softbus_adapter_mem.h"
24 
25 namespace OHOS {
26 using namespace testing::ext;
27 constexpr uint32_t SESSIONKEY_LEN = 32;
28 constexpr int32_t SESSIONKEY_INDEX = 1;
29 constexpr int32_t SESSIONKEY_INDEX2 = 2;
30 
31 class AuthSessionKeyTest : public testing::Test {
32 public:
33     static void SetUpTestCase();
34     static void TearDownTestCase();
35     void SetUp();
36     void TearDown();
37 };
38 
SetUpTestCase()39 void AuthSessionKeyTest::SetUpTestCase()
40 {
41     AuthCommonInit();
42 }
43 
TearDownTestCase()44 void AuthSessionKeyTest::TearDownTestCase()
45 {
46     AuthCommonDeinit();
47 }
48 
SetUp()49 void AuthSessionKeyTest::SetUp() {}
50 
TearDown()51 void AuthSessionKeyTest::TearDown() {}
52 
53 /*
54  * @tc.name: SESSIONKEY_USE_TIME_TEST_001
55  * @tc.desc: sessionkey item useTime test
56  * @tc.type: FUNC
57  * @tc.require:
58  */
59 HWTEST_F(AuthSessionKeyTest, SESSIONKEY_USE_TIME_TEST_001, TestSize.Level1)
60 {
61     SessionKeyList clientList = { 0 };
62     SessionKey sessionKey = { { 0 }, SESSIONKEY_LEN };
63     ListInit(&clientList);
64     int32_t ret = AddSessionKey(&clientList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_WIFI, false);
65     EXPECT_EQ(ret, SOFTBUS_OK);
66     ret = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX);
67     EXPECT_EQ(ret, SOFTBUS_OK);
68 
69     uint64_t time = GetLatestAvailableSessionKeyTime(&clientList, AUTH_LINK_TYPE_BLE);
70     EXPECT_EQ(time, 0);
71     time = GetLatestAvailableSessionKeyTime(&clientList, AUTH_LINK_TYPE_WIFI);
72     EXPECT_NE(time, 0);
73     DestroySessionKeyList(&clientList);
74 }
75 
76 /*
77  * @tc.name: SESSIONKEY_USE_TIME_TEST_002
78  * @tc.desc: GetLatestSessionKey test
79  * @tc.type: FUNC
80  * @tc.require:
81  */
82 HWTEST_F(AuthSessionKeyTest, SESSIONKEY_USE_TIME_TEST_002, TestSize.Level1)
83 {
84     SessionKeyList clientList = { 0 };
85     SessionKey sessionKey = { { 0 }, SESSIONKEY_LEN };
86     ListInit(&clientList);
87     int32_t ret = AddSessionKey(&clientList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_WIFI, false);
88     EXPECT_EQ(ret, SOFTBUS_OK);
89     ret = AddSessionKey(&clientList, SESSIONKEY_INDEX2, &sessionKey, AUTH_LINK_TYPE_BLE, false);
90     EXPECT_EQ(ret, SOFTBUS_OK);
91     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX);
92     EXPECT_EQ(ret, SOFTBUS_OK);
93     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX2);
94     EXPECT_EQ(ret, SOFTBUS_OK);
95 
96     int32_t index = -1;
97     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_BR, &index, &sessionKey);
98     EXPECT_NE(ret, SOFTBUS_OK);
99     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_WIFI, &index, &sessionKey);
100     EXPECT_EQ(ret, SOFTBUS_OK);
101     EXPECT_TRUE(index == SESSIONKEY_INDEX);
102     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_BLE, &index, &sessionKey);
103     EXPECT_EQ(ret, SOFTBUS_OK);
104     EXPECT_EQ(index, SESSIONKEY_INDEX2);
105     DestroySessionKeyList(&clientList);
106 }
107 
108 /*
109  * @tc.name: SESSIONKEY_USE_TIME_TEST_003
110  * @tc.desc: sessionkey item useTime test
111  * @tc.type: FUNC
112  * @tc.require:
113  */
114 HWTEST_F(AuthSessionKeyTest, SESSIONKEY_USE_TIME_TEST_003, TestSize.Level1)
115 {
116     SessionKeyList clientList = { 0 };
117     SessionKeyList serverList = { 0 };
118     SessionKey sessionKey = { { 0 }, SESSIONKEY_LEN };
119     ListInit(&clientList);
120     ListInit(&serverList);
121     int32_t ret = AddSessionKey(&clientList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_BLE, false);
122     EXPECT_EQ(ret, SOFTBUS_OK);
123     SoftBusSleepMs(100);
124     ret = AddSessionKey(&serverList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_BLE, false);
125     EXPECT_EQ(ret, SOFTBUS_OK);
126     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX);
127     EXPECT_EQ(ret, SOFTBUS_OK);
128     ret  = SetSessionKeyAvailable(&serverList, SESSIONKEY_INDEX);
129     EXPECT_EQ(ret, SOFTBUS_OK);
130     SoftBusSleepMs(100);
131     ret = SetSessionKeyAuthLinkType(&clientList, SESSIONKEY_INDEX, AUTH_LINK_TYPE_BR);
132     EXPECT_EQ(ret, SOFTBUS_OK);
133 
134     uint64_t clientTime = GetLatestAvailableSessionKeyTime(&clientList, AUTH_LINK_TYPE_BR);
135     uint64_t serverTime = GetLatestAvailableSessionKeyTime(&serverList, AUTH_LINK_TYPE_BLE);
136     EXPECT_LE(serverTime, clientTime);
137     clientTime = GetLatestAvailableSessionKeyTime(&clientList, AUTH_LINK_TYPE_BLE);
138     EXPECT_GE(serverTime, clientTime);
139     DestroySessionKeyList(&clientList);
140     DestroySessionKeyList(&serverList);
141 }
142 
143 /*
144  * @tc.name: UPDATE_LATEST_USE_TIME_TEST_001
145  * @tc.desc: UpdateLatestUseTime test
146  * @tc.type: FUNC
147  * @tc.require:
148  */
149 HWTEST_F(AuthSessionKeyTest, UPDATE_LATEST_USE_TIME_TEST_001, TestSize.Level1)
150 {
151     SessionKeyList clientList = { 0 };
152     SessionKey sessionKey = { { 0 }, SESSIONKEY_LEN };
153     ListInit(&clientList);
154     int32_t ret = AddSessionKey(&clientList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_BLE, false);
155     EXPECT_EQ(ret, SOFTBUS_OK);
156     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX);
157     EXPECT_EQ(ret, SOFTBUS_OK);
158     SoftBusSleepMs(100);
159     ret = AddSessionKey(&clientList, SESSIONKEY_INDEX2, &sessionKey, AUTH_LINK_TYPE_BLE, false);
160     EXPECT_EQ(ret, SOFTBUS_OK);
161     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX2);
162     EXPECT_EQ(ret, SOFTBUS_OK);
163     SoftBusSleepMs(100);
164     ret = SetSessionKeyAuthLinkType(&clientList, SESSIONKEY_INDEX, AUTH_LINK_TYPE_WIFI);
165     EXPECT_EQ(ret, SOFTBUS_OK);
166     SoftBusSleepMs(100);
167     ret = SetSessionKeyAuthLinkType(&clientList, SESSIONKEY_INDEX2, AUTH_LINK_TYPE_WIFI);
168     EXPECT_EQ(ret, SOFTBUS_OK);
169 
170     int32_t index = 0;
171     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_BLE, &index, &sessionKey);
172     EXPECT_EQ(index, SESSIONKEY_INDEX2);
173     RemoveSessionkeyByIndex(&clientList, SESSIONKEY_INDEX, AUTH_LINK_TYPE_BLE);
174     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_WIFI, &index, &sessionKey);
175     EXPECT_EQ(index, SESSIONKEY_INDEX2);
176     DestroySessionKeyList(&clientList);
177 }
178 
179 /*
180  * @tc.name: UPDATE_LATEST_USE_TIME_TEST_002
181  * @tc.desc: UpdateLatestUseTime test
182  * @tc.type: FUNC
183  * @tc.require:
184  */
185 HWTEST_F(AuthSessionKeyTest, UPDATE_LATEST_USE_TIME_TEST_002, TestSize.Level1)
186 {
187     SessionKeyList clientList = { 0 };
188     SessionKey sessionKey = { { 0 }, SESSIONKEY_LEN };
189     ListInit(&clientList);
190     int32_t ret = AddSessionKey(&clientList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_BLE, false);
191     EXPECT_EQ(ret, SOFTBUS_OK);
192     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX);
193     EXPECT_EQ(ret, SOFTBUS_OK);
194     SoftBusSleepMs(100);
195     ret = AddSessionKey(&clientList, SESSIONKEY_INDEX2, &sessionKey, AUTH_LINK_TYPE_BLE, false);
196     EXPECT_EQ(ret, SOFTBUS_OK);
197     ret  = SetSessionKeyAvailable(&clientList, SESSIONKEY_INDEX2);
198     EXPECT_EQ(ret, SOFTBUS_OK);
199     SoftBusSleepMs(100);
200     ret = SetSessionKeyAuthLinkType(&clientList, SESSIONKEY_INDEX2, AUTH_LINK_TYPE_WIFI);
201     EXPECT_EQ(ret, SOFTBUS_OK);
202     SoftBusSleepMs(100);
203     ret = SetSessionKeyAuthLinkType(&clientList, SESSIONKEY_INDEX, AUTH_LINK_TYPE_WIFI);
204     EXPECT_EQ(ret, SOFTBUS_OK);
205 
206     int32_t index = 0;
207     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_WIFI, &index, &sessionKey);
208     EXPECT_EQ(index, SESSIONKEY_INDEX);
209     ClearSessionkeyByAuthLinkType(0, &clientList, AUTH_LINK_TYPE_WIFI);
210     ret = GetLatestSessionKey(&clientList, AUTH_LINK_TYPE_BLE, &index, &sessionKey);
211     EXPECT_EQ(index, SESSIONKEY_INDEX2);
212     DestroySessionKeyList(&clientList);
213 }
214 
215 /*
216  * @tc.name: OLD_SESSION_KEY_TEST_001
217  * @tc.desc: CheckSessionKeyListHasOldKey and ClearOldKey test
218  * @tc.type: FUNC
219  * @tc.require:
220  */
221 HWTEST_F(AuthSessionKeyTest, OLD_SESSION_KEY_TEST_001, TestSize.Level1)
222 {
223     SessionKeyList clientList = { 0 };
224     SessionKey sessionKey = { { 0 }, SESSIONKEY_LEN };
225     ListInit(&clientList);
226     int32_t ret = AddSessionKey(&clientList, SESSIONKEY_INDEX, &sessionKey, AUTH_LINK_TYPE_BLE, true);
227     EXPECT_EQ(ret, SOFTBUS_OK);
228     EXPECT_EQ(CheckSessionKeyListHasOldKey(&clientList, AUTH_LINK_TYPE_BLE), true);
229     EXPECT_EQ(ClearOldKey(&clientList, AUTH_LINK_TYPE_BLE), SOFTBUS_OK);
230     EXPECT_EQ(CheckSessionKeyListHasOldKey(&clientList, AUTH_LINK_TYPE_BLE), false);
231     DestroySessionKeyList(&clientList);
232 }
233 } // namespace OHOS
234 
235