X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=t%2Funit%2Futils%2Fproto_test.c;h=442234e62c641e4fa0f4d1fe1678e5acd7c745ac;hb=4b1c3e70c727641934d697339cad02cda0a3c565;hp=1ec0615fa33fd7a7f29c2796a9c2c369e92afebe;hpb=7624ec9003444dbd76f03dfeda38167f3831fc48;p=sysdb.git diff --git a/t/unit/utils/proto_test.c b/t/unit/utils/proto_test.c index 1ec0615..442234e 100644 --- a/t/unit/utils/proto_test.c +++ b/t/unit/utils/proto_test.c @@ -25,6 +25,7 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include "core/store.h" #include "utils/proto.h" #include "libsysdb_test.h" @@ -39,6 +40,7 @@ START_TEST(test_marshal_data) #define STRING_TYPE "\0\0\0\3" #define DATETIME_TYPE "\0\0\0\4" #define BINARY_TYPE "\0\0\0\5" +#define REGEX_TYPE "\0\0\0\6" #define NULL_ARRAY "\0\0\1\0" #define INT_ARRAY "\0\0\1\1" @@ -46,11 +48,26 @@ START_TEST(test_marshal_data) #define STRING_ARRAY "\0\0\1\3" #define DATETIME_ARRAY "\0\0\1\4" #define BINARY_ARRAY "\0\0\1\5" +#define REGEX_ARRAY "\0\0\1\6" regex_t dummy_re; int64_t int_values[] = { 47, 11, 23 }; double dec_values[] = { 47.11, .5 }; char *string_values[] = { "foo", "abcd" }; + sdb_time_t datetime_values[] = { 4711, 1234567890123456789L }; + struct { + size_t length; + unsigned char *datum; + } binary_values[] = { + { 3, (unsigned char *)"\x1\x2\x3" }, + { 4, (unsigned char *)"\x42\x0\xa\x1b" }, + }; + struct { + char *raw; + regex_t regex; + } regex_values[] = { + { "dummy regex", dummy_re }, + }; struct { sdb_data_t datum; @@ -71,8 +88,7 @@ START_TEST(test_marshal_data) }, { { SDB_TYPE_STRING, { .string = "some string" } }, - /* length includes the null byte */ - 20, STRING_TYPE "\0\0\0\xc" "some string\0", + 16, STRING_TYPE "some string\0", }, { { SDB_TYPE_DATETIME, { .datetime = 1418923804000000 } }, @@ -85,7 +101,7 @@ START_TEST(test_marshal_data) }, { { SDB_TYPE_REGEX, { .re = { "dummy", dummy_re } } }, - -1, NULL, /* not supported */ + 10, REGEX_TYPE "dummy\0", }, { { SDB_TYPE_INTEGER | SDB_TYPE_ARRAY, { .array = { @@ -102,8 +118,24 @@ START_TEST(test_marshal_data) { { SDB_TYPE_STRING | SDB_TYPE_ARRAY, { .array = { 2, string_values } } }, - 25, STRING_ARRAY "\0\0\0\x2" "\0\0\0\x4" "foo\0" - "\0\0\0\x5" "abcd\0" + 17, STRING_ARRAY "\0\0\0\x2" "foo\0" "abcd\0" + }, + { + { SDB_TYPE_DATETIME | SDB_TYPE_ARRAY, { .array = { + 2, datetime_values } } }, + 24, DATETIME_ARRAY "\0\0\0\x2" "\0\0\0\0\0\0\x12\x67" + "\x11\x22\x10\xf4\x7d\xe9\x81\x15" + }, + { + { SDB_TYPE_BINARY | SDB_TYPE_ARRAY, { .array = { + 2, binary_values } } }, + 23, BINARY_ARRAY "\0\0\0\x2" "\0\0\0\x3" "\x1\x2\x3" + "\0\0\0\4" "\x42\x0\xa\x1b" + }, + { + { SDB_TYPE_REGEX | SDB_TYPE_ARRAY, { .array = { + 1, regex_values } } }, + 20, REGEX_ARRAY "\0\0\0\1" "dummy regex\0" }, }; @@ -126,8 +158,8 @@ START_TEST(test_marshal_data) len = sdb_proto_marshal_data(buf, sizeof(buf), &golden_data[i].datum); fail_unless(len == golden_data[i].expected_len, - "sdb_proto_marshal_data(, , %s) = %zi; expected: %zi", - v, len, golden_data[i].expected_len); + "sdb_proto_marshal_data(, %zu, %s) = %zi; expected: %zi", + sizeof(buf), v, len, golden_data[i].expected_len); if (memcmp(buf, golden_data[i].expected, len) != 0) { size_t pos; for (pos = 0; pos < (size_t)len; ++pos) @@ -142,6 +174,240 @@ START_TEST(test_marshal_data) } END_TEST +#define HOST_TYPE "\0\0\0\1" +#define SVC_TYPE "\0\0\0\2" +#define METRIC_TYPE "\0\0\0\3" +#define HOST_ATTR_TYPE "\0\0\0\x11" +#define SVC_ATTR_TYPE "\0\0\0\x12" +#define METRIC_ATTR_TYPE "\0\0\0\x13" + +START_TEST(test_marshal_host) +{ + struct { + sdb_proto_host_t host; + ssize_t expected_len; + char *expected; + } golden_data[] = { + { + { 4711, "hostA" }, + 18, HOST_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0" + }, + { + { 0, "hostA" }, + 18, HOST_TYPE "\0\0\0\0\0\0\0\0" "hostA\0" + }, + { { 4711, NULL }, -1, NULL }, + }; + + size_t i; + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + ssize_t len = sdb_proto_marshal_host(NULL, 0, &golden_data[i].host); + char buf[len > 0 ? len : 1]; + + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_host(NULL, 0, %s) = %zi; expected: %zi", + i, golden_data[i].host.name, len, golden_data[i].expected_len); + + if (len < 0) + continue; + + len = sdb_proto_marshal_host(buf, sizeof(buf), &golden_data[i].host); + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_host(, %zu, %s) = %zi; expected: %zi", + i, sizeof(buf), golden_data[i].host.name, + len, golden_data[i].expected_len); + if (memcmp(buf, golden_data[i].expected, len) != 0) { + size_t pos; + for (pos = 0; pos < (size_t)len; ++pos) + if (buf[pos] != golden_data[i].expected[pos]) + break; + fail("<%zu> sdb_proto_marshal_host(%s) -> \"%s\"; expected: \"%s\" " + "(bytes %zu differ: '%x' != '%x')", + i, golden_data[i].host.name, buf, golden_data[i].expected, + pos, (int)buf[pos], (int)golden_data[i].expected[pos]); + } + } +} +END_TEST + +START_TEST(test_marshal_service) +{ + struct { + sdb_proto_service_t svc; + ssize_t expected_len; + char *expected; + } golden_data[] = { + { + { 4711, "hostA", "serviceX" }, + 27, SVC_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0serviceX\0" + }, + { + { 0, "hostA", "serviceX" }, + 27, SVC_TYPE "\0\0\0\0\0\0\0\0" "hostA\0serviceX\0" + }, + { { 4711, "hostA", NULL }, -1, NULL }, + { { 4711, NULL, "serviceX" }, -1, NULL }, + { { 4711, NULL, NULL }, -1, NULL }, + }; + + size_t i; + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + ssize_t len = sdb_proto_marshal_service(NULL, 0, &golden_data[i].svc); + char buf[len > 0 ? len : 1]; + + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_service(NULL, 0, %s) = %zi; expected: %zi", + i, golden_data[i].svc.name, len, golden_data[i].expected_len); + + if (len < 0) + continue; + + len = sdb_proto_marshal_service(buf, sizeof(buf), &golden_data[i].svc); + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_service(, %zu, %s) = %zi; expected: %zi", + i, sizeof(buf), golden_data[i].svc.name, + len, golden_data[i].expected_len); + if (memcmp(buf, golden_data[i].expected, len) != 0) { + size_t pos; + for (pos = 0; pos < (size_t)len; ++pos) + if (buf[pos] != golden_data[i].expected[pos]) + break; + fail("<%zu> sdb_proto_marshal_service(%s) -> \"%s\"; expected: \"%s\" " + "(bytes %zu differ: '%x' != '%x')", + i, golden_data[i].svc.name, buf, golden_data[i].expected, + pos, (int)buf[pos], (int)golden_data[i].expected[pos]); + } + } +} +END_TEST + +START_TEST(test_marshal_metric) +{ + struct { + sdb_proto_metric_t metric; + ssize_t expected_len; + char *expected; + } golden_data[] = { + { + { 4711, "hostA", "metricX", NULL, NULL }, + 26, METRIC_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0metricX\0" + }, + { + { 0, "hostA", "metricX", NULL, NULL }, + 26, METRIC_TYPE "\0\0\0\0\0\0\0\0" "hostA\0metricX\0" + }, + { + { 0, "hostA", "metricX", "type", NULL }, + 26, METRIC_TYPE "\0\0\0\0\0\0\0\0" "hostA\0metricX\0" + }, + { + { 0, "hostA", "metricX", NULL, "id" }, + 26, METRIC_TYPE "\0\0\0\0\0\0\0\0" "hostA\0metricX\0" + }, + { + { 4711, "hostA", "metricX", "type", "id" }, + 34, METRIC_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0metricX\0type\0id\0" + }, + { { 4711, "hostA", NULL, NULL, NULL }, -1, NULL }, + { { 4711, NULL, "metricX", NULL, NULL }, -1, NULL }, + { { 4711, NULL, NULL, NULL, NULL }, -1, NULL }, + }; + + size_t i; + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + ssize_t len = sdb_proto_marshal_metric(NULL, 0, &golden_data[i].metric); + char buf[len > 0 ? len : 1]; + + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_metric(NULL, 0, %s) = %zi; expected: %zi", + i, golden_data[i].metric.name, len, golden_data[i].expected_len); + + if (len < 0) + continue; + + len = sdb_proto_marshal_metric(buf, sizeof(buf), &golden_data[i].metric); + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_metric(, %zu, %s) = %zi; expected: %zi", + i, sizeof(buf), golden_data[i].metric.name, + len, golden_data[i].expected_len); + if (memcmp(buf, golden_data[i].expected, len) != 0) { + size_t pos; + for (pos = 0; pos < (size_t)len; ++pos) + if (buf[pos] != golden_data[i].expected[pos]) + break; + fail("<%zu> sdb_proto_marshal_metric(%s) -> \"%s\"; expected: \"%s\" " + "(bytes %zu differ: '%x' != '%x')", + i, golden_data[i].metric.name, buf, golden_data[i].expected, + pos, (int)buf[pos], (int)golden_data[i].expected[pos]); + } + } +} +END_TEST + +START_TEST(test_marshal_attribute) +{ + sdb_data_t v = { SDB_TYPE_NULL, { .integer = 0 } }; +#define VAL "\0\0\0\0" + struct { + sdb_proto_attribute_t attr; + ssize_t expected_len; + char *expected; + } golden_data[] = { + { + { 4711, SDB_HOST, NULL, "hostA", "k1", &v }, + 25, HOST_ATTR_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0" "k1\0" VAL + }, + { + { 4711, SDB_SERVICE, "hostA", "svc1", "k1", &v }, + 30, SVC_ATTR_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0" "svc1\0" "k1\0" VAL + }, + { + { 4711, SDB_METRIC, "hostA", "m1", "k1", &v }, + 28, METRIC_ATTR_TYPE "\0\0\0\0\0\0\x12\x67" "hostA\0" "m1\0" "k1\0" VAL + }, + { { 4711, SDB_HOST, NULL, NULL, "k1", &v }, -1, NULL }, + { { 4711, SDB_HOST, NULL, "hostA", NULL, &v }, -1, NULL }, + { { 4711, SDB_HOST, NULL, "hostA", "k1", NULL }, -1, NULL }, + { { 4711, SDB_SERVICE, NULL, "svc1", "k1", &v }, -1, NULL }, + { { 4711, SDB_METRIC, NULL, "m1", "k1", &v }, -1, NULL }, + { { 4711, 0, "hostA", "svc1", "k1", &v }, -1, NULL }, + }; + + size_t i; + + for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { + ssize_t len = sdb_proto_marshal_attribute(NULL, 0, &golden_data[i].attr); + char buf[len > 0 ? len : 1]; + + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_attribute(NULL, 0, %s) = %zi; expected: %zi", + i, golden_data[i].attr.key, len, golden_data[i].expected_len); + + if (len < 0) + continue; + + len = sdb_proto_marshal_attribute(buf, sizeof(buf), &golden_data[i].attr); + fail_unless(len == golden_data[i].expected_len, + "<%zu> sdb_proto_marshal_attribute(, %zu, %s) = %zi; expected: %zi", + i, sizeof(buf), golden_data[i].attr.key, + len, golden_data[i].expected_len); + if (memcmp(buf, golden_data[i].expected, len) != 0) { + size_t pos; + for (pos = 0; pos < (size_t)len; ++pos) + if (buf[pos] != golden_data[i].expected[pos]) + break; + fail("<%zu> sdb_proto_marshal_attribute(%s) -> \"%s\"; expected: \"%s\" " + "(bytes %zu differ: '%x' != '%x')", + i, golden_data[i].attr.key, buf, golden_data[i].expected, + pos, (int)buf[pos], (int)golden_data[i].expected[pos]); + } + } +} +END_TEST + Suite * util_proto_suite(void) { @@ -150,6 +416,10 @@ util_proto_suite(void) tc = tcase_create("core"); tcase_add_test(tc, test_marshal_data); + tcase_add_test(tc, test_marshal_host); + tcase_add_test(tc, test_marshal_service); + tcase_add_test(tc, test_marshal_metric); + tcase_add_test(tc, test_marshal_attribute); suite_add_tcase(s, tc); return s;