1 /**
2 * Copyright (c) 2020-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 * Description : testcases for distributedschedule_lite subsystem
16 * Create : 2020/04/19
17 */
18
19 #include "cmsis_os.h"
20 #include "hctest.h"
21 #include "samgr_lite.h"
22 #include "broadcast_interface.h"
23
24 #define TEST_LEN 10
25 #define OPER_INTERVAL 200
26 #define BROADCASR_TEST_SERVICE "S_broadcast1"
27
C1Callback(Consumer * consumer,const Topic * topic,const Request * request)28 static void C1Callback(Consumer *consumer, const Topic *topic, const Request *request)
29 {
30 (void)consumer;
31 (void)topic;
32 (void)request;
33 }
C2Callback(Consumer * consumer,const Topic * topic,const Request * request)34 static void C2Callback(Consumer *consumer, const Topic *topic, const Request *request)
35 {
36 (void)consumer;
37 (void)topic;
38 (void)request;
39 }
40
Equal(const Consumer * current,const Consumer * other)41 static BOOL Equal(const Consumer *current, const Consumer *other)
42 {
43 if (current->Notify == other->Notify) {
44 return TRUE;
45 } else {
46 return FALSE;
47 }
48 }
49
GetName(Service * service)50 static const char *GetName(Service *service)
51 {
52 (void)service;
53 return BROADCASR_TEST_SERVICE;
54 };
55
56 static Identity g_identity = { -1, -1, NULL};
Initialize(Service * service,Identity identity)57 static BOOL Initialize(Service *service, Identity identity)
58 {
59 g_identity = identity;
60 (void)service;
61 return TRUE;
62 };
63
MessageHandle(Service * service,Request * msg)64 static BOOL MessageHandle(Service *service, Request *msg)
65 {
66 (void)service;
67 (void)msg;
68 return FALSE;
69 };
70
GetTaskConfig(Service * service)71 static TaskConfig GetTaskConfig(Service *service)
72 {
73 TaskConfig config = {LEVEL_HIGH, PRI_NORMAL, 0x800, 20, SHARED_TASK}; // share with broadcast
74 (void)service;
75 return config;
76 };
77
78 static Service g_service = {GetName, Initialize, MessageHandle, GetTaskConfig};
Init(void)79 static void Init(void)
80 {
81 BOOL result = SAMGR_GetInstance()->RegisterService(&g_service);
82 if (result == FALSE) {
83 printf("[hctest]E RegisterService failed. \n");
84 }
85 }
86 SYSEX_SERVICE_INIT(Init);
87
CASE_GetIUnknown(void)88 static PubSubInterface *CASE_GetIUnknown(void)
89 {
90 PubSubInterface *fapi = NULL;
91 IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE, PUB_SUB_FEATURE);
92 if (iUnknown == NULL) {
93 printf("[hctest]failed to GetIUnknown ");
94 return NULL;
95 }
96
97 int result = iUnknown->QueryInterface(iUnknown, 0, (void **)&fapi);
98 if (result != 0 || fapi == NULL) {
99 printf("[hctest]failed to QueryInterface ");
100 }
101 return fapi;
102 }
103
CASE_ReleaseIUnknown(PubSubInterface * fapi)104 static void CASE_ReleaseIUnknown(PubSubInterface *fapi)
105 {
106 fapi->Release((IUnknown *)fapi);
107 }
108
109 LITE_TEST_SUIT(test, broadcast, Broadcast01TestSuite);
110
Broadcast01TestSuiteSetUp(void)111 static BOOL Broadcast01TestSuiteSetUp(void)
112 {
113 osDelay(OPER_INTERVAL);
114
115 return TRUE;
116 }
117
Broadcast01TestSuiteTearDown(void)118 static BOOL Broadcast01TestSuiteTearDown(void)
119 {
120 return TRUE;
121 }
122
123 /**
124 * @tc.number : DMSLite_SAMGR_AddTopic_0010
125 * @tc.name : Valid topic can be added successfully
126 * @tc.desc : [C- SOFTWARE -0200]
127 */
128 LITE_TEST_CASE(Broadcast01TestSuite, testAddTopic0010, Function | MediumTest | Level1)
129 {
130 PubSubInterface *fapi = CASE_GetIUnknown();
131 if (fapi == NULL) {
132 TEST_FAIL();
133 }
134 Subscriber *subscriber = &fapi->subscriber;
135 if (subscriber == NULL) {
136 TEST_FAIL();
137 }
138
139 Topic topic0 = 11;
140 int result = subscriber->AddTopic((IUnknown *)fapi, &topic0);
141 TEST_ASSERT_EQUAL_INT(result == 0, TRUE);
142
143 CASE_ReleaseIUnknown(fapi);
144 }
145
146 /**
147 * @tc.number : DMSLite_SAMGR_AddTopic_0020
148 * @tc.name : Topic which is NULL or already existing can not be added
149 * @tc.desc : [C- SOFTWARE -0200]
150 */
151 LITE_TEST_CASE(Broadcast01TestSuite, testAddTopic0020, Function | MediumTest | Level2)
152 {
153 PubSubInterface *fapi = CASE_GetIUnknown();
154 if (fapi == NULL) {
155 TEST_FAIL();
156 }
157 Subscriber *subscriber = &fapi->subscriber;
158 if (subscriber == NULL) {
159 TEST_FAIL();
160 }
161
162 Topic topic0 = 0;
163 subscriber->AddTopic((IUnknown *)fapi, &topic0);
164
165 int result = subscriber->AddTopic((IUnknown *)fapi, NULL);
166 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
167
168 result = subscriber->AddTopic((IUnknown *)fapi, &topic0);
169 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
170
171 CASE_ReleaseIUnknown(fapi);
172 }
173
174 /**
175 * @tc.number : DMSLite_SAMGR_Subscribe_0010
176 * @tc.name : Consumer can subscribe to a topic
177 * @tc.desc : [C- SOFTWARE -0200]
178 */
179 LITE_TEST_CASE(Broadcast01TestSuite, testSubscribe0010, Function | MediumTest | Level1)
180 {
181 PubSubInterface *fapi = CASE_GetIUnknown();
182 if (fapi == NULL) {
183 TEST_FAIL();
184 }
185 Subscriber *subscriber = &fapi->subscriber;
186 if (subscriber == NULL) {
187 TEST_FAIL();
188 }
189 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
190
191 Topic topic0 = 9;
192 subscriber->AddTopic((IUnknown *)fapi, &topic0);
193 int result = subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
194 TEST_ASSERT_EQUAL_INT(result == 0, TRUE);
195
196 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
197
198 CASE_ReleaseIUnknown(fapi);
199 }
200
201 /**
202 * @tc.number : DMSLite_SAMGR_Subscribe_0020
203 * @tc.name : Consumer can not subscribe to the topic which is NULL or does not exist
204 * @tc.desc : [C- SOFTWARE -0200]
205 */
206 LITE_TEST_CASE(Broadcast01TestSuite, testSubscribe0020, Function | MediumTest | Level2)
207 {
208 PubSubInterface *fapi = CASE_GetIUnknown();
209 if (fapi == NULL) {
210 TEST_FAIL();
211 }
212 Subscriber *subscriber = &fapi->subscriber;
213 if (subscriber == NULL) {
214 TEST_FAIL();
215 }
216 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
217
218 Topic topic0 = 0;
219 subscriber->AddTopic((IUnknown *)fapi, &topic0);
220 int result = subscriber->Subscribe((IUnknown *)fapi, NULL, &c1);
221 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
222
223 Topic noExistTopic = -200;
224 result = subscriber->Subscribe((IUnknown *)fapi, &noExistTopic, &c1);
225 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
226
227 CASE_ReleaseIUnknown(fapi);
228 }
229
230 /**
231 * @tc.number : DMSLite_SAMGR_Subscribe_0030
232 * @tc.name : Consumer which is NULL can not subscribe to a topic
233 * @tc.desc : [C- SOFTWARE -0200]
234 */
235 LITE_TEST_CASE(Broadcast01TestSuite, testSubscribe0030, Function | MediumTest | Level2)
236 {
237 PubSubInterface *fapi = CASE_GetIUnknown();
238 if (fapi == NULL) {
239 TEST_FAIL();
240 }
241 Subscriber *subscriber = &fapi->subscriber;
242 if (subscriber == NULL) {
243 TEST_FAIL();
244 }
245 Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
246
247 Topic topic0 = 0;
248 subscriber->AddTopic((IUnknown *)fapi, &topic0);
249 int result = subscriber->Subscribe((IUnknown *)fapi, &topic0, NULL);
250 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
251
252 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
253
254 CASE_ReleaseIUnknown(fapi);
255 }
256
257 /**
258 * @tc.number : DMSLite_SAMGR_Subscribe_0040
259 * @tc.name : Consumer can not subscribe to the same topic twice
260 * @tc.desc : [C- SOFTWARE -0200]
261 */
262 LITE_TEST_CASE(Broadcast01TestSuite, testSubscribe0040, Function | MediumTest | Level2)
263 {
264 PubSubInterface *fapi = CASE_GetIUnknown();
265 if (fapi == NULL) {
266 TEST_FAIL();
267 }
268 Subscriber *subscriber = &fapi->subscriber;
269 if (subscriber == NULL) {
270 TEST_FAIL();
271 }
272 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
273
274 Topic topic0 = 0;
275 subscriber->AddTopic((IUnknown *)fapi, &topic0);
276 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
277 int result = subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
278 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
279
280 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
281
282 CASE_ReleaseIUnknown(fapi);
283 }
284
285 /**
286 * @tc.number : DMSLite_SAMGR_UnSubscribe_0010
287 * @tc.name : Consumer can unsubscribe a topic
288 * @tc.desc : [C- SOFTWARE -0200]
289 */
290 LITE_TEST_CASE(Broadcast01TestSuite, testUnsubscribe0010, Function | MediumTest | Level1)
291 {
292 PubSubInterface *fapi = CASE_GetIUnknown();
293 if (fapi == NULL) {
294 TEST_FAIL();
295 }
296 Subscriber *subscriber = &fapi->subscriber;
297 if (subscriber == NULL) {
298 TEST_FAIL();
299 }
300
301 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
302
303 Topic topic0 = 0;
304 subscriber->AddTopic((IUnknown *)fapi, &topic0);
305 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
306
307 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
308 TEST_ASSERT_EQUAL_INT(result != NULL, TRUE);
309
310 CASE_ReleaseIUnknown(fapi);
311 }
312
313 /**
314 * @tc.number : DMSLite_SAMGR_UnSubscribe_0020
315 * @tc.name : Consumer can not unsubscribe a topic if the specified topic-comsumer relationship is NULL
316 * @tc.desc : [C- SOFTWARE -0200]
317 */
318 LITE_TEST_CASE(Broadcast01TestSuite, testUnsubscribe0020, Function | MediumTest | Level2)
319 {
320 PubSubInterface *fapi = CASE_GetIUnknown();
321 if (fapi == NULL) {
322 TEST_FAIL();
323 }
324 Subscriber *subscriber = &fapi->subscriber;
325 if (subscriber == NULL) {
326 TEST_FAIL();
327 }
328 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
329
330 Topic topic0 = 0;
331 subscriber->AddTopic((IUnknown *)fapi, &topic0);
332 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
333
334 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, NULL, &c1);
335 TEST_ASSERT_EQUAL_INT(result==NULL, TRUE); // failed
336
337 result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, NULL);
338 TEST_ASSERT_EQUAL_INT(result==NULL, TRUE);
339
340 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
341 CASE_ReleaseIUnknown(fapi);
342 }
343
344 /**
345 * @tc.number : DMSLite_SAMGR_UnSubscribe_0030
346 * @tc.name : Consumer can not unsubscribe a topic if the specified topic-comsumer relationship not exist
347 * @tc.desc : [C- SOFTWARE -0200]
348 */
349 LITE_TEST_CASE(Broadcast01TestSuite, testUnsubscribe0030, Function | MediumTest | Level2)
350 {
351 PubSubInterface *fapi = CASE_GetIUnknown();
352 if (fapi == NULL) {
353 TEST_FAIL();
354 }
355 Subscriber *subscriber = &fapi->subscriber;
356 if (subscriber == NULL) {
357 TEST_FAIL();
358 }
359 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
360 static Consumer c2 = {.identity = &g_identity, .Notify = C2Callback, .Equal = Equal};
361
362 Topic topic0 = 0;
363 subscriber->AddTopic((IUnknown *)fapi, &topic0);
364 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
365
366 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c2);
367 TEST_ASSERT_EQUAL_INT(result==NULL, TRUE);
368
369 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
370 CASE_ReleaseIUnknown(fapi);
371 }
372
373 /**
374 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0010
375 * @tc.name : Consumer can modify subscription relationship
376 * @tc.desc : [C- SOFTWARE -0200]
377 */
378 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0010, Function | MediumTest | Level2)
379 {
380 PubSubInterface *fapi = CASE_GetIUnknown();
381 if (fapi == NULL) {
382 TEST_FAIL();
383 }
384 Subscriber *subscriber = &fapi->subscriber;
385 if (subscriber == NULL) {
386 TEST_FAIL();
387 }
388 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
389 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
390
391 Topic topic0 = 0;
392 subscriber->AddTopic((IUnknown *)fapi, &topic0);
393 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
394
395 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, &c2);
396 TEST_ASSERT_EQUAL_INT(result != NULL, TRUE);
397
398 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
399
400 CASE_ReleaseIUnknown(fapi);
401 }
402
403 /**
404 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0020
405 * @tc.name : Consumer can not modify subscription relationship if the input parameter is NULL
406 * @tc.desc : [C- SOFTWARE -0200]
407 */
408 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0020, Function | MediumTest | Level2)
409 {
410 PubSubInterface *fapi = CASE_GetIUnknown();
411 if (fapi == NULL) {
412 TEST_FAIL();
413 }
414 Subscriber *subscriber = &fapi->subscriber;
415 if (subscriber == NULL) {
416 TEST_FAIL();
417 }
418 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
419 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
420
421 Topic topic0 = 0;
422 subscriber->AddTopic((IUnknown *)fapi, &topic0);
423 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
424
425 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, NULL, &c1, &c2);
426 TEST_ASSERT_EQUAL_INT(result!=NULL, 0);
427
428 result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, NULL, &c2);
429 TEST_ASSERT_EQUAL_INT(result!=NULL, 0);
430
431 result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, NULL);
432 TEST_ASSERT_EQUAL_INT(result!=NULL, 0);
433
434 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
435
436 CASE_ReleaseIUnknown(fapi);
437 }
438
439 /**
440 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0030
441 * @tc.name : Consumer can not modify subscription relationship if the specified topic not exist
442 * @tc.desc : [C- SOFTWARE -0200]
443 */
444 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0030, Function | MediumTest | Level2)
445 {
446 PubSubInterface *fapi = CASE_GetIUnknown();
447 if (fapi == NULL) {
448 TEST_FAIL();
449 }
450 Subscriber *subscriber = &fapi->subscriber;
451 if (subscriber == NULL) {
452 TEST_FAIL();
453 }
454 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
455 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
456
457 Topic topic0 = 0;
458 subscriber->AddTopic((IUnknown *)fapi, &topic0);
459 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
460
461 Topic noExistTopic = 99;
462 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &noExistTopic, &c1, &c2);
463 TEST_ASSERT_EQUAL_INT(result==NULL, 1);
464
465 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
466
467 CASE_ReleaseIUnknown(fapi);
468 }
469
470 /**
471 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0040
472 * @tc.name : Consumer can not modify subscription relationship if the specified old consumer not exist
473 * @tc.desc : [C- SOFTWARE -0200]
474 */
475 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0040, Function | MediumTest | Level2)
476 {
477 PubSubInterface *fapi = CASE_GetIUnknown();
478 if (fapi == NULL) {
479 TEST_FAIL();
480 }
481 Subscriber *subscriber = &fapi->subscriber;
482 if (subscriber == NULL) {
483 TEST_FAIL();
484 }
485 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
486 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
487
488 Topic topic0 = 0;
489 subscriber->AddTopic((IUnknown *)fapi, &topic0);
490 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
491
492 Topic noExistTopic = 99;
493 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &noExistTopic, &c2, &c2);
494 TEST_ASSERT_EQUAL_INT(result==NULL, 1);
495
496 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
497
498 CASE_ReleaseIUnknown(fapi);
499 }
500
501 /**
502 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0050
503 * @tc.name : Consumer can modify subscription relationship if the new consumer is the same as old consumer
504 * @tc.desc : [C- SOFTWARE -0200]
505 */
506 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0050, Function | MediumTest | Level2)
507 {
508 PubSubInterface *fapi = CASE_GetIUnknown();
509 if (fapi == NULL) {
510 TEST_FAIL();
511 }
512 Subscriber *subscriber = &fapi->subscriber;
513 if (subscriber == NULL) {
514 TEST_FAIL();
515 }
516 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
517
518 Topic topic0 = 0;
519 subscriber->AddTopic((IUnknown *)fapi, &topic0);
520 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
521
522 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, &c1);
523 TEST_ASSERT_EQUAL_INT(result != NULL, TRUE);
524
525 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
526
527 CASE_ReleaseIUnknown(fapi);
528 }
529
530 RUN_TEST_SUITE(Broadcast01TestSuite);