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 {
32 virtual void SetUp() {
36 virtual void TearDown()
42 TEST_F(CABlockTransferTests, CACreateNewDataSetTest)
44 CAEndpoint_t* tempRep = NULL;
45 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
47 coap_pdu_t *pdu = NULL;
48 coap_list_t *options = NULL;
49 coap_transport_type transport = coap_udp;
51 CAToken_t tempToken = NULL;
52 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
55 memset(&requestData, 0, sizeof(CAInfo_t));
56 requestData.token = tempToken;
57 requestData.tokenLength = CA_MAX_TOKEN_LEN;
58 requestData.type = CA_MSG_NONCONFIRM;
60 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
61 if (!requestData.payload)
63 CADestroyToken(tempToken);
64 FAIL() << "requestData.payload allocation failed";
66 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
67 requestData.payloadSize = sizeof(requestData.payload);
68 requestData.type = CA_MSG_NONCONFIRM;
70 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
72 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
73 EXPECT_TRUE(cadata != NULL);
75 CABlockData_t *currData = CACreateNewBlockData(cadata);
76 EXPECT_TRUE(currData != NULL);
80 CAData_t *getData = CAGetDataSetFromBlockDataList(currData->blockDataId);
81 EXPECT_TRUE(getData != NULL);
83 CARemoveBlockDataFromList(currData->blockDataId);
86 CADestroyDataSet(cadata);
87 coap_delete_list(options);
90 CADestroyToken(tempToken);
91 CADestroyEndpoint(tempRep);
92 free(requestData.payload);
95 TEST_F(CABlockTransferTests, CAGetBlockDataFromBlockDataListTest)
97 CAEndpoint_t* tempRep = NULL;
98 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
100 coap_pdu_t *pdu = NULL;
101 coap_list_t *options = NULL;
102 coap_transport_type transport = coap_udp;
104 CAToken_t tempToken = NULL;
105 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
107 CAInfo_t requestData;
108 memset(&requestData, 0, sizeof(CAInfo_t));
109 requestData.token = tempToken;
110 requestData.tokenLength = CA_MAX_TOKEN_LEN;
111 requestData.type = CA_MSG_NONCONFIRM;
113 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
115 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
116 EXPECT_TRUE(cadata != NULL);
118 CABlockData_t *currData = CACreateNewBlockData(cadata);
119 EXPECT_TRUE(currData != NULL);
123 CABlockData_t *data = CAGetBlockDataFromBlockDataList(currData->blockDataId);
124 EXPECT_TRUE(data != NULL);
126 CARemoveBlockDataFromList(currData->blockDataId);
129 CADestroyDataSet(cadata);
130 coap_delete_list(options);
131 coap_delete_pdu(pdu);
133 CADestroyToken(tempToken);
134 CADestroyEndpoint(tempRep);
135 free(requestData.payload);
138 TEST_F(CABlockTransferTests, CAGetPayloadFromBlockDataListTest)
140 CAEndpoint_t* tempRep = NULL;
141 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
143 coap_pdu_t *pdu = NULL;
144 coap_list_t *options = NULL;
145 coap_transport_type transport = coap_udp;
147 CAToken_t tempToken = NULL;
148 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
150 CAInfo_t requestData;
151 memset(&requestData, 0, sizeof(CAInfo_t));
152 requestData.token = tempToken;
153 requestData.tokenLength = CA_MAX_TOKEN_LEN;
154 requestData.type = CA_MSG_NONCONFIRM;
156 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
158 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
159 EXPECT_TRUE(cadata != NULL);
161 CABlockData_t *currData = CACreateNewBlockData(cadata);
162 EXPECT_TRUE(currData != NULL);
164 size_t fullPayload = 0;
165 CAPayload_t payload = CAGetPayloadFromBlockDataList(currData->blockDataId,
168 size_t payloadLen = (payload != NULL) ? strlen((const char*) payload) : 0;
169 EXPECT_TRUE(fullPayload == payloadLen);
171 CARemoveBlockDataFromList(currData->blockDataId);
172 CADestroyDataSet(cadata);
173 coap_delete_list(options);
174 coap_delete_pdu(pdu);
176 CADestroyToken(tempToken);
177 CADestroyEndpoint(tempRep);
178 free(requestData.payload);
181 // request and block option1
182 TEST_F(CABlockTransferTests, CAAddBlockOptionTest)
184 CAEndpoint_t* tempRep = NULL;
185 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
187 coap_pdu_t *pdu = NULL;
188 coap_list_t *options = NULL;
189 coap_transport_type transport = coap_udp;
191 CAToken_t tempToken = NULL;
192 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
194 CAInfo_t requestData;
195 memset(&requestData, 0, sizeof(CAInfo_t));
196 requestData.token = tempToken;
197 requestData.tokenLength = CA_MAX_TOKEN_LEN;
199 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
200 if(!requestData.payload)
202 CADestroyToken(tempToken);
203 FAIL() << "requestData.payload allocation failed";
205 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
206 requestData.payloadSize = sizeof(requestData.payload);
207 requestData.type = CA_MSG_NONCONFIRM;
209 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
211 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption(&pdu, &requestData, tempRep, &options));
213 coap_delete_list(options);
214 coap_delete_pdu(pdu);
216 CADestroyToken(tempToken);
217 CADestroyEndpoint(tempRep);
218 free(requestData.payload);
221 // request and block option1
222 TEST_F(CABlockTransferTests, CAAddBlockOption1InRequest)
224 CAEndpoint_t* tempRep = NULL;
225 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
227 coap_pdu_t *pdu = NULL;
228 coap_list_t *options = NULL;
229 coap_transport_type transport = coap_udp;
231 CAToken_t tempToken = NULL;
232 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
234 CAInfo_t requestData;
235 memset(&requestData, 0, sizeof(CAInfo_t));
236 requestData.token = tempToken;
237 requestData.tokenLength = CA_MAX_TOKEN_LEN;
239 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
240 if(!requestData.payload)
242 CADestroyToken(tempToken);
243 FAIL() << "requestData.payload allocation failed";
245 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
246 requestData.payloadSize = sizeof(requestData.payload);
247 requestData.type = CA_MSG_NONCONFIRM;
249 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
251 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
252 EXPECT_TRUE(cadata != NULL);
254 CABlockData_t *currData = CACreateNewBlockData(cadata);
255 EXPECT_TRUE(currData != NULL);
257 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
258 COAP_OPTION_BLOCK1));
260 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption1(&pdu, &requestData,
261 requestData.payloadSize,
262 currData->blockDataId, &options));
264 CADestroyDataSet(cadata);
265 coap_delete_list(options);
266 coap_delete_pdu(pdu);
268 CADestroyToken(tempToken);
269 CADestroyEndpoint(tempRep);
270 free(requestData.payload);
273 // response and block option1
274 TEST_F(CABlockTransferTests, CAAddBlockOption1InResponse)
276 CAEndpoint_t* tempRep = NULL;
277 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
279 coap_pdu_t *pdu = NULL;
280 coap_list_t *options = NULL;
281 coap_transport_type transport = coap_udp;
283 CAToken_t tempToken = NULL;
284 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
286 CAInfo_t responseData;
287 memset(&responseData, 0, sizeof(CAInfo_t));
288 responseData.token = tempToken;
289 responseData.tokenLength = CA_MAX_TOKEN_LEN;
290 responseData.type = CA_MSG_NONCONFIRM;
291 responseData.messageId = 1;
293 responseData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
294 if(!responseData.payload)
296 CADestroyToken(tempToken);
297 FAIL() << "requestData.payload allocation failed";
299 memset(responseData.payload, '1', sizeof(responseData.payload) - 1);
300 responseData.payloadSize = sizeof(responseData.payload);
302 pdu = CAGeneratePDU(CA_CREATED, &responseData, tempRep, &options, &transport);
304 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
305 EXPECT_TRUE(cadata != NULL);
307 CABlockData_t *currData = CACreateNewBlockData(cadata);
308 EXPECT_TRUE(currData != NULL);
310 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
311 COAP_OPTION_BLOCK1));
313 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption1(&pdu, &responseData,
314 responseData.payloadSize,
315 currData->blockDataId, &options));
317 CADestroyDataSet(cadata);
318 coap_delete_list(options);
319 coap_delete_pdu(pdu);
321 CADestroyToken(tempToken);
322 CADestroyEndpoint(tempRep);
323 free(responseData.payload);
326 // response and block option2
327 TEST_F(CABlockTransferTests, CAAddBlockOption2InResponse)
329 CAEndpoint_t* tempRep = NULL;
330 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
332 coap_pdu_t *pdu = NULL;
333 coap_list_t *options = NULL;
334 coap_transport_type transport = coap_udp;
336 CAToken_t tempToken = NULL;
337 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
339 CAInfo_t responseData;
340 memset(&responseData, 0, sizeof(CAInfo_t));
341 responseData.token = tempToken;
342 responseData.tokenLength = CA_MAX_TOKEN_LEN;
343 responseData.type = CA_MSG_NONCONFIRM;
344 responseData.messageId = 1;
346 responseData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
347 if(!responseData.payload)
349 CADestroyToken(tempToken);
350 FAIL() << "requestData.payload allocation failed";
352 memset(responseData.payload, '1', sizeof(responseData.payload) - 1);
353 responseData.payloadSize = sizeof(responseData.payload);
355 pdu = CAGeneratePDU(CA_CREATED, &responseData, tempRep, &options, &transport);
357 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
358 EXPECT_TRUE(cadata != NULL);
360 CABlockData_t *currData = CACreateNewBlockData(cadata);
361 EXPECT_TRUE(currData != NULL);
363 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
364 COAP_OPTION_BLOCK2));
366 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption2(&pdu, &responseData,
367 responseData.payloadSize,
368 currData->blockDataId, &options));
370 CADestroyDataSet(cadata);
371 coap_delete_list(options);
372 coap_delete_pdu(pdu);
374 CADestroyToken(tempToken);
375 CADestroyEndpoint(tempRep);
376 free(responseData.payload);
379 // request and block option1
380 TEST_F(CABlockTransferTests, CAAddBlockOption2InRequest)
382 CAEndpoint_t* tempRep = NULL;
383 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
385 coap_pdu_t *pdu = NULL;
386 coap_list_t *options = NULL;
387 coap_transport_type transport = coap_udp;
389 CAToken_t tempToken = NULL;
390 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
392 CAInfo_t requestData;
393 memset(&requestData, 0, sizeof(CAInfo_t));
394 requestData.token = tempToken;
395 requestData.tokenLength = CA_MAX_TOKEN_LEN;
397 requestData.payload = (CAPayload_t) calloc(LARGE_PAYLOAD_LENGTH, sizeof(char));
398 if(!requestData.payload)
400 CADestroyToken(tempToken);
401 FAIL() << "requestData.payload allocation failed";
403 memset(requestData.payload, '1', sizeof(requestData.payload) - 1);
404 requestData.payloadSize = sizeof(requestData.payload);
405 requestData.type = CA_MSG_NONCONFIRM;
407 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
409 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
410 EXPECT_TRUE(cadata != NULL);
412 CABlockData_t *currData = CACreateNewBlockData(cadata);
413 EXPECT_TRUE(currData != NULL);
415 EXPECT_EQ(CA_STATUS_OK, CAUpdateBlockOptionType(currData->blockDataId,
416 COAP_OPTION_BLOCK2));
418 EXPECT_EQ(CA_STATUS_OK, CAAddBlockOption2(&pdu, &requestData,
419 requestData.payloadSize,
420 currData->blockDataId, &options));
422 CARemoveBlockDataFromList(currData->blockDataId);
423 CADestroyDataSet(cadata);
424 coap_delete_list(options);
425 coap_delete_pdu(pdu);
427 CADestroyToken(tempToken);
428 CADestroyEndpoint(tempRep);
429 free(requestData.payload);
432 TEST_F(CABlockTransferTests, CAGetBlockSizeOptionFromPduTest)
434 CAEndpoint_t* tempRep = NULL;
435 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
437 coap_pdu_t *pdu = NULL;
438 coap_list_t *options = NULL;
439 coap_transport_type transport = coap_udp;
441 CAToken_t tempToken = NULL;
442 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
444 CAInfo_t requestData;
445 memset(&requestData, 0, sizeof(CAInfo_t));
446 requestData.token = tempToken;
447 requestData.tokenLength = CA_MAX_TOKEN_LEN;
448 requestData.type = CA_MSG_NONCONFIRM;
450 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
452 size_t totalPayloadLen = 0;
453 EXPECT_FALSE(CAIsPayloadLengthInPduWithBlockSizeOption(pdu, COAP_OPTION_SIZE1,
456 coap_delete_list(options);
457 coap_delete_pdu(pdu);
459 CADestroyToken(tempToken);
460 CADestroyEndpoint(tempRep);
461 free(requestData.payload);
464 TEST_F(CABlockTransferTests, CASetNextBlockOption1Test)
466 CAEndpoint_t* tempRep = NULL;
467 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
469 coap_pdu_t *pdu = NULL;
470 coap_list_t *options = NULL;
471 coap_transport_type transport = coap_udp;
473 CAToken_t tempToken = NULL;
474 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
476 CAInfo_t responseData;
477 memset(&responseData, 0, sizeof(CAInfo_t));
478 responseData.token = tempToken;
479 responseData.tokenLength = CA_MAX_TOKEN_LEN;
480 responseData.type = CA_MSG_NONCONFIRM;
481 responseData.messageId = 1;
483 pdu = CAGeneratePDU(CA_CREATED, &responseData, tempRep, &options, &transport);
485 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
486 EXPECT_TRUE(cadata != NULL);
488 CABlockData_t *currData = CACreateNewBlockData(cadata);
489 EXPECT_TRUE(currData != NULL);
491 coap_block_t block = {0, 0, 0};
492 EXPECT_EQ(CA_STATUS_OK, CASetNextBlockOption1(pdu, tempRep, cadata, block, pdu->length));
494 EXPECT_EQ(CA_STATUS_OK, CAHandleRequestResponse());
496 CADestroyDataSet(cadata);
497 coap_delete_list(options);
498 coap_delete_pdu(pdu);
500 CADestroyToken(tempToken);
501 CADestroyEndpoint(tempRep);
502 free(responseData.payload);
505 TEST_F(CABlockTransferTests, CASetNextBlockOption2Test)
507 CAEndpoint_t* tempRep = NULL;
508 CACreateEndpoint(CA_DEFAULT_FLAGS, CA_ADAPTER_IP, "127.0.0.1", 5683, &tempRep);
510 coap_pdu_t *pdu = NULL;
511 coap_list_t *options = NULL;
512 coap_transport_type transport = coap_udp;
514 CAToken_t tempToken = NULL;
515 CAGenerateToken(&tempToken, CA_MAX_TOKEN_LEN);
517 CAInfo_t requestData;
518 memset(&requestData, 0, sizeof(CAInfo_t));
519 requestData.token = tempToken;
520 requestData.tokenLength = CA_MAX_TOKEN_LEN;
521 requestData.type = CA_MSG_NONCONFIRM;
523 pdu = CAGeneratePDU(CA_GET, &requestData, tempRep, &options, &transport);
525 CAData_t *cadata = CACreateNewDataSet(pdu, tempRep);
526 EXPECT_TRUE(cadata != NULL);
528 CABlockData_t *currData = CACreateNewBlockData(cadata);
529 EXPECT_TRUE(currData != NULL);
531 coap_block_t block = {0, 0, 0};
532 EXPECT_EQ(CA_STATUS_OK, CASetNextBlockOption2(pdu, tempRep, cadata, block, pdu->length));
534 CADestroyDataSet(cadata);
535 coap_delete_list(options);
536 coap_delete_pdu(pdu);
538 CADestroyToken(tempToken);
539 CADestroyEndpoint(tempRep);
540 free(requestData.payload);