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 <string>
17 #include <gtest/gtest.h>
18 #include <securec.h>
19 
20 #include "inner_socket.h"
21 #include "socket.h"
22 #include "inner_socket.h"
23 #include "softbus_error_code.h"
24 
25 #define SOCKET_NAME_MAX_LEN          255
26 #define SOCKET_NAME_INVALID_LEN      (SOCKET_NAME_MAX_LEN + 1)
27 #define SOCKET_PKG_NAME_MAX_LEN      64
28 #define SOCKET_PKG_NAME_INVALID_LEN  (SOCKET_PKG_NAME_MAX_LEN + 1)
29 #define SOCKET_NETWORKID_MAX_LEN     64
30 #define SOCKET_NETWORKID_INVALID_LEN (SOCKET_NETWORKID_MAX_LEN + 1)
31 
32 using namespace testing::ext;
33 namespace OHOS {
34 static std::string g_pkgName = "dms";
35 static std::string g_socketName = "ohos.distributedschedule.dms.test.client";
36 static std::string g_socketPeerName = "ohos.distributedschedule.dms.test.server";
37 static std::string g_networkId = "ABCDEF00ABCDEF00ABCDEF00ABCDEF00ABCDEF00ABCDEF00ABCDEF00ABCDEF0";
38 
39 class TransClientSocketServiceTest : public testing::Test {
40 public:
TransClientSocketServiceTest()41     TransClientSocketServiceTest() { }
~TransClientSocketServiceTest()42     ~TransClientSocketServiceTest() { }
SetUpTestCase(void)43     static void SetUpTestCase(void) {}
TearDownTestCase(void)44     static void TearDownTestCase(void) {}
SetUp()45     void SetUp() override { }
TearDown()46     void TearDown() override { }
47 };
48 
49 /**
50  * @tc.name: SocketName001
51  * @tc.desc: call Socket function with different socket name.
52  * @tc.type: FUNC
53  * @tc.require:
54  */
55 HWTEST_F(TransClientSocketServiceTest, SocketName001, TestSize.Level1)
56 {
57     SocketInfo info;
58     info.peerName = const_cast<char *>(g_socketPeerName.c_str());
59     info.peerNetworkId = const_cast<char *>(g_networkId.c_str());
60     info.pkgName = const_cast<char *>(g_pkgName.c_str());
61     info.dataType = DATA_TYPE_MESSAGE;
62 
63     int32_t socketId = -1;
64 
65     // socket name is null pointer
66     info.name = nullptr;
67     socketId = Socket(info);
68     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
69 
70     // the length of socket name is zero
71     char socketName[SOCKET_NAME_INVALID_LEN + 1];
72     memset_s(socketName, SOCKET_NAME_INVALID_LEN + 1, 0, SOCKET_NAME_INVALID_LEN + 1);
73     info.name = socketName;
74     socketId = Socket(info);
75     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
76 
77     // the length of socket name greater than 255
78     memset_s(socketName, SOCKET_NAME_INVALID_LEN + 1, 'a', SOCKET_NAME_INVALID_LEN);
79     info.name = socketName;
80     socketId = Socket(info);
81     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
82 }
83 
84 /**
85  * @tc.name: SocketPeerName001
86  * @tc.desc: call Socket function with different socket peerName.
87  * @tc.type: FUNC
88  * @tc.require:
89  */
90 HWTEST_F(TransClientSocketServiceTest, SocketPeerName001, TestSize.Level1)
91 {
92     SocketInfo info;
93     info.name = const_cast<char *>(g_socketName.c_str());
94     info.peerNetworkId = const_cast<char *>(g_networkId.c_str());
95     info.pkgName = const_cast<char *>(g_pkgName.c_str());
96     info.dataType = DATA_TYPE_MESSAGE;
97     int32_t socketId = -1;
98 
99     // the length of socket peerName is zero
100     char socketName[SOCKET_NAME_INVALID_LEN + 1];
101     memset_s(socketName, SOCKET_NAME_INVALID_LEN + 1, 0, SOCKET_NAME_INVALID_LEN + 1);
102     info.peerName = socketName;
103     socketId = Socket(info);
104     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
105 
106     // the length of socket name greater than 255
107     memset_s(socketName, SOCKET_NAME_INVALID_LEN + 1, 'a', SOCKET_NAME_INVALID_LEN);
108     info.peerName = socketName;
109     socketId = Socket(info);
110     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
111 }
112 
113 /**
114  * @tc.name: SocketPeerNetworkId001
115  * @tc.desc: call Socket function with different socket peerNetworkId.
116  * @tc.type: FUNC
117  * @tc.require:
118  */
119 HWTEST_F(TransClientSocketServiceTest, SocketPeerNetworkId001, TestSize.Level1)
120 {
121     SocketInfo info;
122     info.name = const_cast<char *>(g_socketName.c_str());
123     info.peerName = const_cast<char *>(g_socketPeerName.c_str());
124     info.pkgName = const_cast<char *>(g_pkgName.c_str());
125     info.dataType = DATA_TYPE_MESSAGE;
126     int32_t socketId = -1;
127 
128     // the length of socket peerNetworkId is zero
129     char networkId[SOCKET_NETWORKID_INVALID_LEN + 1];
130     memset_s(networkId, SOCKET_NETWORKID_INVALID_LEN + 1, 0, SOCKET_NETWORKID_INVALID_LEN + 1);
131     info.peerNetworkId = networkId;
132     socketId = Socket(info);
133     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
134 
135     // the length of socket peerNetworkId greater than 65
136     memset_s(networkId, SOCKET_NETWORKID_INVALID_LEN + 1, 'a', SOCKET_NETWORKID_INVALID_LEN);
137     info.peerNetworkId = networkId;
138     socketId = Socket(info);
139     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
140 }
141 
142 /**
143  * @tc.name: SocketPkgName001
144  * @tc.desc: call Socket function with different socket pkgName.
145  * @tc.type: FUNC
146  * @tc.require:
147  */
148 HWTEST_F(TransClientSocketServiceTest, SocketPkgName001, TestSize.Level1)
149 {
150     SocketInfo info;
151     info.name = const_cast<char *>(g_socketName.c_str());
152     info.peerName = const_cast<char *>(g_socketPeerName.c_str());
153     info.peerNetworkId = const_cast<char *>(g_networkId.c_str());
154     info.dataType = DATA_TYPE_MESSAGE;
155 
156     int32_t socketId = -1;
157 
158     // socket name is null pointer
159     info.pkgName = nullptr;
160     socketId = Socket(info);
161     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
162 
163     // the length of socket name is zero
164     char pkgName[SOCKET_PKG_NAME_INVALID_LEN + 1];
165     memset_s(pkgName, SOCKET_PKG_NAME_INVALID_LEN + 1, 0, SOCKET_PKG_NAME_INVALID_LEN + 1);
166     info.pkgName = pkgName;
167     socketId = Socket(info);
168     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
169 
170     // the length of socket name greater than 255
171     memset_s(pkgName, SOCKET_PKG_NAME_INVALID_LEN + 1, 'a', SOCKET_PKG_NAME_INVALID_LEN);
172     info.name = pkgName;
173     socketId = Socket(info);
174     ASSERT_EQ(socketId, SOFTBUS_INVALID_PARAM);
175 }
176 
177 /**
178  * @tc.name: SocketPkgName001
179  * @tc.desc: call Socket function with different data type.
180  * @tc.type: FUNC
181  * @tc.require:
182  */
183 HWTEST_F(TransClientSocketServiceTest, DataType001, TestSize.Level1)
184 {
185     SocketInfo info;
186     info.name = const_cast<char *>(g_socketName.c_str());
187     info.peerName = nullptr;
188     info.peerNetworkId = nullptr;
189     info.pkgName = const_cast<char *>(g_pkgName.c_str());
190 
191     for (int32_t type = DATA_TYPE_MESSAGE; type < DATA_TYPE_BUTT; type++) {
192         info.dataType = static_cast<TransDataType>(type);
193         int32_t socketId = Socket(info);
194         EXPECT_EQ(socketId, SOFTBUS_TRANS_SESSION_ADDPKG_FAILED);
195     }
196 }
197 
198 /**
199  * @tc.name: DfsBind001
200  * @tc.desc: call DfsBind function with invalid socket or listener.
201  * @tc.type: FUNC
202  * @tc.require:
203  */
204 HWTEST_F(TransClientSocketServiceTest, DfsBind001, TestSize.Level1)
205 {
206     ISocketListener listener;
207     int32_t ret = DfsBind(-1, &listener);
208     EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM);
209 
210     ret = DfsBind(1, nullptr);
211     EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM);
212 
213     ret = DfsBind(1, &listener);
214     EXPECT_EQ(ret, SOFTBUS_INVALID_PARAM);
215 }
216 
OnShutdown(int32_t socket,ShutdownReason reason)217 static void OnShutdown(int32_t socket, ShutdownReason reason)
218 {
219     return;
220 }
221 
222 /**
223  * @tc.name: DfsBind002
224  * @tc.desc: call DfsBind function with offline socket.
225  * @tc.type: FUNC
226  * @tc.require:
227  */
228 HWTEST_F(TransClientSocketServiceTest, DfsBind002, TestSize.Level1)
229 {
230     ISocketListener listener = { .OnShutdown = OnShutdown };
231     int32_t ret = DfsBind(1, &listener);
232     EXPECT_EQ(ret, SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND);
233 }
234 
235 /**
236  * @tc.name: SetSocketOpt001
237  * @tc.desc: call SetSocketOpt function with with invalid parameter.
238  * @tc.type: FUNC
239  * @tc.require:
240  */
241 HWTEST_F(TransClientSocketServiceTest, SetSocketOpt001, TestSize.Level1)
242 {
243     OptLevel levelInvalid = OPT_LEVEL_BUTT;
244     OptLevel levelValid = OPT_LEVEL_SOFTBUS;
245     OptType optTypeInvalid = (OptType)-1;
246     OptType optTypeValid = OPT_TYPE_MAX_BUFFER;
247     int32_t socket = 1;
248     int32_t optValueValid = 1234;
249     void *temp = &optValueValid;
250     int32_t optValueSizeInvalid = -1;
251     int32_t optValueSizeValid = sizeof(int32_t);
252     int32_t ret = SetSocketOpt(socket, levelInvalid, optTypeInvalid, NULL, optValueSizeInvalid);
253     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
254     ret = SetSocketOpt(socket, levelValid, optTypeInvalid, NULL, optValueSizeInvalid);
255     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
256     ret = SetSocketOpt(socket, levelValid, optTypeValid, NULL, optValueSizeInvalid);
257     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
258     ret = SetSocketOpt(socket, levelValid, optTypeValid, temp, optValueSizeInvalid);
259     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
260     ret = SetSocketOpt(socket, levelValid, optTypeValid, temp, optValueSizeValid);
261     ASSERT_NE(ret, SOFTBUS_INVALID_PARAM);
262 }
263 
264 /**
265  * @tc.name: GetSocketOpt001
266  * @tc.desc: call GetSocketOpt function with with invalid parameter.
267  * @tc.type: FUNC
268  * @tc.require:
269  */
270 HWTEST_F(TransClientSocketServiceTest, GetSocketOpt001, TestSize.Level1)
271 {
272     OptLevel levelInvalid = OPT_LEVEL_BUTT;
273     OptLevel levelValid = OPT_LEVEL_SOFTBUS;
274     OptType optTypeInvalid = (OptType)-1;
275     OptType optTypeValid = OPT_TYPE_MAX_BUFFER;
276     int32_t socket = 1;
277     int32_t optValueValid = 0;
278     void *temp = &optValueValid;
279     int32_t valueSize = 0;
280     int32_t *optValueSizeValid = &valueSize;
281     int32_t ret = GetSocketOpt(socket, levelInvalid, optTypeInvalid, NULL, NULL);
282     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
283     ret = GetSocketOpt(socket, levelValid, optTypeInvalid, NULL, NULL);
284     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
285     ret = GetSocketOpt(socket, levelValid, optTypeValid, NULL, NULL);
286     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
287     ret = GetSocketOpt(socket, levelValid, optTypeValid, temp, NULL);
288     ASSERT_EQ(ret, SOFTBUS_INVALID_PARAM);
289     ret = GetSocketOpt(socket, levelValid, optTypeValid, temp, optValueSizeValid);
290     ASSERT_NE(ret, SOFTBUS_INVALID_PARAM);
291 }
292 } // namespace OHOS