static void test_coap_parse_illegal_token_length(void) { uint8_t pdu[] = { 0x59, 0x69, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', '1', '2', '3', '4' }; struct sol_coap_packet *pkt; struct sol_buffer *buf; size_t offset; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(coap_packet_parse(pkt)); pdu[0] = 0x5f; ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_parse_empty_pdu(void) { uint8_t pdu[] = { 0x40, 0x01, 0, 0 }; struct sol_coap_packet *pkt; struct sol_buffer *buf; size_t offset; uint8_t ver, type, code; uint16_t id; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(!coap_packet_parse(pkt)); sol_coap_header_get_version(pkt, &ver); sol_coap_header_get_type(pkt, &type); sol_coap_header_get_code(pkt, &code); sol_coap_header_get_id(pkt, &id); ASSERT_INT_EQ(ver, 1); ASSERT_INT_EQ(type, SOL_COAP_MESSAGE_TYPE_CON); ASSERT_INT_EQ(code, SOL_COAP_METHOD_GET); ASSERT_INT_EQ(id, 0); sol_coap_packet_unref(pkt); }
static void test_coap_find_options(void) { uint8_t pdu[] = { 0x55, 0xA5, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', 0x00, 0xC1, 0x00, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd', 0x00 }; struct sol_str_slice options[16]; struct sol_coap_packet *pkt; struct sol_buffer *buf; int count = 16; size_t offset; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(!coap_packet_parse(pkt)); count = sol_coap_find_options(pkt, SOL_COAP_OPTION_CONTENT_FORMAT, options, count); ASSERT_INT_EQ(count, 1); ASSERT_INT_EQ(options[0].len, 1); ASSERT_INT_EQ((uint8_t)options[0].data[0], 0); count = sol_coap_find_options(pkt, SOL_COAP_OPTION_IF_MATCH, options, count); ASSERT_INT_EQ(count, 0); sol_coap_packet_unref(pkt); }
static void test_coap_find_options(void) { uint8_t pdu[] = { 0x55, 0xA5, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', 0x00, 0xC1, 0x00, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd', 0x00 }; struct sol_coap_packet *pkt; struct sol_str_slice options[16]; int count = 16; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(!coap_packet_parse(pkt)); count = sol_coap_find_options(pkt, SOL_COAP_OPTION_CONTENT_FORMAT, options, count); ASSERT_INT_EQ(count, 1); ASSERT_INT_EQ(options[0].len, 1); ASSERT_INT_EQ((uint8_t)options[0].data[0], 0); count = sol_coap_find_options(pkt, SOL_COAP_OPTION_IF_MATCH, options, count); ASSERT_INT_EQ(count, 0); sol_coap_packet_unref(pkt); }
static void test_coap_parse_simple_pdu(void) { uint8_t pdu[] = { 0x55, 0xA5, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', 0x00, 0xc1, 0x00, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd', 0x00 }; struct sol_str_slice options[16]; struct sol_coap_packet *pkt; struct sol_buffer *buf; uint8_t *token; int count = 16; size_t offset; uint8_t tkl, code, ver, type; uint16_t id; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(!coap_packet_parse(pkt)); sol_coap_header_get_version(pkt, &ver); sol_coap_header_get_type(pkt, &type); ASSERT_INT_EQ(ver, 1); ASSERT_INT_EQ(type, SOL_COAP_MESSAGE_TYPE_NON_CON); token = sol_coap_header_get_token(pkt, &tkl); ASSERT(token); ASSERT_INT_EQ(tkl, 5); ASSERT(!strcmp((char *)token, "token")); sol_coap_header_get_code(pkt, &code); sol_coap_header_get_id(pkt, &id); ASSERT_INT_EQ(code, SOL_COAP_RESPONSE_CODE_PROXYING_NOT_SUPPORTED); ASSERT_INT_EQ(id, 0x1234); count = sol_coap_find_options(pkt, SOL_COAP_OPTION_CONTENT_FORMAT, options, count); ASSERT_INT_EQ(count, 1); ASSERT_INT_EQ(options[0].len, 1); ASSERT_INT_EQ((uint8_t)options[0].data[0], 0); /* Not existent. */ count = sol_coap_find_options(pkt, SOL_COAP_OPTION_ETAG, options, count); ASSERT_INT_EQ(count, 0); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT_INT_EQ(offset + sizeof("payload"), buf->used); ASSERT(!strcmp((char *)buf->data + offset, "payload")); sol_coap_packet_unref(pkt); }
static void test_coap_parse_illegal_token_length(void) { uint8_t pdu[] = { 0x59, 0x69, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', '1', '2', '3', '4' }; struct sol_coap_packet *pkt; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(coap_packet_parse(pkt)); pdu[0] = 0x5f; memcpy(pkt->buf, pdu, sizeof(pdu)); ASSERT(coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_parse_options_that_exceed_pdu(void) { uint8_t pdu[] = { 0x55, 0x73, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', 0x00, 0xc1, 0x00, 0xae, 0xf0, 0x03 }; struct sol_coap_packet *pkt; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_parse_without_options_with_payload(void) { uint8_t pdu[] = { 0x50, 0x73, 0x12, 0x34, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd' }; struct sol_coap_packet *pkt; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(!coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_parse_simple_pdu(void) { uint8_t pdu[] = { 0x55, 0xA5, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', 0x00, 0xc1, 0x00, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd', 0x00 }; struct sol_coap_packet *pkt; struct sol_str_slice options[16]; uint8_t *payload, *token; uint16_t len; int count = 16; uint8_t tkl; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(!coap_packet_parse(pkt)); ASSERT_INT_EQ(sol_coap_header_get_ver(pkt), 1); ASSERT_INT_EQ(sol_coap_header_get_type(pkt), SOL_COAP_TYPE_NONCON); token = sol_coap_header_get_token(pkt, &tkl); ASSERT(token); ASSERT_INT_EQ(tkl, 5); ASSERT(!strcmp((char *)token, "token")); ASSERT_INT_EQ(sol_coap_header_get_code(pkt), SOL_COAP_RSPCODE_PROXYING_NOT_SUPPORTED); ASSERT_INT_EQ(sol_coap_header_get_id(pkt), 0x1234); count = sol_coap_find_options(pkt, SOL_COAP_OPTION_CONTENT_FORMAT, options, count); ASSERT_INT_EQ(count, 1); ASSERT_INT_EQ(options[0].len, 1); ASSERT_INT_EQ((uint8_t)options[0].data[0], 0); /* Not existent. */ count = sol_coap_find_options(pkt, SOL_COAP_OPTION_ETAG, options, count); ASSERT_INT_EQ(count, 0); ASSERT(!sol_coap_packet_get_payload(pkt, &payload, &len)); ASSERT_INT_EQ(len, sizeof("payload")); ASSERT(!strcmp((char *)payload, "payload")); sol_coap_packet_unref(pkt); }
static void test_coap_parse_options_that_exceed_pdu(void) { uint8_t pdu[] = { 0x55, 0x73, 0x12, 0x34, 't', 'o', 'k', 'e', 'n', 0x00, 0xc1, 0x00, 0xae, 0xf0, 0x03 }; struct sol_coap_packet *pkt; struct sol_buffer *buf; size_t offset; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_parse_without_options_with_payload(void) { uint8_t pdu[] = { 0x50, 0x73, 0x12, 0x34, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd' }; struct sol_coap_packet *pkt; struct sol_buffer *buf; size_t offset; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT(!coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_parse_empty_pdu(void) { uint8_t pdu[] = { 0x40, 0x01, 0, 0 }; struct sol_coap_packet *pkt; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(!coap_packet_parse(pkt)); ASSERT_INT_EQ(sol_coap_header_get_ver(pkt), 1); ASSERT_INT_EQ(sol_coap_header_get_type(pkt), SOL_COAP_TYPE_CON); ASSERT_INT_EQ(sol_coap_header_get_code(pkt), SOL_COAP_METHOD_GET); ASSERT_INT_EQ(sol_coap_header_get_id(pkt), 0); sol_coap_packet_unref(pkt); }
static void test_coap_token_simple(void) { uint8_t token[] = { 't', 'o', 'k', 'e', 'n' }; uint8_t token_length; uint8_t *token_ptr; struct sol_coap_packet *pkt; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_header_set_token(pkt, token, sizeof(token))); token_ptr = sol_coap_header_get_token(pkt, &token_length); ASSERT(token_ptr); ASSERT_INT_EQ(token_length, sizeof(token)); ASSERT(streqn((char *)token_ptr, (char *)token, sizeof(token))); ASSERT(!coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_payload_simple(void) { uint8_t pdu[] = { 0x50, 0x73, 0x12, 0x34, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd', 0x00 }; struct sol_coap_packet *pkt; struct sol_buffer *buf; size_t offset; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); ASSERT(!sol_coap_packet_get_payload(pkt, &buf, &offset)); ASSERT(!sol_buffer_remove_data(buf, 0, offset)); ASSERT(!sol_buffer_insert_bytes(buf, 0, pdu, sizeof(pdu))); ASSERT_INT_EQ(buf->used - offset, sizeof("payload")); ASSERT(streq((char *)buf->data + offset, "payload")); ASSERT(!coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }
static void test_coap_payload_simple(void) { uint8_t pdu[] = { 0x50, 0x73, 0x12, 0x34, 0xff, 'p', 'a', 'y', 'l', 'o', 'a', 'd', 0x00 }; uint16_t payload_length; uint8_t *payload_ptr; struct sol_coap_packet *pkt; pkt = sol_coap_packet_new(NULL); ASSERT(pkt); memcpy(pkt->buf, pdu, sizeof(pdu)); pkt->payload.size = sizeof(pdu); ASSERT(!sol_coap_packet_get_payload(pkt, &payload_ptr, &payload_length)); ASSERT(payload_ptr); ASSERT_INT_EQ(payload_length, sizeof("payload")); ASSERT(streq((char *)payload_ptr, "payload")); ASSERT(!coap_packet_parse(pkt)); sol_coap_packet_unref(pkt); }