1 //******************************************************************
3 // Copyright 2017 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include <gtest/gtest.h>
24 #include <condition_variable>
28 #include "OCPlatform.h"
31 #include "ocpayload.h"
32 #include "cainterface.h"
35 #include "NSConsumerInterface.h"
36 #include "NSConsumerDiscovery.h"
37 #include "NSConsumerCommunication.h"
38 #include "NSConsumerInternalTaskController.h"
42 NSProvider * g_provider = NULL;
43 NSProvider_internal * g_provider_internal = NULL;
45 OCClientResponse * g_testResponse = NULL;
46 OCDevAddr * testAddr = NULL;
49 NSSyncType type = NS_SYNC_DELETED;
50 NSProviderState revState = NS_STOPPED;
51 NSProviderState expectedState = NS_STOPPED;
55 std::chrono::milliseconds g_waitForResponse(1000);
57 std::condition_variable messageReceive;
58 std::mutex messageReceiveLock;
60 std::condition_variable syncReceive;
61 std::mutex syncReceiveLock;
63 std::condition_variable providerChanged;
64 std::mutex providerChangedLock;
66 const std::string testProviderID = "123456789012345678901234567890123456";
68 static void NSNotificationReceivedCallback(NSMessage * message)
70 if (0 != testProviderID.compare(message->providerId))
72 NSRemoveMessage(message);
76 std::cout << __func__ << std::endl;
77 std::cout << "Income Notification : " << message->messageId << std::endl;
78 revId = message->messageId;
80 NSRemoveMessage(message);
81 messageReceive.notify_all();
84 static void NSSyncCallback(NSSyncInfo * sync)
86 if (0 != testProviderID.compare(sync->providerId))
92 std::cout << __func__ << std::endl;
93 std::cout << "Income SyncInfo : " << sync->messageId
94 << ", State : " << sync->state << std::endl;
98 syncReceive.notify_all();
101 static void NSProviderChangedCallback(NSProvider * provider, NSProviderState state)
103 if (0 != testProviderID.compare(provider->providerId))
105 NSRemoveProvider(provider);
109 std::cout << __func__ << " " << state << std::endl;
110 std::cout << provider->providerId << std::endl;
113 NSRemoveProvider(g_provider);
116 g_provider = provider;
118 if (expectedState == state)
121 providerChanged.notify_all();
124 static FILE* client_open(const char * path, const char * mode)
126 if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME))
128 std::string file_name = "./oic_svr_db_ns.dat";
129 return fopen(file_name.c_str(), mode);
133 return fopen(path, mode);
137 OCDevAddr * getDevAddr()
139 CAEndpoint_t * ninfo = NULL;
141 CAResult_t ret = CAGetNetworkInformation(&ninfo, &size);
142 if (ret != CA_STATUS_OK || size == 0)
148 (OCDevAddr *)malloc(sizeof(OCDevAddr));
154 addr->adapter = (ninfo[0].adapter == CA_ALL_ADAPTERS) ? OC_ADAPTER_IP :
155 (OCTransportAdapter) ninfo[0].adapter;
156 strncpy(addr->addr, ninfo[0].addr, sizeof(ninfo[0].addr));
157 addr->flags = (OCTransportFlags)ninfo[0].flags;
158 addr->ifindex = ninfo[0].ifindex;
159 addr->port = ninfo[0].port;
160 strncpy(addr->remoteId, ninfo[0].remoteId, 37);
167 OCRepPayload * getDiscoverPayload()
169 OCRepPayload * payload = OCRepPayloadCreate();
170 EXPECT_NE((void *)NULL, payload);
172 std::string msgUri = "/notifiationTest/message";
173 std::string syncUri = "/notifiationTest/sync";
174 std::string topicUri = "/notifiationTest/topic";
176 bool getResult = OCRepPayloadSetPropBool(payload, NS_ATTRIBUTE_POLICY, false);
177 getResult &= OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, testProviderID.c_str());
178 getResult &= OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_MESSAGE, msgUri.c_str());
179 getResult &= OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_SYNC, syncUri.c_str());
180 getResult &= OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_TOPIC, topicUri.c_str());
181 if (getResult == false)
183 OCRepPayloadDestroy(payload);
185 EXPECT_EQ(true, getResult);
190 OCRepPayload * getMsgPayload(uint64_t msgId)
192 OCRepPayload * payload = OCRepPayloadCreate();
193 EXPECT_NE((void *)NULL, payload);
194 bool getResult = OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, msgId);
195 getResult &= OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, testProviderID.c_str());
196 if (getResult == false)
198 OCRepPayloadDestroy(payload);
200 EXPECT_EQ(true, getResult);
205 OCRepPayload * getSyncPayload(uint64_t msgId, int64_t state)
207 OCRepPayload * payload = OCRepPayloadCreate();
208 EXPECT_NE((void *)NULL, payload);
209 bool getResult = OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, msgId);
210 getResult &= OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, testProviderID.c_str());
211 getResult &= OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_STATE, state);
212 if (getResult == false)
214 OCRepPayloadDestroy(payload);
216 EXPECT_EQ(true, getResult);
221 OCRepPayload * getTopicPayload()
223 size_t dimensions[MAX_REP_ARRAY_DEPTH] = {3, 0, 0};
224 OCRepPayload ** topicList = (OCRepPayload **)malloc(sizeof(OCRepPayload *)*3);
225 EXPECT_NE((void *)NULL, topicList);
226 for (int i = 0; i < 3; ++i)
228 topicList[i] = OCRepPayloadCreate();
229 EXPECT_NE((void *)NULL, topicList[i]);
231 bool getResult = OCRepPayloadSetPropInt(topicList[i],
232 NS_ATTRIBUTE_TOPIC_SELECTION, 1);
233 getResult &= OCRepPayloadSetPropString(topicList[i],
234 NS_ATTRIBUTE_TOPIC_NAME, std::to_string(i+1).c_str());
235 EXPECT_EQ(true, getResult);
238 OCRepPayload * payload = OCRepPayloadCreate();
239 EXPECT_NE((void *)NULL, payload);
240 bool getResult = OCRepPayloadSetPropString(payload,
241 NS_ATTRIBUTE_CONSUMER_ID, testProviderID.c_str());
242 getResult &= OCRepPayloadSetPropObjectArrayAsOwner(payload,
243 NS_ATTRIBUTE_TOPIC_LIST, topicList, dimensions);
244 if (getResult == false)
246 OCRepPayloadDestroy(payload);
248 EXPECT_EQ(true, getResult);
253 OCClientResponse * createResponse()
255 OCClientResponse * testResponse =
256 (OCClientResponse *)malloc(sizeof(OCClientResponse));
257 EXPECT_NE((void *)NULL, testResponse);
259 std::string notiUri = "/notifiationTest";
261 testResponse->addr = testAddr;
262 testResponse->devAddr = *testAddr;
263 testResponse->connType = CT_ADAPTER_IP;
264 testResponse->identity.id_length = 37;
265 strncpy((char *)(testResponse->identity.id), testProviderID.c_str(), 37);
266 testResponse->numRcvdVendorSpecificHeaderOptions = 0;
267 testResponse->resourceUri = (char*)malloc(sizeof(char)*notiUri.size() + 1);
268 strncpy((char*)testResponse->resourceUri, notiUri.c_str(), notiUri.size()+1);
269 testResponse->result = OC_STACK_OK;
270 testResponse->sequenceNumber = 1;
271 testResponse->payload = NULL;
276 NSProvider_internal * getProvider(OCDevAddr * addr)
283 NSProviderConnectionInfo * info =
284 (NSProviderConnectionInfo *)malloc(sizeof(NSProviderConnectionInfo));
290 info->isCloudConnection = false;
291 info->isSubscribing = false;
292 info->messageHandle = NULL;
293 info->syncHandle = NULL;
297 NSProvider_internal * provider =
298 (NSProvider_internal *)malloc(sizeof(NSProvider_internal));
299 if (provider == NULL)
305 provider->accessPolicy = NSSelector::NS_SELECTION_CONSUMER;
306 provider->state = NS_DISCOVERED;
307 strcpy(provider->providerId, testProviderID.c_str());
308 provider->messageUri = strdup("/notificationTest/message");
309 provider->syncUri = strdup("/notificationTest/sync");
310 provider->topicUri = strdup("/notificationTest/topic");
311 provider->topicLL = NULL;
312 provider->connection = info;
319 static OCPersistentStorage gps {client_open, fread, fwrite, fclose, unlink };
320 OC::PlatformConfig occfg
322 OC::ServiceType::InProc,
326 OC::QualityOfService::LowQos,
329 OC::OCPlatform::Configure(occfg);
333 OC::OCPlatform::stopPresence();
340 testAddr = getDevAddr();
341 if (testAddr == NULL)
343 throw std::exception();
355 NSRemoveProvider(g_provider);
360 void removeGlobalResponse()
364 free((void*)(g_testResponse->resourceUri));
365 free(g_testResponse);
366 g_testResponse = NULL;
371 TEST(NotificationConsumerTest, StartConsumerNegativeNonSetChangedCB)
373 cfg.changedCb = NULL;
374 cfg.messageCb = NSNotificationReceivedCallback;
375 cfg.syncInfoCb = NSSyncCallback;
377 EXPECT_EQ(NS_ERROR, NSStartConsumer(cfg));
380 TEST(NotificationConsumerTest, StartConsumerNegativeNonSetNotiReceiveCB)
382 cfg.changedCb = NSProviderChangedCallback;
383 cfg.messageCb = NULL;
384 cfg.syncInfoCb = NSSyncCallback;
386 EXPECT_EQ(NS_ERROR, NSStartConsumer(cfg));
389 TEST(NotificationConsumerTest, StartConsumerNegativeNonSetSyncCB)
391 cfg.changedCb = NSProviderChangedCallback;
392 cfg.messageCb = NSNotificationReceivedCallback;
393 cfg.syncInfoCb = NULL;
395 EXPECT_EQ(NS_ERROR, NSStartConsumer(cfg));
398 TEST(NotificationConsumerTest, StartConsumerPositive)
401 EXPECT_NO_THROW(stackInit());
403 cfg.changedCb = NSProviderChangedCallback;
404 cfg.messageCb = NSNotificationReceivedCallback;
405 cfg.syncInfoCb = NSSyncCallback;
407 EXPECT_EQ(NS_OK, NSStartConsumer(cfg));
410 TEST(NotificationConsumerTest, StopConsumerPositive)
412 EXPECT_EQ(NSStopConsumer(), NS_OK);
415 TEST(NotificationConsumerTest, StopConsumerNegative)
417 EXPECT_EQ(NSStopConsumer(), NS_ERROR);
420 TEST(NotificationConsumerTest, ExpectCallbackDiscovered)
422 cfg.changedCb = NSProviderChangedCallback;
423 cfg.messageCb = NSNotificationReceivedCallback;
424 cfg.syncInfoCb = NSSyncCallback;
426 NSStartConsumer(cfg);
428 revState = NS_STOPPED;
429 expectedState = NS_DISCOVERED;
431 g_testResponse = createResponse();
432 g_testResponse->payload = (OCPayload *)getDiscoverPayload();
433 NSIntrospectProvider(NULL, NULL, g_testResponse);
435 std::unique_lock< std::mutex > lock{ providerChangedLock };
436 providerChanged.wait_for(lock, g_waitForResponse);
438 OCRepPayloadDestroy((OCRepPayload *)g_testResponse->payload);
439 g_testResponse->payload = NULL;
440 removeGlobalResponse();
442 EXPECT_EQ(NS_DISCOVERED, revState);
445 TEST(NotificationConsumerTest, ExpectCallbackAllow)
447 revState = NS_STOPPED;
448 expectedState = NS_ALLOW;
450 g_testResponse = createResponse();
451 g_testResponse->payload = (OCPayload *)getMsgPayload(NS_ALLOW);
452 NSConsumerMessageListener(NULL,NULL, g_testResponse);
454 std::unique_lock< std::mutex > lock{ providerChangedLock };
455 providerChanged.wait_for(lock, g_waitForResponse);
457 OCRepPayloadDestroy((OCRepPayload *)g_testResponse->payload);
458 g_testResponse->payload = NULL;
459 removeGlobalResponse();
461 EXPECT_EQ(NS_ALLOW, revState);
464 TEST(NotificationConsumerTest, ExpectReceiveNotification)
468 g_testResponse = createResponse();
469 g_testResponse->payload = (OCPayload *)getMsgPayload(id);
470 NSConsumerMessageListener(NULL,NULL, g_testResponse);
472 std::unique_lock< std::mutex > lock{ messageReceiveLock };
473 messageReceive.wait_for(lock, g_waitForResponse);
475 OCRepPayloadDestroy((OCRepPayload *)g_testResponse->payload);
476 g_testResponse->payload = NULL;
477 removeGlobalResponse();
479 EXPECT_EQ(id, revId);
482 TEST(NotificationConsumerTest, ExpectReceiveSyncInfo)
485 type = NS_SYNC_DELETED;
487 g_testResponse = createResponse();
488 g_testResponse->payload = (OCPayload *)getSyncPayload(id, NS_SYNC_READ);
489 NSConsumerSyncInfoListener(NULL,NULL, g_testResponse);
491 std::unique_lock< std::mutex > lock{ syncReceiveLock };
492 syncReceive.wait_for(lock, g_waitForResponse);
494 OCRepPayloadDestroy((OCRepPayload *)g_testResponse->payload);
495 g_testResponse->payload = NULL;
496 removeGlobalResponse();
498 EXPECT_EQ(NS_SYNC_READ, type);
501 TEST(NotificationConsumerTest, ExpectSuccessSendSyncInfo)
506 auto ret = NSConsumerSendSyncInfo(g_provider->providerId, id, NS_SYNC_DELETED);
508 EXPECT_EQ(NS_OK, ret);
511 TEST(NotificationConsumerTest, GetValidProvider)
513 NSProvider * provider = NSConsumerGetProvider(g_provider->providerId);
514 EXPECT_NE((void *)NULL, provider);
515 NSRemoveProvider(provider);
518 TEST(NotificationConsumerTest, GetInvalidProvider)
520 NSProvider * provider = NSConsumerGetProvider(NULL);
521 EXPECT_EQ((void *)NULL, provider);
524 TEST(NotificationConsumerTest, ExpectGetTopicListIsNULL)
526 NSTopicLL * currentTopics = NSConsumerGetTopicList(g_provider->providerId);
527 EXPECT_EQ(NULL, currentTopics);
531 NSRemoveTopicLL(currentTopics);
535 TEST(NotificationConsumerTest, ExpectCallbackTopicUpdated)
537 revState = NS_STOPPED;
539 g_testResponse = createResponse();
540 g_testResponse->payload = (OCPayload *)getTopicPayload();
541 g_provider_internal = getProvider(testAddr);
542 NSIntrospectTopic((void *)g_provider_internal, NULL, g_testResponse);
544 expectedState = NS_TOPIC;
545 std::unique_lock< std::mutex > lock{ providerChangedLock };
546 providerChanged.wait_for(lock, g_waitForResponse);
548 EXPECT_EQ(NS_TOPIC, revState);
550 OCRepPayloadDestroy((OCRepPayload *)g_testResponse->payload);
551 g_testResponse->payload = NULL;
552 removeGlobalResponse();
554 expectedState = NS_STOPPED;
557 TEST(NotificationConsumerTest, ExpectEQTopicList)
561 typedef std::list<std::string> TesttopicList;
562 TesttopicList topics;
563 topics.push_back("1");
564 topics.push_back("2");
565 topics.push_back("3");
567 NSTopicLL * retTopic = NSConsumerGetTopicList(g_provider_internal->providerId);
568 EXPECT_NE((void *)NULL, (void *)retTopic);
570 NSTopicLL * iter = retTopic;
571 std::for_each (topics.begin(), topics.end(),
572 [this, & iter, & isSame](const std::string & str)
574 isSame &= (str == std::string(iter->topicName));
578 NSRemoveTopicLL(retTopic);
580 EXPECT_EQ(true, isSame);
583 TEST(NotificationConsumerTest, ExpectSuccessUpdateTopicOnConsumer)
585 NSTopicLL * retTopic = NSConsumerGetTopicList(g_provider_internal->providerId);
587 NSTopicLL * iter = retTopic;
588 for (; iter; iter = iter->next)
590 iter->state = NS_TOPIC_SUBSCRIBED;
592 NSResult ret = NSConsumerUpdateTopicList(g_provider_internal->providerId, retTopic);
594 NSRemoveTopicLL(retTopic);
596 EXPECT_EQ(NS_OK, ret);
599 TEST(NotificationConsumerTest, ExpectUnsubscribeSuccess)
602 NSResult ret = NSUnsubscribe(g_provider_internal->providerId);
604 expectedState = NS_STOPPED;
605 std::unique_lock< std::mutex > lock{ providerChangedLock };
606 providerChanged.wait_for(lock, g_waitForResponse);
608 EXPECT_EQ(NS_STOPPED, revState);
609 EXPECT_EQ(NS_OK, ret);
612 TEST(NotificationConsumerTest, ExpectUnsubscribeWithPresenceStart)
614 g_testResponse = createResponse();
615 OCPresencePayload * payload = OCPresencePayloadCreate(1, 2, OC_PRESENCE_TRIGGER_CREATE, NULL);
616 EXPECT_NE((void *)NULL, payload);
617 g_testResponse->payload = (OCPayload *)payload;
619 auto ret = NSConsumerPresenceListener(NULL,NULL, g_testResponse);
621 EXPECT_EQ(OC_STACK_KEEP_TRANSACTION, ret);
622 OCPresencePayloadDestroy(payload);
623 removeGlobalResponse();
626 TEST(NotificationConsumerTest, ExpectUnsubscribeWithPresenceStop)
628 g_testResponse = createResponse();
629 OCPresencePayload * payload = OCPresencePayloadCreate(2, 2, OC_PRESENCE_TRIGGER_DELETE, NULL);
630 EXPECT_NE((void *)NULL, payload);
631 g_testResponse->payload = (OCPayload *)payload;
633 auto ret = NSConsumerPresenceListener(NULL,NULL, g_testResponse);
635 EXPECT_EQ(OC_STACK_KEEP_TRANSACTION, ret);
636 OCPresencePayloadDestroy(payload);