X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Fcommon_test.c;h=68958f3f15271db5b66c64dd189e12e2f1c50073;hb=441e067a2d5a294517bd87ca45c87fd67377d2cf;hp=1fa8f324461293c201b30440a8bb3e857062a993;hpb=d9db39b8e8b5e9a34d955d057574f6ddd00759e6;p=collectd.git diff --git a/src/daemon/common_test.c b/src/daemon/common_test.c index 1fa8f324..68958f3f 100644 --- a/src/daemon/common_test.c +++ b/src/daemon/common_test.c @@ -24,8 +24,12 @@ * Florian octo Forster */ -#include "testing.h" #include "common.h" +#include "testing.h" + +#if HAVE_LIBKSTAT +kstat_ctl_t *kc; +#endif /* HAVE_LIBKSTAT */ DEF_TEST(sstrncpy) { @@ -38,18 +42,18 @@ DEF_TEST(sstrncpy) ret = sstrncpy (ptr, "foobar", 8); OK(ret == ptr); - STREQ ("foobar", ptr); + EXPECT_EQ_STR ("foobar", ptr); OK(buffer[3] == buffer[12]); ret = sstrncpy (ptr, "abc", 8); OK(ret == ptr); - STREQ ("abc", ptr); + EXPECT_EQ_STR ("abc", ptr); OK(buffer[3] == buffer[12]); ret = sstrncpy (ptr, "collectd", 8); OK(ret == ptr); OK(ptr[7] == 0); - STREQ ("collect", ptr); + EXPECT_EQ_STR ("collect", ptr); OK(buffer[3] == buffer[12]); return (0); @@ -66,12 +70,12 @@ DEF_TEST(ssnprintf) status = ssnprintf (ptr, 8, "%i", 1337); OK(status == 4); - STREQ ("1337", ptr); + EXPECT_EQ_STR ("1337", ptr); status = ssnprintf (ptr, 8, "%s", "collectd"); OK(status == 8); OK(ptr[7] == 0); - STREQ ("collect", ptr); + EXPECT_EQ_STR ("collect", ptr); OK(buffer[3] == buffer[12]); return (0); @@ -83,10 +87,9 @@ DEF_TEST(sstrdup) ptr = sstrdup ("collectd"); OK(ptr != NULL); - STREQ ("collectd", ptr); + EXPECT_EQ_STR ("collectd", ptr); sfree(ptr); - OK(ptr == NULL); ptr = sstrdup (NULL); OK(ptr == NULL); @@ -103,40 +106,40 @@ DEF_TEST(strsplit) strncpy (buffer, "foo bar", sizeof (buffer)); status = strsplit (buffer, fields, 8); OK(status == 2); - STREQ ("foo", fields[0]); - STREQ ("bar", fields[1]); + EXPECT_EQ_STR ("foo", fields[0]); + EXPECT_EQ_STR ("bar", fields[1]); strncpy (buffer, "foo \t bar", sizeof (buffer)); status = strsplit (buffer, fields, 8); OK(status == 2); - STREQ ("foo", fields[0]); - STREQ ("bar", fields[1]); + EXPECT_EQ_STR ("foo", fields[0]); + EXPECT_EQ_STR ("bar", fields[1]); strncpy (buffer, "one two\tthree\rfour\nfive", sizeof (buffer)); status = strsplit (buffer, fields, 8); OK(status == 5); - STREQ ("one", fields[0]); - STREQ ("two", fields[1]); - STREQ ("three", fields[2]); - STREQ ("four", fields[3]); - STREQ ("five", fields[4]); + EXPECT_EQ_STR ("one", fields[0]); + EXPECT_EQ_STR ("two", fields[1]); + EXPECT_EQ_STR ("three", fields[2]); + EXPECT_EQ_STR ("four", fields[3]); + EXPECT_EQ_STR ("five", fields[4]); strncpy (buffer, "\twith trailing\n", sizeof (buffer)); status = strsplit (buffer, fields, 8); OK(status == 2); - STREQ ("with", fields[0]); - STREQ ("trailing", fields[1]); + EXPECT_EQ_STR ("with", fields[0]); + EXPECT_EQ_STR ("trailing", fields[1]); strncpy (buffer, "1 2 3 4 5 6 7 8 9 10 11 12 13", sizeof (buffer)); status = strsplit (buffer, fields, 8); OK(status == 8); - STREQ ("7", fields[6]); - STREQ ("8", fields[7]); + EXPECT_EQ_STR ("7", fields[6]); + EXPECT_EQ_STR ("8", fields[7]); strncpy (buffer, "single", sizeof (buffer)); status = strsplit (buffer, fields, 8); OK(status == 1); - STREQ ("single", fields[0]); + EXPECT_EQ_STR ("single", fields[0]); strncpy (buffer, "", sizeof (buffer)); status = strsplit (buffer, fields, 8); @@ -158,26 +161,26 @@ DEF_TEST(strjoin) status = strjoin (buffer, sizeof (buffer), fields, 2, "!"); OK(status == 7); - STREQ ("foo!bar", buffer); + EXPECT_EQ_STR ("foo!bar", buffer); status = strjoin (buffer, sizeof (buffer), fields, 1, "!"); OK(status == 3); - STREQ ("foo", buffer); + EXPECT_EQ_STR ("foo", buffer); status = strjoin (buffer, sizeof (buffer), fields, 0, "!"); OK(status < 0); status = strjoin (buffer, sizeof (buffer), fields, 2, "rcht"); OK(status == 10); - STREQ ("foorchtbar", buffer); + EXPECT_EQ_STR ("foorchtbar", buffer); status = strjoin (buffer, sizeof (buffer), fields, 4, ""); OK(status == 12); - STREQ ("foobarbazqux", buffer); + EXPECT_EQ_STR ("foobarbazqux", buffer); status = strjoin (buffer, sizeof (buffer), fields, 4, "!"); OK(status == 15); - STREQ ("foo!bar!baz!qux", buffer); + EXPECT_EQ_STR ("foo!bar!baz!qux", buffer); fields[0] = "0123"; fields[1] = "4567"; @@ -189,6 +192,57 @@ DEF_TEST(strjoin) return (0); } +DEF_TEST(escape_slashes) +{ + struct { + char *str; + char *want; + } cases[] = { + {"foo/bar/baz", "foo_bar_baz"}, + {"/like/a/path", "like_a_path"}, + {"trailing/slash/", "trailing_slash_"}, + {"foo//bar", "foo__bar"}, + }; + size_t i; + + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) { + char buffer[32]; + + strncpy (buffer, cases[i].str, sizeof (buffer)); + OK(escape_slashes (buffer, sizeof (buffer)) == 0); + EXPECT_EQ_STR(cases[i].want, buffer); + } + + return 0; +} + +DEF_TEST(escape_string) +{ + struct { + char *str; + char *want; + } cases[] = { + {"foobar", "foobar"}, + {"f00bar", "f00bar"}, + {"foo bar", "\"foo bar\""}, + {"foo \"bar\"", "\"foo \\\"bar\\\"\""}, + {"012345678901234", "012345678901234"}, + {"012345 78901234", "\"012345 789012\""}, + {"012345 78901\"34", "\"012345 78901\""}, + }; + size_t i; + + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) { + char buffer[16]; + + strncpy (buffer, cases[i].str, sizeof (buffer)); + OK(escape_string (buffer, sizeof (buffer)) == 0); + EXPECT_EQ_STR(cases[i].want, buffer); + } + + return 0; +} + DEF_TEST(strunescape) { char buffer[16]; @@ -197,23 +251,23 @@ DEF_TEST(strunescape) strncpy (buffer, "foo\\tbar", sizeof (buffer)); status = strunescape (buffer, sizeof (buffer)); OK(status == 0); - STREQ ("foo\tbar", buffer); + EXPECT_EQ_STR ("foo\tbar", buffer); strncpy (buffer, "\\tfoo\\r\\n", sizeof (buffer)); status = strunescape (buffer, sizeof (buffer)); OK(status == 0); - STREQ ("\tfoo\r\n", buffer); + EXPECT_EQ_STR ("\tfoo\r\n", buffer); strncpy (buffer, "With \\\"quotes\\\"", sizeof (buffer)); status = strunescape (buffer, sizeof (buffer)); OK(status == 0); - STREQ ("With \"quotes\"", buffer); + EXPECT_EQ_STR ("With \"quotes\"", buffer); /* Backslash before null byte */ strncpy (buffer, "\\tbackslash end\\", sizeof (buffer)); status = strunescape (buffer, sizeof (buffer)); OK(status != 0); - STREQ ("\tbackslash end", buffer); + EXPECT_EQ_STR ("\tbackslash end", buffer); return (0); /* Backslash at buffer end */ @@ -231,6 +285,100 @@ DEF_TEST(strunescape) return (0); } +DEF_TEST(parse_values) +{ + struct { + char buffer[64]; + int status; + gauge_t value; + } cases[] = { + {"1435044576:42", 0, 42.0}, + {"1435044576:42:23", -1, NAN}, + {"1435044576:U", 0, NAN}, + {"N:12.3", 0, 12.3}, + {"N:42.0:23", -1, NAN}, + {"N:U", 0, NAN}, + {"T:42.0", -1, NAN}, + }; + + size_t i; + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) + { + data_source_t dsrc = { + .name = "value", + .type = DS_TYPE_GAUGE, + .min = 0.0, + .max = NAN, + }; + data_set_t ds = { + .type = "example", + .ds_num = 1, + .ds = &dsrc, + }; + + value_t v = { + .gauge = NAN, + }; + value_list_t vl = { + .values = &v, + .values_len = 1, + .time = 0, + .interval = 0, + .host = "example.com", + .plugin = "common_test", + .type = "example", + .meta = NULL, + }; + + int status = parse_values (cases[i].buffer, &vl, &ds); + EXPECT_EQ_INT (cases[i].status, status); + if (status != 0) + continue; + + EXPECT_EQ_DOUBLE (cases[i].value, vl.values[0].gauge); + } + + return (0); +} + +DEF_TEST(value_to_rate) +{ + struct { + time_t t0; + time_t t1; + int ds_type; + value_t v0; + value_t v1; + gauge_t want; + } cases[] = { + { 0, 10, DS_TYPE_DERIVE, {.derive = 0}, {.derive = 1000}, NAN}, + {10, 20, DS_TYPE_DERIVE, {.derive = 1000}, {.derive = 2000}, 100.0}, + {20, 30, DS_TYPE_DERIVE, {.derive = 2000}, {.derive = 1800}, -20.0}, + { 0, 10, DS_TYPE_COUNTER, {.counter = 0}, {.counter = 1000}, NAN}, + {10, 20, DS_TYPE_COUNTER, {.counter = 1000}, {.counter = 5000}, 400.0}, + /* 32bit wrap-around. */ + {20, 30, DS_TYPE_COUNTER, {.counter = 4294967238ULL}, {.counter = 42}, 10.0}, + /* 64bit wrap-around. */ + {30, 40, DS_TYPE_COUNTER, {.counter = 18446744073709551558ULL}, {.counter = 42}, 10.0}, + }; + size_t i; + + for (i = 0; i < STATIC_ARRAY_SIZE (cases); i++) { + value_to_rate_state_t state = { cases[i].v0, TIME_T_TO_CDTIME_T (cases[i].t0) }; + gauge_t got; + + if (cases[i].t0 == 0) { + OK(value_to_rate (&got, cases[i].v1, cases[i].ds_type, TIME_T_TO_CDTIME_T(cases[i].t1), &state) == EAGAIN); + continue; + } + + OK(value_to_rate (&got, cases[i].v1, cases[i].ds_type, TIME_T_TO_CDTIME_T(cases[i].t1), &state) == 0); + EXPECT_EQ_DOUBLE(cases[i].want, got); + } + + return 0; +} + int main (void) { RUN_TEST(sstrncpy); @@ -238,7 +386,11 @@ int main (void) RUN_TEST(sstrdup); RUN_TEST(strsplit); RUN_TEST(strjoin); + RUN_TEST(escape_slashes); + RUN_TEST(escape_string); RUN_TEST(strunescape); + RUN_TEST(parse_values); + RUN_TEST(value_to_rate); END_TEST; }