summaryrefslogtreecommitdiffstats
path: root/fluent-bit/tests/internal/slist.c
diff options
context:
space:
mode:
Diffstat (limited to 'fluent-bit/tests/internal/slist.c')
-rw-r--r--fluent-bit/tests/internal/slist.c205
1 files changed, 205 insertions, 0 deletions
diff --git a/fluent-bit/tests/internal/slist.c b/fluent-bit/tests/internal/slist.c
new file mode 100644
index 00000000..8c786fc8
--- /dev/null
+++ b/fluent-bit/tests/internal/slist.c
@@ -0,0 +1,205 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#include <fluent-bit/flb_info.h>
+#include <fluent-bit/flb_mem.h>
+#include <fluent-bit/flb_slist.h>
+
+#include "flb_tests_internal.h"
+
+void token_check(struct mk_list *list, int id, char *str)
+{
+ int i = 0;
+ int len;
+ int ret;
+ struct mk_list *head;
+ struct flb_slist_entry *e = NULL;
+
+ mk_list_foreach(head, list) {
+ if (i == id) {
+ e = mk_list_entry(head, struct flb_slist_entry, _head);
+ break;
+ }
+ e = NULL;
+ i++;
+ }
+ TEST_CHECK(e != NULL);
+
+ len = strlen(str);
+ ret = flb_sds_cmp(e->str, str, len);
+ TEST_CHECK(ret == 0);
+ if (ret != 0) {
+ fprintf(stderr, "[token %i] expected '%s', got '%s'\n\n",
+ i, str, e->str);
+ exit(EXIT_FAILURE);
+ }
+}
+
+void test_slist_add()
+{
+ int ret;
+ struct mk_list list;
+ struct flb_slist_entry *e;
+
+ ret = flb_slist_create(&list);
+ TEST_CHECK(ret == 0);
+
+ ret = flb_slist_add(&list, "");
+ TEST_CHECK(ret == -1);
+
+ ret = flb_slist_add(&list, NULL);
+ TEST_CHECK(ret == -1);
+
+ TEST_CHECK(mk_list_is_empty(&list) == 0);
+
+ ret = flb_slist_add(&list, "test");
+ TEST_CHECK(ret == 0);
+
+ e = mk_list_entry_last(&list, struct flb_slist_entry, _head);
+ TEST_CHECK(flb_sds_len(e->str) == 4);
+
+ ret = flb_slist_add_n(&list, "test", 3);
+ TEST_CHECK(ret == 0);
+
+ e = mk_list_entry_last(&list, struct flb_slist_entry, _head);
+ TEST_CHECK(flb_sds_len(e->str) == 3);
+
+ flb_slist_destroy(&list);
+}
+
+void test_slist_split_string()
+{
+ int ret;
+ struct mk_list list;
+ struct flb_slist_entry *e;
+
+ ret = flb_slist_create(&list);
+ TEST_CHECK(ret == 0);
+
+ /* Simple string without separator */
+ ret = flb_slist_split_string(&list, "abcdefg", ' ', -1);
+ TEST_CHECK(ret == 1);
+ TEST_CHECK(mk_list_size(&list) == 1);
+ token_check(&list, 0, "abcdefg");
+ flb_slist_destroy(&list);
+
+ /* Separated strings */
+ ret = flb_slist_split_string(&list, "a bc defg", ' ', -1);
+ TEST_CHECK(ret == 3);
+ TEST_CHECK(mk_list_size(&list) == 3);
+ token_check(&list, 0, "a");
+ token_check(&list, 1, "bc");
+ token_check(&list, 2, "defg");
+ flb_slist_destroy(&list);
+
+ /* One char with empty spaces */
+ ret = flb_slist_split_string(&list, " a ", ' ', 2);
+ TEST_CHECK(ret == 1);
+ TEST_CHECK(mk_list_size(&list) == 1);
+ token_check(&list, 0, "a");
+ flb_slist_destroy(&list);
+
+ /* Two separated characters */
+ ret = flb_slist_split_string(&list, " a b ", ' ', 2);
+ TEST_CHECK(ret == 2);
+ TEST_CHECK(mk_list_size(&list) == 2);
+ token_check(&list, 0, "a");
+ token_check(&list, 1, "b");
+ flb_slist_destroy(&list);
+
+ /* Comma separated strings */
+ ret = flb_slist_split_string(&list, ",,,a ,, b,c ,d,,e ,f,g, , ,", ',', -1);
+ TEST_CHECK(ret == 7);
+ TEST_CHECK(mk_list_size(&list) == 7);
+ token_check(&list, 0, "a");
+ token_check(&list, 1, "b");
+ token_check(&list, 2, "c");
+ token_check(&list, 3, "d");
+ token_check(&list, 4, "e");
+ token_check(&list, 5, "f");
+ token_check(&list, 6, "g");
+ flb_slist_destroy(&list);
+
+ /* Comma seperated strings for real world NO_PROXY example */
+ ret = flb_slist_split_string(&list, "127.0.0.1, localhost, kubernetes.default.svc.cluster.local", ',', -1);
+ TEST_CHECK(ret == 3);
+ TEST_CHECK(mk_list_size(&list) == 3);
+ token_check(&list, 0, "127.0.0.1");
+ token_check(&list, 1, "localhost");
+ token_check(&list, 2, "kubernetes.default.svc.cluster.local");
+ flb_slist_destroy(&list);
+
+ /* Comma separated strings with limit */
+ ret = flb_slist_split_string(&list, ",,,a ,, b, c ,d,,e ,f,g, , ,", ',', 2);
+ TEST_CHECK(ret == 3);
+ TEST_CHECK(mk_list_size(&list) == 3);
+ e = mk_list_entry_last(&list, struct flb_slist_entry, _head);
+ TEST_CHECK(flb_sds_len(e->str) == 22);
+ flb_slist_destroy(&list);
+
+ /* Nothing */
+ ret = flb_slist_split_string(&list, ",,, ,, , , , ", ',', 2);
+ TEST_CHECK(ret == 0);
+ TEST_CHECK(mk_list_size(&list) == 0);
+}
+
+void test_slist_split_tokens()
+{
+ struct mk_list list;
+ char *txt = \
+ " this \"is a tokens parser\" \" apples \", "
+ "no\"quoted \"this is \\\"quoted\\\"\" "
+ "don't escape insi\\\"de q\\\"uoted strings\\\"";
+
+ mk_list_init(&list);
+ flb_slist_split_tokens(&list, txt, -1);
+
+ token_check(&list, 0, "this");
+ token_check(&list, 1, "is a tokens parser");
+ token_check(&list, 2, " apples ");
+ token_check(&list, 3, ",");
+ token_check(&list, 4, "no\"quoted");
+ token_check(&list, 5, "this is \"quoted\"");
+ token_check(&list, 6, "don't");
+ token_check(&list, 7, "escape");
+ token_check(&list, 8, "insi\\\"de");
+ token_check(&list, 9, "q\\\"uoted");
+ token_check(&list, 10, "strings\\\"");
+
+ flb_slist_destroy(&list);
+
+ mk_list_init(&list);
+ flb_slist_split_string(&list, "aaa bbb ccc ddd eee", ' ', 3);
+ token_check(&list, 3, "ddd eee");
+ flb_slist_destroy(&list);
+
+ mk_list_init(&list);
+ flb_slist_split_tokens(&list, "aaa bbb ccc ddd eee", 3);
+ token_check(&list, 3, "ddd eee");
+ flb_slist_destroy(&list);
+
+}
+
+void test_bugs()
+{
+ int ret;
+ struct mk_list list;
+ struct flb_slist_entry *e;
+
+ ret = flb_slist_create(&list);
+
+ /* Bug found during #293 development */
+ ret = flb_slist_split_string(&list, "$key2 ab final-tag true", ' ', 4);
+ TEST_CHECK(ret == 4);
+ e = flb_slist_entry_get(&list, 2);
+ TEST_CHECK(*e->str == 'f');
+
+ flb_slist_destroy(&list);
+}
+
+TEST_LIST = {
+ { "add" , test_slist_add},
+ { "split_string", test_slist_split_string},
+ { "split_tokens", test_slist_split_tokens},
+ { "bugs" , test_bugs},
+ { 0 }
+};