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
16 #include <securec.h>
17 #include <ohos_init.h>
18 #include "gtest/gtest.h"
19 #include "broadcast_interface.h"
20 #include "utils/SamgrTestBase.h"
21
22 using namespace testing::ext;
23
24 static const int16 TEST_LEN = 10;
25 static const char *BROADCASR_TEST_SERVICE = "S_broadcast1";
26
C1Callback(Consumer *consumer, const Topic *topic, const Request *request)27 static void C1Callback(Consumer *consumer, const Topic *topic, const Request *request)
28 {
29 (void)consumer;
30 (void)topic;
31 }
C2Callback(Consumer *consumer, const Topic *topic, const Request *request)32 static void C2Callback(Consumer *consumer, const Topic *topic, const Request *request)
33 {
34 (void)consumer;
35 (void)topic;
36 }
37
Equal(const Consumer *current, const Consumer *other)38 static BOOL Equal(const Consumer *current, const Consumer *other)
39 {
40 if (current->Notify == other->Notify) {
41 return TRUE;
42 } else {
43 return FALSE;
44 }
45 }
46
GetName(Service *service)47 static const char *GetName(Service *service)
48 {
49 (void)service;
50 return BROADCASR_TEST_SERVICE;
51 };
52
53 static Identity g_identity = { -1, -1, nullptr};
Initialize(Service *service, Identity identity)54 static BOOL Initialize(Service *service, Identity identity)
55 {
56 g_identity = identity;
57 (void)service;
58 return TRUE;
59 };
60
MessageHandle(Service *service, Request *msg)61 static BOOL MessageHandle(Service *service, Request *msg)
62 {
63 (void)service;
64 return FALSE;
65 };
66
GetTaskConfig(Service *service)67 static TaskConfig GetTaskConfig(Service *service)
68 {
69 TaskConfig config = {LEVEL_HIGH, PRI_NORMAL, 0x800, 20, SHARED_TASK}; // share with broadcast
70 (void)service;
71 return config;
72 };
73
74 static Service g_service = {GetName, Initialize, MessageHandle, GetTaskConfig};
GInit(void)75 static void GInit(void)
76 {
77 SAMGR_GetInstance()->RegisterService(&g_service);
78 }
79 SYSEX_SERVICE_INIT(GInit);
80
CASE_GetIUnknown(void)81 static PubSubInterface *CASE_GetIUnknown(void)
82 {
83 PubSubInterface *fapi = nullptr;
84 IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE, PUB_SUB_FEATURE);
85 if (iUnknown == nullptr) {
86 printf("[hctest]CASE_GetIUnknown error ");
87 return nullptr;
88 }
89
90 int result = iUnknown->QueryInterface(iUnknown, 0x20, (void **)&fapi);
91 if (result != 0 || fapi == nullptr) {
92 printf("[hctest]CASE_GetIUnknown error ");
93 }
94 return fapi;
95 }
96
CASE_ReleaseIUnknown(PubSubInterface *fapi)97 static void CASE_ReleaseIUnknown(PubSubInterface *fapi)
98 {
99 fapi->Release((IUnknown *)fapi);
100 }
101
102 class BroadcastSubscribeTest : public testing::Test {
103 protected:
104 // SetUpTestCase: Testsuit setup, run before 1st testcase
SetUpTestCase(void)105 static void SetUpTestCase(void)
106 {
107 SystemInitProxy();
108 }
109 // TearDownTestCase: Testsuit teardown, run after last testcase
TearDownTestCase(void)110 static void TearDownTestCase(void)
111 {
112 }
113 // Testcase setup
SetUp()114 virtual void SetUp()
115 {
116 }
117 // Testcase teardown
TearDown()118 virtual void TearDown()
119 {
120 }
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 */
HWTEST_F(BroadcastSubscribeTest, testAddTopic0010, Function | MediumTest | Level1)128 HWTEST_F(BroadcastSubscribeTest, testAddTopic0010, Function | MediumTest | Level1)
129 {
130 PubSubInterface *fapi = CASE_GetIUnknown();
131 if (fapi == nullptr) {
132 ADD_FAILURE();
133 }
134 Subscriber *subscriber = &fapi->subscriber;
135 if (subscriber == nullptr) {
136 ADD_FAILURE();
137 }
138
139 Topic topic0 = 11;
140 int result = subscriber->AddTopic((IUnknown *)fapi, &topic0);
141 ASSERT_EQ(result == 0, TRUE);
142
143 CASE_ReleaseIUnknown(fapi);
144 }
145
146 /**
147 * @tc.number : DMSLite_SAMGR_AddTopic_0020
148 * @tc.name : Topic which is nullptr or already existing can not be added
149 * @tc.desc : [C- SOFTWARE -0200]
150 */
HWTEST_F(BroadcastSubscribeTest, testAddTopic0020, Function | MediumTest | Level2)151 HWTEST_F(BroadcastSubscribeTest, testAddTopic0020, Function | MediumTest | Level2)
152 {
153 PubSubInterface *fapi = CASE_GetIUnknown();
154 if (fapi == nullptr) {
155 ADD_FAILURE();
156 }
157 Subscriber *subscriber = &fapi->subscriber;
158 if (subscriber == nullptr) {
159 ADD_FAILURE();
160 }
161
162 Topic topic0 = 0;
163 subscriber->AddTopic((IUnknown *)fapi, &topic0);
164
165 int result = subscriber->AddTopic((IUnknown *)fapi, nullptr);
166 ASSERT_EQ(result != 0, TRUE);
167
168 result = subscriber->AddTopic((IUnknown *)fapi, &topic0);
169 ASSERT_EQ(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 */
HWTEST_F(BroadcastSubscribeTest, testSubscribe0010, Function | MediumTest | Level1)179 HWTEST_F(BroadcastSubscribeTest, testSubscribe0010, Function | MediumTest | Level1)
180 {
181 PubSubInterface *fapi = CASE_GetIUnknown();
182 if (fapi == nullptr) {
183 ADD_FAILURE();
184 }
185 Subscriber *subscriber = &fapi->subscriber;
186 if (subscriber == nullptr) {
187 ADD_FAILURE();
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 ASSERT_EQ(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 nullptr or does not exist
204 * @tc.desc : [C- SOFTWARE -0200]
205 */
HWTEST_F(BroadcastSubscribeTest, testSubscribe0020, Function | MediumTest | Level2)206 HWTEST_F(BroadcastSubscribeTest, testSubscribe0020, Function | MediumTest | Level2)
207 {
208 PubSubInterface *fapi = CASE_GetIUnknown();
209 if (fapi == nullptr) {
210 ADD_FAILURE();
211 }
212 Subscriber *subscriber = &fapi->subscriber;
213 if (subscriber == nullptr) {
214 ADD_FAILURE();
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, nullptr, &c1);
221 ASSERT_EQ(result != 0, TRUE);
222
223 Topic noExistTopic = -200;
224 result = subscriber->Subscribe((IUnknown *)fapi, &noExistTopic, &c1);
225 ASSERT_EQ(result != 0, TRUE);
226
227 CASE_ReleaseIUnknown(fapi);
228 }
229
230 /**
231 * @tc.number : DMSLite_SAMGR_Subscribe_0030
232 * @tc.name : Consumer which is nullptr can not subscribe to a topic
233 * @tc.desc : [C- SOFTWARE -0200]
234 */
HWTEST_F(BroadcastSubscribeTest, testSubscribe0030, Function | MediumTest | Level2)235 HWTEST_F(BroadcastSubscribeTest, testSubscribe0030, Function | MediumTest | Level2)
236 {
237 PubSubInterface *fapi = CASE_GetIUnknown();
238 if (fapi == nullptr) {
239 ADD_FAILURE();
240 }
241 Subscriber *subscriber = &fapi->subscriber;
242 if (subscriber == nullptr) {
243 ADD_FAILURE();
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, nullptr);
250 ASSERT_EQ(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 */
HWTEST_F(BroadcastSubscribeTest, testSubscribe0040, Function | MediumTest | Level2)262 HWTEST_F(BroadcastSubscribeTest, testSubscribe0040, Function | MediumTest | Level2)
263 {
264 PubSubInterface *fapi = CASE_GetIUnknown();
265 if (fapi == nullptr) {
266 ADD_FAILURE();
267 }
268 Subscriber *subscriber = &fapi->subscriber;
269 if (subscriber == nullptr) {
270 ADD_FAILURE();
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 ASSERT_EQ(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 */
HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0010, Function | MediumTest | Level1)290 HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0010, Function | MediumTest | Level1)
291 {
292 PubSubInterface *fapi = CASE_GetIUnknown();
293 if (fapi == nullptr) {
294 ADD_FAILURE();
295 }
296 Subscriber *subscriber = &fapi->subscriber;
297 if (subscriber == nullptr) {
298 ADD_FAILURE();
299 }
300 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
301
302 Topic topic0 = 0;
303 subscriber->AddTopic((IUnknown *)fapi, &topic0);
304 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
305
306 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
307 ASSERT_EQ(result != nullptr, TRUE);
308
309 CASE_ReleaseIUnknown(fapi);
310 }
311
312 /**
313 * @tc.number : DMSLite_SAMGR_UnSubscribe_0020
314 * @tc.name : Consumer can not unsubscribe a topic if the specified topic-comsumer relationship is nullptr
315 * @tc.desc : [C- SOFTWARE -0200]
316 */
HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0020, Function | MediumTest | Level2)317 HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0020, Function | MediumTest | Level2)
318 {
319 PubSubInterface *fapi = CASE_GetIUnknown();
320 if (fapi == nullptr) {
321 ADD_FAILURE();
322 }
323 Subscriber *subscriber = &fapi->subscriber;
324 if (subscriber == nullptr) {
325 ADD_FAILURE();
326 }
327 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
328
329 Topic topic0 = 0;
330 subscriber->AddTopic((IUnknown *)fapi, &topic0);
331 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
332
333 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, nullptr, &c1);
334 ASSERT_EQ(result==NULL, TRUE); // failed
335
336 result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, nullptr);
337 ASSERT_EQ(result==NULL, TRUE);
338
339 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
340 CASE_ReleaseIUnknown(fapi);
341 }
342
343 /**
344 * @tc.number : DMSLite_SAMGR_UnSubscribe_0030
345 * @tc.name : Consumer can not unsubscribe a topic if the specified topic-comsumer relationship not exist
346 * @tc.desc : [C- SOFTWARE -0200]
347 */
HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0030, Function | MediumTest | Level2)348 HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0030, Function | MediumTest | Level2)
349 {
350 PubSubInterface *fapi = CASE_GetIUnknown();
351 if (fapi == nullptr) {
352 ADD_FAILURE();
353 }
354 Subscriber *subscriber = &fapi->subscriber;
355 if (subscriber == nullptr) {
356 ADD_FAILURE();
357 }
358 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
359 static Consumer c2 = {.identity = &g_identity, .Notify = C2Callback, .Equal = Equal};
360
361 Topic topic0 = 0;
362 subscriber->AddTopic((IUnknown *)fapi, &topic0);
363 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
364
365 Consumer *result = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c2);
366 ASSERT_EQ(result==NULL, TRUE);
367
368 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
369 CASE_ReleaseIUnknown(fapi);
370 }
371
372 /**
373 * @tc.number : DMSLite_SAMGR_UnSubscribe_0040
374 * @tc.name : Consumer subscribe and unsubscribe a topic repeatedly, no memory leak.
375 * @tc.desc : [C- SOFTWARE -0200]
376 */
HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0040, Function | MediumTest | Level2)377 HWTEST_F(BroadcastSubscribeTest, testUnsubscribe0040, Function | MediumTest | Level2)
378 {
379 PubSubInterface *fapi = CASE_GetIUnknown();
380 if (fapi == nullptr) {
381 ADD_FAILURE();
382 }
383 Subscriber *subscriber = &fapi->subscriber;
384 if (subscriber == nullptr) {
385 ADD_FAILURE();
386 }
387 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
388 Topic topic0 = 0;
389 subscriber->AddTopic((IUnknown *)fapi, &topic0);
390
391 for (int i = 0; i < PRESSURE_BASE; i++) {
392 int result = subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
393 ASSERT_EQ(result == 0, TRUE);
394
395 Consumer *resultConsumer = subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
396 ASSERT_EQ(resultConsumer != nullptr, TRUE);
397 }
398 CASE_ReleaseIUnknown(fapi);
399 }
400
401 /**
402 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0010
403 * @tc.name : Consumer can modify subscription relationship
404 * @tc.desc : [C- SOFTWARE -0200]
405 */
HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0010, Function | MediumTest | Level2)406 HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0010, Function | MediumTest | Level2)
407 {
408 PubSubInterface *fapi = CASE_GetIUnknown();
409 if (fapi == nullptr) {
410 ADD_FAILURE();
411 }
412 Subscriber *subscriber = &fapi->subscriber;
413 if (subscriber == nullptr) {
414 ADD_FAILURE();
415 }
416 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
417 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
418
419 Topic topic0 = 0;
420 subscriber->AddTopic((IUnknown *)fapi, &topic0);
421 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
422
423 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, &c2);
424 ASSERT_EQ(result != nullptr, TRUE);
425
426 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
427
428 CASE_ReleaseIUnknown(fapi);
429 }
430
431 /**
432 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0020
433 * @tc.name : Consumer can not modify subscription relationship if the input parameter is nullptr
434 * @tc.desc : [C- SOFTWARE -0200]
435 */
HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0020, Function | MediumTest | Level2)436 HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0020, Function | MediumTest | Level2)
437 {
438 PubSubInterface *fapi = CASE_GetIUnknown();
439 if (fapi == nullptr) {
440 ADD_FAILURE();
441 }
442 Subscriber *subscriber = &fapi->subscriber;
443 if (subscriber == nullptr) {
444 ADD_FAILURE();
445 }
446 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
447 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
448
449 Topic topic0 = 0;
450 subscriber->AddTopic((IUnknown *)fapi, &topic0);
451 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
452
453 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, nullptr, &c1, &c2);
454 ASSERT_EQ(result!=NULL, 0);
455
456 result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, nullptr, &c2);
457 ASSERT_EQ(result!=NULL, 0);
458
459 result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, nullptr);
460 ASSERT_EQ(result!=NULL, 0);
461
462 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
463
464 CASE_ReleaseIUnknown(fapi);
465 }
466
467 /**
468 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0030
469 * @tc.name : Consumer can not modify subscription relationship if the specified topic not exist
470 * @tc.desc : [C- SOFTWARE -0200]
471 */
HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0030, Function | MediumTest | Level2)472 HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0030, Function | MediumTest | Level2)
473 {
474 PubSubInterface *fapi = CASE_GetIUnknown();
475 if (fapi == nullptr) {
476 ADD_FAILURE();
477 }
478 Subscriber *subscriber = &fapi->subscriber;
479 if (subscriber == nullptr) {
480 ADD_FAILURE();
481 }
482 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
483 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
484
485 Topic topic0 = 0;
486 subscriber->AddTopic((IUnknown *)fapi, &topic0);
487 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
488
489 Topic noExistTopic = 99;
490 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &noExistTopic, &c1, &c2);
491 ASSERT_EQ(result==NULL, 1);
492
493 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
494
495 CASE_ReleaseIUnknown(fapi);
496 }
497
498 /**
499 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0040
500 * @tc.name : Consumer can not modify subscription relationship if the specified old consumer not exist
501 * @tc.desc : [C- SOFTWARE -0200]
502 */
HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0040, Function | MediumTest | Level2)503 HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0040, Function | MediumTest | Level2)
504 {
505 PubSubInterface *fapi = CASE_GetIUnknown();
506 if (fapi == nullptr) {
507 ADD_FAILURE();
508 }
509 Subscriber *subscriber = &fapi->subscriber;
510 if (subscriber == nullptr) {
511 ADD_FAILURE();
512 }
513 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
514 static Consumer c2 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
515
516 Topic topic0 = 0;
517 subscriber->AddTopic((IUnknown *)fapi, &topic0);
518 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
519
520 Topic noExistTopic = 99;
521 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &noExistTopic, &c2, &c2);
522 ASSERT_EQ(result==NULL, 1);
523
524 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
525
526 CASE_ReleaseIUnknown(fapi);
527 }
528
529 /**
530 * @tc.number : DMSLite_SAMGR_ModifyConsumer_0050
531 * @tc.name : Consumer can modify subscription relationship if the new consumer is the same as old consumer
532 * @tc.desc : [C- SOFTWARE -0200]
533 */
HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0050, Function | MediumTest | Level2)534 HWTEST_F(BroadcastSubscribeTest, testModifyConsumer0050, Function | MediumTest | Level2)
535 {
536 PubSubInterface *fapi = CASE_GetIUnknown();
537 if (fapi == nullptr) {
538 ADD_FAILURE();
539 }
540 Subscriber *subscriber = &fapi->subscriber;
541 if (subscriber == nullptr) {
542 ADD_FAILURE();
543 }
544 static Consumer c1 = {.identity = &g_identity, .Notify = C1Callback, .Equal = Equal};
545
546 Topic topic0 = 0;
547 subscriber->AddTopic((IUnknown *)fapi, &topic0);
548 subscriber->Subscribe((IUnknown *)fapi, &topic0, &c1);
549
550 Consumer *result = subscriber->ModifyConsumer((IUnknown *)fapi, &topic0, &c1, &c1);
551 ASSERT_EQ(result != nullptr, TRUE);
552
553 subscriber->Unsubscribe((IUnknown *)fapi, &topic0, &c1);
554
555 CASE_ReleaseIUnknown(fapi);
556 }
557