TEST_F(CborByteStringTest, ByteStringArraySetGetTest ) { OCRepPayloadSetUri(payload_in, "/a/quake_sensor"); OCRepPayloadSetPropInt(payload_in, "scale", 4); size_t dimensions_in[MAX_REP_ARRAY_DEPTH] = { 3, 0, 0}; uint8_t binval1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19}; uint8_t binval2[] = {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29}; uint8_t binval3[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39}; OCByteString quakedata_in[3] = {{binval1, sizeof(binval1)}, {binval2, sizeof(binval2)}, {binval3, sizeof(binval3)}}; EXPECT_EQ(true, OCRepPayloadSetByteStringArray(payload_in, "quakedata", quakedata_in, dimensions_in)); OCByteString* quakedata_out = NULL; size_t dimensions_out[MAX_REP_ARRAY_DEPTH] = {0}; ASSERT_EQ(true, OCRepPayloadGetByteStringArray(payload_in, "quakedata", &quakedata_out, dimensions_out)); for(size_t i = 0; i < dimensions_in[0]; i++) { EXPECT_EQ(quakedata_in[i].len, quakedata_out[i].len); EXPECT_EQ(0, memcmp(quakedata_in[i].bytes, quakedata_out[i].bytes, quakedata_in[i].len)); } // Cleanup for(size_t i = 0; i < dimensions_out[0]; i++) { OICFree(quakedata_out[i].bytes); } OICFree(quakedata_out); }
TEST_F(CborByteStringTest, ByteStringArrayConvertParseTest ) { OCRepPayloadSetUri(payload_in, "/a/quake_sensor"); OCRepPayloadSetPropInt(payload_in, "scale", 4); size_t dimensions_in[MAX_REP_ARRAY_DEPTH] = { 3, 0, 0}; uint8_t binval1[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19}; uint8_t binval2[] = {0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29}; uint8_t binval3[] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39}; OCByteString quakedata_in[3] = {{binval1, sizeof(binval1)}, {binval2, sizeof(binval2)}, {binval3, sizeof(binval3)}}; EXPECT_EQ(true, OCRepPayloadSetByteStringArray(payload_in, "quakedata", quakedata_in, dimensions_in)); // Convert OCPayload to CBOR uint8_t *payload_cbor = NULL; size_t payload_cbor_size = 0; EXPECT_EQ(OC_STACK_OK, OCConvertPayload((OCPayload*) payload_in, &payload_cbor, &payload_cbor_size)); #ifdef CBOR_BIN_STRING_DEBUG FILE *fp = fopen("binstringarr.cbor", "wb+"); if (fp) { fwrite(payload_cbor, 1, payload_cbor_size, fp); fclose(fp); } #endif //CBOR_BIN_STRING_DEBUG // Parse CBOR back to OCPayload OCPayload* payload_out = NULL; EXPECT_EQ(OC_STACK_OK, OCParsePayload(&payload_out, PAYLOAD_TYPE_REPRESENTATION, payload_cbor, payload_cbor_size)); OCByteString* quakedata_out = NULL; size_t dimensions_out[MAX_REP_ARRAY_DEPTH] = {0}; ASSERT_EQ(true, OCRepPayloadGetByteStringArray((OCRepPayload*)payload_out, "quakedata", &quakedata_out, dimensions_out)); for(size_t i = 0; i < dimensions_in[0]; i++) { EXPECT_EQ(quakedata_in[i].len, quakedata_out[i].len); EXPECT_EQ(0, memcmp(quakedata_in[i].bytes, quakedata_out[i].bytes, quakedata_in[i].len)); } // Cleanup OICFree(payload_cbor); for(size_t i = 0; i < dimensions_out[0]; i++) { OICFree(quakedata_out[i].bytes); } OICFree(quakedata_out); OCPayloadDestroy((OCPayload*)payload_out); }
static int _icd_state_array_from_list(OCRepPayload *repr, struct icd_state_list_s *value_list, const char *key) { int i, len; GList *node; bool *b_arr; double *d_arr; char **str_arr; int64_t *i_arr; OCByteString *byte_arr; union icd_state_value_u *value; struct OCRepPayload **state_arr; len = calcDimTotal(value_list->dimensions); switch (value_list->type) { case OCREP_PROP_INT: i_arr = calloc(len, sizeof(int64_t)); if (NULL == i_arr) { ERR("calloc() Fail(%d)", errno); return IOTCON_ERROR_OUT_OF_MEMORY; } for (node = value_list->list, i = 0; node; node = node->next, i++) { value = node->data; i_arr[i] = value->i; } g_list_free_full(value_list->list, free); OCRepPayloadSetIntArrayAsOwner(repr, key, i_arr, value_list->dimensions); break; case OCREP_PROP_BOOL: b_arr = calloc(len, sizeof(bool)); if (NULL == b_arr) { ERR("calloc() Fail(%d)", errno); return IOTCON_ERROR_OUT_OF_MEMORY; } for (node = value_list->list, i = 0; node; node = node->next, i++) { value = node->data; b_arr[i] = value->b; } g_list_free_full(value_list->list, free); OCRepPayloadSetBoolArrayAsOwner(repr, key, b_arr, value_list->dimensions); break; case OCREP_PROP_DOUBLE: d_arr = calloc(len, sizeof(double)); if (NULL == d_arr) { ERR("calloc() Fail(%d)", errno); return IOTCON_ERROR_OUT_OF_MEMORY; } for (node = value_list->list, i = 0; node; node = node->next, i++) { value = node->data; d_arr[i] = value->d; } g_list_free_full(value_list->list, free); OCRepPayloadSetDoubleArrayAsOwner(repr, key, d_arr, value_list->dimensions); break; case OCREP_PROP_STRING: str_arr = calloc(len, sizeof(char *)); if (NULL == str_arr) { ERR("calloc() Fail(%d)", errno); return IOTCON_ERROR_OUT_OF_MEMORY; } for (node = value_list->list, i = 0; node; node = node->next, i++) str_arr[i] = strdup(node->data); g_list_free_full(value_list->list, free); OCRepPayloadSetStringArrayAsOwner(repr, key, str_arr, value_list->dimensions); break; case OCREP_PROP_BYTE_STRING: byte_arr = calloc(len, sizeof(OCByteString)); if (NULL == byte_arr) { ERR("calloc() Fail(%d)", errno); return IOTCON_ERROR_OUT_OF_MEMORY; } for (node = value_list->list, i = 0; node; node = node->next, i++) { OCByteString *byte_str = node->data; byte_arr[i].bytes = byte_str->bytes; byte_arr[i].len = byte_str->len; } g_list_free(value_list->list); OCRepPayloadSetByteStringArray(repr, key, byte_arr, value_list->dimensions); break; case OCREP_PROP_OBJECT: state_arr = calloc(len, sizeof(struct OCRepPayload *)); if (NULL == state_arr) { ERR("calloc() Fail(%d)", errno); return IOTCON_ERROR_OUT_OF_MEMORY; } for (node = value_list->list, i = 0; node; node = node->next, i++) state_arr[i] = OCRepPayloadClone(node->data); g_list_free_full(value_list->list, _icd_payload_object_destroy); OCRepPayloadSetPropObjectArrayAsOwner(repr, key, state_arr, value_list->dimensions); break; case OCREP_PROP_ARRAY: case OCREP_PROP_NULL: default: ERR("Invalid Type(%d)", value_list->type); return IOTCON_ERROR_INVALID_TYPE; } return IOTCON_ERROR_NONE; }