1 /* ****************************************************************
3 * Copyright 2016 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"
23 #include "cautilinterface.h"
25 #include "caprotocolmessage.h"
26 #include "cablockwisetransfer.h"
28 #define LARGE_PAYLOAD_LENGTH 1024
30 class CABlockTransferTests : public testing::Test {
37 virtual void TearDown()
43 TEST_F(CABlockTransferTests, CACreateNewDataSetTest)
45 CAEndpoint_t* tempRep = NULL;
46 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
48 coap_pdu_t *pdu = NULL;
49 coap_list_t *options = NULL;
50 coap_transport_type transport = coap_udp;
52 CAToken_t tempToken = NULL;
53 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
56 memset(&requestData, 0, sizeof(CAInfo_t));
57 requestData.token = tempToken;
58 requestData.tokenLength = CA_MAX_TOKEN_LEN;
59 requestData.type = CA_MSG_NONCONFIRM;
61 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
62 if (!requestData.payload)
64 CADestroyToken(tempToken);
65 FAIL() << "requestData.payload allocation failed";
67 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
68 requestData.payloadSize = sizeof(requestData.payload);
69 requestData.type = CA_MSG_NONCONFIRM;
71 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
73 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
74 EXPECT_TRUE(cadata != NULL);
76 CABlockData_t *currData = CACreateNewBlockData(cadata);
77 EXPECT_TRUE(currData != NULL);
81 CAData_t *getData = CAGetDataSetFromBlockDataList(currData->blockDataId);
82 EXPECT_TRUE(getData != NULL);
84 CARemoveBlockDataFromList(currData->blockDataId);
87 CADestroyDataSet(cadata);
88 coap_delete_list(options);
91 CADestroyToken(tempToken);
92 CADestroyEndpoint(tempRep);
93 free(requestData.payload);
96 TEST_F(CABlockTransferTests, CAGetBlockDataFromBlockDataListTest)
98 CAEndpoint_t* tempRep = NULL;
99 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
101 coap_pdu_t *pdu = NULL;
102 coap_list_t *options = NULL;
103 coap_transport_type transport = coap_udp;
105 CAToken_t tempToken = NULL;
106 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
108 CAInfo_t requestData;
109 memset(&requestData, 0, sizeof(CAInfo_t));
110 requestData.token = tempToken;
111 requestData.tokenLength = CA_MAX_TOKEN_LEN;
112 requestData.type = CA_MSG_NONCONFIRM;
114 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
116 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
117 EXPECT_TRUE(cadata != NULL);
119 CABlockData_t *currData = CACreateNewBlockData(cadata);
120 EXPECT_TRUE(currData != NULL);
124 CABlockData_t *data = CAGetBlockDataFromBlockDataList(currData->blockDataId);
125 EXPECT_TRUE(data != NULL);
127 CARemoveBlockDataFromList(currData->blockDataId);
130 CADestroyDataSet(cadata);
131 coap_delete_list(options);
132 coap_delete_pdu(pdu);
134 CADestroyToken(tempToken);
135 CADestroyEndpoint(tempRep);
136 free(requestData.payload);
139 TEST_F(CABlockTransferTests, CAGetPayloadFromBlockDataListTest)
141 CAEndpoint_t* tempRep = NULL;
142 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
144 coap_pdu_t *pdu = NULL;
145 coap_list_t *options = NULL;
146 coap_transport_type transport = coap_udp;
148 CAToken_t tempToken = NULL;
149 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
151 CAInfo_t requestData;
152 memset(&requestData, 0, sizeof(CAInfo_t));
153 requestData.token = tempToken;
154 requestData.tokenLength = CA_MAX_TOKEN_LEN;
155 requestData.type = CA_MSG_NONCONFIRM;
157 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
159 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
160 EXPECT_TRUE(cadata != NULL);
162 CABlockData_t *currData = CACreateNewBlockData(cadata);
163 EXPECT_TRUE(currData != NULL);
165 size_t fullPayload = 0;
166 CAPayload_t payload = CAGetPayloadFromBlockDataList(currData->blockDataId,
169 size_t payloadLen = (payload != NULL) ? strlen((const char*) payload) : 0;
170 EXPECT_TRUE(fullPayload == payloadLen);
172 CARemoveBlockDataFromList(currData->blockDataId);
173 CADestroyDataSet(cadata);
174 coap_delete_list(options);
175 coap_delete_pdu(pdu);
177 CADestroyToken(tempToken);
178 CADestroyEndpoint(tempRep);
179 free(requestData.payload);
182 // request and block option1
183 TEST_F(CABlockTransferTests, CAAddBlockOptionTest)
185 CAEndpoint_t* tempRep = NULL;
186 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
188 coap_pdu_t *pdu = NULL;
189 coap_list_t *options = NULL;
190 coap_transport_type transport = coap_udp;
192 CAToken_t tempToken = NULL;
193 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
195 CAInfo_t requestData;
196 memset(&requestData, 0, sizeof(CAInfo_t));
197 requestData.token = tempToken;
198 requestData.tokenLength = CA_MAX_TOKEN_LEN;
200 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
201 if(!requestData.payload)
203 CADestroyToken(tempToken);
204 FAIL() << "requestData.payload allocation failed";
206 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
207 requestData.payloadSize = sizeof(requestData.payload);
208 requestData.type = CA_MSG_NONCONFIRM;
210 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
212 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption(&pdu, &requestData, tempRep, &options));
214 coap_delete_list(options);
215 coap_delete_pdu(pdu);
217 CADestroyToken(tempToken);
218 CADestroyEndpoint(tempRep);
219 free(requestData.payload);
222 // request and block option1
223 TEST_F(CABlockTransferTests, CAAddBlockOption1InRequest)
225 CAEndpoint_t* tempRep = NULL;
226 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
228 coap_pdu_t *pdu = NULL;
229 coap_list_t *options = NULL;
230 coap_transport_type transport = coap_udp;
232 CAToken_t tempToken = NULL;
233 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
235 CAInfo_t requestData;
236 memset(&requestData, 0, sizeof(CAInfo_t));
237 requestData.token = tempToken;
238 requestData.tokenLength = CA_MAX_TOKEN_LEN;
240 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
241 if(!requestData.payload)
243 CADestroyToken(tempToken);
244 FAIL() << "requestData.payload allocation failed";
246 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
247 requestData.payloadSize = sizeof(requestData.payload);
248 requestData.type = CA_MSG_NONCONFIRM;
250 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
252 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
253 EXPECT_TRUE(cadata != NULL);
255 CABlockData_t *currData = CACreateNewBlockData(cadata);
256 EXPECT_TRUE(currData != NULL);
258 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
259 COAP_OPTION_BLOCK1));
261 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption1(&pdu, &requestData,
262 requestData.payloadSize,
263 currData->blockDataId, &options));
265 CADestroyDataSet(cadata);
266 coap_delete_list(options);
267 coap_delete_pdu(pdu);
269 CADestroyToken(tempToken);
270 CADestroyEndpoint(tempRep);
271 free(requestData.payload);
274 // response and block option1
275 TEST_F(CABlockTransferTests, CAAddBlockOption1InResponse)
277 CAEndpoint_t* tempRep = NULL;
278 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
280 coap_pdu_t *pdu = NULL;
281 coap_list_t *options = NULL;
282 coap_transport_type transport = coap_udp;
284 CAToken_t tempToken = NULL;
285 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
287 CAInfo_t responseData;
288 memset(&responseData, 0, sizeof(CAInfo_t));
289 responseData.token = tempToken;
290 responseData.tokenLength = CA_MAX_TOKEN_LEN;
291 responseData.type = CA_MSG_NONCONFIRM;
292 responseData.messageId = 1;
294 responseData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
295 if(!responseData.payload)
297 CADestroyToken(tempToken);
298 FAIL() << "requestData.payload allocation failed";
300 memset(responseData.payload, '1', sizeof(responseData.payload) - 1);
301 responseData.payloadSize = sizeof(responseData.payload);
303 pdu = CAGeneratePDU(CA_CREATED, &responseData, tempRep, &options, &transport);
305 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
306 EXPECT_TRUE(cadata != NULL);
308 CABlockData_t *currData = CACreateNewBlockData(cadata);
309 EXPECT_TRUE(currData != NULL);
311 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
312 COAP_OPTION_BLOCK1));
314 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption1(&pdu, &responseData,
315 responseData.payloadSize,
316 currData->blockDataId, &options));
318 CADestroyDataSet(cadata);
319 coap_delete_list(options);
320 coap_delete_pdu(pdu);
322 CADestroyToken(tempToken);
323 CADestroyEndpoint(tempRep);
324 free(responseData.payload);
327 // response and block option2
328 TEST_F(CABlockTransferTests, CAAddBlockOption2InResponse)
330 CAEndpoint_t* tempRep = NULL;
331 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
333 coap_pdu_t *pdu = NULL;
334 coap_list_t *options = NULL;
335 coap_transport_type transport = coap_udp;
337 CAToken_t tempToken = NULL;
338 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
340 CAInfo_t responseData;
341 memset(&responseData, 0, sizeof(CAInfo_t));
342 responseData.token = tempToken;
343 responseData.tokenLength = CA_MAX_TOKEN_LEN;
344 responseData.type = CA_MSG_NONCONFIRM;
345 responseData.messageId = 1;
347 responseData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
348 if(!responseData.payload)
350 CADestroyToken(tempToken);
351 FAIL() << "requestData.payload allocation failed";
353 memset(responseData.payload, '1', sizeof(responseData.payload) - 1);
354 responseData.payloadSize = sizeof(responseData.payload);
356 pdu = CAGeneratePDU(CA_CREATED, &responseData, tempRep, &options, &transport);
358 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
359 EXPECT_TRUE(cadata != NULL);
361 CABlockData_t *currData = CACreateNewBlockData(cadata);
362 EXPECT_TRUE(currData != NULL);
364 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
365 COAP_OPTION_BLOCK2));
367 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption2(&pdu, &responseData,
368 responseData.payloadSize,
369 currData->blockDataId, &options));
371 CADestroyDataSet(cadata);
372 coap_delete_list(options);
373 coap_delete_pdu(pdu);
375 CADestroyToken(tempToken);
376 CADestroyEndpoint(tempRep);
377 free(responseData.payload);
380 // request and block option1
381 TEST_F(CABlockTransferTests, CAAddBlockOption2InRequest)
383 CAEndpoint_t* tempRep = NULL;
384 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
386 coap_pdu_t *pdu = NULL;
387 coap_list_t *options = NULL;
388 coap_transport_type transport = coap_udp;
390 CAToken_t tempToken = NULL;
391 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
393 CAInfo_t requestData;
394 memset(&requestData, 0, sizeof(CAInfo_t));
395 requestData.token = tempToken;
396 requestData.tokenLength = CA_MAX_TOKEN_LEN;
398 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
399 if(!requestData.payload)
401 CADestroyToken(tempToken);
402 FAIL() << "requestData.payload allocation failed";
404 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
405 requestData.payloadSize = sizeof(requestData.payload);
406 requestData.type = CA_MSG_NONCONFIRM;
408 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
410 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
411 EXPECT_TRUE(cadata != NULL);
413 CABlockData_t *currData = CACreateNewBlockData(cadata);
414 EXPECT_TRUE(currData != NULL);
416 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
417 COAP_OPTION_BLOCK2));
419 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption2(&pdu, &requestData,
420 requestData.payloadSize,
421 currData->blockDataId, &options));
423 CARemoveBlockDataFromList(currData->blockDataId);
424 CADestroyDataSet(cadata);
425 coap_delete_list(options);
426 coap_delete_pdu(pdu);
428 CADestroyToken(tempToken);
429 CADestroyEndpoint(tempRep);
430 free(requestData.payload);
433 TEST_F(CABlockTransferTests, CAGetBlockSizeOptionFromPduTest)
435 CAEndpoint_t* tempRep = NULL;
436 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
438 coap_pdu_t *pdu = NULL;
439 coap_list_t *options = NULL;
440 coap_transport_type transport = coap_udp;
442 CAToken_t tempToken = NULL;
443 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
445 CAInfo_t requestData;
446 memset(&requestData, 0, sizeof(CAInfo_t));
447 requestData.token = tempToken;
448 requestData.tokenLength = CA_MAX_TOKEN_LEN;
449 requestData.type = CA_MSG_NONCONFIRM;
451 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
453 size_t totalPayloadLen = 0;
454 EXPECT_FALSE(CAIsPayloadLengthInPduWithBlockSizeOption(pdu, COAP_OPTION_SIZE1,
457 coap_delete_list(options);
458 coap_delete_pdu(pdu);
460 CADestroyToken(tempToken);
461 CADestroyEndpoint(tempRep);
462 free(requestData.payload);
465 TEST_F(CABlockTransferTests, CASetNextBlockOption1Test)
467 CAEndpoint_t* tempRep = NULL;
468 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
470 coap_pdu_t *pdu = NULL;
471 coap_list_t *options = NULL;
472 coap_transport_type transport = coap_udp;
474 CAToken_t tempToken = NULL;
475 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
477 CAInfo_t responseData;
478 memset(&responseData, 0, sizeof(CAInfo_t));
479 responseData.token = tempToken;
480 responseData.tokenLength = CA_MAX_TOKEN_LEN;
481 responseData.type = CA_MSG_NONCONFIRM;
482 responseData.messageId = 1;
484 pdu = CAGeneratePDU(CA_CREATED, &responseData, tempRep, &options, &transport);
486 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
487 EXPECT_TRUE(cadata != NULL);
489 CABlockData_t *currData = CACreateNewBlockData(cadata);
490 EXPECT_TRUE(currData != NULL);
492 coap_block_t block = {0, 0, 0};
493 EXPECT_EQ(CA_STATUS_OK, CASetNextBlockOption1(pdu, tempRep, cadata, block, pdu->length));
495 EXPECT_EQ(CA_STATUS_OK, CAHandleRequestResponse());
497 CADestroyDataSet(cadata);
498 coap_delete_list(options);
499 coap_delete_pdu(pdu);
501 CADestroyToken(tempToken);
502 CADestroyEndpoint(tempRep);
503 free(responseData.payload);
506 TEST_F(CABlockTransferTests, CASetNextBlockOption2Test)
508 CAEndpoint_t* tempRep = NULL;
509 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
511 coap_pdu_t *pdu = NULL;
512 coap_list_t *options = NULL;
513 coap_transport_type transport = coap_udp;
515 CAToken_t tempToken = NULL;
516 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
518 CAInfo_t requestData;
519 memset(&requestData, 0, sizeof(CAInfo_t));
520 requestData.token = tempToken;
521 requestData.tokenLength = CA_MAX_TOKEN_LEN;
522 requestData.type = CA_MSG_NONCONFIRM;
524 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
526 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
527 EXPECT_TRUE(cadata != NULL);
529 CABlockData_t *currData = CACreateNewBlockData(cadata);
530 EXPECT_TRUE(currData != NULL);
532 coap_block_t block = {0, 0, 0};
533 EXPECT_EQ(CA_STATUS_OK, CASetNextBlockOption2(pdu, tempRep, cadata, block, pdu->length));
535 CADestroyDataSet(cadata);
536 coap_delete_list(options);
537 coap_delete_pdu(pdu);
539 CADestroyToken(tempToken);
540 CADestroyEndpoint(tempRep);
541 free(requestData.payload);