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>
23 #include <condition_variable>
27 #include "OCPlatform.h"
28 #include "ocpayload.h"
31 #include "NSConstants.h"
32 #include "NSProviderInterface.h"
34 #include "NSProviderListener.h"
35 #include "NSUnittestUtil.h"
39 std::chrono::milliseconds g_waitForResponse(1000);
41 std::condition_variable responseProviderSub;
42 std::mutex responseProviderSubLock;
44 std::condition_variable responseProviderSync;
45 std::mutex responseProviderSyncLock;
47 char * g_consumerID = NULL;
49 int expectedSyncType = NS_SYNC_READ;
51 const std::string testConsumerId = "123456789012345678901234567890123457";
53 static FILE* server_open(const char * path, const char * mode)
55 if (0 == strcmp(path, OC_SECURITY_DB_DAT_FILE_NAME))
57 std::string file_name = "./oic_svr_db_ns.dat";
59 file_name = "./service/notification/unittest/oic_svr_db_ns.dat";
61 return fopen(file_name.c_str(), mode);
65 return fopen(path, mode);
69 static void NSRequestedSubscribeCallback(NSConsumer * consumer)
75 g_consumerID = strdup(consumer->consumerId);
77 responseProviderSub.notify_all();
80 static void NSSyncCallback(NSSyncInfo * sync)
82 expectedSyncType = sync->state;
83 expectedMsgId = sync->messageId;
85 responseProviderSync.notify_all();
88 OCEntityHandlerRequest * getEntityRequest(OCMethod method, OCObserveAction action)
90 static OCObservationId id = 10;
91 OCEntityHandlerRequest * request =
92 (OCEntityHandlerRequest *)malloc(sizeof(OCEntityHandlerRequest));
93 EXPECT_NE((void *)NULL, request);
94 request->requestHandle = NULL;
95 request->resource = NULL;
97 if (OC_REST_OBSERVE == method)
99 request->obsInfo.action = action;
100 request->obsInfo.obsId = id++;
102 std::string query = std::string(NS_QUERY_CONSUMER_ID)
103 + "=" + testConsumerId;
104 request->query = (char *)malloc(query.size() + 1);
105 EXPECT_NE((void *)NULL, request->query);
106 strncpy(request->query, query.c_str(), query.size() + 1);
108 request->method = method;
109 request->numRcvdVendorSpecificHeaderOptions = 0;
110 request->payload = NULL;
115 OCEntityHandlerRequest * getPostSyncEntityRequest(uint64_t id)
117 OCEntityHandlerRequest * request =
118 (OCEntityHandlerRequest *)malloc(sizeof(OCEntityHandlerRequest));
119 EXPECT_NE((void *)NULL, request);
120 request->requestHandle = NULL;
121 request->resource = NULL;
123 request->method = OC_REST_POST;
124 request->numRcvdVendorSpecificHeaderOptions = 0;
125 request->query = NULL;
127 OCRepPayload * payload = OCRepPayloadCreate();
128 EXPECT_NE((void *)NULL, payload);
130 bool ret = OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, id);
131 OCUUIdentity provider;
132 OC::OCPlatform::getDeviceId(&provider);
133 ret &= OCRepPayloadSetPropString(payload,
134 NS_ATTRIBUTE_PROVIDER_ID, (const char *)provider.id);
135 ret &= OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_STATE, NS_SYNC_READ);
136 EXPECT_EQ(true, ret);
138 request->payload = (OCPayload *) payload;
145 static OCPersistentStorage gps {server_open, fread, fwrite, fclose, unlink };
147 OC::PlatformConfig cfg
149 OC::ServiceType::InProc,
153 OC::QualityOfService::HighQos,
156 OC::OCPlatform::Configure(cfg);
160 OC::OCPlatform::stopPresence();
169 TEST(NotificationProviderTest, StartProviderPositiveWithNSPolicyTrue)
173 NSProviderConfig config;
174 config.subRequestCallback = NSRequestedSubscribeCallback;
175 config.syncInfoCallback = NSSyncCallback;
176 config.subControllability = true;
177 config.userInfo = strdup("user1");
178 config.resourceSecurity = false;
180 NSResult ret = NSStartProvider(config);
182 EXPECT_EQ(ret, NS_OK);
183 free(config.userInfo);
184 config.userInfo = NULL;
187 TEST(NotificationProviderTest, StopProviderPositive)
189 NSResult ret = NSStopProvider();
191 EXPECT_EQ(ret, NS_OK);
194 TEST(NotificationProviderTest, ExpectCallbackSubscribeRequestWithAccepterProvider)
196 NSProviderConfig config;
197 config.subRequestCallback = NSRequestedSubscribeCallback;
198 config.syncInfoCallback = NSSyncCallback;
199 config.subControllability = true;
200 config.userInfo = NULL;
201 config.resourceSecurity = false;
203 NSStartProvider(config);
205 OCEntityHandlerFlag flag = OC_OBSERVE_FLAG;
206 OCEntityHandlerRequest * msgRequest = getEntityRequest(OC_REST_OBSERVE, OC_OBSERVE_REGISTER);
207 NSEntityHandlerMessageCb(flag, msgRequest, NULL);
209 std::unique_lock< std::mutex > lock{ responseProviderSubLock };
210 responseProviderSub.wait_for(lock, g_waitForResponse);
212 free(msgRequest->query);
215 OCEntityHandlerRequest * syncRequest = getEntityRequest(OC_REST_OBSERVE, OC_OBSERVE_REGISTER);
216 NSEntityHandlerSyncCb(flag, syncRequest, NULL);
218 std::unique_lock< std::mutex > lock{ responseProviderSubLock };
219 responseProviderSub.wait_for(lock, g_waitForResponse);
222 free(syncRequest->query);
225 EXPECT_NE((void *)NULL, g_consumerID);
228 TEST(NotificationProviderTest, ExpectSuccessSendAllow)
230 auto ret = NSAcceptSubscription(g_consumerID, true);
231 EXPECT_EQ(NS_OK, ret);
234 TEST(NotificationProviderTest, ExpectFailGetRequestForNotificationWithInvalidInterface)
236 OCEntityHandlerFlag flag = OC_REQUEST_FLAG;
237 OCEntityHandlerRequest * getRequest = getEntityRequest(OC_REST_GET, OC_OBSERVE_NO_OPTION);
238 std::string query = std::string("if=") + "test.invalid";
239 getRequest->query = strdup(query.c_str());
240 auto ret = NSEntityHandlerNotificationCb(flag, getRequest, NULL);
242 EXPECT_NE(ret, OC_EH_OK);
244 free(getRequest->query);
248 TEST(NotificationProviderTest, ExpectFailGetRequestForMsgWithInvalidInterface)
250 OCEntityHandlerFlag flag = OC_REQUEST_FLAG;
251 OCEntityHandlerRequest * getRequest = getEntityRequest(OC_REST_GET, OC_OBSERVE_NO_OPTION);
252 std::string query = std::string("if=") + "test.invalid";
253 getRequest->query = strdup(query.c_str());
254 auto ret = NSEntityHandlerMessageCb(flag, getRequest, NULL);
256 EXPECT_NE(ret, OC_EH_OK);
258 free(getRequest->query);
262 TEST(NotificationProviderTest, ExpectFailGetRequestForSyncWithInvalidInterface)
264 OCEntityHandlerFlag flag = OC_REQUEST_FLAG;
265 OCEntityHandlerRequest * getRequest = getEntityRequest(OC_REST_GET, OC_OBSERVE_NO_OPTION);
266 std::string query = std::string("if=") + "test.invalid";
267 getRequest->query = strdup(query.c_str());
268 auto ret = NSEntityHandlerSyncCb(flag, getRequest, NULL);
270 EXPECT_NE(ret, OC_EH_OK);
272 free(getRequest->query);
276 TEST(NotificationProviderTest, ExpectFailGetRequestForTopicWithInvalidInterface)
278 OCEntityHandlerFlag flag = OC_REQUEST_FLAG;
279 OCEntityHandlerRequest * getRequest = getEntityRequest(OC_REST_GET, OC_OBSERVE_NO_OPTION);
280 std::string query = std::string("if=") + "test.invalid";
281 getRequest->query = strdup(query.c_str());
282 auto ret = NSEntityHandlerTopicCb(flag, getRequest, NULL);
284 EXPECT_NE(ret, OC_EH_OK);
286 free(getRequest->query);
290 TEST(NotificationProviderTest, ExpectSuccessGetRequestForTopicWithInvalidInterface)
292 OCEntityHandlerFlag flag = OC_REQUEST_FLAG;
293 OCEntityHandlerRequest * getRequest = getEntityRequest(OC_REST_GET, OC_OBSERVE_NO_OPTION);
294 std::string query = std::string("if=") + NS_INTERFACE_BASELINE;
295 getRequest->query = strdup(query.c_str());
296 auto ret = NSEntityHandlerTopicCb(flag, getRequest, NULL);
298 EXPECT_EQ(ret, OC_EH_OK);
300 free(getRequest->query);
304 TEST(NotificationProviderTest, ExpectCallbackReceiveSync)
307 int type = NS_SYNC_READ;
309 OCEntityHandlerFlag flag = OC_REQUEST_FLAG;
310 NSEntityHandlerSyncCb(flag, getPostSyncEntityRequest(id), NULL);
312 std::unique_lock< std::mutex > lock{ responseProviderSyncLock };
313 responseProviderSync.wait_for(lock, g_waitForResponse);
315 EXPECT_EQ(expectedMsgId, id);
316 EXPECT_EQ(expectedSyncType, type);
319 TEST(NotificationProviderTest, ExpectSuccessSetTopics)
321 std::string str("TEST1");
322 std::string str2("TEST2");
323 auto ret = NSProviderRegisterTopic(str.c_str());
324 EXPECT_EQ(NS_OK, ret);
325 ret = NSProviderRegisterTopic(str2.c_str());
326 EXPECT_EQ(NS_OK, ret);
329 TEST(NotificationProviderTest, ExpectSuccessUnsetTopics)
331 std::string str("TEST1");
332 std::string str2("TEST2");
333 auto ret = NSProviderUnregisterTopic(str.c_str());
334 EXPECT_EQ(NS_OK, ret);
335 ret = NSProviderUnregisterTopic(str2.c_str());
336 EXPECT_EQ(NS_OK, ret);
339 TEST(NotificationProviderTest, ExpectSuccessTopicAllowConsumer)
341 std::string str("TEST1");
342 std::string str2("TEST2");
343 auto ret = NSProviderRegisterTopic(str.c_str());
344 EXPECT_EQ(NS_OK, ret);
345 ret = NSProviderRegisterTopic(str2.c_str());
346 EXPECT_EQ(NS_OK, ret);
348 ret = NSProviderSetConsumerTopic(g_consumerID, str.c_str());
349 EXPECT_EQ(NS_OK, ret);
350 ret = NSProviderSetConsumerTopic(g_consumerID, str2.c_str());
351 EXPECT_EQ(NS_OK, ret);
354 TEST(NotificationProviderTest, ExpectSuccessTopicDenyConsumer)
356 std::string str("TEST1");
357 std::string str2("TEST2");
359 auto ret = NSProviderUnsetConsumerTopic(g_consumerID, str.c_str());
360 EXPECT_EQ(NS_OK, ret);
361 ret = NSProviderUnsetConsumerTopic(g_consumerID, str2.c_str());
362 EXPECT_EQ(NS_OK, ret);
365 TEST(NotificationProviderTest, ExpectEqualUnSetConsumerTopicsAndGetConsumerTopics)
367 std::string str("TEST1");
368 std::string str2("TEST2");
369 NSProviderSetConsumerTopic(g_consumerID, str2.c_str());
373 NSTopicLL * topics = NSProviderGetConsumerTopics(g_consumerID);
381 NSTopicLL * firstData = topics;
382 NSTopicLL * secondData = firstData->next;
384 if(str.compare(firstData->topicName) == 0 && str2.compare(secondData->topicName) == 0
385 && ((int)firstData->state) == 0 && ((int)secondData->state) == 1)
391 removeTopics(topics);
393 NSProviderUnregisterTopic(str.c_str());
394 NSProviderUnregisterTopic(str2.c_str());
395 EXPECT_EQ(isSame, true);
398 TEST(NotificationProviderTest, ExpectSuccessCreateMessage)
400 auto msg = NSCreateMessage();
401 EXPECT_NE((void *)NULL, msg);
405 TEST(NotificationProviderTest, ExpectCopyMessage)
407 auto msg = NSCreateMessage();
408 auto copied = NSDuplicateMessage(msg);
409 EXPECT_EQ(msg->messageId, copied->messageId);
411 NSFreeMessage(copied);
414 TEST(NotificationProviderTest, ExpectSuccessSendMessage)
416 auto msg = NSCreateMessage();
417 auto ret = NSSendMessage(msg);
418 EXPECT_EQ(NS_OK, ret);
422 TEST(NotificationProviderTest, ExpectCopyConsumer)
424 auto consumer = (NSConsumer *)malloc(sizeof(NSConsumer));
425 strcpy(consumer->consumerId, g_consumerID);
427 auto copied = NSDuplicateConsumer(consumer);
428 EXPECT_EQ(0, strcmp(copied->consumerId, consumer->consumerId));
430 NSFreeConsumer(consumer);
431 NSFreeConsumer(copied);
434 TEST(NotificationProviderTest, ExpectFailSendMessageWithNULL)
436 NSResult ret = NSSendMessage(NULL);
437 EXPECT_NE(NS_OK, ret);
440 TEST(NotificationProviderTest, ExpectFailAcceptSubscription)
444 result = NSAcceptSubscription(NULL, true);
445 result = NSAcceptSubscription("\0", true);
447 EXPECT_EQ(result, NS_FAIL);
450 TEST(NotificationProviderTest, ExpectFailRegisterTopic)
454 result = NSProviderRegisterTopic(NULL);
455 result = NSProviderRegisterTopic("\0");
457 EXPECT_EQ(result, NS_FAIL);
460 TEST(NotificationProviderTest, ExpectFailUnregisterTopic)
464 result = NSProviderUnregisterTopic(NULL);
465 result = NSProviderUnregisterTopic("\0");
467 EXPECT_EQ(result, NS_FAIL);
470 TEST(NotificationProviderTest, ExpectFailGetConsumerTopics)
473 NSTopicLL * topicLL = &topic;
475 topicLL = NSProviderGetConsumerTopics(NULL);
476 topicLL = NSProviderGetConsumerTopics("\0");
478 EXPECT_EQ(topicLL, (NSTopicLL *)NULL);
481 TEST(NotificationProviderTest, ExpectFailSetConsumerTopics)
485 result = NSProviderSetConsumerTopic(NULL, NULL);
486 result = NSProviderSetConsumerTopic(NULL, "\0");
487 result = NSProviderSetConsumerTopic("\0", NULL);
488 result = NSProviderSetConsumerTopic("\0", "\0");
489 result = NSProviderSetConsumerTopic("abc", NULL);
490 result = NSProviderSetConsumerTopic(NULL, "abc");
491 result = NSProviderSetConsumerTopic("abc", "\0");
492 result = NSProviderSetConsumerTopic("\0", "abc");
494 EXPECT_EQ(result, NS_FAIL);
497 TEST(NotificationProviderTest, ExpectFailUnsetConsumerTopics)
501 result = NSProviderUnsetConsumerTopic(NULL, NULL);
502 result = NSProviderUnsetConsumerTopic(NULL, "\0");
503 result = NSProviderUnsetConsumerTopic("\0", NULL);
504 result = NSProviderUnsetConsumerTopic("\0", "\0");
505 result = NSProviderUnsetConsumerTopic("abc", NULL);
506 result = NSProviderUnsetConsumerTopic(NULL, "abc");
507 result = NSProviderUnsetConsumerTopic("abc", "\0");
508 result = NSProviderUnsetConsumerTopic("\0", "abc");
510 EXPECT_EQ(result, NS_FAIL);
513 TEST(NotificationProviderTest, ExpectSuccessUnsub)
515 OCEntityHandlerFlag flag = OC_OBSERVE_FLAG;
516 OCEntityHandlerRequest * msgRequest =
517 getEntityRequest(OC_REST_OBSERVE, OC_OBSERVE_DEREGISTER);
518 NSEntityHandlerMessageCb(flag, msgRequest, NULL);
520 std::unique_lock< std::mutex > lock{ responseProviderSubLock };
521 responseProviderSub.wait_for(lock, g_waitForResponse);
523 free(msgRequest->query);
526 OCEntityHandlerRequest * syncRequest =
527 getEntityRequest(OC_REST_OBSERVE, OC_OBSERVE_DEREGISTER);
528 NSEntityHandlerSyncCb(flag, syncRequest, NULL);
530 std::unique_lock< std::mutex > lock{ responseProviderSubLock };
531 responseProviderSub.wait_for(lock, g_waitForResponse);
533 free(syncRequest->query);