1 /* ****************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
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 "cainterface.h"
27 void request_handler(CARemoteEndpoint_t* object, CARequestInfo_t* requestInfo);
28 void response_handler(CARemoteEndpoint_t* object, CAResponseInfo_t* responseInfo);
30 void request_handler(const CARemoteEndpoint_t *object, const CARequestInfo_t *requestInfo)
35 void response_handler(const CARemoteEndpoint_t *object, const CAResponseInfo_t *responseInfo)
40 static char* uri = NULL;
41 static CARemoteEndpoint_t* tempRep = NULL;
42 static CARequestInfo_t requestInfo;
43 static CAInfo_t requestData;
44 static CAInfo_t responseData;
45 static CAResponseInfo_t responseInfo;
46 static CAToken_t tempToken = NULL;
47 uint8_t tokenLength = CA_MAX_TOKEN_LEN;
48 static const char URI[] = "coap://10.11.12.13:4545/a/light";
49 static const char RESOURCE_URI[] = "/a/light";
51 static const char SECURE_INFO_DATA[] =
52 "{\"oc\":[{\"href\":\"%s\",\"prop\":{\"rt\":[\"core.led\"],"
53 "\"if\":[\"oc.mi.def\"],\"obs\":1,\"sec\":1,\"port\":%d}}]}";
54 static const char NORMAL_INFO_DATA[] =
55 "{\"oc\":[{\"href\":\"%s\",\"prop\":{\"rt\":[\"core.led\"],"
56 "\"if\":[\"oc.mi.def\"],\"obs\":1}}]}";
59 static OCDtlsPskCredsBlob *pskCredsBlob = NULL;
61 void clearDtlsCredentialInfo()
63 printf("clearDtlsCredentialInfo IN\n");
66 // Initialize sensitive data to zeroes before freeing.
67 memset(pskCredsBlob->creds, 0, sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
68 free(pskCredsBlob->creds);
70 memset(pskCredsBlob, 0, sizeof(OCDtlsPskCredsBlob));
74 printf("clearDtlsCredentialInfo OUT\n");
77 // Internal API. Invoked by OC stack to retrieve credentials from this module
78 void CAGetDtlsPskCredentials(OCDtlsPskCredsBlob **credInfo)
80 printf("CAGetDtlsPskCredentials IN\n");
82 if (pskCredsBlob != NULL)
84 *credInfo = pskCredsBlob;
87 printf("CAGetDtlsPskCredentials OUT\n");
90 int32_t SetCredentials()
92 printf("SetCredentials IN\n");
93 pskCredsBlob = (OCDtlsPskCredsBlob *)malloc(sizeof(OCDtlsPskCredsBlob));
95 memset(pskCredsBlob, 0x0, sizeof(OCDtlsPskCredsBlob));
96 memcpy(pskCredsBlob->identity, IDENTITY, DTLS_PSK_ID_LEN);
98 pskCredsBlob->num = 1;
100 pskCredsBlob->creds = (OCDtlsPskCreds *)malloc(sizeof(OCDtlsPskCreds) * (pskCredsBlob->num));
102 memcpy(pskCredsBlob->creds[0].id, IDENTITY, DTLS_PSK_ID_LEN);
103 memcpy(pskCredsBlob->creds[0].psk, RS_CLIENT_PSK, DTLS_PSK_PSK_LEN);
105 printf("SetCredentials OUT\n");
110 int main(int argc, char **argv)
112 testing::InitGoogleTest(&argc, argv);
113 return RUN_ALL_TESTS();
117 // check return value
118 TEST(InitializeTest, TC_01_Positive_01)
120 EXPECT_EQ(CA_STATUS_OK, CAInitialize());
124 TEST(TerminateTest, TC_02_Positive_01)
128 char* check = (char *) "terminate success";
129 EXPECT_STREQ(check, "terminate success");
133 // CAStartListeningServer TC
134 // check return value
135 TEST(StartListeningServerTest, TC_03_Positive_01)
137 CASelectNetwork(CA_WIFI);
138 EXPECT_EQ(CA_STATUS_OK, CAStartListeningServer());
141 // CAStartDiscoveryServer TC
142 // check return value
143 TEST(StartDiscoveryServerTest, TC_04_Positive_01)
145 EXPECT_EQ(CA_STATUS_OK, CAStartDiscoveryServer());
148 // CARegisterHandlerTest TC
149 // check return value
150 TEST(RegisterHandlerTest, TC_05_Positive_01)
152 CARegisterHandler(request_handler, response_handler);
153 char* check = (char *) "registerHandler success";
154 EXPECT_STREQ(check, "registerHandler success");
157 // CACreateRemoteEndpoint TC
158 // check return value
159 TEST(CreateRemoteEndpointTest, TC_06_Positive_01)
163 EXPECT_EQ(CA_STATUS_OK, CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep));
165 CADestroyRemoteEndpoint(tempRep);
169 // check remoteEndpoint and values of remoteEndpoint
170 TEST(CreateRemoteEndpointTest, TC_07_Positive_02)
174 CACreateRemoteEndpoint(uri, CA_WIFI, &tempRep);
176 EXPECT_TRUE(tempRep != NULL);
180 EXPECT_STRNE(NULL, tempRep->resourceUri);
183 CADestroyRemoteEndpoint(tempRep);
187 // check return value when uri is NULL
188 TEST(CreateRemoteEndpointTest, TC_08_Negative_01)
192 EXPECT_EQ(CA_STATUS_FAILED, CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep));
196 CADestroyRemoteEndpoint(tempRep);
201 // check values of remoteEndpoint when uri is NULL
202 TEST(CreateRemoteEndpointTest, TC_09_Negative_02)
205 CACreateRemoteEndpoint(uri, CA_WIFI, &tempRep);
209 EXPECT_STREQ(NULL, tempRep->resourceUri);
215 CADestroyRemoteEndpoint(tempRep);
220 // CADestroyRemoteEndpoint TC
221 // check destroyed remoteEndpoint
222 TEST(DestroyRemoteEndpointTest, TC_10_Positive_01)
225 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
227 CADestroyRemoteEndpoint(tempRep);
230 char * check = (char *) "destroy success";
231 EXPECT_STREQ(check, "destroy success");
235 // check return value
236 TEST(GenerateTokenTest, TC_11_Positive_01)
238 EXPECT_EQ(CA_STATUS_OK, CAGenerateToken(&tempToken, tokenLength));
240 CADestroyToken(tempToken);
243 // check return value when CAGenerateToken is passed a NULL instead a valid pointer
244 TEST(GenerateTokenTest, TC_12_Negative_01)
246 EXPECT_EQ(CA_STATUS_INVALID_PARAM, CAGenerateToken(NULL, tokenLength));
250 // check destroyed token
251 TEST(DestroyTokenTest, TC_13_Positive_01)
253 CAGenerateToken(&tempToken, tokenLength);
254 CADestroyToken(tempToken);
256 char * check = (char *) "destroy success";
257 EXPECT_STREQ(check, "destroy success");
261 // check return value
262 TEST(FindResourceTest, TC_14_Positive_01)
264 uri = (char *) RESOURCE_URI;
266 CAGenerateToken(&tempToken, tokenLength);
267 EXPECT_EQ(CA_STATUS_OK, CAFindResource(uri, tempToken, tokenLength));
268 CADestroyToken(tempToken);
271 // check return value when uri is NULL
272 TEST(FindResourceTest, TC_15_Negative_01)
275 CAGenerateToken(&tempToken, tokenLength);
276 EXPECT_EQ(CA_STATUS_INVALID_PARAM, CAFindResource(uri, tempToken, tokenLength));
277 CADestroyToken(tempToken);
281 // check return value
282 TEST(SendRequestTest, TC_16_Positive_01)
285 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
287 memset(&requestData, 0, sizeof(CAInfo_t));
288 CAGenerateToken(&tempToken, tokenLength);
289 requestData.token = tempToken;
290 requestData.tokenLength = tokenLength;
292 int length = strlen(NORMAL_INFO_DATA) + strlen("a/light");
293 requestData.payload = (CAPayload_t) calloc(length, sizeof(char));
294 snprintf(requestData.payload, length, NORMAL_INFO_DATA, "a/light");
295 requestData.type = CA_MSG_NONCONFIRM;
297 memset(&requestInfo, 0, sizeof(CARequestInfo_t));
298 requestInfo.method = CA_GET;
299 requestInfo.info = requestData;
301 EXPECT_EQ(CA_STATUS_OK, CASendRequest(tempRep, &requestInfo));
303 CADestroyToken(tempToken);
305 free(requestData.payload);
307 CADestroyRemoteEndpoint(tempRep);
312 // check return value when uri is NULL
313 TEST(SendRequestTest, DISABLED_TC_17_Negative_01)
316 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
318 memset(&requestData, 0, sizeof(CAInfo_t));
319 CAGenerateToken(&tempToken, tokenLength);
320 requestData.token = tempToken;
321 requestData.tokenLength = tokenLength;
323 int length = strlen(NORMAL_INFO_DATA) + strlen("a/light");
324 requestData.payload = (CAPayload_t) calloc(length, sizeof(char));
325 snprintf(requestData.payload, length, NORMAL_INFO_DATA, "a/light");
326 requestData.type = CA_MSG_NONCONFIRM;
328 memset(&requestInfo, 0, sizeof(CARequestInfo_t));
329 requestInfo.method = CA_GET;
330 requestInfo.info = requestData;
332 EXPECT_EQ(CA_STATUS_FAILED, CASendRequest(tempRep, &requestInfo));
334 CADestroyToken(tempToken);
336 free(requestData.payload);
340 CADestroyRemoteEndpoint(tempRep);
345 // check return value when a NULL is passed instead of a valid CARequestInfo_t address
346 TEST(SendRequestTest, TC_18_Negative_02)
349 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
351 memset(&requestData, 0, sizeof(CAInfo_t));
352 CAGenerateToken(&tempToken, tokenLength);
353 requestData.token = tempToken;
354 requestData.tokenLength = tokenLength;
356 int length = strlen(NORMAL_INFO_DATA) + strlen("a/light");
357 requestData.payload = (CAPayload_t) calloc(length, sizeof(char));
358 snprintf(requestData.payload, length, NORMAL_INFO_DATA, "a/light");
359 requestData.type = CA_MSG_NONCONFIRM;
361 memset(&requestInfo, 0, sizeof(CARequestInfo_t));
362 requestInfo.method = CA_GET;
363 requestInfo.info = requestData;
365 EXPECT_EQ(CA_STATUS_INVALID_PARAM, CASendRequest(tempRep, NULL));
367 CADestroyToken(tempToken);
369 free(requestData.payload);
373 CADestroyRemoteEndpoint(tempRep);
379 // check return value
380 TEST(SendResponseTest, TC_19_Positive_01)
383 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
385 memset(&responseData, 0, sizeof(CAInfo_t));
386 responseData.type = CA_MSG_NONCONFIRM;
387 responseData.messageId = 1;
388 responseData.payload = (char *) "response payload";
390 CAGenerateToken(&tempToken, tokenLength);
391 requestData.token = tempToken;
392 requestData.tokenLength = tokenLength;
394 memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
395 responseInfo.result = CA_SUCCESS;
396 responseInfo.info = responseData;
398 EXPECT_EQ(CA_STATUS_OK, CASendResponse(tempRep, &responseInfo));
400 CADestroyToken(tempToken);
401 CADestroyRemoteEndpoint(tempRep);
405 // check return value when uri is NULL
406 TEST(SendResponseTest, DISABLED_TC_20_Negative_01)
409 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
411 memset(&responseData, 0, sizeof(CAInfo_t));
412 responseData.type = CA_MSG_NONCONFIRM;
413 responseData.messageId = 1;
414 responseData.payload = (char *) "response payload";
416 CAGenerateToken(&tempToken, tokenLength);
417 requestData.token = tempToken;
418 requestData.tokenLength = tokenLength;
420 memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
421 responseInfo.result = CA_SUCCESS;
422 responseInfo.info = responseData;
424 EXPECT_EQ(CA_STATUS_FAILED, CASendResponse(tempRep, &responseInfo));
426 CADestroyToken(tempToken);
429 CADestroyRemoteEndpoint(tempRep);
434 // check return value NULL is passed instead of a valid CAResponseInfo_t address
435 TEST(SendResponseTest, TC_21_Negative_02)
438 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
440 memset(&responseData, 0, sizeof(CAInfo_t));
441 responseData.type = CA_MSG_NONCONFIRM;
442 responseData.messageId = 1;
443 responseData.payload = (char *) "response payload";
445 CAGenerateToken(&tempToken, tokenLength);
446 requestData.token = tempToken;
447 requestData.tokenLength = tokenLength;
449 memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
450 responseInfo.result = CA_SUCCESS;
451 responseInfo.info = responseData;
453 EXPECT_EQ(CA_STATUS_INVALID_PARAM, CASendResponse(tempRep, NULL));
455 CADestroyToken(tempToken);
458 CADestroyRemoteEndpoint(tempRep);
463 // CASendNotification TC
464 // check return value
465 TEST(SendNotificationTest, TC_22_Positive_01)
468 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
470 memset(&responseData, 0, sizeof(CAInfo_t));
471 responseData.type = CA_MSG_NONCONFIRM;
472 responseData.payload = (char *) "Temp Notification Data";
474 CAGenerateToken(&tempToken, tokenLength);
475 requestData.token = tempToken;
476 requestData.tokenLength = tokenLength;
478 memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
479 responseInfo.result = CA_SUCCESS;
480 responseInfo.info = responseData;
482 EXPECT_EQ(CA_STATUS_OK, CASendNotification(tempRep, &responseInfo));
484 CADestroyToken(tempToken);
487 CADestroyRemoteEndpoint(tempRep);
492 // check return value when uri is NULL
493 TEST(SendNotificationTest, DISABLED_TC_23_Negative_01)
496 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
498 memset(&responseData, 0, sizeof(CAInfo_t));
499 responseData.type = CA_MSG_NONCONFIRM;
500 responseData.payload = (char *) "Temp Notification Data";
502 CAGenerateToken(&tempToken, tokenLength);
503 requestData.token = tempToken;
504 requestData.tokenLength = tokenLength;
506 memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
507 responseInfo.result = CA_SUCCESS;
508 responseInfo.info = responseData;
510 EXPECT_EQ(CA_STATUS_FAILED, CASendNotification(tempRep, &responseInfo));
512 CADestroyToken(tempToken);
515 CADestroyRemoteEndpoint(tempRep);
520 // CAAdvertiseResource TC
521 // check return value
522 TEST(AdvertiseResourceTest, TC_24_Positive_01)
524 uri = (char *) RESOURCE_URI;
527 CAHeaderOption_t* headerOpt;
528 headerOpt = (CAHeaderOption_t *) calloc(1, optionNum * sizeof(CAHeaderOption_t));
530 char* tmpOptionData1 = (char *) "Hello";
531 size_t tmpOptionDataLen = (strlen(tmpOptionData1) < CA_MAX_HEADER_OPTION_DATA_LENGTH) ?
532 strlen(tmpOptionData1) : CA_MAX_HEADER_OPTION_DATA_LENGTH - 1;
533 headerOpt[0].optionID = 3000;
534 memcpy(headerOpt[0].optionData, tmpOptionData1, tmpOptionDataLen);
535 headerOpt[0].optionLength = (uint16_t) tmpOptionDataLen;
537 char* tmpOptionData2 = (char *) "World";
538 tmpOptionDataLen = (strlen(tmpOptionData2) < CA_MAX_HEADER_OPTION_DATA_LENGTH) ?
539 strlen(tmpOptionData2) : CA_MAX_HEADER_OPTION_DATA_LENGTH - 1;
540 headerOpt[1].optionID = 3001;
541 memcpy(headerOpt[1].optionData, tmpOptionData2, tmpOptionDataLen);
542 headerOpt[1].optionLength = (uint16_t) tmpOptionDataLen;
544 CAGenerateToken(&tempToken, tokenLength);
546 EXPECT_EQ(CA_STATUS_OK, CAAdvertiseResource(uri, tempToken, tokenLength, headerOpt, (uint8_t )optionNum));
548 CADestroyToken(tempToken);
553 // check return value when uri is NULL
554 TEST(AdvertiseResourceTest, TC_25_Negative_01)
559 CAHeaderOption_t* headerOpt;
560 headerOpt = (CAHeaderOption_t *) calloc(1, optionNum * sizeof(CAHeaderOption_t));
562 char* tmpOptionData1 = (char *) "Hello";
563 size_t tmpOptionDataLen = (strlen(tmpOptionData1) < CA_MAX_HEADER_OPTION_DATA_LENGTH) ?
564 strlen(tmpOptionData1) : CA_MAX_HEADER_OPTION_DATA_LENGTH - 1;
565 headerOpt[0].optionID = 3000;
566 memcpy(headerOpt[0].optionData, tmpOptionData1, tmpOptionDataLen);
567 headerOpt[0].optionLength = (uint16_t) tmpOptionDataLen;
569 char* tmpOptionData2 = (char *) "World";
570 tmpOptionDataLen = (strlen(tmpOptionData2) < CA_MAX_HEADER_OPTION_DATA_LENGTH) ?
571 strlen(tmpOptionData2) : CA_MAX_HEADER_OPTION_DATA_LENGTH - 1;
572 headerOpt[1].optionID = 3001;
573 memcpy(headerOpt[1].optionData, tmpOptionData2, tmpOptionDataLen);
574 headerOpt[1].optionLength = (uint16_t) tmpOptionDataLen;
576 CAGenerateToken(&tempToken, tokenLength);
578 EXPECT_EQ(CA_STATUS_INVALID_PARAM,
579 CAAdvertiseResource(uri, tempToken, tokenLength, headerOpt, (uint8_t )optionNum));
581 CADestroyToken(tempToken);
586 // CASelectNewwork TC
587 // check return value
588 TEST(SelectNetworkTest, TC_26_Positive_01)
590 //Select wifi network
591 EXPECT_EQ(CA_STATUS_OK, CASelectNetwork(CA_WIFI));
594 // check return value when selected network is disable
595 TEST(SelectNetworkTest, TC_27_Negative_01)
597 //Select disable network
598 EXPECT_EQ(CA_NOT_SUPPORTED, CASelectNetwork(1000));
601 // CAUnSelectNewwork TC
602 // check return value
603 TEST(UnSelectNetworkTest, TC_28_Positive_01)
605 //Unselect wifi network
606 EXPECT_EQ(CA_STATUS_OK, CAUnSelectNetwork(CA_WIFI));
609 // check return value when selected network is disable
610 TEST(UnSelectNetworkTest, TC_29_Negative_01)
612 //UnSelect disable network
613 EXPECT_EQ(CA_STATUS_FAILED, CAUnSelectNetwork(1000));
616 // CAHandlerRequestResponse TC
617 // check return value
618 TEST (HandlerRequestResponseTest, TC_30_Positive_01)
620 EXPECT_EQ(CA_STATUS_OK, CAHandleRequestResponse());
623 // CASendRequestToAll TC
624 // check return value
625 TEST (SendRequestToAllTest, TC_31_Positive_01)
627 uri = (char *) RESOURCE_URI;
628 CACreateRemoteEndpoint(uri, CA_ETHERNET, &tempRep);
629 CAGroupEndpoint_t *group = NULL;
630 group = (CAGroupEndpoint_t *) malloc(sizeof(CAGroupEndpoint_t));
631 group->connectivityType = tempRep->connectivityType;
632 group->resourceUri = tempRep->resourceUri;
634 memset(&requestData, 0, sizeof(CAInfo_t));
635 CAGenerateToken(&tempToken, tokenLength);
636 requestData.token = tempToken;
637 requestData.tokenLength = tokenLength;
639 requestData.payload = (char *) "Temp Json Payload";
640 requestData.type = CA_MSG_NONCONFIRM;
641 memset(&requestInfo, 0, sizeof(CARequestInfo_t));
642 requestInfo.method = CA_GET;
643 requestInfo.info = requestData;
645 EXPECT_EQ(CA_STATUS_OK, CASendRequestToAll(group, &requestInfo));
647 CADestroyToken(tempToken);
649 CADestroyRemoteEndpoint(tempRep);
655 // check return value when group->resourceUri is NULL
656 TEST (SendRequestToAllTest, TC_32_Negative_01)
658 uri = (char *) RESOURCE_URI;
659 CAGroupEndpoint_t *group = NULL;
661 memset(&requestData, 0, sizeof(CAInfo_t));
662 CAGenerateToken(&tempToken, tokenLength);
663 requestData.token = tempToken;
664 requestData.tokenLength = tokenLength;
666 requestData.payload = (char *) "Temp Json Payload";
667 requestData.type = CA_MSG_NONCONFIRM;
668 memset(&requestInfo, 0, sizeof(CARequestInfo_t));
669 requestInfo.method = CA_GET;
670 requestInfo.info = requestData;
672 EXPECT_EQ(CA_STATUS_INVALID_PARAM, CASendRequestToAll(group, &requestInfo));
674 CADestroyToken(tempToken);
677 // CAGetNetworkInformation TC
678 // check return value
679 TEST (GetNetworkInformationTest, TC_33_Positive_01)
681 CALocalConnectivity_t *tempInfo = NULL;
682 uint32_t tempSize = 0;
684 EXPECT_EQ(CA_STATUS_OK, CAGetNetworkInformation(&tempInfo, &tempSize));
687 TEST(RegisterDTLSCredentialsHandlerTest, TC_34_positive_01)
690 if (SetCredentials() == 0)
692 printf("SetCredentials failed\n");
696 res = CARegisterDTLSCredentialsHandler(CAGetDtlsPskCredentials);
697 EXPECT_EQ(CA_STATUS_OK, CARegisterDTLSCredentialsHandler(CAGetDtlsPskCredentials));