1 /*
2  * Copyright (c) 2021 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 #define LOG_TAG "CommunicationProviderImplTest"
17 
18 #include <gtest/gtest.h>
19 #include <cstdint>
20 #include <vector>
21 #include <unistd.h>
22 #include <iostream>
23 #include "app_device_change_listener.h"
24 #include "communication_provider.h"
25 #include "log_print.h"
26 
27 using namespace std;
28 using namespace testing::ext;
29 using namespace OHOS::AppDistributedKv;
30 class CommunicationProviderImplTest : public testing::Test {
31 };
32 
33 class AppDataChangeListenerImpl : public AppDataChangeListener {
34     void OnMessage(const OHOS::AppDistributedKv::DeviceInfo &info, const uint8_t *ptr, const int size,
35                    const struct PipeInfo &id) const override;
36 };
OnMessage(const OHOS::AppDistributedKv::DeviceInfo & info,const uint8_t * ptr,const int size,const struct PipeInfo & id) const37 void AppDataChangeListenerImpl::OnMessage(const OHOS::AppDistributedKv::DeviceInfo &info,
38     const uint8_t *ptr, const int size, const struct PipeInfo &id) const
39 {
40     ZLOGI("data  %{public}s  %s", info.deviceName.c_str(), ptr);
41 }
42 
43 /**
44 * @tc.name: CommunicationProvider001
45 * @tc.desc: Verify getting KvStore
46 * @tc.type: FUNC
47 * @tc.require: AR000CCPQ1 AR000CQDVE
48 * @tc.author: hongbo
49 */
50 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider001, TestSize.Level1)
51 {
52     ZLOGI("begin.");
53     const AppDataChangeListenerImpl* dataListener = new AppDataChangeListenerImpl();
54     PipeInfo appId;
55     appId.pipeId = "appId";
56     appId.userId = "groupId";
57     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, appId);
58     auto secRegister = CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, appId);
59     EXPECT_EQ(Status::ERROR, secRegister);
60     sleep(1); // avoid thread dnet thread died, then will have pthread;
61 }
62 
63 /**
64 * @tc.name: CommunicationProvider002
65 * @tc.desc: Verify stop watch device change
66 * @tc.type: FUNC
67 * @tc.require: AR000CCPQ2 AR000CQS3F
68 * @tc.author: hongbo
69 */
70 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider002, TestSize.Level1)
71 {
72     ZLOGD("CommunicationProvider004");
73     const AppDataChangeListenerImpl* dataListener = new AppDataChangeListenerImpl();
74     PipeInfo appId;
75     appId.pipeId = "appId";
76     appId.userId = "groupId";
77     auto secRegister = CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, appId);
78     ZLOGD("CommunicationProvider004 %d", static_cast<int>(secRegister));
79     EXPECT_EQ(Status::ERROR, secRegister);
80     sleep(1); // avoid thread dnet thread died, then will have pthread;
81 }
82 
83 /**
84 * @tc.name: CommunicationProvider003
85 * @tc.desc: close pipe
86 * @tc.type: FUNC
87 * @tc.require: AR000CCPQ2
88 * @tc.author: hongbo
89 */
90 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider003, TestSize.Level1)
91 {
92     ZLOGI("CommunicationProvider015 ");
93     PipeInfo appId;
94     appId.pipeId = "appId";
95     appId.userId = "groupId";
96     auto status = CommunicationProvider::GetInstance().Stop(appId);
97     EXPECT_NE(Status::ERROR, status);
98     sleep(1); // avoid thread dnet thread died, then will have pthread;
99 }
100 
101 /**
102 * @tc.name: CommunicationProvider004
103 * @tc.desc: singleton pipe
104 * @tc.type: FUNC
105 * @tc.require: AR000CCPQ2
106 * @tc.author: hongbo
107 */
108 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider004, TestSize.Level1)
109 {
110     ZLOGI("begin.");
111     auto &provider = CommunicationProvider::GetInstance();
112     auto &provider1 = CommunicationProvider::GetInstance();
113     EXPECT_EQ(&provider, &provider1);
114     sleep(1); // avoid thread dnet thread died, then will have pthread;
115 }
116 
117 /**
118 * @tc.name: CommunicationProvider005
119 * @tc.desc: parse sent data
120 * @tc.type: FUNC
121 * @tc.require: AR000CCPQ2 AR000CQS3M AR000CQSAI
122 * @tc.author: hongbo
123 */
124 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider005, TestSize.Level1)
125 {
126     const AppDataChangeListenerImpl *dataListener17 = new AppDataChangeListenerImpl();
127     PipeInfo id17;
128     id17.pipeId = "appId";
129     id17.userId = "groupId";
130     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener17, id17);
131     CommunicationProvider::GetInstance().Start(id17);
132     std::string content = "Helloworlds";
133     const uint8_t *t = reinterpret_cast<const uint8_t*>(content.c_str());
134     DeviceId di17 = {"127.0.0.2"};
135     DataInfo data = { const_cast<uint8_t *>(t), static_cast<uint32_t>(content.length())};
136     auto status = CommunicationProvider::GetInstance().SendData(id17, di17, data, 0);
137     EXPECT_NE(status.first, Status::SUCCESS);
138     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener17, id17);
139     CommunicationProvider::GetInstance().Stop(id17);
140     delete dataListener17;
141     sleep(1); // avoid thread dnet thread died, then will have pthread;
142 }
143 
144 /**
145 * @tc.name: CommunicationProvider006
146 * @tc.desc:the observer is nullptr
147 * @tc.type: FUNC
148 * @tc.author: nhj
149 */
150 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider006, TestSize.Level1)
151 {
152     ZLOGI("begin.");
153     PipeInfo appId;
154     appId.pipeId = "appId06";
155     appId.userId = "groupId06";
156     CommunicationProvider::GetInstance().StartWatchDataChange(nullptr, appId);
157     auto secRegister = CommunicationProvider::GetInstance().StartWatchDataChange(nullptr, appId);
158     EXPECT_EQ(Status::INVALID_ARGUMENT, secRegister);
159 }
160 
161 /**
162 * @tc.name: CommunicationProvider007
163 * @tc.desc:the pipeInfo is nullptr
164 * @tc.type: FUNC
165 * @tc.author: nhj
166 */
167 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider007, TestSize.Level1)
168 {
169     ZLOGI("begin.");
170     auto secRegister = CommunicationProvider::GetInstance().StartWatchDataChange(nullptr, {});
171     EXPECT_EQ(Status::INVALID_ARGUMENT, secRegister);
172 }
173 
174 /**
175 * @tc.name: CommunicationProvider008
176 * @tc.desc:the observer is nullptr
177 * @tc.type: FUNC
178 * @tc.author: nhj
179 */
180 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider008, TestSize.Level1)
181 {
182     ZLOGI("begin.");
183     PipeInfo appId;
184     appId.pipeId = "appId06";
185     appId.userId = "groupId06";
186     CommunicationProvider::GetInstance().StopWatchDataChange(nullptr, appId);
187     auto secRegister = CommunicationProvider::GetInstance().StopWatchDataChange(nullptr, appId);
188     EXPECT_EQ(Status::INVALID_ARGUMENT, secRegister);
189 }
190 
191 /**
192 * @tc.name: CommunicationProvider009
193 * @tc.desc: the pipeInfo is nullptr
194 * @tc.type: FUNC
195 * @tc.author: nhj
196 */
197 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider009, TestSize.Level1)
198 {
199     ZLOGI("begin.");
200     auto secRegister = CommunicationProvider::GetInstance().StopWatchDataChange(nullptr, {});
201     EXPECT_EQ(Status::INVALID_ARGUMENT, secRegister);
202 }
203 
204 /**
205 * @tc.name: CommunicationProvider010
206 * @tc.desc: Start pipe
207 * @tc.type: FUNC
208 * @tc.author: nhj
209 */
210 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider010, TestSize.Level1)
211 {
212     PipeInfo appId;
213     appId.pipeId = "";
214     appId.userId = "groupId";
215     auto status = CommunicationProvider::GetInstance().Start(appId);
216     EXPECT_EQ(Status::INVALID_ARGUMENT, status);
217 }
218 
219 /**
220 * @tc.name: CommunicationProvider011
221 * @tc.desc: parse sent data
222 * @tc.type: FUNC
223 * @tc.author: nhj
224 */
225 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider011, TestSize.Level1)
226 {
227     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
228     PipeInfo id;
229     id.pipeId = "appId";
230     id.userId = "groupId";
231     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
232     CommunicationProvider::GetInstance().Start(id);
233     std::string content = "";
234     const uint8_t *t = reinterpret_cast<const uint8_t*>(content.c_str());
235     DeviceId di = {"DeviceId"};
236     DataInfo data = { const_cast<uint8_t *>(t), static_cast<uint32_t>(content.length())};
237     auto status = CommunicationProvider::GetInstance().SendData(id, di, data, 0);
238     EXPECT_EQ(status.first, Status::ERROR);
239     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
240     CommunicationProvider::GetInstance().Stop(id);
241     delete dataListener;
242 }
243 
244 /**
245 * @tc.name: CommunicationProvider012
246 * @tc.desc: parse sent data
247 * @tc.type: FUNC
248 * @tc.author: nhj
249 */
250 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider012, TestSize.Level1)
251 {
252     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
253     PipeInfo id;
254     id.pipeId = "appId";
255     id.userId = "groupId";
256     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
257     CommunicationProvider::GetInstance().Start(id);
258     std::string content = "hello";
259     const uint8_t *t = reinterpret_cast<const uint8_t*>(content.c_str());
260     DeviceId di = {""};
261     DataInfo data = { const_cast<uint8_t *>(t), static_cast<uint32_t>(content.length())};
262     auto status = CommunicationProvider::GetInstance().SendData(id, di, data, 0);
263     EXPECT_EQ(status.first, Status::ERROR);
264     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
265     CommunicationProvider::GetInstance().Stop(id);
266     delete dataListener;
267 }
268 
269 /**
270 * @tc.name: CommunicationProvider013
271 * @tc.desc: parse sent data
272 * @tc.type: FUNC
273 * @tc.author: nhj
274 */
275 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider013, TestSize.Level1)
276 {
277     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
278     PipeInfo id;
279     id.pipeId = "appId";
280     id.userId = "groupId";
281     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
282     CommunicationProvider::GetInstance().Start(id);
283     DeviceId di = {"DeviceId"};
284     DataInfo data = {nullptr, 0};
285     auto status = CommunicationProvider::GetInstance().SendData(id, di, data, 0);
286     EXPECT_EQ(status.first, Status::ERROR);
287     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
288     CommunicationProvider::GetInstance().Stop(id);
289     delete dataListener;
290 }
291 
292 /**
293 * @tc.name: CommunicationProvider014
294 * @tc.desc: parse sent data
295 * @tc.type: FUNC
296 * @tc.author: nhj
297 */
298 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider014, TestSize.Level1)
299 {
300     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
301     PipeInfo id;
302     id.pipeId = "";
303     id.userId = "groupId";
304     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
305     CommunicationProvider::GetInstance().Start(id);
306     std::string content = "hello";
307     const uint8_t *t = reinterpret_cast<const uint8_t*>(content.c_str());
308     DeviceId di = {"DeviceId"};
309     DataInfo data = { const_cast<uint8_t *>(t), static_cast<uint32_t>(content.length())};
310     auto status = CommunicationProvider::GetInstance().SendData(id, di, data, 0);
311     EXPECT_EQ(status.first, Status::ERROR);
312     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
313     CommunicationProvider::GetInstance().Stop(id);
314     delete dataListener;
315 }
316 
317 /**
318 * @tc.name: CommunicationProvider015
319 * @tc.desc: parse sent data
320 * @tc.type: FUNC
321 * @tc.author: nhj
322 */
323 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider015, TestSize.Level1)
324 {
325     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
326     PipeInfo id;
327     id.pipeId = "";
328     id.userId = "groupId";
329     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
330     CommunicationProvider::GetInstance().Start(id);
331     DeviceId di = {"DeviceId"};
332     auto status = CommunicationProvider::GetInstance().IsSameStartedOnPeer(id, di);
333     EXPECT_EQ(status, false);
334     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
335     CommunicationProvider::GetInstance().Stop(id);
336     delete dataListener;
337 }
338 
339 /**
340 * @tc.name: CommunicationProvider016
341 * @tc.desc: IsSameStartedOnPeer
342 * @tc.type: FUNC
343 * @tc.author: nhj
344 */
345 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider016, TestSize.Level1)
346 {
347     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
348     PipeInfo id;
349     id.pipeId = "pipeid";
350     id.userId = "userId";
351     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
352     CommunicationProvider::GetInstance().Start(id);
353     DeviceId di = {""};
354     auto status = CommunicationProvider::GetInstance().IsSameStartedOnPeer(id, di);
355     EXPECT_EQ(status, false);
356     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
357     CommunicationProvider::GetInstance().Stop(id);
358     delete dataListener;
359 }
360 
361 /**
362 * @tc.name: CommunicationProvider017
363 * @tc.desc: SetMessageTransFlag
364 * @tc.type: FUNC
365 * @tc.author: nhj
366 */
367 HWTEST_F(CommunicationProviderImplTest, CommunicationProvider017, TestSize.Level1)
368 {
369     const AppDataChangeListenerImpl *dataListener = new AppDataChangeListenerImpl();
370     PipeInfo id;
371     id.pipeId = "pipeid";
372     id.userId = "userId";
373     CommunicationProvider::GetInstance().StartWatchDataChange(dataListener, id);
374     CommunicationProvider::GetInstance().Start(id);
375     DeviceId di = {"DeviceId"};
376     auto status = CommunicationProvider::GetInstance().IsSameStartedOnPeer(id, di);
377     EXPECT_EQ(status, false);
378     CommunicationProvider::GetInstance().SetMessageTransFlag(id, true);
379     CommunicationProvider::GetInstance().StopWatchDataChange(dataListener, id);
380     CommunicationProvider::GetInstance().Stop(id);
381     delete dataListener;
382 }