1-- severity_test.lua
2-- Runs unit tests against the severity filtering code from severity.lua
3-- requires 2 arguments
4-- 1. a path to the test library: e.g.: /Users/ur1337/edge-infra/third_party/lua/simple_test/src
5-- 2. a path to the test target dir: e.g.: /Users/ur1337/edge-infra/pkg/edge/logging/fluentbit
6
7local test_library = arg[1] .. "/?.lua"
8local target_dir = arg[2] .. "/?.lua"
9local test_data = arg[2] .. "/testdata"
10
11-- the test library and target directory need to be added to package.path so we can 'require' them
12package.path = package.path .. ";" .. test_library .. ";" .. target_dir .. ";" .. test_data
13
14local test = require("simple_test.init")
15local severity = require("severity")
16
17local logLevelsTest = {
18 ["cluster"] = "warning",
19 ["namespace"] = {
20 ["warehouse-system"] = "info",
21 ["kinform"] = "critical"
22 },
23}
24
25local test_string_fill = "_test-pod-name_test-container-name_"
26
27local config_map_test_cases = {
28 {
29 description = "should populate the log_levels table",
30 input = test_data .. "/log-levels-info",
31 assert_func = function(t,result) t.not_equal(next(result), nil) end
32 },
33 {
34 description = "should return cluser level = info",
35 input = test_data .. "/log-levels-info",
36 assert_func = function(t,result) t.equal(result.cluster, "info") end
37 },
38 {
39 description = "should return an empty map if no file is found",
40 input = test_data .. "/log-levels-file-does-not-exist",
41 -- in lua, a call to next returns the next index of the table and its associated value. So if
42 -- we have an empty map then the value should be nil.
43 assert_func = function(t,result) t.equal(next(result), nil) end
44 },
45 {
46 description = "should return cluser level = error",
47 input = test_data .. "/log-levels-error",
48 assert_func = function(t,result) t.equal(result.cluster, "error") end
49 },
50 {
51 description = "should return a critical level for a cluster with namespaces defined",
52 input = test_data .. "/log-levels-with-ns",
53 assert_func = function(t,result) t.equal(result.cluster, "critical") end
54 },
55 {
56 description = "should return an info level for a namespace",
57 input = test_data .. "/log-levels-with-ns",
58 assert_func = function(t,result) t.equal(result.namespace["warehouse-system"], "info") end
59 },
60 {
61 description = "should return a warning level for a namespace",
62 input = test_data .. "/log-levels-with-ns",
63 assert_func = function(t,result) t.equal(result.namespace["kinform"], "warning") end
64 },
65 {
66 description = "should handle mixed case cluster severity levels",
67 input = test_data .. "/log-levels-mixed-case",
68 assert_func = function(t,result) t.equal(result.cluster, "error") end
69 },
70 {
71 description = "should handle mixed case namespace severity levels",
72 input = test_data .. "/log-levels-mixed-case",
73 assert_func = function(t,result) t.equal(result.namespace["warehouse-system"], "info") end
74 },
75 {
76 description = "should return an error level if cluster key is empty",
77 input = test_data .. "/log-levels-cluster-empty",
78 assert_func = function(t,result) t.equal(result.cluster, "error") end
79 },
80 {
81 description = "should return an error level if cluster setting is double quote empty string",
82 input = test_data .. "/log-levels-cluster-empty-quotes",
83 assert_func = function(t,result) t.equal(result.cluster, "error") end
84 },
85 {
86 description = "should return an error level if cluster setting is single quote empty string",
87 input = test_data .. "/log-levels-cluster-empty-single-quotes",
88 assert_func = function(t,result) t.equal(result.cluster, "error") end
89 },
90 {
91 description = "should return an error level if no cluster setting is defined",
92 input = test_data .. "/log-levels-no-cluster",
93 assert_func = function(t,result) t.equal(result.cluster, "error") end
94 },
95 {
96 description = "should return namespace:info if only namespaces are found ",
97 input = test_data .. "/log-levels-no-cluster",
98 assert_func = function(t,result) t.equal(result.namespace["warehouse-system"], "info") end
99 },
100 {
101 description = "should return namespace:error if namespace value is empty",
102 input = test_data .. "/log-levels-with-ns-quotes",
103 assert_func = function(t,result) t.equal(result.namespace["warehouse-system"], "error") end
104 },
105 {
106 description = "should ignore a line if namespace is empty",
107 input = test_data .. "/log-levels-ns-empty",
108 assert_func = function(t,result) t.equal(result.cluster, "critical") end
109 },
110 {
111 description = "should not return a namespace value if namespace is empty",
112 input = test_data .. "/log-levels-ns-empty",
113 assert_func = function(t,result) t.equal(result.namespace, nil) end
114 },
115 {
116 description = "should ignore a line if namespace is empty but still get other namespace levels",
117 input = test_data .. "/log-levels-ns-empty-multi",
118 assert_func = function(t,result) t.equal(result.namespace["warehouse-system"], "info") end
119 },
120 {
121 description = "should ignore a line if namespace is defined but has an empty severity",
122 input = test_data .. "/log-levels-ns-value-empty",
123 assert_func = function(t,result) t.equal(result.namespace, nil) end
124 },
125 {
126 description = "should ignore a line if namespace line is defined without a namespace name",
127 input = test_data .. "/log-levels-ns-empty-missing",
128 assert_func = function(t,result) t.equal(result.namespace, nil) end,
129 },
130}
131
132local normal_severity_test_cases = {
133 {
134 description = "allowed severity log level warehouse-system = info",
135 record = {
136 ["kubernetes"] = {
137 ["container_name"] = "lumperctl",
138 ["namespace_name"] = "warehouse-system"
139 },
140 },
141 tag = "k8s_container.warehouse-system" .. test_string_fill,
142 log_levels = logLevelsTest,
143 assert_func = function(t,result) t.equal(result["info"], true) end
144 },
145 {
146 description = "allowed severity log level from cluster setting",
147 record = {
148 ["kubernetes"] = {
149 ["container_name"] = "lumperctl",
150 ["namespace_name"] = "warehouse-system"
151 },
152 },
153 tag = "k8s_container.warehouse-system" .. test_string_fill,
154 log_levels = logLevelsTest,
155 assert_func = function(t,result) t.equal(result["warning"], true) end
156 },
157 {
158 description = "allowed severity log level from default setting error",
159 record = {
160 ["kubernetes"] = {
161 ["container_name"] = "fluentbit",
162 ["namespace_name"] = "fluent-operator"
163 },
164 },
165 tag = "k8s_container.fluent-operator" .. test_string_fill,
166 log_levels = {
167 ["namespace"] = {
168 ["warehouse-system"] = "info",
169 ["kinform"] = "critical"
170 },
171 },
172 assert_func = function(t,result) t.equal(result["error"], true) end
173 },
174 {
175 description = "audit level logs, should be nil for severity",
176 record = {
177 ["kubernetes"] = {
178 ["container_name"] = "lumperctl",
179 ["namespace_name"] = "warehouse-system"
180 },
181 ["log_class"] = "audit",
182 },
183 tag = "k8s_container.warehouse-system" .. test_string_fill,
184 log_levels = logLevelsTest,
185 assert_func = function(t,result) t.equal(result, nil) end
186 },
187 {
188 description = "security level logs, should be nil for severity",
189 record = {
190 ["kubernetes"] = {
191 ["namespace_name"] = "authserver"
192 },
193 ["log_class"] = "security",
194 },
195 tag = "k8s_container.authserver_authserver_authserver",
196 log_levels = logLevelsTest,
197 assert_func = function(t,result) t.equal(result, nil) end
198 },
199 {
200 description = "annotation to info level logs",
201 record = {
202 ["kubernetes"] = {
203 ["container_name"] = "lumperctl",
204 ["namespace_name"] = "fluent-operator",
205 ["annotations"] = {
206 ["logging.edge.ncr.com/level"] = "info"
207 }
208 },
209 ["log_class"] = "notice",
210 },
211 tag = "k8s_container.fluent-operator" .. test_string_fill,
212 log_levels = logLevelsTest,
213 assert_func = function(t,result) t.equal(result["info"], true) end
214 },
215}
216
217local log_replay_severity_test_cases = {
218 {
219 description = "allowed severity log level info: lower case",
220 record = {
221 ["kubernetes"] = {
222 ["container_name"] = "lumperctl",
223 ["namespace_name"] = "warehouse-system"
224 },
225 ["replay_severity"] = "info",
226 ["log_class"] = "replay",
227 },
228 tag = "k8s_container.warehouse-system" .. test_string_fill,
229 log_levels = logLevelsTest,
230 assert_func = function(t,result) t.equal(result["info"], true) end
231 },
232 {
233 description = "allowed severity log level info: upper case",
234 record = {
235 ["kubernetes"] = {
236 ["container_name"] = "lumperctl",
237 ["namespace_name"] = "warehouse-system"
238 },
239 ["replay_severity"] = "INFO",
240 ["log_class"] = "replay",
241 },
242 tag = "k8s_container.warehouse-system" .. test_string_fill,
243 log_levels = logLevelsTest,
244 assert_func = function(t,result) t.equal(result["info"], true) end
245 },
246 {
247 description = "allowed severity log level warning: upper case",
248 record = {
249 ["kubernetes"] = {
250 ["container_name"] = "lumperctl",
251 ["namespace_name"] = "warehouse-system"
252 },
253 ["replay_severity"] = "WARNING",
254 ["log_class"] = "replay",
255 },
256 tag = "k8s_container.warehouse-system" .. test_string_fill,
257 log_levels = logLevelsTest,
258 assert_func = function(t,result) t.equal(result["warning"], true) end
259 },
260 {
261 description = "no log level passed in",
262 record = {
263 ["kubernetes"] = {
264 ["container_name"] = "lumperctl",
265 ["namespace_name"] = "warehouse-system"
266 },
267 ["log_class"] = "replay",
268 },
269 tag = "k8s_container.warehouse-system" .. test_string_fill,
270 log_levels = logLevelsTest,
271 assert_func = function(t,result) t.equal(result, nil) end
272 },
273}
274
275print("--------------------------------------")
276print("severity config_map_test_cases started")
277print("--------------------------------------")
278for _, case in ipairs(config_map_test_cases) do
279 test(case.description, function(t)
280 local result = severity.parse_levels_configmap(case.input)
281 case.assert_func(t, result)
282 end)
283end
284
285print("------------------------------------------")
286print("normal_allowed_severity_test_cases started")
287print("-----------------------------------------")
288for _, case in ipairs(normal_severity_test_cases) do
289 test(case.description, function(t)
290 local result = severity.get_allowed_severity(case.tag, case.record, case.log_levels)
291 case.assert_func(t, result)
292 end)
293end
294
295
296print("----------------------------------------------")
297print("log_replay_allowed_severity_test_cases started")
298print("----------------------------------------------")
299for _, case in ipairs(log_replay_severity_test_cases) do
300 test(case.description, function(t)
301 local result = severity.get_allowed_severity(case.tag, case.record, case.log_levels)
302 case.assert_func(t, result)
303 end)
304end
View as plain text