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 CASE_ReleaseIUnknown(fapi);
224 }
225
226 /**
227 * @tc.number : DMSLite_SAMGR_Subscribe_0030
228 * @tc.name : Consumer which is NULL can not subscribe to a topic
229 * @tc.desc : [C- SOFTWARE -0200]
230 */
231 LITE_TEST_CASE(Broadcast01TestSuite, testSubscribe0030, Function | MediumTest | Level2)
232 {
233 PubSubInterface *fapi = CASE_GetIUnknown();
234 if (fapi == NULL) {
235 TEST_FAIL();
236 }
237 Subscriber *subscriber = &fapi->subscriber;
238 if (subscriber == NULL) {
239 TEST_FAIL();
240 }
241 Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
242
243 Topic topic0 = 0;
244 subscriber->AddTopic((IUnknown *)fapi, &topic0);
245 int result = subscriber->Subscribe((IUnknown *)fapi, &topic0, NULL);
246 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
247
248 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
249
250 CASE_ReleaseIUnknown(fapi);
251 }
252
253 /**
254 * @tc.number : DMSLite_SAMGR_Subscribe_0040
255 * @tc.name : Consumer can not subscribe to the same topic twice
256 * @tc.desc : [C- SOFTWARE -0200]
257 */
258 LITE_TEST_CASE(Broadcast01TestSuite, testSubscribe0040, Function | MediumTest | Level2)
259 {
260 PubSubInterface *fapi = CASE_GetIUnknown();
261 if (fapi == NULL) {
262 TEST_FAIL();
263 }
264 Subscriber *subscriber = &fapi->subscriber;
265 if (subscriber == NULL) {
266 TEST_FAIL();
267 }
268 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
269
270 Topic topic0 = 0;
271 subscriber->AddTopic((IUnknown *)fapi, &topic0);
272 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
273 int result = subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
274 TEST_ASSERT_EQUAL_INT(result != 0, TRUE);
275
276 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
277
278 CASE_ReleaseIUnknown(fapi);
279 }
280
281 /**
282 * @tc.number : DMSLite_SAMGR_UnSubscribe_0010
283 * @tc.name : Consumer can unsubscribe a topic
284 * @tc.desc : [C- SOFTWARE -0200]
285 */
286 LITE_TEST_CASE(Broadcast01TestSuite, testUnsubscribe0010, Function | MediumTest | Level1)
287 {
288 PubSubInterface *fapi = CASE_GetIUnknown();
289 if (fapi == NULL) {
290 TEST_FAIL();
291 }
292 Subscriber *subscriber = &fapi->subscriber;
293 if (subscriber == NULL) {
294 TEST_FAIL();
295 }
296
297 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
298
299 Topic topic0 = 0;
300 subscriber->AddTopic((IUnknown *)fapi, &topic0);
301 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
302
303 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
304 TEST_ASSERT_EQUAL_INT(result != NULL, TRUE);
305
306 CASE_ReleaseIUnknown(fapi);
307 }
308
309 /**
310 * @tc.number : DMSLite_SAMGR_UnSubscribe_0020
311 * @tc.name : Consumer can not unsubscribe a topic if the specified topic-comsumer relationship is NULL
312 * @tc.desc : [C- SOFTWARE -0200]
313 */
314 LITE_TEST_CASE(Broadcast01TestSuite, testUnsubscribe0020, Function | MediumTest | Level2)
315 {
316 PubSubInterface *fapi = CASE_GetIUnknown();
317 if (fapi == NULL) {
318 TEST_FAIL();
319 }
320 Subscriber *subscriber = &fapi->subscriber;
321 if (subscriber == NULL) {
322 TEST_FAIL();
323 }
324 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
325
326 Topic topic0 = 0;
327 subscriber->AddTopic((IUnknown *)fapi, &topic0);
328 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
329
330 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, NULL, &c1);
331 TEST_ASSERT_EQUAL_INT(result==NULL, TRUE); // failed
332
333 result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, NULL);
334 TEST_ASSERT_EQUAL_INT(result==NULL, TRUE);
335
336 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
337 CASE_ReleaseIUnknown(fapi);
338 }
339
340 /**
341 * @tc.number : DMSLite_SAMGR_UnSubscribe_0030
342 * @tc.name : Consumer can not unsubscribe a topic if the specified topic-comsumer relationship not exist
343 * @tc.desc : [C- SOFTWARE -0200]
344 */
345 LITE_TEST_CASE(Broadcast01TestSuite, testUnsubscribe0030, Function | MediumTest | Level2)
346 {
347 PubSubInterface *fapi = CASE_GetIUnknown();
348 if (fapi == NULL) {
349 TEST_FAIL();
350 }
351 Subscriber *subscriber = &fapi->subscriber;
352 if (subscriber == NULL) {
353 TEST_FAIL();
354 }
355 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
356 static Consumer c2 = {.identity = &g_identity, .Notify = C2Callback, .Equal = Equal};
357
358 Topic topic0 = 0;
359 subscriber->AddTopic((IUnknown *)fapi, &topic0);
360 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
361
362 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c2);
363 TEST_ASSERT_EQUAL_INT(result==NULL, TRUE);
364
365 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
366 CASE_ReleaseIUnknown(fapi);
367 }
368
369 /**
370 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0010
371 * @tc.name : Consumer can modify subscription relationship
372 * @tc.desc : [C- SOFTWARE -0200]
373 */
374 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0010, Function | MediumTest | Level2)
375 {
376 PubSubInterface *fapi = CASE_GetIUnknown();
377 if (fapi == NULL) {
378 TEST_FAIL();
379 }
380 Subscriber *subscriber = &fapi->subscriber;
381 if (subscriber == NULL) {
382 TEST_FAIL();
383 }
384 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
385 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
386
387 Topic topic0 = 0;
388 subscriber->AddTopic((IUnknown *)fapi, &topic0);
389 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
390
391 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, &c2);
392 TEST_ASSERT_EQUAL_INT(result != NULL, TRUE);
393
394 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
395
396 CASE_ReleaseIUnknown(fapi);
397 }
398
399 /**
400 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0020
401 * @tc.name : Consumer can not modify subscription relationship if the input parameter is NULL
402 * @tc.desc : [C- SOFTWARE -0200]
403 */
404 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0020, Function | MediumTest | Level2)
405 {
406 PubSubInterface *fapi = CASE_GetIUnknown();
407 if (fapi == NULL) {
408 TEST_FAIL();
409 }
410 Subscriber *subscriber = &fapi->subscriber;
411 if (subscriber == NULL) {
412 TEST_FAIL();
413 }
414 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
415 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
416
417 Topic topic0 = 0;
418 subscriber->AddTopic((IUnknown *)fapi, &topic0);
419 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
420
421 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, NULL, &c1, &c2);
422 TEST_ASSERT_EQUAL_INT(result!=NULL, 0);
423
424 result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, NULL, &c2);
425 TEST_ASSERT_EQUAL_INT(result!=NULL, 0);
426
427 result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, NULL);
428 TEST_ASSERT_EQUAL_INT(result!=NULL, 0);
429
430 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
431
432 CASE_ReleaseIUnknown(fapi);
433 }
434
435 /**
436 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0030
437 * @tc.name : Consumer can not modify subscription relationship if the specified topic not exist
438 * @tc.desc : [C- SOFTWARE -0200]
439 */
440 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0030, Function | MediumTest | Level2)
441 {
442 PubSubInterface *fapi = CASE_GetIUnknown();
443 if (fapi == NULL) {
444 TEST_FAIL();
445 }
446 Subscriber *subscriber = &fapi->subscriber;
447 if (subscriber == NULL) {
448 TEST_FAIL();
449 }
450 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
451 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
452
453 Topic topic0 = 0;
454 subscriber->AddTopic((IUnknown *)fapi, &topic0);
455 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
456
457 Topic noExistTopic = 99;
458 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &noExistTopic, &c1, &c2);
459 TEST_ASSERT_EQUAL_INT(result==NULL, 1);
460
461 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
462
463 CASE_ReleaseIUnknown(fapi);
464 }
465
466 /**
467 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0040
468 * @tc.name : Consumer can not modify subscription relationship if the specified old consumer not exist
469 * @tc.desc : [C- SOFTWARE -0200]
470 */
471 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0040, Function | MediumTest | Level2)
472 {
473 PubSubInterface *fapi = CASE_GetIUnknown();
474 if (fapi == NULL) {
475 TEST_FAIL();
476 }
477 Subscriber *subscriber = &fapi->subscriber;
478 if (subscriber == NULL) {
479 TEST_FAIL();
480 }
481 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
482 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
483
484 Topic topic0 = 0;
485 subscriber->AddTopic((IUnknown *)fapi, &topic0);
486 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
487
488 Topic noExistTopic = 99;
489 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &noExistTopic, &c2, &c2);
490 TEST_ASSERT_EQUAL_INT(result==NULL, 1);
491
492 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
493
494 CASE_ReleaseIUnknown(fapi);
495 }
496
497 /**
498 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0050
499 * @tc.name : Consumer can modify subscription relationship if the new consumer is the same as old consumer
500 * @tc.desc : [C- SOFTWARE -0200]
501 */
502 LITE_TEST_CASE(Broadcast01TestSuite, testModifyConsumer0050, Function | MediumTest | Level2)
503 {
504 PubSubInterface *fapi = CASE_GetIUnknown();
505 if (fapi == NULL) {
506 TEST_FAIL();
507 }
508 Subscriber *subscriber = &fapi->subscriber;
509 if (subscriber == NULL) {
510 TEST_FAIL();
511 }
512 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
513
514 Topic topic0 = 0;
515 subscriber->AddTopic((IUnknown *)fapi, &topic0);
516 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
517
518 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, &c1);
519 TEST_ASSERT_EQUAL_INT(result != NULL, TRUE);
520
521 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
522
523 CASE_ReleaseIUnknown(fapi);
524 }
525
526 RUN_TEST_SUITE(Broadcast01TestSuite);