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 std::shared_ptr<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(std::shared_ptr<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 []( std::shared_ptr<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 ASSERT_NE(nullptr, g_consumer) << "error: discovery failure";
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 ASSERT_NE(nullptr, g_consumer) << "error: discovery failure";
224 g_consumer->acceptSubscription(false);
226 OIC::Service::NSMessage msg = OIC::Service::NSProviderService::getInstance()->createMessage();
227 msgID = (int)msg.getMessageId();
228 msg.setTitle(std::string("Title"));
229 msg.setContentText(std::string("ContentText"));
230 msg.setSourceName(std::string("OCF"));
232 OIC::Service::NSProviderService::getInstance()->sendMessage(msg);
234 std::unique_lock< std::mutex > lock { mutexForCondition };
235 responseCon.wait_for(lock, g_waitForResponse);
238 std::unique_lock< std::mutex > lock { mutexForCondition };
239 responseCon.wait_for(lock, g_waitForResponse);
241 EXPECT_EQ(expectTrue, true);
244 TEST_F(NotificationProviderServiceTest, ExpectCallNotifyOnConsumerByAcceptIsTrue)
248 ASSERT_NE(nullptr, g_consumer) << "error: discovery failure";
250 mocks.ExpectCallFunc(MessageCallbackFromConsumerEmpty).Do(
251 [&msgID](const int &id, const std::string &, const std::string &, const std::string &)
255 std::cout << "ExpectCallNotifyOnConsumerByAcceptIsTrue" << std::endl;
256 responseCon.notify_all();
260 g_consumer->acceptSubscription(true);
262 OIC::Service::NSMessage msg = OIC::Service::NSProviderService::getInstance()->createMessage();
263 msgID = (int)msg.getMessageId();
264 msg.setTitle(std::string("Title"));
265 msg.setContentText(std::string("ContentText"));
266 msg.setSourceName(std::string("OCF"));
268 OIC::Service::NSProviderService::getInstance()->sendMessage(msg);
269 std::unique_lock< std::mutex > lock { mutexForCondition };
270 responseCon.wait_for(lock, g_waitForResponse);
274 TEST_F(NotificationProviderServiceTest, ExpectCallbackSyncOnReadToConsumer)
278 mocks.ExpectCallFunc(SyncCallbackFromConsumerEmpty).Do(
279 [& id](int &type, int &syncId)
281 std::cout << "MessageSynchronizedCallbackEmpty" << std::endl;
283 type == (int)OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ)
285 std::cout << "ExpectCallbackSyncOnReadFromConsumer" << std::endl;
286 responseCon.notify_all();
290 OIC::Service::NSMessage msg = OIC::Service::NSProviderService::getInstance()->createMessage();
291 id = (int)msg.getMessageId();
292 msg.setTitle(std::string("Title"));
293 msg.setContentText(std::string("ContentText"));
294 msg.setSourceName(std::string("OCF"));
296 OIC::Service::NSProviderService::getInstance()->sendSyncInfo(msg.getMessageId(),
297 OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ);
298 std::unique_lock< std::mutex > lock { mutexForCondition };
299 responseCon.wait_for(lock, g_waitForResponse);
302 TEST_F(NotificationProviderServiceTest, ExpectCallbackSyncOnReadFromConsumer)
304 int type = (int)OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ;
306 mocks.ExpectCallFunc(MessageSynchronizedCallbackEmpty).Do(
307 [& id](OIC::Service::NSSyncInfo sync)
309 std::cout << "MessageSynchronizedCallbackEmpty" << std::endl;
310 if ((int)sync.getMessageId() == id
311 && sync.getState() == OIC::Service::NSSyncInfo::NSSyncType::NS_SYNC_READ)
313 std::cout << "ExpectCallbackSyncOnReadFromConsumer" << std::endl;
314 responseCon.notify_all();
318 OIC::Service::NSMessage msg = OIC::Service::NSProviderService::getInstance()->createMessage();
319 id = (int)msg.getMessageId();
320 msg.setTitle(std::string("Title"));
321 msg.setContentText(std::string("ContentText"));
322 msg.setSourceName(std::string("OCF"));
323 g_consumerSimul.syncToProvider(type, id, msg.getProviderId());
324 std::unique_lock< std::mutex > lock { mutexForCondition };
325 responseCon.wait(lock);
328 TEST_F(NotificationProviderServiceTest, ExpectEqualAddedTopicsAndRegisteredTopics)
330 std::string str1("TEST1");
331 std::string str2("TEST2");
332 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
333 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
334 std::unique_lock< std::mutex > lock { mutexForCondition };
335 responseCon.wait_for(lock, g_waitForResponse);
337 OIC::Service::NSTopicsList *topicList =
338 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
341 printf("topic is NULL\n");
346 std::string compString[10];
348 for (auto itr : topicList->getTopicsList())
350 compString[i] = itr->getTopicName(); i++;
352 std::cout << compString[0] << std::endl;
353 std::cout << compString[1] << std::endl;
354 if (str1.compare(compString[0]) == 0 && str2.compare(compString[1]) == 0)
359 EXPECT_EQ(isSame, true);
361 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
362 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
363 if (topicList != nullptr)
367 responseCon.wait_for(lock, g_waitForResponse);
370 TEST_F(NotificationProviderServiceTest, ExpectEqualUnregisteredTopicsAndRegisteredTopics)
372 std::string str1("TEST1");
373 std::string str2("TEST2");
374 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
375 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
376 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
377 std::unique_lock< std::mutex > lock { mutexForCondition };
378 responseCon.wait_for(lock, g_waitForResponse);
380 OIC::Service::NSTopicsList *topicList =
381 OIC::Service::NSProviderService::getInstance()->getRegisteredTopicList();
384 printf("topic is NULL\n");
389 std::list<OIC::Service::NSTopic *>::iterator it = topicList->getTopicsList().begin();
390 std::string compStr = (*it)->getTopicName() ;
391 std::cout << compStr << std::endl;
392 if (str1.compare(compStr) == 0 )
397 EXPECT_EQ(isSame, true);
399 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
400 if (topicList != nullptr)
404 responseCon.wait_for(lock, g_waitForResponse);
407 TEST_F(NotificationProviderServiceTest, ExpectEqualSetConsumerTopicsAndGetConsumerTopics)
409 std::string str1("TEST1");
410 std::string str2("TEST2");
411 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
412 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
414 ASSERT_NE(nullptr, g_consumer) << "error: discovery failure";
416 g_consumer->setTopic(str1);
418 std::unique_lock< std::mutex > lock { mutexForCondition };
419 responseCon.wait_for(lock, g_waitForResponse);
422 OIC::Service::NSTopicsList *topicList = g_consumer->getConsumerTopicList();
426 printf("topic is NULL\n");
431 std::string compString[10];
432 int i = 0, state[10] = {0};
433 for (auto itr : topicList->getTopicsList())
435 compString[i] = itr->getTopicName();
436 state[i++] = (int) itr->getState();
438 std::cout << compString[0] << std::endl;
439 std::cout << compString[1] << std::endl;
440 if (str1.compare(compString[0]) == 0 && str2.compare(compString[1]) == 0
441 && state[0] == 1 && state[1] == 0)
447 EXPECT_EQ(isSame, true);
449 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
450 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
451 if (topicList != nullptr)
455 responseCon.wait_for(lock, g_waitForResponse);
458 TEST_F(NotificationProviderServiceTest, ExpectEqualUnSetConsumerTopicsAndGetConsumerTopics)
460 std::string str1("TEST1");
461 std::string str2("TEST2");
462 OIC::Service::NSProviderService::getInstance()->registerTopic(str1);
463 OIC::Service::NSProviderService::getInstance()->registerTopic(str2);
465 ASSERT_NE(nullptr, g_consumer) << "error: discovery failure";
467 g_consumer->setTopic(str1);
468 g_consumer->setTopic(str2);
469 g_consumer->unsetTopic(str1);
471 std::unique_lock< std::mutex > lock { mutexForCondition };
472 responseCon.wait_for(lock, g_waitForResponse);
475 OIC::Service::NSTopicsList *topicList = g_consumer->getConsumerTopicList();
479 printf("topic is NULL\n");
484 std::string compString[10];
485 int i = 0, state[10] = {0};
486 for (auto itr : topicList->getTopicsList())
488 compString[i] = itr->getTopicName();
489 state[i++] = (int) itr->getState();
491 std::cout << compString[0] << std::endl;
492 std::cout << compString[1] << std::endl;
493 if (str1.compare(compString[0]) == 0 && str2.compare(compString[1]) == 0
494 && state[0] == 0 && state[1] == 1)
500 EXPECT_EQ(isSame, true);
502 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str1);
503 OIC::Service::NSProviderService::getInstance()->unregisterTopic(str2);
505 if (topicList != nullptr)
509 responseCon.wait_for(lock, g_waitForResponse);
513 TEST_F(NotificationProviderServiceTest, CancelObserves)
515 bool ret = g_consumerSimul.cancelObserves();
517 std::unique_lock< std::mutex > lock { mutexForCondition };
518 responseCon.wait_for(lock, g_waitForResponse);
520 EXPECT_EQ(ret, true);