1 //******************************************************************
3 // Copyright 2016 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>
22 #include <HippoMocks/hippomocks.h>
25 #include <condition_variable>
32 #include "NSSyncInfo.h"
33 #include "NSMessage.h"
34 #include "NSMediaContents.h"
35 #include "NSConsumerService.h"
37 #include "NSProviderServiceSimulator.h"
41 NSProviderSimulator g_providerSimul;
42 OIC::Service::NSProvider *g_provider;
44 std::atomic_bool g_isStartedStack(false);
46 std::chrono::milliseconds g_waitForResponse(1000);
48 std::condition_variable responseCon;
49 std::mutex mutexForCondition;
53 NS_SELECTION_CONSUMER = 0,
54 NS_SELECTION_PROVIDER = 1
59 class TestWithMock: public testing::Test
65 virtual ~TestWithMock() noexcept(noexcept(std::declval<Test>().~Test()))
70 virtual void TearDown()
84 class NotificationServiceConsumerTest : public TestWithMock
87 NotificationServiceConsumerTest() = default;
88 ~NotificationServiceConsumerTest() = default;
90 static void ProviderDiscoveredCallbackEmpty( OIC::Service::NSProvider *)
92 std::cout << __func__ << std::endl;
95 static void NotificationReceivedCallbackEmpty( OIC::Service::NSMessage *)
97 std::cout << __func__ << std::endl;
100 static void SyncCallbackEmpty(OIC::Service::NSSyncInfo *)
102 std::cout << __func__ << std::endl;
105 static void FoundResourceEmpty(std::shared_ptr< OC::OCResource >)
107 std::cout << __func__ << std::endl;
110 static void ProviderChangedCallbackEmpty( OIC::Service::NSProviderState )
112 std::cout << __func__ << std::endl;
119 TestWithMock::SetUp();
121 if (g_isStartedStack == false)
123 OC::PlatformConfig cfg
125 OC::ServiceType::InProc,
129 OC::QualityOfService::LowQos
131 OC::OCPlatform::Configure(cfg);
135 OC::OCPlatform::stopPresence();
142 g_isStartedStack = true;
149 TestWithMock::TearDown();
154 TEST_F(NotificationServiceConsumerTest, StartConsumerPositive)
156 OIC::Service::NSConsumerService::getInstance()->start(ProviderDiscoveredCallbackEmpty);
159 TEST_F(NotificationServiceConsumerTest, StopConsumerPositive)
161 OIC::Service::NSConsumerService::getInstance()->stop();
164 TEST_F(NotificationServiceConsumerTest, DiscoverProviderWithNonAccepterWhenStartedConsumerFirst)
166 mocks.ExpectCallFunc(ProviderDiscoveredCallbackEmpty).Do(
167 [this]( OIC::Service::NSProvider * provider)
169 std::cout << "Call Discovered" << std::endl;
170 std::cout << provider->getProviderId() << std::endl;
171 responseCon.notify_all();
174 OIC::Service::NSConsumerService::getInstance()->start(ProviderDiscoveredCallbackEmpty);
176 g_providerSimul.setAccepter((int)NSSelector::NS_SELECTION_CONSUMER);
177 g_providerSimul.createNotificationResource();
179 std::unique_lock< std::mutex > lock { mutexForCondition };
180 responseCon.wait_for(lock, g_waitForResponse);
182 OIC::Service::NSConsumerService::getInstance()->stop();
183 g_providerSimul.deleteNotificationResource();
186 TEST_F(NotificationServiceConsumerTest, DiscoverProviderWithNonAccepterWhenStartedConsumerAfter)
188 g_providerSimul.setAccepter((int)NSSelector::NS_SELECTION_CONSUMER);
189 g_providerSimul.createNotificationResource();
191 std::unique_lock< std::mutex > lock { mutexForCondition };
192 responseCon.wait_for(lock, g_waitForResponse);
195 mocks.ExpectCallFunc(ProviderDiscoveredCallbackEmpty).Do(
196 [this]( OIC::Service::NSProvider * provider)
198 std::cout << "Call Discovered" << std::endl;
199 g_provider = provider;
200 std::cout << g_provider->getProviderId() << std::endl;
201 responseCon.notify_all();
204 OIC::Service::NSConsumerService::getInstance()->start(ProviderDiscoveredCallbackEmpty);
206 std::unique_lock< std::mutex > lock { mutexForCondition };
207 responseCon.wait_for(lock, g_waitForResponse);
211 TEST_F(NotificationServiceConsumerTest, DiscoverProviderWithNonAccepterWhenRescan)
213 g_providerSimul.setAccepter((int)NSSelector::NS_SELECTION_CONSUMER);
214 mocks.OnCallFunc(ProviderDiscoveredCallbackEmpty).Do(
215 [this]( OIC::Service::NSProvider * provider)
217 std::cout << "Call Discovered" << std::endl;
218 g_provider = provider;
219 std::cout << g_provider->getProviderId() << std::endl;
220 responseCon.notify_all();
223 OIC::Service::NSConsumerService::getInstance()->rescanProvider();
225 std::unique_lock< std::mutex > lock { mutexForCondition };
226 responseCon.wait_for(lock, g_waitForResponse);
229 TEST_F(NotificationServiceConsumerTest, ExpectSubscribeSuccess)
231 OIC::Service::NSProviderState revState = OIC::Service::NSProviderState::DENY;
232 mocks.OnCallFunc(ProviderChangedCallbackEmpty).Do(
233 [this, & revState](OIC::Service::NSProviderState state)
235 std::cout << "Income Accepted subscription : " << std::endl;
237 responseCon.notify_all();
240 g_provider->setListener( (OIC::Service::NSProvider::ProviderStateCallback)
241 ProviderChangedCallbackEmpty,
242 (OIC::Service::NSProvider::MessageReceivedCallback)NotificationReceivedCallbackEmpty,
243 (OIC::Service::NSProvider::SyncInfoReceivedCallback)SyncCallbackEmpty);
244 if (!g_provider->isSubscribed())
246 g_provider->subscribe();
248 std::unique_lock< std::mutex > lock { mutexForCondition };
249 responseCon.wait_for(lock, g_waitForResponse);
250 EXPECT_EQ(OIC::Service::NSProviderState::ALLOW, revState);
253 TEST_F(NotificationServiceConsumerTest, ExpectReceiveNotification)
256 std::string title = "title";
257 std::string msg = "msg";
259 mocks.ExpectCallFunc(NotificationReceivedCallbackEmpty).Do(
260 [this]( OIC::Service::NSMessage * message)
262 std::cout << "Income Notification : " << message->getMessageId() << std::endl;
263 responseCon.notify_all();
266 g_providerSimul.notifyMessage(id, title, msg);
268 std::unique_lock< std::mutex > lock { mutexForCondition };
269 responseCon.wait_for(lock, g_waitForResponse);
271 OIC::Service::NSConsumerService::getInstance()->stop();
274 TEST_F(NotificationServiceConsumerTest, DiscoverProviderWithAccepterisProvider)
276 g_providerSimul.setAccepter((int)NSSelector::NS_SELECTION_PROVIDER);
278 mocks.ExpectCallFunc(ProviderDiscoveredCallbackEmpty).Do(
279 [this]( OIC::Service::NSProvider * provider)
281 std::cout << "Call Discovered" << std::endl;
282 g_provider = provider;
283 g_provider->setListener( (OIC::Service::NSProvider::ProviderStateCallback)
284 ProviderChangedCallbackEmpty,
285 (OIC::Service::NSProvider::MessageReceivedCallback)NotificationReceivedCallbackEmpty,
286 (OIC::Service::NSProvider::SyncInfoReceivedCallback)SyncCallbackEmpty);
287 if (!g_provider->isSubscribed())
289 g_provider->subscribe();
291 std::cout << g_provider->getProviderId() << std::endl;
292 responseCon.notify_all();
296 OIC::Service::NSConsumerService::getInstance()->start(ProviderDiscoveredCallbackEmpty);
297 std::unique_lock< std::mutex > lock { mutexForCondition };
298 responseCon.wait_for(lock, g_waitForResponse);
301 TEST_F(NotificationServiceConsumerTest, ExpectReceiveNotificationWithAccepterisProvider)
304 std::string title = "title";
305 std::string msg = "msg";
308 mocks.OnCallFunc(NotificationReceivedCallbackEmpty).Do(
309 [this, & id, & revId](OIC::Service::NSMessage * message)
311 std::cout << "Income Notification : " << message->getMessageId() << std::endl;
312 revId = message->getMessageId();
313 responseCon.notify_all();
316 g_providerSimul.notifyMessage(id, title, msg);
318 std::unique_lock< std::mutex > lock { mutexForCondition };
319 responseCon.wait_for(lock, g_waitForResponse);
321 EXPECT_EQ(id, revId);
324 TEST_F(NotificationServiceConsumerTest, ExpectCallbackReadCheckWhenProviderNotifySync)
327 std::string title = "title";
328 std::string msg = "msg";
329 OIC::Service::NSSyncInfo::NSSyncType type = OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED;
331 mocks.OnCallFunc(NotificationReceivedCallbackEmpty).Do(
332 [this]( OIC::Service::NSMessage * message)
334 std::cout << "Income Notification : " << message->getMessageId() << std::endl;
337 mocks.OnCallFunc(SyncCallbackEmpty).Do(
338 [& type, this](OIC::Service::NSSyncInfo * sync)
340 std::cout << "Income SyncInfo : " << sync->getMessageId()
341 << ", State : " << (int) sync->getState() << std::endl;
342 type = sync->getState();
343 responseCon.notify_all();
346 g_providerSimul.notifyMessage(id, title, msg);
348 std::unique_lock< std::mutex > lock { mutexForCondition };
349 responseCon.wait_for(lock, g_waitForResponse);
352 g_providerSimul.sendRead(id);
354 std::unique_lock< std::mutex > lock { mutexForCondition };
355 responseCon.wait_for(lock, g_waitForResponse);
358 EXPECT_EQ(OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ, type);
361 TEST_F(NotificationServiceConsumerTest, ExpectCallbackDismissCheckWhenProviderNotifySync)
364 std::string title = "title";
365 std::string msg = "msg";
366 OIC::Service::NSSyncInfo::NSSyncType type = OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ;
368 mocks.OnCallFunc(NotificationReceivedCallbackEmpty).Do(
369 [this]( OIC::Service::NSMessage * message)
371 std::cout << "Income Notification : " << message->getMessageId() << std::endl;
374 mocks.OnCallFunc(SyncCallbackEmpty).Do(
375 [& type, this](OIC::Service::NSSyncInfo * sync)
377 std::cout << "Income Notification : " << sync->getMessageId()
378 << ", State : " << (int) sync->getState() << std::endl;
379 type = sync->getState();
380 responseCon.notify_all();
383 g_providerSimul.notifyMessage(id, title, msg);
385 std::unique_lock< std::mutex > lock { mutexForCondition };
386 responseCon.wait_for(lock, g_waitForResponse);
389 g_providerSimul.sendDismiss(id);
391 std::unique_lock< std::mutex > lock { mutexForCondition };
392 responseCon.wait_for(lock, g_waitForResponse);
395 EXPECT_EQ(OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED, type);
398 TEST_F(NotificationServiceConsumerTest, ExpectCallbackReadCheckWhenConsumerPostSync)
401 std::string title = "title";
402 std::string msg = "msg";
403 OIC::Service::NSSyncInfo::NSSyncType type = OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED;
405 mocks.OnCallFunc(NotificationReceivedCallbackEmpty).Do(
406 [this]( OIC::Service::NSMessage * message)
408 std::cout << "Income Notification : " << message->getMessageId() << std::endl;
409 g_provider->sendSyncInfo(message->getMessageId(),
410 OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);
411 std::unique_lock< std::mutex > lock { mutexForCondition };
412 responseCon.wait_for(lock, g_waitForResponse);
415 mocks.OnCallFunc(SyncCallbackEmpty).Do(
416 [& type, this](OIC::Service::NSSyncInfo * sync)
418 std::cout << "Income Notification : " << sync->getMessageId()
419 << ", State : " << (int) sync->getState() << std::endl;
420 type = sync->getState();
421 responseCon.notify_all();
424 g_providerSimul.notifyMessage(id, title, msg);
426 std::unique_lock< std::mutex > lock { mutexForCondition };
427 responseCon.wait_for(lock, g_waitForResponse);
430 EXPECT_EQ(OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ, type);
433 TEST_F(NotificationServiceConsumerTest, ExpectCallbackDismissCheckWhenConsumerPostSync)
436 std::string title = "title";
437 std::string msg = "msg";
438 OIC::Service::NSSyncInfo::NSSyncType type = OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ;
440 mocks.OnCallFunc(NotificationReceivedCallbackEmpty).Do(
441 [this]( OIC::Service::NSMessage * message)
443 std::cout << "Income Notification : " << message->getMessageId() << std::endl;
444 g_provider->sendSyncInfo(message->getMessageId(),
445 OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED);
446 std::unique_lock< std::mutex > lock { mutexForCondition };
447 responseCon.wait_for(lock, g_waitForResponse);
450 mocks.OnCallFunc(SyncCallbackEmpty).Do(
451 [& type, this](OIC::Service::NSSyncInfo * sync)
453 std::cout << "Income Notification : " << sync->getMessageId()
454 << ", State : " << (int) sync->getState() << std::endl;
455 type = sync->getState();
456 responseCon.notify_all();
459 g_providerSimul.notifyMessage(id, title, msg);
461 std::unique_lock< std::mutex > lock { mutexForCondition };
462 responseCon.wait_for(lock, g_waitForResponse);
465 EXPECT_EQ(OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_DELETED, type);
468 TEST_F(NotificationServiceConsumerTest, ExpectGetProviderSuccessWithValidProviderId)
470 OIC::Service::NSProvider * provider =
471 OIC::Service::NSConsumerService::getInstance()->getProvider(g_provider->getProviderId());
472 int ret = strcmp(provider->getProviderId().c_str(), g_provider->getProviderId().c_str());
476 TEST_F(NotificationServiceConsumerTest, ExpectGetProviderSuccessWithInvalidProviderId)
478 OIC::Service::NSProvider * provider =
479 OIC::Service::NSConsumerService::getInstance()->getProvider("123456789012345678901234567890123457");
480 EXPECT_EQ(provider, (void*)NULL);
483 TEST_F(NotificationServiceConsumerTest, ExpectCallbackTopicUpdated)
485 OIC::Service::NSProviderState revState = OIC::Service::NSProviderState::STOPPED;
486 mocks.OnCallFunc(ProviderChangedCallbackEmpty).Do(
487 [this, & revState](OIC::Service::NSProviderState state)
489 std::cout << "Income Changed Callback : " << (int)state << std::endl;
491 responseCon.notify_all();
494 NSProviderSimulator::NS_TopicList topics;
495 topics.push_back("1");
496 topics.push_back("2");
497 topics.push_back("3");
499 g_providerSimul.setTopics(topics);
501 std::unique_lock< std::mutex > lock{ mutexForCondition };
502 responseCon.wait_for(lock, g_waitForResponse);
504 EXPECT_EQ(OIC::Service::NSProviderState::TOPIC, revState);
507 TEST_F(NotificationServiceConsumerTest, ExpectEQTopicList)
511 NSProviderSimulator::NS_TopicList topics;
512 topics.push_back("1");
513 topics.push_back("2");
514 topics.push_back("3");
516 std::list<OIC::Service::NSTopic *> retTopic = g_provider->getTopicList()->getTopicsList();
517 auto it1=retTopic.begin();
518 auto it2=topics.begin();
519 while( it1 != retTopic.end() || it2 != topics.end() )
521 if((*it1)->getTopicName() != *it2)
523 isSame = false; break;
529 EXPECT_EQ(true, isSame);
532 TEST_F(NotificationServiceConsumerTest, ExpectFailUpdateTopicOnConsumer)
534 OIC::Service::NSTopicsList * retTopic = g_provider->getTopicList();
535 for (auto it : retTopic->getTopicsList())
537 it->setState(OIC::Service::NSTopic::NSTopicState::SUBSCRIBED);
539 OIC::Service::NSResult ret = g_provider->updateTopicList(retTopic);
541 EXPECT_EQ(OIC::Service::NSResult::ERROR, ret);
545 TEST_F(NotificationServiceConsumerTest, ExpectCallbackDeletedProvider)
547 OIC::Service::NSProviderState type = OIC::Service::NSProviderState::ALLOW;
548 mocks.OnCallFunc(ProviderChangedCallbackEmpty).Do(
549 [& type, this](OIC::Service::NSProviderState state)
551 std::cout << "Income Changed Callback : " << std::endl;
555 g_providerSimul.deleteNotificationResource();
557 std::unique_lock< std::mutex > lock { mutexForCondition };
558 responseCon.wait_for(lock, g_waitForResponse);
560 EXPECT_EQ(type, OIC::Service::NSProviderState::STOPPED);
561 OIC::Service::NSConsumerService::getInstance()->stop();