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