void test_create_destroy_writer(void) { kaa_platform_message_writer_t *writer = NULL; char buffer[16]; size_t buffer_size = sizeof(buffer) / sizeof(char); kaa_error_t error_code = KAA_ERR_NONE; error_code = kaa_platform_message_writer_create(NULL, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_BADPARAM); ASSERT_NULL(writer); error_code = kaa_platform_message_writer_create(&writer, NULL, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_BADPARAM); ASSERT_NULL(writer); error_code = kaa_platform_message_writer_create(&writer, buffer, 0); ASSERT_EQUAL(error_code, KAA_ERR_BADPARAM); ASSERT_NULL(writer); error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_NOT_NULL(writer); ASSERT_EQUAL((writer->end - writer->begin), buffer_size); ASSERT_EQUAL(writer->begin, writer->current); kaa_platform_message_writer_destroy(writer); }
void test_create_request(void) { KAA_TRACE_IN(logger); size_t expected_size = 0; ASSERT_EQUAL(kaa_configuration_manager_get_size(config_manager, &expected_size), KAA_ERR_NONE); ASSERT_EQUAL(expected_size, sizeof(uint32_t) + KAA_EXTENSION_HEADER_SIZE + SHA_1_DIGEST_LENGTH); char request_buffer[expected_size]; kaa_platform_message_writer_t *writer = NULL; ASSERT_EQUAL(kaa_platform_message_writer_create(&writer, request_buffer, expected_size), KAA_ERR_NONE); ASSERT_EQUAL(kaa_configuration_manager_request_serialize(config_manager, writer), KAA_ERR_NONE); char *cursor = writer->begin; ASSERT_EQUAL(*cursor, KAA_CONFIGURATION_EXTENSION_TYPE); cursor += sizeof(uint32_t); ASSERT_EQUAL(KAA_NTOHL(*((uint32_t *) cursor)), sizeof(uint32_t) + SHA_1_DIGEST_LENGTH); // checking payload size cursor += sizeof(uint32_t); ASSERT_EQUAL(KAA_NTOHL(*((uint32_t *) cursor)), CONFIG_START_SEQ_N); // checking sequence number cursor += sizeof(uint32_t); kaa_digest check_hash; ext_calculate_sha_hash(KAA_CONFIGURATION_DATA, KAA_CONFIGURATION_DATA_LENGTH, check_hash); // checking configuration hash ASSERT_EQUAL(memcmp(cursor, check_hash, SHA_1_DIGEST_LENGTH), 0); cursor += SHA_1_DIGEST_LENGTH; ASSERT_EQUAL(cursor, writer->end); kaa_platform_message_writer_destroy(writer); }
void test_create_request(void **state) { (void)state; size_t expected_size = 0; ASSERT_EQUAL(kaa_configuration_manager_get_size(config_manager, &expected_size), KAA_ERR_NONE); ASSERT_EQUAL(expected_size, KAA_EXTENSION_HEADER_SIZE + SHA_1_DIGEST_LENGTH); uint8_t request_buffer[expected_size]; kaa_platform_message_writer_t *writer = NULL; ASSERT_EQUAL(kaa_platform_message_writer_create(&writer, request_buffer, expected_size), KAA_ERR_NONE); ASSERT_EQUAL(kaa_configuration_manager_request_serialize(config_manager, writer), KAA_ERR_NONE); uint8_t *cursor = writer->begin; ASSERT_EQUAL(KAA_HTONS(*((uint16_t *) cursor)), KAA_EXTENSION_CONFIGURATION); cursor += sizeof(uint32_t); ASSERT_EQUAL(KAA_NTOHL(*((uint32_t *) cursor)), SHA_1_DIGEST_LENGTH); // checking payload size cursor += sizeof(uint32_t); kaa_digest check_hash; ext_calculate_sha_hash(KAA_CONFIGURATION_DATA, KAA_CONFIGURATION_DATA_LENGTH, check_hash); // checking configuration hash ASSERT_EQUAL(memcmp(cursor, check_hash, SHA_1_DIGEST_LENGTH), 0); cursor += SHA_1_DIGEST_LENGTH; ASSERT_EQUAL(cursor, writer->end); kaa_platform_message_writer_destroy(writer); }
void test_specified_user_verifier(void **state) { (void)state; ASSERT_EQUAL(kaa_user_manager_attach_to_user(user_manager, USER_EXTERNAL_ID, ACCESS_TOKEN, USER_VERIFIER), KAA_ERR_NONE); size_t expected_size = 0; ASSERT_EQUAL(kaa_user_request_get_size(user_manager, &expected_size), KAA_ERR_NONE); uint8_t buffer[expected_size]; kaa_platform_message_writer_t *writer = NULL; ASSERT_EQUAL(kaa_platform_message_writer_create(&writer, buffer, expected_size), KAA_ERR_NONE); ASSERT_NOT_NULL(writer); ASSERT_EQUAL(kaa_user_request_serialize(user_manager, writer), KAA_ERR_NONE); uint8_t *buf_cursor = buffer; ASSERT_EQUAL(KAA_EXTENSION_USER, KAA_HTONS(*(uint16_t*)buf_cursor)); buf_cursor += sizeof(uint16_t); char options[] = { 0x00, 0x01 }; ASSERT_EQUAL(memcmp(buf_cursor, options, 2), 0); buf_cursor += 2; ASSERT_EQUAL(*(uint32_t * ) buf_cursor, KAA_HTONL(2 * sizeof(uint32_t) + kaa_aligned_size_get(strlen(USER_EXTERNAL_ID)) + kaa_aligned_size_get(strlen(ACCESS_TOKEN) + kaa_aligned_size_get(strlen(USER_VERIFIER))))); buf_cursor += sizeof(uint32_t); ASSERT_EQUAL(0, *buf_cursor); ++buf_cursor; ASSERT_EQUAL(strlen(USER_EXTERNAL_ID), *buf_cursor); ++buf_cursor; ASSERT_EQUAL(KAA_HTONS(strlen(ACCESS_TOKEN)), *(uint16_t *) buf_cursor); buf_cursor += sizeof(uint16_t); ASSERT_EQUAL(KAA_HTONS(strlen(USER_VERIFIER)), *(uint16_t *) buf_cursor); buf_cursor += sizeof(uint32_t); // + reserved 16B ASSERT_EQUAL(memcmp(buf_cursor, USER_EXTERNAL_ID, strlen(USER_EXTERNAL_ID)), 0); buf_cursor += kaa_aligned_size_get(strlen(USER_EXTERNAL_ID)); ASSERT_EQUAL(memcmp(buf_cursor, ACCESS_TOKEN, strlen(ACCESS_TOKEN)), 0); buf_cursor += kaa_aligned_size_get(strlen(ACCESS_TOKEN)); ASSERT_EQUAL(memcmp(buf_cursor, USER_VERIFIER, strlen(USER_VERIFIER)), 0); buf_cursor += kaa_aligned_size_get(strlen(USER_VERIFIER)); kaa_platform_message_writer_destroy(writer); }
void test_meta_extension_serialize_failed(void) { KAA_TRACE_IN(logger); kaa_error_t error_code; const size_t buffer_size = 6; char buffer[buffer_size]; kaa_platform_message_writer_t *writer; error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_meta_data_request_serialize(NULL, NULL, 0); ASSERT_NOT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_meta_data_request_serialize(NULL, (kaa_platform_message_writer_t *)!NULL, 0); ASSERT_NOT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_writer_destroy(writer); }
void test_aligned_write(void) { kaa_error_t error_code = KAA_ERR_NONE; char buffer[3 * KAA_ALIGNMENT]; size_t buffer_size = sizeof(buffer) / sizeof(char); kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); char *match_alignment_data[KAA_ALIGNMENT]; size_t match_alignment_data_len = KAA_ALIGNMENT; char *unmatch_alignment_data[KAA_ALIGNMENT + 1]; size_t unmatch_alignment_data_len = KAA_ALIGNMENT + 1; error_code = kaa_platform_message_write_aligned(writer, unmatch_alignment_data, unmatch_alignment_data_len); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL((writer->current - writer->begin), kaa_aligned_size_get(unmatch_alignment_data_len)); error_code = (memcmp(writer->begin, unmatch_alignment_data, unmatch_alignment_data_len) == 0 ? KAA_ERR_NONE : KAA_ERR_WRITE_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); size_t i = 0; size_t padding = kaa_aligned_size_get(unmatch_alignment_data_len) - unmatch_alignment_data_len; for (; i < padding; ++i) { if (*(writer->begin + unmatch_alignment_data_len + i) != 0) { error_code = KAA_ERR_WRITE_FAILED; } } ASSERT_EQUAL(error_code, KAA_ERR_NONE); char* begin = writer->current; error_code = kaa_platform_message_write_aligned(writer, match_alignment_data, match_alignment_data_len); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL((writer->current - begin), kaa_aligned_size_get(match_alignment_data_len)); error_code = (memcmp(begin, match_alignment_data, kaa_aligned_size_get(match_alignment_data_len)) == 0 ? KAA_ERR_NONE : KAA_ERR_WRITE_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_writer_destroy(writer); }
void test_write(void) { kaa_error_t error_code = KAA_ERR_NONE; char buffer[16]; size_t buffer_size = sizeof(buffer) / sizeof(char); kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); const char *test_data = "test data"; size_t test_data_len = strlen(test_data); error_code = kaa_platform_message_write(writer, test_data, test_data_len); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL((writer->current - writer->begin), test_data_len); error_code = (memcmp(writer->begin, test_data, test_data_len) == 0 ? KAA_ERR_NONE : KAA_ERR_WRITE_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_writer_destroy(writer); }
void test_write_protocol_message_header(void) { kaa_error_t error_code = KAA_ERR_NONE; char buffer[KAA_PROTOCOL_ID_SIZE + KAA_PROTOCOL_VERSION_SIZE]; size_t buffer_size = sizeof(buffer) / sizeof(char); kaa_platform_message_writer_t *writer = NULL; const char serialized_header[KAA_PROTOCOL_ID_SIZE + KAA_PROTOCOL_VERSION_SIZE] = {0x00, 0x00, 0x30, 0x39, 0x01, 0x00}; uint32_t protocol_id = 12345; uint16_t protocol_version = 256; error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_header_write(writer, protocol_id, protocol_version); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = (memcmp(writer->begin, serialized_header, KAA_PROTOCOL_ID_SIZE + KAA_PROTOCOL_VERSION_SIZE) == 0? KAA_ERR_NONE : KAA_ERR_WRITE_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_writer_destroy(writer); }
void test_write_buffer_overflow(void) { kaa_error_t error_code = KAA_ERR_NONE; char buffer[2 * KAA_ALIGNMENT]; size_t buffer_size = sizeof(buffer) / sizeof(char); kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); char *data[KAA_ALIGNMENT]; size_t data_len = KAA_ALIGNMENT; error_code = kaa_platform_message_write_aligned(writer, data, data_len); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_write_aligned(writer, data, data_len); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_write_aligned(writer, data, data_len); ASSERT_EQUAL(error_code, KAA_ERR_WRITE_FAILED); kaa_platform_message_writer_destroy(writer); }
void test_write_extension_header(void) { kaa_error_t error_code = KAA_ERR_NONE; char buffer[KAA_EXTENSION_HEADER_SIZE]; size_t buffer_size = sizeof(buffer) / sizeof(char); kaa_platform_message_writer_t *writer = NULL; const char serialized_header[KAA_EXTENSION_HEADER_SIZE] = {0xfa, 0x10, 0x11, 0x12, 0xaa, 0xbb, 0xcc, 0xff}; uint8_t extension_type = 250; uint32_t extension_options = (0x10 << 16) | (0x11 << 8) | 0x12; uint32_t extension_payload_length = 0xaabbccff; error_code = kaa_platform_message_writer_create(&writer, buffer, buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_write_extension_header( writer, extension_type, extension_options, extension_payload_length); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = (memcmp(writer->begin, serialized_header, KAA_EXTENSION_HEADER_SIZE) == 0? KAA_ERR_NONE : KAA_ERR_WRITE_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_writer_destroy(writer); }
void test_create_request(void **state) { (void)state; kaa_user_log_record_t *test_log_record = kaa_test_log_record_create(); test_log_record->data = kaa_string_copy_create(TEST_LOG_BUFFER); size_t test_log_record_size = test_log_record->get_size(test_log_record); kaa_log_collector_t *log_collector = NULL; kaa_error_t error_code = kaa_log_collector_create(&log_collector, status, channel_manager, logger); ASSERT_EQUAL(error_code, KAA_ERR_NONE); mock_strategy_context_t strategy; memset(&strategy, 0, sizeof(mock_strategy_context_t)); strategy.decision = NOOP; strategy.max_parallel_uploads = UINT32_MAX; kaa_log_bucket_constraints_t constraints = { .max_bucket_size = 2 * test_log_record_size, .max_bucket_log_count = UINT32_MAX, }; error_code = kaa_logging_init(log_collector, create_mock_storage(), &strategy, &constraints); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); size_t expected_size = 0; error_code = kaa_logging_request_get_size(log_collector, &expected_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); uint8_t buffer[expected_size]; kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, buffer, expected_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_NOT_NULL(writer); error_code = kaa_logging_request_serialize(log_collector, writer); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_writer_destroy(writer); uint8_t *buf_cursor = buffer; ASSERT_EQUAL(KAA_EXTENSION_LOGGING, KAA_HTONS(*(uint16_t *)buf_cursor)); buf_cursor += sizeof(uint16_t); uint8_t options[] = { 0x00, 0x01 }; ASSERT_EQUAL(memcmp(buf_cursor, options, 2), 0); buf_cursor += 2; ASSERT_EQUAL(*(uint32_t *) buf_cursor, KAA_HTONL(20)); buf_cursor += sizeof(uint32_t); uint8_t request_id_records_count[] = { 0x00, 0x01, 0x00, 0x01 }; ASSERT_EQUAL(memcmp(buf_cursor, request_id_records_count, 4), 0); buf_cursor += 4; uint8_t record_buf[test_log_record_size]; avro_writer_t avro_writer = avro_writer_memory((char *)record_buf, test_log_record_size); test_log_record->serialize(avro_writer, test_log_record); avro_writer_free(avro_writer); ASSERT_EQUAL(*(uint32_t *) buf_cursor, KAA_HTONL(test_log_record_size)); buf_cursor += sizeof(uint32_t); ASSERT_EQUAL(memcmp(buf_cursor, record_buf, test_log_record_size), 0); kaa_log_collector_destroy(log_collector); test_log_record->destroy(test_log_record); } void test_response(void **state) { (void)state; srand(time(NULL)); kaa_log_collector_t *log_collector = NULL; kaa_error_t error_code = kaa_log_collector_create(&log_collector, status, channel_manager, logger); ASSERT_EQUAL(error_code, KAA_ERR_NONE); mock_strategy_context_t strategy; memset(&strategy, 0, sizeof(mock_strategy_context_t)); mock_storage_context_t *storage = create_mock_storage(); kaa_log_bucket_constraints_t constraints = { .max_bucket_size = 1024, .max_bucket_log_count = UINT32_MAX, }; error_code = kaa_logging_init(log_collector, storage, &strategy, &constraints); ASSERT_EQUAL(error_code, KAA_ERR_NONE); uint32_t response_count = 2; size_t response_buffer_size = sizeof(uint32_t) + sizeof(uint32_t) * response_count; uint8_t response_buffer[response_buffer_size]; uint8_t *response = response_buffer; *((uint32_t *)response) = KAA_HTONL(response_count); response += sizeof(uint32_t); /* First response */ *((uint16_t *)response) = KAA_HTONS(rand()); response += sizeof(uint16_t); *((uint8_t *)response) = 0x0; // SUCCESS response += sizeof(uint8_t); *((uint8_t *)response) = 0; response += sizeof(uint8_t); /* Second response */ *((uint16_t *)response) = KAA_HTONS(rand()); response += sizeof(uint16_t); *((uint8_t *)response) = 0x1; // FAILURE response += sizeof(uint8_t); *((uint8_t *)response) = rand() % 4; response += sizeof(uint8_t); kaa_platform_message_reader_t *reader = NULL; error_code = kaa_platform_message_reader_create(&reader, response_buffer, response_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_NOT_NULL(reader); error_code = kaa_logging_handle_server_sync(log_collector, reader, 0, response_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_TRUE(strategy.on_failure_count); ASSERT_TRUE(storage->on_remove_by_id_count); ASSERT_TRUE(storage->on_unmark_by_id_count); kaa_platform_message_reader_destroy(reader); kaa_log_collector_destroy(log_collector); } void test_timeout(void **state) { (void)state; kaa_log_collector_t *log_collector = NULL; kaa_error_t error_code = kaa_log_collector_create(&log_collector, status, channel_manager, logger); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_user_log_record_t *test_log_record = kaa_test_log_record_create(); test_log_record->data = kaa_string_copy_create(TEST_LOG_BUFFER); size_t test_log_record_size = test_log_record->get_size(test_log_record); mock_strategy_context_t strategy; memset(&strategy, 0, sizeof(mock_strategy_context_t)); strategy.timeout = TEST_TIMEOUT; strategy.decision = NOOP; strategy.max_parallel_uploads = UINT32_MAX; kaa_log_bucket_constraints_t constraints = { .max_bucket_size = 2 * test_log_record_size, .max_bucket_log_count = UINT32_MAX, }; error_code = kaa_logging_init(log_collector, create_mock_storage(), &strategy, &constraints); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); size_t request_buffer_size = 256; uint8_t request_buffer[request_buffer_size]; kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, request_buffer, request_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_request_serialize(log_collector, writer); ASSERT_EQUAL(error_code, KAA_ERR_NONE); sleep(TEST_TIMEOUT + 1); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_TRUE(strategy.on_timeout_count); test_log_record->destroy(test_log_record); kaa_platform_message_writer_destroy(writer); kaa_log_collector_destroy(log_collector); } void test_decline_timeout(void **state) { (void)state; kaa_log_collector_t *log_collector = NULL; kaa_error_t error_code = kaa_log_collector_create(&log_collector, status, channel_manager, logger); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_user_log_record_t *test_log_record = kaa_test_log_record_create(); test_log_record->data = kaa_string_copy_create(TEST_LOG_BUFFER); size_t test_log_record_size = test_log_record->get_size(test_log_record); mock_strategy_context_t strategy; memset(&strategy, 0, sizeof(mock_strategy_context_t)); strategy.timeout = TEST_TIMEOUT; strategy.decision = NOOP; strategy.max_parallel_uploads = UINT32_MAX; mock_storage_context_t *storage = create_mock_storage(); ASSERT_NOT_NULL(storage); kaa_log_bucket_constraints_t constraints = { .max_bucket_size = 2 * test_log_record_size, .max_bucket_log_count = UINT32_MAX, }; error_code = kaa_logging_init(log_collector, storage, &strategy, &constraints); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); size_t request_buffer_size = 256; uint8_t request_buffer[request_buffer_size]; kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, request_buffer, request_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_request_serialize(log_collector, writer); ASSERT_EQUAL(error_code, KAA_ERR_NONE); sleep(TEST_TIMEOUT + 1); uint16_t bucket_id = *((uint16_t *)(request_buffer + KAA_EXTENSION_HEADER_SIZE)); bucket_id = KAA_NTOHS(bucket_id); uint32_t response_count = 1; size_t response_buffer_size = sizeof(uint32_t) + sizeof(uint32_t) * response_count; uint8_t response_buffer[response_buffer_size]; uint8_t *response = response_buffer; *((uint32_t *)response) = KAA_HTONL(response_count); response += sizeof(uint32_t); /* First response */ *((uint16_t *)response) = KAA_HTONS(bucket_id); response += sizeof(uint16_t); *((uint8_t *)response) = 0x0; // SUCCESS response += sizeof(uint8_t); *((uint8_t *)response) = 0; response += sizeof(uint8_t); kaa_platform_message_reader_t *reader = NULL; error_code = kaa_platform_message_reader_create(&reader, response_buffer, response_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_NOT_NULL(reader); error_code = kaa_logging_handle_server_sync(log_collector, reader, 0, response_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_TRUE(storage->on_remove_by_id_count); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_FALSE(strategy.on_timeout_count); test_log_record->destroy(test_log_record); kaa_platform_message_writer_destroy(writer); kaa_platform_message_reader_destroy(reader); kaa_log_collector_destroy(log_collector); } void test_max_parallel_uploads_with_log_sync(void **state) { (void)state; uint32_t channel_id = 0; kaa_transport_channel_interface_t transport_context; test_kaa_channel_create(&transport_context); kaa_channel_manager_add_transport_channel(channel_manager, &transport_context, &channel_id); kaa_log_collector_t *log_collector = NULL; kaa_error_t error_code = kaa_log_collector_create(&log_collector, status, channel_manager, logger); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_user_log_record_t *test_log_record = kaa_test_log_record_create(); test_log_record->data = kaa_string_copy_create(TEST_LOG_BUFFER); size_t test_log_size = test_log_record->get_size(test_log_record); mock_strategy_context_t strategy; memset(&strategy, 0, sizeof(mock_strategy_context_t)); strategy.timeout = INT16_MAX; strategy.decision = UPLOAD; mock_storage_context_t *storage = create_mock_storage(); ASSERT_NOT_NULL(storage); kaa_log_bucket_constraints_t constraints = { .max_bucket_size = 2 * test_log_size, .max_bucket_log_count = UINT32_MAX, }; error_code = kaa_logging_init(log_collector, storage, &strategy, &constraints); ASSERT_EQUAL(error_code, KAA_ERR_NONE); /* * Ensure the log delivery is forbidden at all. */ strategy.max_parallel_uploads = 0; error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL(((mock_transport_channel_context_t *)transport_context.context)->on_sync_count, 0); /* * Ensure the first request is allowed. */ strategy.max_parallel_uploads = 1; error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL(((mock_transport_channel_context_t *)transport_context.context)->on_sync_count, 1); /* * Do the first request to remember the delivery timeout of the log batch. */ size_t request_buffer_size = 256; uint8_t request_buffer[request_buffer_size]; kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, request_buffer, request_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_request_serialize(log_collector, writer); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); /* * Ensure the second request is forbidden. */ ASSERT_EQUAL(((mock_transport_channel_context_t *)transport_context.context)->on_sync_count, 1); /* * Clean up. */ error_code = kaa_channel_manager_remove_transport_channel(channel_manager, channel_id); ASSERT_EQUAL(error_code, KAA_ERR_NONE); test_log_record->destroy(test_log_record); kaa_log_collector_destroy(log_collector); } void test_max_parallel_uploads_with_sync_all(void **state) { (void)state; uint32_t channel_id = 0; kaa_transport_channel_interface_t transport_context; test_kaa_channel_create(&transport_context); kaa_channel_manager_add_transport_channel(channel_manager, &transport_context, &channel_id); kaa_log_collector_t *log_collector = NULL; kaa_error_t error_code = kaa_log_collector_create(&log_collector, status, channel_manager, logger); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_user_log_record_t *test_log_record = kaa_test_log_record_create(); test_log_record->data = kaa_string_copy_create(TEST_LOG_BUFFER); size_t test_log_size = test_log_record->get_size(test_log_record); mock_strategy_context_t strategy; memset(&strategy, 0, sizeof(mock_strategy_context_t)); strategy.timeout = INT16_MAX; strategy.decision = UPLOAD; mock_storage_context_t *storage = create_mock_storage(); ASSERT_NOT_NULL(storage); kaa_log_bucket_constraints_t constraints = { .max_bucket_size = 2 * test_log_size, .max_bucket_log_count = UINT32_MAX, }; error_code = kaa_logging_init(log_collector, storage, &strategy, &constraints); ASSERT_EQUAL(error_code, KAA_ERR_NONE); /* * Ensure the log delivery is forbidden at all. */ strategy.max_parallel_uploads = 0; error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); size_t expected_size = 0; error_code = kaa_logging_request_get_size(log_collector, &expected_size); assert_int_equal(KAA_ERR_NONE, error_code); ASSERT_FALSE(expected_size); /* * Ensure the first request is allowed. */ strategy.max_parallel_uploads = 1; error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); /* * Do the first request to remember the delivery timeout of the log batch. */ error_code = kaa_logging_request_get_size(log_collector, &expected_size); assert_int_equal(KAA_ERR_NONE, error_code); ASSERT_TRUE(expected_size); size_t request_buffer_size = 256; uint8_t request_buffer[request_buffer_size]; kaa_platform_message_writer_t *writer = NULL; error_code = kaa_platform_message_writer_create(&writer, request_buffer, request_buffer_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_request_serialize(log_collector, writer); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_logging_add_record(log_collector, test_log_record, NULL); ASSERT_EQUAL(error_code, KAA_ERR_NONE); /* * Ensure the second request is forbidden. */ error_code = kaa_logging_request_get_size(log_collector, &expected_size); assert_int_equal(KAA_ERR_NONE, error_code); ASSERT_FALSE(expected_size); /* * Clean up. */ error_code = kaa_channel_manager_remove_transport_channel(channel_manager, channel_id); ASSERT_EQUAL(error_code, KAA_ERR_NONE); test_log_record->destroy(test_log_record); kaa_log_collector_destroy(log_collector); } /* ---------------------------------------------------------------------------*/ /* Log delivery tests */ /* ---------------------------------------------------------------------------*/ /* Server chunk, managed by a corresponding reader object. * Perfectly packed. Packed attribute is intentionally avoided. */ struct response_chunk { uint8_t bucket_id[2]; /* 16 bits for bucket ID */ uint8_t resp_code; /* 8 bits for response code. 0 == SUCCESS, 1 == FAILURE */ // cppcheck-suppress unusedStructMember uint8_t reserved; /* Should be 0 */ }; struct response_packet { uint8_t resp_cnt[4]; /* 32 bits for amount of responces in buffer */ struct response_chunk resps[]; /* Responses itself */ }; #define RESP_PACKETS 2 /* Amount of response packets */ #define RESP_SUCCESS_IDX 0 /* Index of successfull response */ #define RESP_FAILURE_IDX 1 /* Index of failed response */ #define TEST_BUFFER_SIZE 1024 #define TEST_EXT_OP 0 /* Simple stub */ static mock_strategy_context_t test_strategy1; static mock_strategy_context_t test_strategy2; static mock_storage_context_t *test_storage1; static mock_storage_context_t *test_storage2; static kaa_log_collector_t *log_collector; static size_t test_log_record_size = TEST_BUFFER_SIZE; /* Will contain response_packet. Thus required to be aligned. */ static uint32_t test_reader_buffer[TEST_BUFFER_SIZE / 4]; static uint32_t test_writer_buffer[TEST_BUFFER_SIZE / 4]; /* Portion of the test buffer filled with valid data */ static size_t test_filled_size; static kaa_platform_message_reader_t *test_reader; static kaa_platform_message_writer_t *test_writer; static kaa_user_log_record_t *test_log_record; /* Values to be checked inside mock event function */ static void *expected_ctx; static int check_bucket; static uint16_t expected_bucked_id; /* Required to trace generic mock function calls */ static int call_is_expected; static int call_completed; /* Required to trace on fail mock function calls */ static int failed_call_is_expected; static int failed_call_completed; /* Required to trace on success mock function calls */ static int success_call_is_expected; static int success_call_completed; /* Required to trace on timeout mock function calls */ static int timeout_call_is_expected; static int timeout_call_completed; /* Mock event functions */ static void mock_log_event_generic_fn(void *ctx, const kaa_log_bucket_info_t *bucket) { ASSERT_TRUE(call_is_expected); ASSERT_NOT_NULL(bucket); /* Shouldn't be NULL no matter what */ if (check_bucket) { ASSERT_EQUAL(expected_bucked_id, bucket->bucket_id); } ASSERT_EQUAL(expected_ctx, ctx); call_completed++; }
void test_profile_sync_serialize(void) { KAA_TRACE_IN(logger); kaa_error_t error_code; kaa_platform_message_writer_t *manual_writer; kaa_platform_message_writer_t *auto_writer; const char *access_token = "access token"; const size_t access_token_size = strlen(access_token); kaa_profile_t *profile = kaa_profile_basic_endpoint_profile_test_create(); profile->profile_body = kaa_string_copy_create("dummy"); size_t serialized_profile_size = profile->get_size(profile); char *serialized_profile = (char *) KAA_MALLOC(serialized_profile_size * sizeof(char)); avro_writer_t avro_writer = avro_writer_memory(serialized_profile, serialized_profile_size); profile->serialize(avro_writer, profile); error_code = kaa_profile_manager_update_profile(profile_manager, profile); ASSERT_EQUAL(error_code, KAA_ERR_NONE); status->is_registered = false; error_code = kaa_profile_manager_set_endpoint_access_token(profile_manager, access_token); ASSERT_EQUAL(error_code, KAA_ERR_NONE); size_t profile_sync_size; error_code = kaa_profile_request_get_size(profile_manager, &profile_sync_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); char buffer[profile_sync_size]; error_code = kaa_platform_message_writer_create(&manual_writer, buffer, profile_sync_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); uint32_t network_order_32; error_code = kaa_platform_message_write_extension_header(manual_writer , KAA_PROFILE_EXTENSION_TYPE , 0 , profile_sync_size - KAA_EXTENSION_HEADER_SIZE); ASSERT_EQUAL(error_code, KAA_ERR_NONE); bool need_resync = true; ASSERT_EQUAL(kaa_profile_need_profile_resync(profile_manager, &need_resync), KAA_ERR_NONE); network_order_32 = KAA_HTONL(0); if (need_resync) network_order_32 = KAA_HTONL(serialized_profile_size); error_code = kaa_platform_message_write(manual_writer, &network_order_32, sizeof(uint32_t)); ASSERT_EQUAL(error_code, KAA_ERR_NONE); if (need_resync) { error_code = kaa_platform_message_write_aligned(manual_writer, serialized_profile, serialized_profile_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); } network_order_32 = KAA_HTONS(TEST_PUB_KEY_SIZE) << 16 | PUB_KEY_VALUE; error_code = kaa_platform_message_write(manual_writer, &network_order_32, sizeof(uint32_t)); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_write_aligned(manual_writer, test_ep_key, TEST_PUB_KEY_SIZE); ASSERT_EQUAL(error_code, KAA_ERR_NONE); network_order_32 = KAA_HTONS(access_token_size) << 16 | ACCESS_TOKEN_VALUE; error_code = kaa_platform_message_write(manual_writer, &network_order_32, sizeof(uint32_t)); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_write_aligned(manual_writer, access_token, access_token_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); char buffer2[profile_sync_size]; error_code = kaa_platform_message_writer_create(&auto_writer, buffer2, profile_sync_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_profile_request_serialize(profile_manager, auto_writer); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = (memcmp(buffer, buffer2, profile_sync_size) == 0 ? KAA_ERR_NONE : KAA_ERR_BADDATA); ASSERT_EQUAL(error_code, KAA_ERR_NONE); KAA_FREE(serialized_profile); avro_writer_free(avro_writer); profile->destroy(profile); kaa_platform_message_writer_destroy(auto_writer); kaa_platform_message_writer_destroy(manual_writer); KAA_TRACE_OUT(logger); }
static kaa_error_t kaa_client_sync_serialize(kaa_platform_protocol_t *self , const kaa_service_t services[] , size_t services_count , char* buffer , size_t *size) { kaa_platform_message_writer_t *writer = NULL; kaa_error_t error_code = kaa_platform_message_writer_create(&writer, buffer, *size); KAA_RETURN_IF_ERR(error_code); uint16_t total_services_count = services_count + 1 /* Meta extension */; error_code = kaa_platform_message_header_write(writer, KAA_PLATFORM_PROTOCOL_ID, KAA_PLATFORM_PROTOCOL_VERSION); if (error_code) { KAA_LOG_ERROR(self->logger, error_code, "Failed to write the client sync header"); return error_code; } char *extension_count_p = writer->current; writer->current += KAA_PROTOCOL_EXTENSIONS_COUNT_SIZE; error_code = kaa_meta_data_request_serialize(self->status, writer, self->request_id); while (!error_code && services_count--) { switch (services[services_count]) { case KAA_SERVICE_BOOTSTRAP: { error_code = kaa_channel_manager_bootstrap_request_serialize(self->kaa_context->channel_manager , writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the bootstrap extension"); break; } case KAA_SERVICE_PROFILE: { bool need_resync = false; error_code = kaa_profile_need_profile_resync(self->kaa_context->profile_manager , &need_resync); if (!error_code) { if (need_resync) { error_code = kaa_profile_request_serialize(self->kaa_context->profile_manager, writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the profile extension"); } else { --total_services_count; } } else { KAA_LOG_ERROR(self->logger, error_code, "Failed to read profile's 'need_resync' flag"); } break; } case KAA_SERVICE_USER: { error_code = kaa_user_request_serialize(self->kaa_context->user_manager, writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the user extension"); break; } case KAA_SERVICE_EVENT: { #ifndef KAA_DISABLE_FEATURE_EVENTS error_code = kaa_event_request_serialize(self->kaa_context->event_manager, self->request_id, writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the event extension"); #else --total_services_count; #endif break; } case KAA_SERVICE_LOGGING: { #ifndef KAA_DISABLE_FEATURE_LOGGING bool need_resync = false; error_code = kaa_logging_need_logging_resync(self->kaa_context->log_collector, &need_resync); if (!error_code) { if (need_resync) { error_code = kaa_logging_request_serialize(self->kaa_context->log_collector, writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the logging extension"); } else { --total_services_count; } } else { KAA_LOG_ERROR(self->logger, error_code, "Failed to read logging's 'need_resync' flag"); } #else --total_services_count; #endif break; } case KAA_SERVICE_CONFIGURATION: { #ifndef KAA_DISABLE_FEATURE_CONFIGURATION error_code = kaa_configuration_manager_request_serialize(self->kaa_context->configuration_manager, writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the configuration extension"); #else --total_services_count; #endif break; } case KAA_SERVICE_NOTIFICATION: { #ifndef KAA_DISABLE_FEATURE_NOTIFICATION error_code = kaa_notification_manager_request_serialize(self->kaa_context->notification_manager, writer); if (error_code) KAA_LOG_ERROR(self->logger, error_code, "Failed to serialize the configuration extension"); #else --total_services_count; #endif break; } default: break; } } *(uint16_t *) extension_count_p = KAA_HTONS(total_services_count); *size = writer->current - writer->begin; kaa_platform_message_writer_destroy(writer); return error_code; }
void test_meta_extension_serialize(void) { KAA_TRACE_IN(logger); size_t meta_extension_size; kaa_error_t error_code = kaa_meta_data_request_get_size(&meta_extension_size); char buffer[meta_extension_size]; kaa_platform_message_writer_t *writer; error_code = kaa_platform_message_writer_create(&writer, buffer, meta_extension_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); uint32_t expected_timeout = KAA_SYNC_TIMEOUT; kaa_digest expected_public_key_hash = {0x74, 0xc7, 0x51, 0x43, 0x00, 0xf7, 0xb8, 0x21, 0x2c, 0xc3, 0x6b, 0xa5, 0x9c, 0xb4, 0x03, 0xef, 0xc2, 0x5c, 0x65, 0x6c}; kaa_digest expected_profile_hash = {0xfa, 0x71, 0xb5, 0x02, 0xe7, 0xdf, 0x96, 0x86, 0x6c, 0xdc, 0xe1, 0x4a, 0x17, 0x35, 0x7f, 0xd9, 0xa8, 0xfb, 0x71, 0x09}; error_code = ext_copy_sha_hash(status->endpoint_public_key_hash, expected_public_key_hash); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = ext_copy_sha_hash(status->profile_hash, expected_profile_hash); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_context_t *context = NULL; kaa_init(&context); kaa_platform_protocol_t *protocol = NULL; kaa_platform_protocol_create(&protocol, context, status); error_code = kaa_meta_data_request_serialize(protocol, writer, 1); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_deinit(context); kaa_platform_message_reader_t *reader; error_code = kaa_platform_message_reader_create(&reader, buffer, meta_extension_size); ASSERT_EQUAL(error_code, KAA_ERR_NONE); uint8_t extension_type; uint32_t extension_options; uint32_t extension_payload; error_code = kaa_platform_message_read_extension_header( reader, &extension_type, &extension_options, &extension_payload); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL(extension_type, KAA_META_DATA_EXTENSION_TYPE); ASSERT_EQUAL(extension_options, (TIMEOUT_VALUE | PUBLIC_KEY_HASH_VALUE | PROFILE_HASH_VALUE | APP_TOKEN_VALUE)); ASSERT_EQUAL(extension_payload, meta_extension_size - KAA_EXTENSION_HEADER_SIZE); uint32_t request_id; uint32_t timeout; kaa_digest public_key_hash; kaa_digest profile_hash; char sdk_token[KAA_SDK_TOKEN_LENGTH]; error_code = kaa_platform_message_read(reader, &request_id, sizeof(uint32_t)); ASSERT_EQUAL(error_code, KAA_ERR_NONE); ASSERT_EQUAL(KAA_NTOHL(request_id), 1); error_code = kaa_platform_message_read(reader, &timeout, sizeof(uint32_t)); ASSERT_EQUAL(error_code, KAA_ERR_NONE); timeout = KAA_NTOHL(timeout); ASSERT_EQUAL(expected_timeout, timeout); error_code = kaa_platform_message_read_aligned(reader, public_key_hash, SHA_1_DIGEST_LENGTH); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = (memcmp(public_key_hash, expected_public_key_hash, SHA_1_DIGEST_LENGTH) == 0 ? KAA_ERR_NONE : KAA_ERR_READ_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_read_aligned(reader, profile_hash, SHA_1_DIGEST_LENGTH); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = (memcmp(profile_hash, expected_profile_hash, SHA_1_DIGEST_LENGTH) == 0 ? KAA_ERR_NONE : KAA_ERR_READ_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = kaa_platform_message_read_aligned(reader, sdk_token, KAA_SDK_TOKEN_LENGTH); ASSERT_EQUAL(error_code, KAA_ERR_NONE); error_code = (memcmp(sdk_token, KAA_SDK_TOKEN, KAA_SDK_TOKEN_LENGTH) == 0 ? KAA_ERR_NONE : KAA_ERR_READ_FAILED); ASSERT_EQUAL(error_code, KAA_ERR_NONE); kaa_platform_message_reader_destroy(reader); kaa_platform_message_writer_destroy(writer); }