diff options
| author | chenzizhan <[email protected]> | 2023-07-28 18:23:37 +0800 |
|---|---|---|
| committer | chenzizhan <[email protected]> | 2023-07-28 18:23:37 +0800 |
| commit | bd9f342bc4e654315ece82b0c70555a7cc5029f5 (patch) | |
| tree | 1b0289cc285cbf472cd08e407339d8789a6bdba4 | |
| parent | 04148e6f3eeda348d148cd6c34e888eba6440b5f (diff) | |
base 64 test
| -rw-r--r-- | src/tags/cell_manager.c | 3 | ||||
| -rw-r--r-- | test/test_metric_histogram.cpp | 27 | ||||
| -rw-r--r-- | test/test_metric_hll.cpp | 49 |
3 files changed, 72 insertions, 7 deletions
diff --git a/src/tags/cell_manager.c b/src/tags/cell_manager.c index 6134f95..933a150 100644 --- a/src/tags/cell_manager.c +++ b/src/tags/cell_manager.c @@ -126,9 +126,6 @@ void cell_manager_id_tag_array_add(struct cell_manager *pthis, int cell_id, cons } } -// todo: 如果一个用例仅做添加操作,那不需要id tag map -// 在query / merge/ serialize时再生成? -// 最麻烦的是,这样就有两种instance,感觉有点怪。 int cell_manager_update_id_tag_map(struct cell_manager *pthis) { if (pthis->id_tag_array != NULL) { diff --git a/test/test_metric_histogram.cpp b/test/test_metric_histogram.cpp index 5e3590f..651f7a3 100644 --- a/test/test_metric_histogram.cpp +++ b/test/test_metric_histogram.cpp @@ -120,6 +120,31 @@ TEST(metric_test_histogram, serialization_and_merge_twice_with_reset) fieldstat_free(instance_total); } +#include "base64/b64.h" +#include "hdr/hdr_histogram.h" +#include "hdr/hdr_histogram_log.h" +TEST(metric_test_histogram, serialize_with_b64_and_query) +{ + struct fieldstat *instance = test_init_standard_instance_one_cube_one_metric_one_cell_hdr(); + fieldstat_histogram_record(instance, 0, 0, 0, 1234); + fieldstat_histogram_record(instance, 0, 0, 0, 1234); + fieldstat_histogram_record(instance, 0, 0, 0, 123); + + char *blob = NULL; + size_t blob_len = 0; + fieldstat_get_serialized_blob(instance, 0, 0, 0, &blob, &blob_len); + struct hdr_histogram *histogram = NULL; + hdr_log_decode(&histogram, blob, blob_len); + EXPECT_TRUE(histogram != NULL); + EXPECT_EQ(histogram->total_count, 3); + EXPECT_EQ(hdr_value_at_percentile(histogram, 50.0), 1234); + + free(blob); + hdr_close(histogram); + + fieldstat_free(instance); +} + TEST(metric_test_histogram, add_or_set_with_wrong_cell_id_expecting_fail) { struct fieldstat *instance = fieldstat_new(); @@ -161,8 +186,6 @@ TEST(metric_test_histogram, add_with_wrong_metric_id_expecting_fail) fieldstat_free(instance); } -// todo:测base 64序列化 - int main(int argc, char *argv[]) { testing::InitGoogleTest(&argc, argv); diff --git a/test/test_metric_hll.cpp b/test/test_metric_hll.cpp index cbe6d3c..3be2850 100644 --- a/test/test_metric_hll.cpp +++ b/test/test_metric_hll.cpp @@ -118,6 +118,53 @@ TEST(metric_test_hll, serialization_and_merge_twice_with_reset) fieldstat_free(instance_total); } + +#define BigLittleSwap32(A) ((((uint32_t)(A) & 0xff000000) >> 24) | \ + (((uint32_t)(A) & 0x00ff0000) >> 8) | \ + (((uint32_t)(A) & 0x0000ff00) << 8) | \ + (((uint32_t)(A) & 0x000000ff) << 24)) +#include "base64/b64.h" +#include "st_hyperloglog.h" +TEST(metric_test_hll, serialize_with_b64_and_query) +{ + struct fieldstat *instance = test_init_standard_instance_one_cube_one_metric_one_cell_hll(); + fieldstat_hll_add(instance, 0, 0, 0, "hello", 5); + fieldstat_hll_add(instance, 0, 0, 0, "wor", 3); + fieldstat_hll_add(instance, 0, 0, 0, "world", 5); + + char *blob = NULL; + size_t blob_len = 0; + fieldstat_get_serialized_blob(instance, 0, 0, 0, &blob, &blob_len); + size_t dec_size = 0; + unsigned char *dec = b64_decode_ex(blob, blob_len, &dec_size); + + unsigned char version; + memcpy(&version, dec, sizeof(unsigned char)); + EXPECT_EQ(version, 1); + unsigned char precision; + memcpy(&precision, dec + sizeof(unsigned char), sizeof(unsigned char)); + EXPECT_EQ(precision, 10); // the one initialized in test_init_standard_instance_one_cube_one_metric_one_cell_hll + + struct ST_hyperloglog *hll_from_blob = ST_hyperloglog_new(precision); + int num_reg = NUM_REG(precision); + int words = INT_CEIL(num_reg, REG_PER_WORD); + size_t reg_size = words * sizeof(uint32_t); + + uint32_t *registers = (uint32_t *)malloc(reg_size); + memcpy(registers, dec + 2 * sizeof(unsigned char), reg_size); + for (int i = 0; i < words; i++) { + registers[i] = BigLittleSwap32(registers[i]); + } + memcpy(hll_from_blob->registers, registers, reg_size); + free(registers); + + EXPECT_NEAR(ST_hyperloglog_count(hll_from_blob), 3, 0.5); + free(blob); + free(dec); + fieldstat_free(instance); + ST_hyperloglog_free(hll_from_blob); +} + TEST(metric_test_histogram, add_or_set_with_wrong_cell_id_expecting_fail) { struct fieldstat *instance = fieldstat_new(); @@ -160,8 +207,6 @@ TEST(metric_test_histogram, add_with_wrong_metric_id_expecting_fail) } -// todo:测base 64序列化 - int main(int argc, char *argv[]) { testing::InitGoogleTest(&argc, argv); |
