summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchenzizhan <[email protected]>2023-07-28 18:23:37 +0800
committerchenzizhan <[email protected]>2023-07-28 18:23:37 +0800
commitbd9f342bc4e654315ece82b0c70555a7cc5029f5 (patch)
tree1b0289cc285cbf472cd08e407339d8789a6bdba4
parent04148e6f3eeda348d148cd6c34e888eba6440b5f (diff)
base 64 test
-rw-r--r--src/tags/cell_manager.c3
-rw-r--r--test/test_metric_histogram.cpp27
-rw-r--r--test/test_metric_hll.cpp49
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);