From: Florian Forster Date: Tue, 28 May 2013 18:57:29 +0000 (+0200) Subject: Move tests and mocks to src/tests/{,mock/}. X-Git-Tag: collectd-5.5.0~274 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=d1abe9536e3f5d87fcf6e98b0b803e9a83cf9846;p=collectd.git Move tests and mocks to src/tests/{,mock/}. --- diff --git a/src/Makefile.am b/src/Makefile.am index 40114652..cba2eb20 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1567,28 +1567,28 @@ uninstall-hook: check_PROGRAMS = common_test utils_avltree_test utils_vl_lookup_test -common_test_SOURCES = common_test.c \ +common_test_SOURCES = tests/common_test.c \ common.h common.c \ - mock/plugin.c \ - mock/utils_cache.c \ - mock/utils_time.c + tests/mock/plugin.c \ + tests/mock/utils_cache.c \ + tests/mock/utils_time.c common_test_CPPFLAGS = $(AM_CPPFLAGS) $(LTDLINCL) common_test_LDFLAGS = -export-dynamic common_test_LDADD = -utils_avltree_test_SOURCES = utils_avltree_test.c \ +utils_avltree_test_SOURCES = tests/utils_avltree_test.c \ utils_avltree.c utils_avltree.h utils_avltree_test_CPPFLAGS = $(AM_CPPFLAGS) $(LTDLINCL) utils_avltree_test_LDFLAGS = -export-dynamic utils_avltree_test_LDADD = -utils_vl_lookup_test_SOURCES = utils_vl_lookup_test.c \ +utils_vl_lookup_test_SOURCES = tests/utils_vl_lookup_test.c \ utils_vl_lookup.h utils_vl_lookup.c \ utils_avltree.c utils_avltree.h \ common.c common.h \ - mock/plugin.c \ - mock/utils_cache.c \ - mock/utils_time.c + tests/mock/plugin.c \ + tests/mock/utils_cache.c \ + tests/mock/utils_time.c utils_vl_lookup_test_CPPFLAGS = $(AM_CPPFLAGS) $(LTDLINCL) utils_vl_lookup_test_CFLAGS = $(AM_CFLAGS) utils_vl_lookup_test_LDFLAGS = -export-dynamic diff --git a/src/common_test.c b/src/common_test.c deleted file mode 100644 index a0d282cd..00000000 --- a/src/common_test.c +++ /dev/null @@ -1,276 +0,0 @@ -/** - * collectd - src/common_test.c - * - * Copyright (C) 2013 Florian octo Forster - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian octo Forster - */ - -#include "common.h" - -static int fail_count = 0; -static int check_count = 0; - -#define TEST(func) do { \ - int status; \ - printf ("Testing %s ...\n", #func); \ - status = test_ ## func (); \ - printf ("%s.\n", (status == 0) ? "Success" : "FAILURE"); \ - if (status != 0) { fail_count++; } \ -} while (0); - -#define OK1(cond, text) do { \ - _Bool result = (cond); \ - printf ("%s %i - %s\n", result ? "ok" : "not ok", ++check_count, text); \ - if (!result) { return (-1); } \ -} while (0); - -#define STREQ(expect, actual) do { \ - if (strcmp (expect, actual) != 0) { \ - printf ("not ok %i - %s incorrect: expected \"%s\", got \"%s\"\n", \ - ++check_count, #actual, expect, actual); \ - return (-1); \ - } \ - printf ("ok %i - %s evaluates to \"%s\"\n", ++check_count, #actual, expect); \ -} while (0) - -#define OK(cond) OK1(cond, #cond) - -static int test_sstrncpy (void) -{ - char buffer[16] = ""; - char *ptr = &buffer[4]; - char *ret; - - buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0xff; - buffer[12] = buffer[13] = buffer[14] = buffer[15] = 0xff; - - ret = sstrncpy (ptr, "foobar", 8); - OK(ret == ptr); - STREQ ("foobar", ptr); - OK(buffer[3] == buffer[12]); - - ret = sstrncpy (ptr, "abc", 8); - OK(ret == ptr); - STREQ ("abc", ptr); - OK(buffer[3] == buffer[12]); - - ret = sstrncpy (ptr, "collectd", 8); - OK(ret == ptr); - OK(ptr[7] == 0); - STREQ ("collect", ptr); - OK(buffer[3] == buffer[12]); - - return (0); -} - -static int test_ssnprintf (void) -{ - char buffer[16] = ""; - char *ptr = &buffer[4]; - int status; - - buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0xff; - buffer[12] = buffer[13] = buffer[14] = buffer[15] = 0xff; - - status = ssnprintf (ptr, 8, "%i", 1337); - OK(status == 4); - STREQ ("1337", ptr); - - status = ssnprintf (ptr, 8, "%s", "collectd"); - OK(status == 8); - OK(ptr[7] == 0); - STREQ ("collect", ptr); - OK(buffer[3] == buffer[12]); - - return (0); -} - -static int test_sstrdup (void) -{ - char *ptr; - - ptr = sstrdup ("collectd"); - OK(ptr != NULL); - STREQ ("collectd", ptr); - - sfree(ptr); - OK(ptr == NULL); - - ptr = sstrdup (NULL); - OK(ptr == NULL); - - return (0); -} - -static int test_strsplit (void) -{ - char buffer[32]; - char *fields[8]; - int status; - - strncpy (buffer, "foo bar", sizeof (buffer)); - status = strsplit (buffer, fields, 8); - OK(status == 2); - STREQ ("foo", fields[0]); - STREQ ("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]); - - 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]); - - strncpy (buffer, "\twith trailing\n", sizeof (buffer)); - status = strsplit (buffer, fields, 8); - OK(status == 2); - STREQ ("with", fields[0]); - STREQ ("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]); - - strncpy (buffer, "single", sizeof (buffer)); - status = strsplit (buffer, fields, 8); - OK(status == 1); - STREQ ("single", fields[0]); - - strncpy (buffer, "", sizeof (buffer)); - status = strsplit (buffer, fields, 8); - OK(status == 0); - - return (0); -} - -int test_strjoin (void) -{ - char buffer[16]; - char *fields[4]; - int status; - - fields[0] = "foo"; - fields[1] = "bar"; - fields[2] = "baz"; - fields[3] = "qux"; - - status = strjoin (buffer, sizeof (buffer), fields, 2, "!"); - OK(status == 7); - STREQ ("foo!bar", buffer); - - status = strjoin (buffer, sizeof (buffer), fields, 1, "!"); - OK(status == 3); - STREQ ("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); - - status = strjoin (buffer, sizeof (buffer), fields, 4, ""); - OK(status == 12); - STREQ ("foobarbazqux", buffer); - - status = strjoin (buffer, sizeof (buffer), fields, 4, "!"); - OK(status == 15); - STREQ ("foo!bar!baz!qux", buffer); - - fields[0] = "0123"; - fields[1] = "4567"; - fields[2] = "8901"; - fields[3] = "2345"; - status = strjoin (buffer, sizeof (buffer), fields, 4, "-"); - OK(status < 0); - - return (0); -} - -static int test_strunescape () -{ - char buffer[16]; - int status; - - strncpy (buffer, "foo\\tbar", sizeof (buffer)); - status = strunescape (buffer, sizeof (buffer)); - OK(status == 0); - STREQ ("foo\tbar", buffer); - - strncpy (buffer, "\\tfoo\\r\\n", sizeof (buffer)); - status = strunescape (buffer, sizeof (buffer)); - OK(status == 0); - STREQ ("\tfoo\r\n", buffer); - - strncpy (buffer, "With \\\"quotes\\\"", sizeof (buffer)); - status = strunescape (buffer, sizeof (buffer)); - OK(status == 0); - STREQ ("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); - return (0); - - /* Backslash at buffer end */ - strncpy (buffer, "\\t3\\56", sizeof (buffer)); - status = strunescape (buffer, 4); - OK(status != 0); - OK(buffer[0] == '\t'); - OK(buffer[1] == '3'); - OK(buffer[2] == 0); - OK(buffer[3] == 0); - OK(buffer[4] == '5'); - OK(buffer[5] == '6'); - OK(buffer[6] == '7'); - - return (0); -} - -int main (void) -{ - TEST(sstrncpy); - TEST(ssnprintf); - TEST(sstrdup); - TEST(strsplit); - TEST(strjoin); - TEST(strunescape); - - if (fail_count != 0) - exit (EXIT_FAILURE); - exit (EXIT_SUCCESS); -} - -/* vim: set sw=2 sts=2 et : */ diff --git a/src/mock/plugin.c b/src/mock/plugin.c deleted file mode 100644 index cb3c65af..00000000 --- a/src/mock/plugin.c +++ /dev/null @@ -1,42 +0,0 @@ -/** - * collectd - src/mock/plugin.c - * - * Copyright (C) 2013 Florian octo Forster - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian octo Forster - */ - -#include "plugin.h" - -void plugin_log (int level, char const *format, ...) -{ - char buffer[1024]; - va_list ap; - - va_start (ap, format); - vsnprintf (buffer, sizeof (buffer), format, ap); - va_end (ap); - - printf ("plugin_log (%i, \"%s\");\n", level, buffer); -} - -/* vim: set sw=2 sts=2 et : */ diff --git a/src/mock/utils_cache.c b/src/mock/utils_cache.c deleted file mode 100644 index 8c8b55b8..00000000 --- a/src/mock/utils_cache.c +++ /dev/null @@ -1,33 +0,0 @@ -/** - * collectd - src/mock/utils_cache.c - * - * Copyright (C) 2013 Florian octo Forster - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian octo Forster - */ - -#include "utils_cache.h" - -gauge_t *uc_get_rate (const data_set_t *ds, const value_list_t *vl) -{ - return (NULL); -} diff --git a/src/mock/utils_time.c b/src/mock/utils_time.c deleted file mode 100644 index 38b59caa..00000000 --- a/src/mock/utils_time.c +++ /dev/null @@ -1,34 +0,0 @@ -/** - * collectd - src/mock/utils_time.c - * - * Copyright (C) 2013 Florian octo Forster - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian octo Forster - */ - -#include "utils_time.h" - -cdtime_t cdtime (void) -{ - return (0); -} - diff --git a/src/tests/common_test.c b/src/tests/common_test.c new file mode 100644 index 00000000..a0d282cd --- /dev/null +++ b/src/tests/common_test.c @@ -0,0 +1,276 @@ +/** + * collectd - src/common_test.c + * + * Copyright (C) 2013 Florian octo Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian octo Forster + */ + +#include "common.h" + +static int fail_count = 0; +static int check_count = 0; + +#define TEST(func) do { \ + int status; \ + printf ("Testing %s ...\n", #func); \ + status = test_ ## func (); \ + printf ("%s.\n", (status == 0) ? "Success" : "FAILURE"); \ + if (status != 0) { fail_count++; } \ +} while (0); + +#define OK1(cond, text) do { \ + _Bool result = (cond); \ + printf ("%s %i - %s\n", result ? "ok" : "not ok", ++check_count, text); \ + if (!result) { return (-1); } \ +} while (0); + +#define STREQ(expect, actual) do { \ + if (strcmp (expect, actual) != 0) { \ + printf ("not ok %i - %s incorrect: expected \"%s\", got \"%s\"\n", \ + ++check_count, #actual, expect, actual); \ + return (-1); \ + } \ + printf ("ok %i - %s evaluates to \"%s\"\n", ++check_count, #actual, expect); \ +} while (0) + +#define OK(cond) OK1(cond, #cond) + +static int test_sstrncpy (void) +{ + char buffer[16] = ""; + char *ptr = &buffer[4]; + char *ret; + + buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0xff; + buffer[12] = buffer[13] = buffer[14] = buffer[15] = 0xff; + + ret = sstrncpy (ptr, "foobar", 8); + OK(ret == ptr); + STREQ ("foobar", ptr); + OK(buffer[3] == buffer[12]); + + ret = sstrncpy (ptr, "abc", 8); + OK(ret == ptr); + STREQ ("abc", ptr); + OK(buffer[3] == buffer[12]); + + ret = sstrncpy (ptr, "collectd", 8); + OK(ret == ptr); + OK(ptr[7] == 0); + STREQ ("collect", ptr); + OK(buffer[3] == buffer[12]); + + return (0); +} + +static int test_ssnprintf (void) +{ + char buffer[16] = ""; + char *ptr = &buffer[4]; + int status; + + buffer[0] = buffer[1] = buffer[2] = buffer[3] = 0xff; + buffer[12] = buffer[13] = buffer[14] = buffer[15] = 0xff; + + status = ssnprintf (ptr, 8, "%i", 1337); + OK(status == 4); + STREQ ("1337", ptr); + + status = ssnprintf (ptr, 8, "%s", "collectd"); + OK(status == 8); + OK(ptr[7] == 0); + STREQ ("collect", ptr); + OK(buffer[3] == buffer[12]); + + return (0); +} + +static int test_sstrdup (void) +{ + char *ptr; + + ptr = sstrdup ("collectd"); + OK(ptr != NULL); + STREQ ("collectd", ptr); + + sfree(ptr); + OK(ptr == NULL); + + ptr = sstrdup (NULL); + OK(ptr == NULL); + + return (0); +} + +static int test_strsplit (void) +{ + char buffer[32]; + char *fields[8]; + int status; + + strncpy (buffer, "foo bar", sizeof (buffer)); + status = strsplit (buffer, fields, 8); + OK(status == 2); + STREQ ("foo", fields[0]); + STREQ ("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]); + + 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]); + + strncpy (buffer, "\twith trailing\n", sizeof (buffer)); + status = strsplit (buffer, fields, 8); + OK(status == 2); + STREQ ("with", fields[0]); + STREQ ("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]); + + strncpy (buffer, "single", sizeof (buffer)); + status = strsplit (buffer, fields, 8); + OK(status == 1); + STREQ ("single", fields[0]); + + strncpy (buffer, "", sizeof (buffer)); + status = strsplit (buffer, fields, 8); + OK(status == 0); + + return (0); +} + +int test_strjoin (void) +{ + char buffer[16]; + char *fields[4]; + int status; + + fields[0] = "foo"; + fields[1] = "bar"; + fields[2] = "baz"; + fields[3] = "qux"; + + status = strjoin (buffer, sizeof (buffer), fields, 2, "!"); + OK(status == 7); + STREQ ("foo!bar", buffer); + + status = strjoin (buffer, sizeof (buffer), fields, 1, "!"); + OK(status == 3); + STREQ ("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); + + status = strjoin (buffer, sizeof (buffer), fields, 4, ""); + OK(status == 12); + STREQ ("foobarbazqux", buffer); + + status = strjoin (buffer, sizeof (buffer), fields, 4, "!"); + OK(status == 15); + STREQ ("foo!bar!baz!qux", buffer); + + fields[0] = "0123"; + fields[1] = "4567"; + fields[2] = "8901"; + fields[3] = "2345"; + status = strjoin (buffer, sizeof (buffer), fields, 4, "-"); + OK(status < 0); + + return (0); +} + +static int test_strunescape () +{ + char buffer[16]; + int status; + + strncpy (buffer, "foo\\tbar", sizeof (buffer)); + status = strunescape (buffer, sizeof (buffer)); + OK(status == 0); + STREQ ("foo\tbar", buffer); + + strncpy (buffer, "\\tfoo\\r\\n", sizeof (buffer)); + status = strunescape (buffer, sizeof (buffer)); + OK(status == 0); + STREQ ("\tfoo\r\n", buffer); + + strncpy (buffer, "With \\\"quotes\\\"", sizeof (buffer)); + status = strunescape (buffer, sizeof (buffer)); + OK(status == 0); + STREQ ("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); + return (0); + + /* Backslash at buffer end */ + strncpy (buffer, "\\t3\\56", sizeof (buffer)); + status = strunescape (buffer, 4); + OK(status != 0); + OK(buffer[0] == '\t'); + OK(buffer[1] == '3'); + OK(buffer[2] == 0); + OK(buffer[3] == 0); + OK(buffer[4] == '5'); + OK(buffer[5] == '6'); + OK(buffer[6] == '7'); + + return (0); +} + +int main (void) +{ + TEST(sstrncpy); + TEST(ssnprintf); + TEST(sstrdup); + TEST(strsplit); + TEST(strjoin); + TEST(strunescape); + + if (fail_count != 0) + exit (EXIT_FAILURE); + exit (EXIT_SUCCESS); +} + +/* vim: set sw=2 sts=2 et : */ diff --git a/src/tests/mock/plugin.c b/src/tests/mock/plugin.c new file mode 100644 index 00000000..cb3c65af --- /dev/null +++ b/src/tests/mock/plugin.c @@ -0,0 +1,42 @@ +/** + * collectd - src/mock/plugin.c + * + * Copyright (C) 2013 Florian octo Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian octo Forster + */ + +#include "plugin.h" + +void plugin_log (int level, char const *format, ...) +{ + char buffer[1024]; + va_list ap; + + va_start (ap, format); + vsnprintf (buffer, sizeof (buffer), format, ap); + va_end (ap); + + printf ("plugin_log (%i, \"%s\");\n", level, buffer); +} + +/* vim: set sw=2 sts=2 et : */ diff --git a/src/tests/mock/utils_cache.c b/src/tests/mock/utils_cache.c new file mode 100644 index 00000000..8c8b55b8 --- /dev/null +++ b/src/tests/mock/utils_cache.c @@ -0,0 +1,33 @@ +/** + * collectd - src/mock/utils_cache.c + * + * Copyright (C) 2013 Florian octo Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian octo Forster + */ + +#include "utils_cache.h" + +gauge_t *uc_get_rate (const data_set_t *ds, const value_list_t *vl) +{ + return (NULL); +} diff --git a/src/tests/mock/utils_time.c b/src/tests/mock/utils_time.c new file mode 100644 index 00000000..38b59caa --- /dev/null +++ b/src/tests/mock/utils_time.c @@ -0,0 +1,34 @@ +/** + * collectd - src/mock/utils_time.c + * + * Copyright (C) 2013 Florian octo Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian octo Forster + */ + +#include "utils_time.h" + +cdtime_t cdtime (void) +{ + return (0); +} + diff --git a/src/tests/utils_avltree_test.c b/src/tests/utils_avltree_test.c new file mode 100644 index 00000000..260aa328 --- /dev/null +++ b/src/tests/utils_avltree_test.c @@ -0,0 +1,112 @@ +/** + * collectd - src/utils_avltree_test.c + * + * Copyright (C) 2013 Florian octo Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian octo Forster + */ + +#include "collectd.h" +#include "utils_avltree.h" + +static int fail_count = 0; +static int check_count = 0; + +#define TEST(func) do { \ + int status; \ + printf ("Testing %s ...\n", #func); \ + status = test_ ## func (); \ + printf ("%s.\n", (status == 0) ? "Success" : "FAILURE"); \ + if (status != 0) { fail_count++; } \ +} while (0); + +#define OK1(cond, text) do { \ + _Bool result = (cond); \ + printf ("%s %i - %s\n", result ? "ok" : "not ok", ++check_count, text); \ + if (!result) { return (-1); } \ +} while (0); + +#define STREQ(expect, actual) do { \ + if (strcmp (expect, actual) != 0) { \ + printf ("not ok %i - %s incorrect: expected \"%s\", got \"%s\"\n", \ + ++check_count, #actual, expect, actual); \ + return (-1); \ + } \ + printf ("ok %i - %s evaluates to \"%s\"\n", ++check_count, #actual, expect); \ +} while (0) + +#define OK(cond) OK1(cond, #cond) + +static int compare_total_count = 0; +#define RESET_COUNTS() do { compare_total_count = 0; } while (0) + +static int compare_callback (void const *v0, void const *v1) +{ + assert (v0 != NULL); + assert (v1 != NULL); + + compare_total_count++; + return (strcmp (v0, v1)); +} + +static int test_success () +{ + c_avl_tree_t *t; + char key_orig[] = "foo"; + char value_orig[] = "bar"; + char *key_ret = NULL; + char *value_ret = NULL; + + RESET_COUNTS (); + t = c_avl_create (compare_callback); + OK (t != NULL); + + OK (c_avl_insert (t, key_orig, value_orig) == 0); + OK (c_avl_size (t) == 1); + + /* Key already exists. */ + OK (c_avl_insert (t, "foo", "qux") > 0); + + OK (c_avl_get (t, "foo", (void *) &value_ret) == 0); + OK (value_ret == &value_orig[0]); + + key_ret = value_ret = NULL; + OK (c_avl_remove (t, "foo", (void *) &key_ret, (void *) &value_ret) == 0); + OK (key_ret == &key_orig[0]); + OK (value_ret == &value_orig[0]); + OK (c_avl_size (t) == 0); + + c_avl_destroy (t); + + return (0); +} + +int main (void) +{ + TEST(success); + + if (fail_count != 0) + exit (EXIT_FAILURE); + exit (EXIT_SUCCESS); +} + +/* vim: set sw=2 sts=2 et : */ diff --git a/src/tests/utils_vl_lookup_test.c b/src/tests/utils_vl_lookup_test.c new file mode 100644 index 00000000..bbb3a67f --- /dev/null +++ b/src/tests/utils_vl_lookup_test.c @@ -0,0 +1,244 @@ +/** + * collectd - src/utils_vl_lookup_test.c + * Copyright (C) 2012 Florian Forster + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian Forster + **/ + +#include "collectd.h" +#include "utils_vl_lookup.h" + +static _Bool expect_new_obj = 0; +static _Bool have_new_obj = 0; + +static identifier_t last_class_ident; +static identifier_t last_obj_ident; + +static data_source_t dsrc_test = { "value", DS_TYPE_DERIVE, 0.0, NAN }; +static data_set_t const ds_test = { "test", 1, &dsrc_test }; + +static data_source_t dsrc_unknown = { "value", DS_TYPE_DERIVE, 0.0, NAN }; +static data_set_t const ds_unknown = { "unknown", 1, &dsrc_unknown }; + +static int lookup_obj_callback (data_set_t const *ds, + value_list_t const *vl, + void *user_class, void *user_obj) +{ + identifier_t *class = user_class; + identifier_t *obj = user_obj; + + assert (expect_new_obj == have_new_obj); + + memcpy (&last_class_ident, class, sizeof (last_class_ident)); + memcpy (&last_obj_ident, obj, sizeof (last_obj_ident)); + + if (strcmp (obj->plugin_instance, "failure") == 0) + return (-1); + + return (0); +} + +static void *lookup_class_callback (data_set_t const *ds, + value_list_t const *vl, void *user_class) +{ + identifier_t *class = user_class; + identifier_t *obj; + + assert (expect_new_obj); + + memcpy (&last_class_ident, class, sizeof (last_class_ident)); + + obj = malloc (sizeof (*obj)); + strncpy (obj->host, vl->host, sizeof (obj->host)); + strncpy (obj->plugin, vl->plugin, sizeof (obj->plugin)); + strncpy (obj->plugin_instance, vl->plugin_instance, sizeof (obj->plugin_instance)); + strncpy (obj->type, vl->type, sizeof (obj->type)); + strncpy (obj->type_instance, vl->type_instance, sizeof (obj->type_instance)); + + have_new_obj = 1; + + return ((void *) obj); +} + +static void checked_lookup_add (lookup_t *obj, /* {{{ */ + char const *host, + char const *plugin, char const *plugin_instance, + char const *type, char const *type_instance, + unsigned int group_by) +{ + identifier_t ident; + void *user_class; + int status; + + memset (&ident, 0, sizeof (ident)); + strncpy (ident.host, host, sizeof (ident.host)); + strncpy (ident.plugin, plugin, sizeof (ident.plugin)); + strncpy (ident.plugin_instance, plugin_instance, sizeof (ident.plugin_instance)); + strncpy (ident.type, type, sizeof (ident.type)); + strncpy (ident.type_instance, type_instance, sizeof (ident.type_instance)); + + user_class = malloc (sizeof (ident)); + memmove (user_class, &ident, sizeof (ident)); + + status = lookup_add (obj, &ident, group_by, user_class); + assert (status == 0); +} /* }}} void test_add */ + +static int checked_lookup_search (lookup_t *obj, + char const *host, + char const *plugin, char const *plugin_instance, + char const *type, char const *type_instance, + _Bool expect_new) +{ + int status; + value_list_t vl = VALUE_LIST_STATIC; + data_set_t const *ds = &ds_unknown; + + strncpy (vl.host, host, sizeof (vl.host)); + strncpy (vl.plugin, plugin, sizeof (vl.plugin)); + strncpy (vl.plugin_instance, plugin_instance, sizeof (vl.plugin_instance)); + strncpy (vl.type, type, sizeof (vl.type)); + strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); + + if (strcmp (vl.type, "test") == 0) + ds = &ds_test; + + expect_new_obj = expect_new; + have_new_obj = 0; + + status = lookup_search (obj, ds, &vl); + return (status); +} + +static lookup_t *checked_lookup_create (void) +{ + lookup_t *obj = lookup_create ( + lookup_class_callback, + lookup_obj_callback, + (void *) free, + (void *) free); + assert (obj != NULL); + return (obj); +} + +static void testcase0 (void) +{ + lookup_t *obj = checked_lookup_create (); + + checked_lookup_add (obj, "/.*/", "test", "", "test", "/.*/", LU_GROUP_BY_HOST); + checked_lookup_search (obj, "host0", "test", "", "test", "0", + /* expect new = */ 1); + checked_lookup_search (obj, "host0", "test", "", "test", "1", + /* expect new = */ 0); + checked_lookup_search (obj, "host1", "test", "", "test", "0", + /* expect new = */ 1); + checked_lookup_search (obj, "host1", "test", "", "test", "1", + /* expect new = */ 0); + + lookup_destroy (obj); +} + +static void testcase1 (void) +{ + lookup_t *obj = checked_lookup_create (); + + checked_lookup_add (obj, "/.*/", "/.*/", "/.*/", "test", "/.*/", LU_GROUP_BY_HOST); + checked_lookup_search (obj, "host0", "plugin0", "", "test", "0", + /* expect new = */ 1); + checked_lookup_search (obj, "host0", "plugin0", "", "test", "1", + /* expect new = */ 0); + checked_lookup_search (obj, "host0", "plugin1", "", "test", "0", + /* expect new = */ 0); + checked_lookup_search (obj, "host0", "plugin1", "", "test", "1", + /* expect new = */ 0); + checked_lookup_search (obj, "host1", "plugin0", "", "test", "0", + /* expect new = */ 1); + checked_lookup_search (obj, "host1", "plugin0", "", "test", "1", + /* expect new = */ 0); + checked_lookup_search (obj, "host1", "plugin1", "", "test", "0", + /* expect new = */ 0); + checked_lookup_search (obj, "host1", "plugin1", "", "test", "1", + /* expect new = */ 0); + + lookup_destroy (obj); +} + +static void testcase2 (void) +{ + lookup_t *obj = checked_lookup_create (); + int status; + + checked_lookup_add (obj, "/.*/", "plugin0", "", "test", "/.*/", LU_GROUP_BY_HOST); + checked_lookup_add (obj, "/.*/", "/.*/", "", "test", "ti0", LU_GROUP_BY_HOST); + + status = checked_lookup_search (obj, "host0", "plugin1", "", "test", "", + /* expect new = */ 0); + assert (status == 0); + status = checked_lookup_search (obj, "host0", "plugin0", "", "test", "", + /* expect new = */ 1); + assert (status == 1); + status = checked_lookup_search (obj, "host0", "plugin1", "", "test", "ti0", + /* expect new = */ 1); + assert (status == 1); + status = checked_lookup_search (obj, "host0", "plugin0", "", "test", "ti0", + /* expect new = */ 0); + assert (status == 2); + + lookup_destroy (obj); +} + +static void testcase3 (void) +{ + lookup_t *obj = checked_lookup_create (); + + checked_lookup_add (obj, "/^db[0-9]\\./", "cpu", "/.*/", "cpu", "/.*/", + LU_GROUP_BY_TYPE_INSTANCE); + checked_lookup_search (obj, "db0.example.com", "cpu", "0", "cpu", "user", + /* expect new = */ 1); + checked_lookup_search (obj, "db0.example.com", "cpu", "0", "cpu", "idle", + /* expect new = */ 1); + checked_lookup_search (obj, "db0.example.com", "cpu", "1", "cpu", "user", + /* expect new = */ 0); + checked_lookup_search (obj, "db0.example.com", "cpu", "1", "cpu", "idle", + /* expect new = */ 0); + checked_lookup_search (obj, "app0.example.com", "cpu", "0", "cpu", "user", + /* expect new = */ 0); + checked_lookup_search (obj, "app0.example.com", "cpu", "0", "cpu", "idle", + /* expect new = */ 0); + checked_lookup_search (obj, "db1.example.com", "cpu", "0", "cpu", "user", + /* expect new = */ 0); + checked_lookup_search (obj, "db1.example.com", "cpu", "0", "cpu", "idle", + /* expect new = */ 0); + checked_lookup_search (obj, "db1.example.com", "cpu", "0", "cpu", "system", + /* expect new = */ 1); + + lookup_destroy (obj); +} + +int main (int argc, char **argv) /* {{{ */ +{ + testcase0 (); + testcase1 (); + testcase2 (); + testcase3 (); + return (EXIT_SUCCESS); +} /* }}} int main */ diff --git a/src/utils_avltree_test.c b/src/utils_avltree_test.c deleted file mode 100644 index 260aa328..00000000 --- a/src/utils_avltree_test.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * collectd - src/utils_avltree_test.c - * - * Copyright (C) 2013 Florian octo Forster - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian octo Forster - */ - -#include "collectd.h" -#include "utils_avltree.h" - -static int fail_count = 0; -static int check_count = 0; - -#define TEST(func) do { \ - int status; \ - printf ("Testing %s ...\n", #func); \ - status = test_ ## func (); \ - printf ("%s.\n", (status == 0) ? "Success" : "FAILURE"); \ - if (status != 0) { fail_count++; } \ -} while (0); - -#define OK1(cond, text) do { \ - _Bool result = (cond); \ - printf ("%s %i - %s\n", result ? "ok" : "not ok", ++check_count, text); \ - if (!result) { return (-1); } \ -} while (0); - -#define STREQ(expect, actual) do { \ - if (strcmp (expect, actual) != 0) { \ - printf ("not ok %i - %s incorrect: expected \"%s\", got \"%s\"\n", \ - ++check_count, #actual, expect, actual); \ - return (-1); \ - } \ - printf ("ok %i - %s evaluates to \"%s\"\n", ++check_count, #actual, expect); \ -} while (0) - -#define OK(cond) OK1(cond, #cond) - -static int compare_total_count = 0; -#define RESET_COUNTS() do { compare_total_count = 0; } while (0) - -static int compare_callback (void const *v0, void const *v1) -{ - assert (v0 != NULL); - assert (v1 != NULL); - - compare_total_count++; - return (strcmp (v0, v1)); -} - -static int test_success () -{ - c_avl_tree_t *t; - char key_orig[] = "foo"; - char value_orig[] = "bar"; - char *key_ret = NULL; - char *value_ret = NULL; - - RESET_COUNTS (); - t = c_avl_create (compare_callback); - OK (t != NULL); - - OK (c_avl_insert (t, key_orig, value_orig) == 0); - OK (c_avl_size (t) == 1); - - /* Key already exists. */ - OK (c_avl_insert (t, "foo", "qux") > 0); - - OK (c_avl_get (t, "foo", (void *) &value_ret) == 0); - OK (value_ret == &value_orig[0]); - - key_ret = value_ret = NULL; - OK (c_avl_remove (t, "foo", (void *) &key_ret, (void *) &value_ret) == 0); - OK (key_ret == &key_orig[0]); - OK (value_ret == &value_orig[0]); - OK (c_avl_size (t) == 0); - - c_avl_destroy (t); - - return (0); -} - -int main (void) -{ - TEST(success); - - if (fail_count != 0) - exit (EXIT_FAILURE); - exit (EXIT_SUCCESS); -} - -/* vim: set sw=2 sts=2 et : */ diff --git a/src/utils_vl_lookup_test.c b/src/utils_vl_lookup_test.c deleted file mode 100644 index bbb3a67f..00000000 --- a/src/utils_vl_lookup_test.c +++ /dev/null @@ -1,244 +0,0 @@ -/** - * collectd - src/utils_vl_lookup_test.c - * Copyright (C) 2012 Florian Forster - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian Forster - **/ - -#include "collectd.h" -#include "utils_vl_lookup.h" - -static _Bool expect_new_obj = 0; -static _Bool have_new_obj = 0; - -static identifier_t last_class_ident; -static identifier_t last_obj_ident; - -static data_source_t dsrc_test = { "value", DS_TYPE_DERIVE, 0.0, NAN }; -static data_set_t const ds_test = { "test", 1, &dsrc_test }; - -static data_source_t dsrc_unknown = { "value", DS_TYPE_DERIVE, 0.0, NAN }; -static data_set_t const ds_unknown = { "unknown", 1, &dsrc_unknown }; - -static int lookup_obj_callback (data_set_t const *ds, - value_list_t const *vl, - void *user_class, void *user_obj) -{ - identifier_t *class = user_class; - identifier_t *obj = user_obj; - - assert (expect_new_obj == have_new_obj); - - memcpy (&last_class_ident, class, sizeof (last_class_ident)); - memcpy (&last_obj_ident, obj, sizeof (last_obj_ident)); - - if (strcmp (obj->plugin_instance, "failure") == 0) - return (-1); - - return (0); -} - -static void *lookup_class_callback (data_set_t const *ds, - value_list_t const *vl, void *user_class) -{ - identifier_t *class = user_class; - identifier_t *obj; - - assert (expect_new_obj); - - memcpy (&last_class_ident, class, sizeof (last_class_ident)); - - obj = malloc (sizeof (*obj)); - strncpy (obj->host, vl->host, sizeof (obj->host)); - strncpy (obj->plugin, vl->plugin, sizeof (obj->plugin)); - strncpy (obj->plugin_instance, vl->plugin_instance, sizeof (obj->plugin_instance)); - strncpy (obj->type, vl->type, sizeof (obj->type)); - strncpy (obj->type_instance, vl->type_instance, sizeof (obj->type_instance)); - - have_new_obj = 1; - - return ((void *) obj); -} - -static void checked_lookup_add (lookup_t *obj, /* {{{ */ - char const *host, - char const *plugin, char const *plugin_instance, - char const *type, char const *type_instance, - unsigned int group_by) -{ - identifier_t ident; - void *user_class; - int status; - - memset (&ident, 0, sizeof (ident)); - strncpy (ident.host, host, sizeof (ident.host)); - strncpy (ident.plugin, plugin, sizeof (ident.plugin)); - strncpy (ident.plugin_instance, plugin_instance, sizeof (ident.plugin_instance)); - strncpy (ident.type, type, sizeof (ident.type)); - strncpy (ident.type_instance, type_instance, sizeof (ident.type_instance)); - - user_class = malloc (sizeof (ident)); - memmove (user_class, &ident, sizeof (ident)); - - status = lookup_add (obj, &ident, group_by, user_class); - assert (status == 0); -} /* }}} void test_add */ - -static int checked_lookup_search (lookup_t *obj, - char const *host, - char const *plugin, char const *plugin_instance, - char const *type, char const *type_instance, - _Bool expect_new) -{ - int status; - value_list_t vl = VALUE_LIST_STATIC; - data_set_t const *ds = &ds_unknown; - - strncpy (vl.host, host, sizeof (vl.host)); - strncpy (vl.plugin, plugin, sizeof (vl.plugin)); - strncpy (vl.plugin_instance, plugin_instance, sizeof (vl.plugin_instance)); - strncpy (vl.type, type, sizeof (vl.type)); - strncpy (vl.type_instance, type_instance, sizeof (vl.type_instance)); - - if (strcmp (vl.type, "test") == 0) - ds = &ds_test; - - expect_new_obj = expect_new; - have_new_obj = 0; - - status = lookup_search (obj, ds, &vl); - return (status); -} - -static lookup_t *checked_lookup_create (void) -{ - lookup_t *obj = lookup_create ( - lookup_class_callback, - lookup_obj_callback, - (void *) free, - (void *) free); - assert (obj != NULL); - return (obj); -} - -static void testcase0 (void) -{ - lookup_t *obj = checked_lookup_create (); - - checked_lookup_add (obj, "/.*/", "test", "", "test", "/.*/", LU_GROUP_BY_HOST); - checked_lookup_search (obj, "host0", "test", "", "test", "0", - /* expect new = */ 1); - checked_lookup_search (obj, "host0", "test", "", "test", "1", - /* expect new = */ 0); - checked_lookup_search (obj, "host1", "test", "", "test", "0", - /* expect new = */ 1); - checked_lookup_search (obj, "host1", "test", "", "test", "1", - /* expect new = */ 0); - - lookup_destroy (obj); -} - -static void testcase1 (void) -{ - lookup_t *obj = checked_lookup_create (); - - checked_lookup_add (obj, "/.*/", "/.*/", "/.*/", "test", "/.*/", LU_GROUP_BY_HOST); - checked_lookup_search (obj, "host0", "plugin0", "", "test", "0", - /* expect new = */ 1); - checked_lookup_search (obj, "host0", "plugin0", "", "test", "1", - /* expect new = */ 0); - checked_lookup_search (obj, "host0", "plugin1", "", "test", "0", - /* expect new = */ 0); - checked_lookup_search (obj, "host0", "plugin1", "", "test", "1", - /* expect new = */ 0); - checked_lookup_search (obj, "host1", "plugin0", "", "test", "0", - /* expect new = */ 1); - checked_lookup_search (obj, "host1", "plugin0", "", "test", "1", - /* expect new = */ 0); - checked_lookup_search (obj, "host1", "plugin1", "", "test", "0", - /* expect new = */ 0); - checked_lookup_search (obj, "host1", "plugin1", "", "test", "1", - /* expect new = */ 0); - - lookup_destroy (obj); -} - -static void testcase2 (void) -{ - lookup_t *obj = checked_lookup_create (); - int status; - - checked_lookup_add (obj, "/.*/", "plugin0", "", "test", "/.*/", LU_GROUP_BY_HOST); - checked_lookup_add (obj, "/.*/", "/.*/", "", "test", "ti0", LU_GROUP_BY_HOST); - - status = checked_lookup_search (obj, "host0", "plugin1", "", "test", "", - /* expect new = */ 0); - assert (status == 0); - status = checked_lookup_search (obj, "host0", "plugin0", "", "test", "", - /* expect new = */ 1); - assert (status == 1); - status = checked_lookup_search (obj, "host0", "plugin1", "", "test", "ti0", - /* expect new = */ 1); - assert (status == 1); - status = checked_lookup_search (obj, "host0", "plugin0", "", "test", "ti0", - /* expect new = */ 0); - assert (status == 2); - - lookup_destroy (obj); -} - -static void testcase3 (void) -{ - lookup_t *obj = checked_lookup_create (); - - checked_lookup_add (obj, "/^db[0-9]\\./", "cpu", "/.*/", "cpu", "/.*/", - LU_GROUP_BY_TYPE_INSTANCE); - checked_lookup_search (obj, "db0.example.com", "cpu", "0", "cpu", "user", - /* expect new = */ 1); - checked_lookup_search (obj, "db0.example.com", "cpu", "0", "cpu", "idle", - /* expect new = */ 1); - checked_lookup_search (obj, "db0.example.com", "cpu", "1", "cpu", "user", - /* expect new = */ 0); - checked_lookup_search (obj, "db0.example.com", "cpu", "1", "cpu", "idle", - /* expect new = */ 0); - checked_lookup_search (obj, "app0.example.com", "cpu", "0", "cpu", "user", - /* expect new = */ 0); - checked_lookup_search (obj, "app0.example.com", "cpu", "0", "cpu", "idle", - /* expect new = */ 0); - checked_lookup_search (obj, "db1.example.com", "cpu", "0", "cpu", "user", - /* expect new = */ 0); - checked_lookup_search (obj, "db1.example.com", "cpu", "0", "cpu", "idle", - /* expect new = */ 0); - checked_lookup_search (obj, "db1.example.com", "cpu", "0", "cpu", "system", - /* expect new = */ 1); - - lookup_destroy (obj); -} - -int main (int argc, char **argv) /* {{{ */ -{ - testcase0 (); - testcase1 (); - testcase2 (); - testcase3 (); - return (EXIT_SUCCESS); -} /* }}} int main */