master
c 127 lines 3.53 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "test_cgroups_plugin.h"
4
5 RRDHOST *localhost;
6 struct config netdata_config;
7
8 struct k8s_test_data {
9 char *data;
10 char *name;
11 char *key[3];
12 char *value[3];
13
14 const char *result_key[3];
15 const char *result_value[3];
16 int result_ls[3];
17 int i;
18 };
19
20 static int read_label_callback(const char *name, const char *value, void *data)
21 {
22 struct k8s_test_data *test_data = (struct k8s_test_data *)data;
23
24 test_data->result_key[test_data->i] = name;
25 test_data->result_value[test_data->i] = value;
26
27 test_data->i++;
28
29 return 1;
30 }
31
32 static void test_cgroup_parse_resolved_name(void **state)
33 {
34 UNUSED(state);
35
36 RRDLABELS *labels = rrdlabels_create();
37
38 struct k8s_test_data test_data[] = {
39 // One label
40 { .data = "name label1=\"value1\"",
41 .name = "name",
42 .key[0] = "label1", .value[0] = "value1" },
43
44 // Three labels
45 { .data = "name label1=\"value1\",label2=\"value2\",label3=\"value3\"",
46 .name = "name",
47 .key[0] = "label1", .value[0] = "value1",
48 .key[1] = "label2", .value[1] = "value2",
49 .key[2] = "label3", .value[2] = "value3" },
50
51 // Comma at the end of the data string
52 { .data = "name label1=\"value1\",",
53 .name = "name",
54 .key[0] = "label1", .value[0] = "value1" },
55
56 // Equals sign in the value
57 // { .data = "name label1=\"value=1\"",
58 // .name = "name",
59 // .key[0] = "label1", .value[0] = "value=1" },
60
61 // Double quotation mark in the value
62 // { .data = "name label1=\"value\"1\"",
63 // .name = "name",
64 // .key[0] = "label1", .value[0] = "value" },
65
66 // Escaped double quotation mark in the value
67 // { .data = "name label1=\"value\\\"1\"",
68 // .name = "name",
69 // .key[0] = "label1", .value[0] = "value\\\"1" },
70
71 // Equals sign in the key
72 // { .data = "name label=1=\"value1\"",
73 // .name = "name",
74 // .key[0] = "label", .value[0] = "1=\"value1\"" },
75
76 // Skipped value
77 // { .data = "name label1=,label2=\"value2\"",
78 // .name = "name",
79 // .key[0] = "label2", .value[0] = "value2" },
80
81 // A pair of equals signs
82 { .data = "name= =",
83 .name = "name=" },
84
85 // A pair of commas
86 { .data = "name, ,",
87 .name = "name," },
88
89 { .data = NULL }
90 };
91
92 for (int i = 0; test_data[i].data != NULL; i++) {
93 char *data = strdup(test_data[i].data);
94
95 char *name = cgroup_parse_resolved_name_and_labels(labels, data);
96
97 assert_string_equal(name, test_data[i].name);
98
99 rrdlabels_walkthrough_read(labels, read_label_callback, &test_data[i]);
100
101 for (int l = 0; l < 3 && test_data[i].key[l] != NULL; l++) {
102 char *key = test_data[i].key[l];
103 char *value = test_data[i].value[l];
104
105 const char *result_key = test_data[i].result_key[l];
106 const char *result_value = test_data[i].result_value[l];
107 int ls = test_data[i].result_ls[l];
108
109 assert_string_equal(key, result_key);
110 assert_string_equal(value, result_value);
111 assert_int_equal(RRDLABEL_SRC_AUTO | RRDLABEL_SRC_K8S, ls);
112 }
113
114 free(data);
115 }
116 }
117
118 int main(void)
119 {
120 const struct CMUnitTest tests[] = {
121 cmocka_unit_test(test_cgroup_parse_resolved_name),
122 };
123
124 int test_res = cmocka_run_group_tests_name("test_cgroup_parse_resolved_name", tests, NULL, NULL);
125
126 return test_res;
127 }