static char* test_encode_and_decode_compressed_large() { const int64_t limit = INT64_C(3600) * 1000 * 1000; struct hdr_histogram* actual = NULL; struct hdr_histogram* expected = NULL; uint8_t* buffer = NULL; size_t len = 0; int rc = 0; hdr_init(1, limit, 4, &expected); srand(5); int i; for (i = 0; i < 8070; i++) { hdr_record_value(expected, rand() % limit); } rc = hdr_encode_compressed(expected, &buffer, &len); mu_assert("Did not encode", validate_return_code(rc)); rc = hdr_decode_compressed(buffer, len, &actual); mu_assert("Did not decode", validate_return_code(rc)); mu_assert("Loaded histogram is null", actual != NULL); mu_assert( "Comparison did not match", compare_histogram(expected, actual)); free(expected); free(actual); return 0; }
static char* test_encode_and_decode_compressed2() { load_histograms(); uint8_t* buffer = NULL; size_t len = 0; int rc = 0; struct hdr_histogram* actual = NULL; struct hdr_histogram* expected = cor_histogram; rc = hdr_encode_compressed(expected, &buffer, &len); mu_assert("Did not encode", validate_return_code(rc)); rc = hdr_decode_compressed(buffer, len, &actual); mu_assert("Did not decode", validate_return_code(rc)); mu_assert("Loaded histogram is null", actual != NULL); mu_assert( "Comparison did not match", compare_histogram(expected, actual)); free(actual); return 0; }
int hdr_log_decode(struct hdr_histogram** histogram, char* base64_histogram, size_t base64_len) { int r; uint8_t* compressed_histogram = NULL; int result = 0; size_t compressed_len = hdr_base64_decoded_len(base64_len); compressed_histogram = malloc(sizeof(uint8_t)*compressed_len); memset(compressed_histogram, 0, compressed_len); r = hdr_base64_decode( base64_histogram, base64_len, compressed_histogram, compressed_len); if (r != 0) { FAIL_AND_CLEANUP(cleanup, result, r); } r = hdr_decode_compressed(compressed_histogram, compressed_len, histogram); if (r != 0) { FAIL_AND_CLEANUP(cleanup, result, r); } cleanup: free(compressed_histogram); return result; }
static char* test_encode_and_decode_compressed() { load_histograms(); size_t raw_histogram_size = hdr_get_memory_size(raw_histogram); uint8_t* buffer = (uint8_t*) malloc(hdr_get_memory_size(raw_histogram)); size_t encode_result = hdr_encode_compressed(raw_histogram, buffer, raw_histogram_size); mu_assert("Did not encode", encode_result == 0); int32_t compressed_length = hdr_get_compressed_length(buffer); struct hdr_histogram* loaded_histogram = NULL; int decode_result = hdr_decode_compressed(buffer, compressed_length, &loaded_histogram); if (decode_result != 0) { printf("%s\n", hdr_strerror(decode_result)); } mu_assert("Did not decode", decode_result == 0); mu_assert("Loaded histogram is null", loaded_histogram != NULL); int compare_result = memcmp(raw_histogram, loaded_histogram, raw_histogram_size); mu_assert("Comparison did not match", compare_result == 0); return 0; }
static char* test_bounds_check_on_decode() { load_histograms(); uint8_t* buffer = NULL; size_t len = 0; int rc = 0; struct hdr_histogram* actual = NULL; struct hdr_histogram* expected = cor_histogram; rc = hdr_encode_compressed(expected, &buffer, &len); mu_assert("Did not encode", validate_return_code(rc)); rc = hdr_decode_compressed(buffer, len - 1, &actual); mu_assert("Should have be invalid", compare_int64(EINVAL, rc)); mu_assert("Should not have built histogram", NULL == actual); return 0; }
int hdr_log_read( struct hdr_log_reader* reader, FILE* file, struct hdr_histogram** histogram, struct timespec* timestamp, struct timespec* interval) { const char* format = "%d.%d,%d.%d,%d.%d,%s"; char* base64_histogram = NULL; uint8_t* compressed_histogram = NULL; char* line = NULL; size_t line_len = 0; int result = 0; int begin_s = 0; int begin_ms = 0; int end_s = 0; int end_ms = 0; int interval_max_s = 0; int interval_max_ms = 0; (void)reader; ssize_t read = getline(&line, &line_len, file); if (-1 == read) { if (0 == errno) { FAIL_AND_CLEANUP(cleanup, result, EOF); } else { FAIL_AND_CLEANUP(cleanup, result, EIO); } } null_trailing_whitespace(line, read); if (strlen(line) == 0) { FAIL_AND_CLEANUP(cleanup, result, EOF); } int r; r = realloc_buffer((void**)&base64_histogram, sizeof(char), read); if (r != 0) { FAIL_AND_CLEANUP(cleanup, result, ENOMEM); } r = realloc_buffer((void**)&compressed_histogram, sizeof(uint8_t), read); if (r != 0) { FAIL_AND_CLEANUP(cleanup, result, ENOMEM); } int num_tokens = sscanf( line, format, &begin_s, &begin_ms, &end_s, &end_ms, &interval_max_s, &interval_max_ms, base64_histogram); if (num_tokens != 7) { FAIL_AND_CLEANUP(cleanup, result, EINVAL); } size_t base64_len = strlen(base64_histogram); size_t compressed_len = hdr_base64_decoded_len(base64_len); r = hdr_base64_decode( base64_histogram, base64_len, compressed_histogram, compressed_len); if (r != 0) { FAIL_AND_CLEANUP(cleanup, result, r); } r = hdr_decode_compressed(compressed_histogram, compressed_len, histogram); if (r != 0) { FAIL_AND_CLEANUP(cleanup, result, r); } update_timespec(timestamp, begin_s, begin_ms); update_timespec(interval, end_s, end_ms); cleanup: free(line); free(base64_histogram); free(compressed_histogram); return result; }