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>
29 #include "NSProviderService.h"
30 #include "NSConsumerServiceSimulator.h"
32 #include "NSSyncInfo.h"
33 #include "NSMessage.h"
34 #include "NSMediaContents.h"
38 std::atomic_bool g_isStartedStack(false);
40 std::chrono::milliseconds g_waitForResponse(500);
42 std::condition_variable responseCon;
43 std::mutex mutexForCondition;
45 NSConsumerSimulator g_consumerSimul;
46 OIC::Service::NSConsumer *g_consumer;
49 class TestWithMock: public testing::Test
55 virtual ~TestWithMock() noexcept(noexcept(std::declval<Test>().~Test()))
59 virtual void TearDown()
73 class NotificationProviderServiceTest : public TestWithMock
76 NotificationProviderServiceTest() = default;
77 ~NotificationProviderServiceTest() = default;
79 static void ConsumerSubscribedCallbackEmpty(OIC::Service::NSConsumer *)
81 std::cout << __func__ << std::endl;
84 static void MessageSynchronizedCallbackEmpty(OIC::Service::NSSyncInfo *)
86 std::cout << __func__ << std::endl;
89 static void MessageCallbackFromConsumerEmpty(
90 const int &, const std::string &, const std::string &, const std::string &)
92 std::cout << __func__ << std::endl;
95 static void SyncCallbackFromConsumerEmpty(int, int)
97 std::cout << __func__ << std::endl;
104 TestWithMock::SetUp();
106 if (g_isStartedStack == false)
108 OC::PlatformConfig cfg
110 OC::ServiceType::InProc,
114 OC::QualityOfService::HighQos
116 OC::OCPlatform::Configure(cfg);
120 OC::OCPlatform::stopPresence();
127 g_isStartedStack = true;
134 TestWithMock::TearDown();
139 TEST_F(NotificationProviderServiceTest, StartProviderPositiveWithPolicyTrue)
141 OIC::Service::NSProviderService::ProviderConfig config;
142 config.m_subscribeRequestCb = ConsumerSubscribedCallbackEmpty;
143 config.m_syncInfoCb = MessageSynchronizedCallbackEmpty;
144 config.subControllability = true;
146 OIC::Service::NSResult ret = OIC::Service::NSProviderService::getInstance()->start(config);
148 EXPECT_EQ(ret, OIC::Service::NSResult::OK);
151 TEST_F(NotificationProviderServiceTest, StopProviderPositive)
153 OIC::Service::NSResult ret = OIC::Service::NSProviderService::getInstance()->stop();
155 EXPECT_EQ(ret, OIC::Service::NSResult::OK);
158 TEST_F(NotificationProviderServiceTest, StartProviderPositiveWithPolicyFalse)
160 OIC::Service::NSProviderService::ProviderConfig config;
161 config.m_subscribeRequestCb = ConsumerSubscribedCallbackEmpty;
162 config.m_syncInfoCb = MessageSynchronizedCallbackEmpty;
163 config.subControllability = false;
165 OIC::Service::NSResult ret = OIC::Service::NSProviderService::getInstance()->start(config);
167 EXPECT_EQ(ret, OIC::Service::NSResult::OK);
168 OIC::Service::NSProviderService::getInstance()->stop();
171 TEST_F(NotificationProviderServiceTest,
172 ExpectCallbackWhenReceiveSubscribeRequestWithAccepterProvider)
175 mocks.ExpectCallFunc(ConsumerSubscribedCallbackEmpty).Do(
176 []( OIC::Service::NSConsumer * consumer)
178 std::cout << "ConsumerSubscribedCallbackEmpty" << std::endl;
179 g_consumer = consumer;
180 responseCon.notify_all();
183 OIC::Service::NSProviderService::ProviderConfig config;
184 config.m_subscribeRequestCb = ConsumerSubscribedCallbackEmpty;
185 config.m_syncInfoCb = MessageSynchronizedCallbackEmpty;
186 config.subControllability = true;
188 OIC::Service::NSProviderService::getInstance()->start(config);
191 std::unique_lock< std::mutex > lock { mutexForCondition };
192 responseCon.wait_for(lock, g_waitForResponse);
195 g_consumerSimul.setCallback(MessageCallbackFromConsumerEmpty,
196 SyncCallbackFromConsumerEmpty);
197 g_consumerSimul.findProvider();
199 std::unique_lock< std::mutex > lock { mutexForCondition };
200 responseCon.wait_for(lock, g_waitForResponse);
202 EXPECT_NE((void*)g_consumer, (void*)NULL);
205 TEST_F(NotificationProviderServiceTest, NeverCallNotifyOnConsumerByAcceptIsFalse)
207 bool expectTrue = true;
210 mocks.OnCallFunc(MessageCallbackFromConsumerEmpty).Do(
211 [& expectTrue, &msgID](const int & id, const std::string &, const std::string &,
216 std::cout << "This function never call" << std::endl;
219 responseCon.notify_all();
222 g_consumer->acceptSubscription(false);
224 OIC::Service::NSMessage *msg = OIC::Service::NSProviderService::getInstance()->createMessage();
225 msgID = (int)msg->getMessageId();
226 msg->setTitle(std::string("Title"));
227 msg->setContentText(std::string("ContentText"));
228 msg->setSourceName(std::string("OCF"));
230 OIC::Service::NSProviderService::getInstance()->sendMessage(msg);
232 std::unique_lock< std::mutex > lock { mutexForCondition };
233 responseCon.wait_for(lock, g_waitForResponse);
236 std::unique_lock< std::mutex > lock { mutexForCondition };
237 responseCon.wait_for(lock, g_waitForResponse);
239 EXPECT_EQ(expectTrue, true);
242 TEST_F(NotificationProviderServiceTest, ExpectCallNotifyOnConsumerByAcceptIsTrue)
246 mocks.ExpectCallFunc(MessageCallbackFromConsumerEmpty).Do(
247 [&msgID](const int & id, const std::string &, const std::string &, const std::string &)
251 std::cout << "ExpectCallNotifyOnConsumerByAcceptIsTrue" << std::endl;
252 responseCon.notify_all();
256 g_consumer->acceptSubscription(true);
258 OIC::Service::NSMessage *msg = OIC::Service::NSProviderService::getInstance()->createMessage();
259 msgID = (int)msg->getMessageId();
260 msg->setTitle(std::string("Title"));
261 msg->setContentText(std::string("ContentText"));
262 msg->setSourceName(std::string("OCF"));
264 OIC::Service::NSProviderService::getInstance()->sendMessage(msg);
265 std::unique_lock< std::mutex > lock { mutexForCondition };
266 responseCon.wait_for(lock, g_waitForResponse);
269 TEST_F(NotificationProviderServiceTest, ExpectCallbackSyncOnReadToConsumer)
273 mocks.ExpectCallFunc(SyncCallbackFromConsumerEmpty).Do(
274 [& id](int & type, int & syncId)
276 std::cout << "MessageSynchronizedCallbackEmpty" << std::endl;
278 type == (int)OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ)
280 std::cout << "ExpectCallbackSyncOnReadFromConsumer" << std::endl;
281 responseCon.notify_all();
285 OIC::Service::NSMessage *msg = OIC::Service::NSProviderService::getInstance()->createMessage();
286 id = (int)msg->getMessageId();
287 msg->setTitle(std::string("Title"));
288 msg->setContentText(std::string("ContentText"));
289 msg->setSourceName(std::string("OCF"));
291 OIC::Service::NSProviderService::getInstance()->sendSyncInfo(msg->getMessageId(),
292 OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);
293 std::unique_lock< std::mutex > lock { mutexForCondition };
294 responseCon.wait_for(lock, g_waitForResponse);
297 TEST_F(NotificationProviderServiceTest, ExpectCallbackSyncOnReadFromConsumer)
299 int type = (int)OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ;
301 mocks.ExpectCallFunc(MessageSynchronizedCallbackEmpty).Do(
302 [& id](OIC::Service::NSSyncInfo * sync)
304 std::cout << "MessageSynchronizedCallbackEmpty" << std::endl;
305 if ((int)sync->getMessageId() == id
306 && sync->getState() == OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ)
308 std::cout << "ExpectCallbackSyncOnReadFromConsumer" << std::endl;
309 responseCon.notify_all();
313 OIC::Service::NSMessage *msg = OIC::Service::NSProviderService::getInstance()->createMessage();
314 id = (int)msg->getMessageId();
315 msg->setTitle(std::string("Title"));
316 msg->setContentText(std::string("ContentText"));
317 msg->setSourceName(std::string("OCF"));
318 g_consumerSimul.syncToProvider(type, id, msg->getProviderId());
319 std::unique_lock< std::mutex > lock { mutexForCondition };
320 responseCon.wait(lock);
323 TEST_F(NotificationProviderServiceTest, ExpectEqualAddedTopicsAndRegisteredTopics)
325 std::string str1("TEST1");
326 std::string str2("TEST2");
327 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
328 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
329 std::unique_lock< std::mutex > lock { mutexForCondition };
330 responseCon.wait_for(lock, g_waitForResponse);
332 OIC::Service::NSTopicsList *topicList =
333 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
336 printf("topic is NULL\n");
341 std::string compString[10];
343 for (auto itr : topicList->getTopicsList())
345 compString[i] = itr->getTopicName(); i++;
347 std::cout << compString[0] << std::endl;
348 std::cout << compString[1] << std::endl;
349 if (str1.compare(compString[0]) == 0 && str2.compare(compString[1]) == 0)
354 EXPECT_EQ(isSame, true);
356 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
357 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
358 if(topicList != nullptr)
362 responseCon.wait_for(lock, g_waitForResponse);
365 TEST_F(NotificationProviderServiceTest, ExpectEqualUnregisteredTopicsAndRegisteredTopics)
367 std::string str1("TEST1");
368 std::string str2("TEST2");
369 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
370 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
371 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
372 std::unique_lock< std::mutex > lock { mutexForCondition };
373 responseCon.wait_for(lock, g_waitForResponse);
375 OIC::Service::NSTopicsList *topicList =
376 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
379 printf("topic is NULL\n");
384 std::list<OIC::Service::NSTopic *>::iterator it = topicList->getTopicsList().begin();
385 std::string compStr = (*it)->getTopicName() ;
386 std::cout << compStr << std::endl;
387 if (str1.compare(compStr) == 0 )
392 EXPECT_EQ(isSame, true);
394 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
395 if(topicList != nullptr)
399 responseCon.wait_for(lock, g_waitForResponse);
402 TEST_F(NotificationProviderServiceTest, ExpectEqualSetConsumerTopicsAndGetConsumerTopics)
404 std::string str1("TEST1");
405 std::string str2("TEST2");
406 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
407 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
408 g_consumer->setTopic(str1);
410 std::unique_lock< std::mutex > lock { mutexForCondition };
411 responseCon.wait_for(lock, g_waitForResponse);
414 OIC::Service::NSTopicsList *topicList = g_consumer->getConsumerTopicList();
418 printf("topic is NULL\n");
423 std::string compString[10];
424 int i = 0, state[10] = {0};
425 for (auto itr : topicList->getTopicsList())
427 compString[i] = itr->getTopicName();
428 state[i++] = (int) itr->getState();
430 std::cout << compString[0] << std::endl;
431 std::cout << compString[1] << std::endl;
432 if (str1.compare(compString[0]) == 0 && str2.compare(compString[1]) == 0
433 && state[0] == 1 && state[1] == 0)
439 EXPECT_EQ(isSame, true);
441 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
442 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
443 if(topicList != nullptr)
447 responseCon.wait_for(lock, g_waitForResponse);
450 TEST_F(NotificationProviderServiceTest, ExpectEqualUnSetConsumerTopicsAndGetConsumerTopics)
452 std::string str1("TEST1");
453 std::string str2("TEST2");
454 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
455 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
456 g_consumer->setTopic(str1);
457 g_consumer->setTopic(str2);
458 g_consumer->unsetTopic(str1);
460 std::unique_lock< std::mutex > lock { mutexForCondition };
461 responseCon.wait_for(lock, g_waitForResponse);
464 OIC::Service::NSTopicsList *topicList = g_consumer->getConsumerTopicList();
468 printf("topic is NULL\n");
473 std::string compString[10];
474 int i = 0, state[10] = {0};
475 for (auto itr : topicList->getTopicsList())
477 compString[i] = itr->getTopicName();
478 state[i++] = (int) itr->getState();
480 std::cout << compString[0] << std::endl;
481 std::cout << compString[1] << std::endl;
482 if (str1.compare(compString[0]) == 0 && str2.compare(compString[1]) == 0
483 && state[0] == 0 && state[1] == 1)
489 EXPECT_EQ(isSame, true);
491 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
492 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
494 if(topicList != nullptr)
498 responseCon.wait_for(lock, g_waitForResponse);
501 TEST_F(NotificationProviderServiceTest, ExpectFailSendMessage)
503 OIC::Service::NSResult result = OIC::Service::NSResult::OK;
504 result = OIC::Service::NSProviderService::getInstance()->sendMessage(nullptr);
506 EXPECT_EQ(result, OIC::Service::NSResult::ERROR);
509 TEST_F(NotificationProviderServiceTest, CancelObserves)
511 bool ret = g_consumerSimul.cancelObserves();
513 std::unique_lock< std::mutex > lock { mutexForCondition };
514 responseCon.wait_for(lock, g_waitForResponse);
516 EXPECT_EQ(ret, true);