X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=t%2Funit%2Futils%2Fproto_test.c;h=fa6bfcfb7e133ce705ce8e8ab13e7ea37308ac7b;hb=6f1ea6365001d494aa358727ac031966dad4d426;hp=442234e62c641e4fa0f4d1fe1678e5acd7c745ac;hpb=4b1c3e70c727641934d697339cad02cda0a3c565;p=sysdb.git diff --git a/t/unit/utils/proto_test.c b/t/unit/utils/proto_test.c index 442234e..fa6bfcf 100644 --- a/t/unit/utils/proto_test.c +++ b/t/unit/utils/proto_test.c @@ -25,30 +25,43 @@ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#if HAVE_CONFIG_H +# include "config.h" +#endif + #include "core/store.h" #include "utils/proto.h" -#include "libsysdb_test.h" +#include "testutils.h" #include +#include #include #include +static bool +streq(const char *s1, const char *s2) +{ + if ((! s1) || (! s2)) + return (s1 == NULL) == (s2 == NULL); + return strcmp(s1, s2) == 0; +} /* streq */ + START_TEST(test_marshal_data) { -#define INT_TYPE "\0\0\0\1" -#define DECIMAL_TYPE "\0\0\0\2" -#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 INT_TYPE "\0\0\0\2" +#define DECIMAL_TYPE "\0\0\0\3" +#define STRING_TYPE "\0\0\0\4" +#define DATETIME_TYPE "\0\0\0\5" +#define BINARY_TYPE "\0\0\0\6" +#define REGEX_TYPE "\0\0\0\7" #define NULL_ARRAY "\0\0\1\0" -#define INT_ARRAY "\0\0\1\1" -#define DECIMAL_ARRAY "\0\0\1\2" -#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" +#define INT_ARRAY "\0\0\1\2" +#define DECIMAL_ARRAY "\0\0\1\3" +#define STRING_ARRAY "\0\0\1\4" +#define DATETIME_ARRAY "\0\0\1\5" +#define BINARY_ARRAY "\0\0\1\6" +#define REGEX_ARRAY "\0\0\1\7" regex_t dummy_re; int64_t int_values[] = { 47, 11, 23 }; @@ -144,32 +157,52 @@ START_TEST(test_marshal_data) for (i = 0; i < SDB_STATIC_ARRAY_LEN(golden_data); ++i) { ssize_t len = sdb_proto_marshal_data(NULL, 0, &golden_data[i].datum); char buf[len > 0 ? len : 1]; - char v[sdb_data_strlen(&golden_data[i].datum)]; + char v1[sdb_data_strlen(&golden_data[i].datum)]; + char v2[sdb_data_strlen(&golden_data[i].datum)]; - if (sdb_data_format(&golden_data[i].datum, v, sizeof(v), 0) < 0) - snprintf(v, sizeof(v), ""); + sdb_data_t datum = SDB_DATA_INIT; + ssize_t check; + + if (! sdb_data_format(&golden_data[i].datum, v1, sizeof(v1), 0)) + snprintf(v1, sizeof(v1), ""); fail_unless(len == golden_data[i].expected_len, - "sdb_proto_marshal_data(NULL, 0, %s) = %zi; expected: %zi", - v, len, golden_data[i].expected_len); + "<%zu> sdb_proto_marshal_data(NULL, 0, %s) = %zi; expected: %zi", + i, v1, len, golden_data[i].expected_len); if (len < 0) continue; len = sdb_proto_marshal_data(buf, sizeof(buf), &golden_data[i].datum); fail_unless(len == golden_data[i].expected_len, - "sdb_proto_marshal_data(, %zu, %s) = %zi; expected: %zi", - sizeof(buf), v, len, golden_data[i].expected_len); + "<%zu> sdb_proto_marshal_data(, %zu, %s) = %zi; expected: %zi", + i, sizeof(buf), v1, 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("sdb_proto_marshal_data(%s) -> \"%s\"; expected: \"%s\" " + fail("<%zu> sdb_proto_marshal_data(%s) -> \"%s\"; expected: \"%s\" " "(bytes %zu differ: '%x' != '%x')", - v, buf, golden_data[i].expected, + i, v1, buf, golden_data[i].expected, pos, (int)buf[pos], (int)golden_data[i].expected[pos]); } + + check = sdb_proto_unmarshal_data(buf, len, &datum); + if (! sdb_data_format(&datum, v2, sizeof(v2), 0)) + snprintf(v2, sizeof(v2), ""); + + if (sdb_data_isnull(&golden_data[i].datum)) + fail_unless(sdb_data_isnull(&datum), + "<%zu> sdb_proto_unmarshal_data(buf<%s>) -> \"%s\"", i, v1, v2); + else + fail_unless(sdb_data_cmp(&golden_data[i].datum, &datum) == 0, + "<%zu> sdb_proto_unmarshal_data(buf<%s>) -> \"%s\"", i, v1, v2); + fail_unless(check == len, + "<%zu> sdb_proto_unmarshal_data(buf<%s>) = %zi; expected: %zi", + i, v1, check, len); + + sdb_data_free_datum(&datum); } } END_TEST @@ -205,6 +238,9 @@ START_TEST(test_marshal_host) ssize_t len = sdb_proto_marshal_host(NULL, 0, &golden_data[i].host); char buf[len > 0 ? len : 1]; + sdb_proto_host_t host; + ssize_t check; + 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); @@ -227,6 +263,17 @@ START_TEST(test_marshal_host) i, golden_data[i].host.name, buf, golden_data[i].expected, pos, (int)buf[pos], (int)golden_data[i].expected[pos]); } + + check = sdb_proto_unmarshal_host(buf, len, &host); + fail_unless(check == len, + "<%zu> sdb_proto_unmarshal_host(buf<%s>) = %zi; expected: %zi", + i, golden_data[i].host.name, check, len); + fail_unless((host.last_update == golden_data[i].host.last_update) + && streq(host.name, golden_data[i].host.name), + "<%zu> sdb_proto_unmarshal_host(buf<%s>) = { %"PRIsdbTIME", %s }; " + "expected: { %"PRIsdbTIME", %s }", i, golden_data[i].host.name, + host.last_update, host.name, golden_data[i].host.last_update, + golden_data[i].host.name); } } END_TEST @@ -257,6 +304,9 @@ START_TEST(test_marshal_service) ssize_t len = sdb_proto_marshal_service(NULL, 0, &golden_data[i].svc); char buf[len > 0 ? len : 1]; + sdb_proto_service_t svc; + ssize_t check; + 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); @@ -279,6 +329,18 @@ START_TEST(test_marshal_service) i, golden_data[i].svc.name, buf, golden_data[i].expected, pos, (int)buf[pos], (int)golden_data[i].expected[pos]); } + + check = sdb_proto_unmarshal_service(buf, len, &svc); + fail_unless(check == len, + "<%zu> sdb_proto_unmarshal_service(buf<%s>) = %zi; expected: %zi", + i, golden_data[i].svc.name, check, len); + fail_unless((svc.last_update == golden_data[i].svc.last_update) + && streq(svc.hostname, golden_data[i].svc.hostname) + && streq(svc.name, golden_data[i].svc.name), + "<%zu> sdb_proto_unmarshal_service(buf<%s>) = { %"PRIsdbTIME", %s, %s }; " + "expected: { %"PRIsdbTIME", %s, %s }", i, golden_data[i].svc.name, + svc.last_update, svc.hostname, svc.name, golden_data[i].svc.last_update, + golden_data[i].svc.hostname, golden_data[i].svc.name); } } END_TEST @@ -321,6 +383,9 @@ START_TEST(test_marshal_metric) ssize_t len = sdb_proto_marshal_metric(NULL, 0, &golden_data[i].metric); char buf[len > 0 ? len : 1]; + sdb_proto_metric_t metric; + ssize_t check; + 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); @@ -343,37 +408,61 @@ START_TEST(test_marshal_metric) i, golden_data[i].metric.name, buf, golden_data[i].expected, pos, (int)buf[pos], (int)golden_data[i].expected[pos]); } + + if ((! golden_data[i].metric.store_type) + || (! golden_data[i].metric.store_id)) { + /* if any of these is NULL, we expect both to be NULL */ + golden_data[i].metric.store_type = NULL; + golden_data[i].metric.store_id = NULL; + } + + check = sdb_proto_unmarshal_metric(buf, len, &metric); + fail_unless(check == len, + "<%zu> sdb_proto_unmarshal_metric(buf<%s>) = %zi; expected: %zi", + i, golden_data[i].metric.name, check, len); + fail_unless((metric.last_update == golden_data[i].metric.last_update) + && streq(metric.hostname, golden_data[i].metric.hostname) + && streq(metric.name, golden_data[i].metric.name) + && streq(metric.store_type, golden_data[i].metric.store_type) + && streq(metric.store_id, golden_data[i].metric.store_id), + "<%zu> sdb_proto_unmarshal_metric(buf<%s>) = " + "{ %"PRIsdbTIME", %s, %s, %s, %s }; expected: " + "{ %"PRIsdbTIME", %s, %s, %s, %s }", i, golden_data[i].metric.name, + metric.last_update, metric.hostname, metric.name, + metric.store_type, metric.store_id, + golden_data[i].metric.last_update, + golden_data[i].metric.hostname, golden_data[i].metric.name, + golden_data[i].metric.store_type, golden_data[i].metric.store_id); } } END_TEST START_TEST(test_marshal_attribute) { - sdb_data_t v = { SDB_TYPE_NULL, { .integer = 0 } }; -#define VAL "\0\0\0\0" + sdb_data_t v = { SDB_TYPE_INTEGER, { .integer = 4711 } }; +#define VAL "\0\0\0\2" "\0\0\0\0\0\0\x12\x67" 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_HOST, NULL, "hostA", "k1", v }, + 33, 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_SERVICE, "hostA", "svc1", "k1", v }, + 38, 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_METRIC, "hostA", "m1", "k1", v }, + 36, 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 }, + { { 4711, SDB_HOST, NULL, NULL, "k1", v }, -1, NULL }, + { { 4711, SDB_HOST, NULL, "hostA", NULL, v }, -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; @@ -382,6 +471,11 @@ START_TEST(test_marshal_attribute) ssize_t len = sdb_proto_marshal_attribute(NULL, 0, &golden_data[i].attr); char buf[len > 0 ? len : 1]; + sdb_proto_attribute_t attr; + ssize_t check; + char v1[sdb_data_strlen(&golden_data[i].attr.value) + 1]; + char v2[sdb_data_strlen(&golden_data[i].attr.value) + 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); @@ -404,26 +498,47 @@ START_TEST(test_marshal_attribute) i, golden_data[i].attr.key, buf, golden_data[i].expected, pos, (int)buf[pos], (int)golden_data[i].expected[pos]); } + + if (! sdb_data_format(&golden_data[i].attr.value, v1, sizeof(v1), 0)) + snprintf(v1, sizeof(v1), ""); + + check = sdb_proto_unmarshal_attribute(buf, len, &attr); + fail_unless(check == len, + "<%zu> sdb_proto_unmarshal_attribute(buf<%s>) = %zi; expected: %zi", + i, golden_data[i].attr.key, check, len); + + if (! sdb_data_format(&attr.value, v2, sizeof(v2), 0)) + snprintf(v2, sizeof(v2), ""); + fail_unless((attr.last_update == golden_data[i].attr.last_update) + && (attr.parent_type == golden_data[i].attr.parent_type) + && streq(attr.hostname, golden_data[i].attr.hostname) + && streq(attr.parent, golden_data[i].attr.parent) + && streq(attr.key, golden_data[i].attr.key) + && (sdb_data_cmp(&attr.value, &golden_data[i].attr.value) == 0), + "<%zu> sdb_proto_unmarshal_attribute(buf<%s>) = " + "{ %"PRIsdbTIME", %s, %s, %s, %s, %s }; expected: " + "{ %"PRIsdbTIME", %s, %s, %s, %s, %s }", i, golden_data[i].attr.key, + attr.last_update, SDB_STORE_TYPE_TO_NAME(attr.parent_type), + attr.hostname, attr.parent, attr.key, v1, + golden_data[i].attr.last_update, + SDB_STORE_TYPE_TO_NAME(golden_data[i].attr.parent_type), + golden_data[i].attr.hostname, golden_data[i].attr.parent, + golden_data[i].attr.key, v2); } } END_TEST -Suite * -util_proto_suite(void) +TEST_MAIN("utils::proto") { - Suite *s = suite_create("utils::proto"); - TCase *tc; - - tc = tcase_create("core"); + TCase *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; -} /* util_proto_suite */ + ADD_TCASE(tc); +} +TEST_MAIN_END /* vim: set tw=78 sw=4 ts=4 noexpandtab : */