Drop previous simple cnf module and class throughout the codebase
[pyi2ncommon] / test / test_cnfvar_old.py
1 #!/usr/bin/env python
2 # This Python file uses the following encoding: utf-8
3
4 # The software in this package is distributed under the GNU General
5 # Public License version 2 (with a special exception described below).
6 #
7 # A copy of GNU General Public License (GPL) is included in this distribution,
8 # in the file COPYING.GPL.
9 #
10 # As a special exception, if other files instantiate templates or use macros
11 # or inline functions from this file, or you compile this file and link it
12 # with other works to produce a work based on this file, this file
13 # does not by itself cause the resulting work to be covered
14 # by the GNU General Public License.
15 #
16 # However the source code for this file must still be made available
17 # in accordance with section (3) of the GNU General Public License.
18 #
19 # This exception does not invalidate any other reasons why a work based
20 # on this file might be covered by the GNU General Public License.
21 #
22 # Copyright (c) 2016-2018 Intra2net AG <info@intra2net.com>
23
24 import os
25 import unittest
26
27 from src import cnfvar_old
28
29 #
30 #                                  test data
31 #
32
33 # model cnf tree
34 demo_cnfvar = {"cnf": [
35     {
36         "varname": "MY_FAVORITE_CNF_VAR",
37         "instance": 1337,
38         "number": 42,
39         "data": "string conf content",
40         "comment": ""
41     },
42     {
43         "varname": "SOME_NESTED_CNF_VAR",
44         "instance": 0,
45         "number": 23,
46         "data": "999",
47         "comment": "",
48         "children": [
49             {
50                 "varname": "SOME_CHILD_VAR",
51                 "instance": 1,
52                 "number": 24,
53                 "data": "2014",
54                 "parent": 23,
55                 "comment": ""
56             }
57         ]
58     },
59 ]}
60
61 # duplicate line number
62 demo_invalid_cnfvar = {"cnf": [
63     {
64         "varname": "SOME_PARTICULARLY_TASTY_CNF_VAR",
65         "instance": 1337,
66         "number": 23,
67         "data": "classic wingers",
68         "comment": ""
69     },
70     {
71         "varname": "EXTRAORDINARILY_FANCY_CNF_VAR",
72         "instance": 1,
73         "number": 42,
74         "data": "ab mentions",
75         "comment": ""
76     },
77     {
78         "varname": "ANOTHER_POPULAR_CNF_VAR",
79         "instance": 0,
80         "number": 42,
81         "data": "notches",
82         "comment": ""
83     }
84 ]}
85
86 demo_jsoncnf = """
87 {
88     "cnf" : [
89         {
90             "children" : [
91                 {
92                     "comment" : "",
93                     "data" : "1",
94                     "instance" : 0,
95                     "number" : 2,
96                     "parent" : 1,
97                     "varname" : "FIREWALL_SERVICEGROUP_PREDEFINED_ID"
98                 },
99                 {
100                     "children" : [
101                         {
102                             "comment" : "",
103                             "data" : "",
104                             "instance" : 0,
105                             "number" : 4,
106                             "parent" : 3,
107                             "varname" : "FIREWALL_SERVICEGROUP_TYPE_COMMENT"
108                         },
109                         {
110                             "comment" : "",
111                             "data" : "80",
112                             "instance" : 0,
113                             "number" : 5,
114                             "parent" : 3,
115                             "varname" : "FIREWALL_SERVICEGROUP_TYPE_TCPUDP_DST_PORT"
116                         }
117                     ],
118                     "comment" : "",
119                     "data" : "TCP",
120                     "instance" : 0,
121                     "number" : 3,
122                     "parent" : 1,
123                     "varname" : "FIREWALL_SERVICEGROUP_TYPE"
124                 }
125             ],
126             "comment" : "",
127             "data" : "http",
128             "instance" : 1,
129             "number" : 1,
130             "varname" : "FIREWALL_SERVICEGROUP"
131         },
132         {
133             "children" : [
134                 {
135                     "comment" : "",
136                     "data" : "2",
137                     "instance" : 0,
138                     "number" : 7,
139                     "parent" : 6,
140                     "varname" : "FIREWALL_SERVICEGROUP_PREDEFINED_ID"
141                 },
142                 {
143                     "children" : [
144                         {
145                             "comment" : "",
146                             "data" : "",
147                             "instance" : 0,
148                             "number" : 9,
149                             "parent" : 8,
150                             "varname" : "FIREWALL_SERVICEGROUP_TYPE_COMMENT"
151                         },
152                         {
153                             "comment" : "",
154                             "data" : "443",
155                             "instance" : 0,
156                             "number" : 10,
157                             "parent" : 8,
158                             "varname" : "FIREWALL_SERVICEGROUP_TYPE_TCPUDP_DST_PORT"
159                         }
160                     ],
161                     "comment" : "",
162                     "data" : "TCP",
163                     "instance" : 0,
164                     "number" : 8,
165                     "parent" : 6,
166                     "varname" : "FIREWALL_SERVICEGROUP_TYPE"
167                 }
168             ],
169             "comment" : "",
170             "data" : "https",
171             "instance" : 2,
172             "number" : 6,
173             "varname" : "FIREWALL_SERVICEGROUP"
174         }
175     ]
176 }
177 """
178
179 demo_jsoncnf_bytes = demo_jsoncnf.encode ("latin-1")
180
181 demo_nonascii = r"""
182 { "cnf" : [
183     {
184         "children" : [
185             {
186                 "comment" : "",
187                 "data" : "0",
188                 "instance" : 0,
189                 "number" : 2,
190                 "parent" : 1,
191                 "varname" : "USER_DISABLED"
192             },
193             {
194                 "comment" : "",
195                 "data" : "Administrator",
196                 "instance" : 0,
197                 "number" : 3,
198                 "parent" : 1,
199                 "varname" : "USER_FULLNAME"
200             },
201             {
202                 "comment" : "",
203                 "data" : "INBOX/Kalender",
204                 "instance" : 0,
205                 "number" : 4,
206                 "parent" : 1,
207                 "varname" : "USER_GROUPWARE_FOLDER_CALENDAR"
208             },
209             {
210                 "comment" : "",
211                 "data" : "INBOX/Kontakte",
212                 "instance" : 0,
213                 "number" : 5,
214                 "parent" : 1,
215                 "varname" : "USER_GROUPWARE_FOLDER_CONTACTS"
216             },
217             {
218                 "comment" : "",
219                 "data" : "INBOX/Entwürfe",
220                 "instance" : 0,
221                 "number" : 6,
222                 "parent" : 1,
223                 "varname" : "USER_GROUPWARE_FOLDER_DRAFTS"
224             },
225             {
226                 "comment" : "",
227                 "data" : "INBOX/Notizen",
228                 "instance" : 0,
229                 "number" : 7,
230                 "parent" : 1,
231                 "varname" : "USER_GROUPWARE_FOLDER_NOTES"
232             },
233             {
234                 "comment" : "",
235                 "data" : "INBOX/Gesendete Elemente",
236                 "instance" : 0,
237                 "number" : 8,
238                 "parent" : 1,
239                 "varname" : "USER_GROUPWARE_FOLDER_OUTBOX"
240             },
241             {
242                 "comment" : "",
243                 "data" : "INBOX/Aufgaben",
244                 "instance" : 0,
245                 "number" : 9,
246                 "parent" : 1,
247                 "varname" : "USER_GROUPWARE_FOLDER_TASKS"
248             },
249
250             {
251                 "comment" : "",
252                 "data" : "INBOX/Gelöschte Elemente",
253                 "instance" : 0,
254                 "number" : 10,
255                 "parent" : 1,
256                 "varname" : "USER_GROUPWARE_FOLDER_TRASH"
257             },
258             {
259                 "comment" : "",
260                 "data" : "1",
261                 "instance" : 0,
262                 "number" : 11,
263                 "parent" : 1,
264                 "varname" : "USER_GROUP_MEMBER_REF"
265             },
266             {
267                 "comment" : "",
268                 "data" : "2",
269                 "instance" : 1,
270                 "number" : 12,
271                 "parent" : 1,
272                 "varname" : "USER_GROUP_MEMBER_REF"
273             },
274             {
275                 "comment" : "",
276                 "data" : "",
277                 "instance" : 0,
278                 "number" : 13,
279                 "parent" : 1,
280                 "varname" : "USER_LOCALE"
281             },
282             {
283                 "comment" : "",
284                 "data" : "idkfa",
285                 "instance" : 0,
286                 "number" : 14,
287                 "parent" : 1,
288                 "varname" : "USER_PASSWORD"
289             },
290             {
291                 "comment" : "",
292                 "data" : "30",
293                 "instance" : 0,
294                 "number" : 15,
295                 "parent" : 1,
296                 "varname" : "USER_TRASH_DELETEDAYS"
297             }
298         ],
299         "comment" : "",
300         "data" : "admin",
301         "instance" : 1,
302         "number" : 1,
303         "varname" : "USER"
304     }
305 ]}
306 """
307
308 demo_latin1crap = demo_nonascii.encode('latin1')
309
310 demo_cnf_group = """
311 1 GROUP,1: "Administratoren"
312 2    (1) GROUP_ACCESS_GO_ONLINE_ALLOWED,0: "1"
313 3    (1) GROUP_EMAILFILTER_BAN_FILTERLIST_REF,0: "-1"
314 4    (1) GROUP_EMAIL_RELAY_RIGHTS,0: "RELAY_FROM_INTRANET"
315 5    (1) GROUP_PROXY_PROFILE_REF,0: "1"
316 """
317
318 demo_cnf_group_bytes = demo_cnf_group.encode ("latin-1")
319
320 demo_cnf_filter = b"""
321 1 EMAILFILTER_BAN_FILTERLIST,1: "Vordefiniert: Alles verboten"
322 2    (1) EMAILFILTER_BAN_FILTERLIST_ENCRYPTED,0: "BLOCK"
323 3    (1) EMAILFILTER_BAN_FILTERLIST_EXTENSIONS,0: ""
324 4    (1) EMAILFILTER_BAN_FILTERLIST_MIMETYPES,0: ""
325 5       (4) EMAILFILTER_BAN_FILTERLIST_MIMETYPES_NAME,0: "text/plain"
326 6       (4) EMAILFILTER_BAN_FILTERLIST_MIMETYPES_NAME,1: "text/html"
327 7    (1) EMAILFILTER_BAN_FILTERLIST_MODE,0: "ALLOW"
328 8    (1) EMAILFILTER_BAN_FILTERLIST_PREDEFINED_ID,0: "1"
329 """
330
331 demo_cnf_comments = b"""
332 1 EMAILFILTER_BAN_FILTERLIST,1: "Vordefiniert: Alles verboten"
333 2    (1) EMAILFILTER_BAN_FILTERLIST_ENCRYPTED,0: "BLOCK"
334 3    (1) EMAILFILTER_BAN_FILTERLIST_EXTENSIONS,0: ""
335 4    (1) EMAILFILTER_BAN_FILTERLIST_MIMETYPES,0: "" # foo
336 5       (4) EMAILFILTER_BAN_FILTERLIST_MIMETYPES_NAME,0: "text/plain"#bar
337 6       (4) EMAILFILTER_BAN_FILTERLIST_MIMETYPES_NAME,1: "text/html"
338 7    (1) EMAILFILTER_BAN_FILTERLIST_MODE,0: "ALLOW"     # baz
339 8    (1) EMAILFILTER_BAN_FILTERLIST_PREDEFINED_ID,0: "1"
340 """
341
342 demo_cnf_escaped_quotes = """
343 1 HERE_BE_QUOTES,0: "\""
344 2 HERE_BE_QUOTES,1: "foo\"bar\"\"\"baz"
345 3 HERE_BE_QUOTES,2: "unquo\\\"table"
346 4 HERE_BE_QUOTES,3: "unquo\\\\\"\"table"
347 """
348
349 demo_json_escaped_quotes = """
350 { "cnf": [ { "number"   : 1,
351              "varname"  : "HERE_BE_QUOTES",
352              "instance" : 0,
353              "data"     : "\\"" },
354            { "number"   : 2,
355              "varname"  : "HERE_BE_QUOTES",
356              "instance" : 1,
357              "data"     : "foo\\"bar\\"\\"\\"baz" },
358            { "number"   : 3,
359              "varname"  : "HERE_BE_QUOTES",
360              "instance" : 2,
361              "data"     : "unquo\\\\\\"table" },
362            { "number"   : 4,
363              "varname"  : "HERE_BE_QUOTES",
364              "instance" : 3,
365              "data"     : "unquo\\\\\\\\\\"\\"table" } ] }
366 """
367
368 #
369 #                                 test class
370 #
371
372 class CnfVarUnittest(unittest.TestCase):
373
374     def test_print_cnf(self):
375         with open(os.devnull, "w") as devnull:
376             cnfvar_old.print_cnf(demo_cnfvar, out=devnull)
377
378     def test_parse_cnf_simple_str(self):
379         cnf = cnfvar_old.read_cnf(demo_cnf_group)
380         with open(os.devnull, "w") as devnull:
381             cnfvar_old.print_cnf_json(cnf, out=devnull)
382
383     def test_parse_cnf_simple_bytes(self):
384         cnf = cnfvar_old.read_cnf(demo_cnf_group_bytes)
385         with open(os.devnull, "w") as devnull:
386             cnfvar_old.print_cnf_json(cnf, out=devnull)
387
388     def test_parse_cnf_nested(self):
389         cnf = cnfvar_old.read_cnf(demo_cnf_filter)
390         with open(os.devnull, "w") as devnull:
391             cnfvar_old.print_cnf_json(cnf, out=devnull)
392
393     def test_parse_cnf_comments(self):
394         cnf = cnfvar_old.read_cnf(demo_cnf_comments)
395         with open(os.devnull, "w") as devnull:
396             cnfvar_old.print_cnf_json(cnf, out=devnull)
397
398     def test_print_cnf_garbage(self):
399         try:
400             with open(os.devnull, "w") as devnull:
401                 cnfvar_old.print_cnf(demo_invalid_cnfvar, out=devnull)
402         except cnfvar_old.InvalidCNF:
403             print ("Caught the duplicate line, bravo!")
404
405     def test_read_json_str(self):
406         cnf = cnfvar_old.read_cnf_json(demo_jsoncnf)
407         with open(os.devnull, "w") as devnull:
408             cnfvar_old.print_cnf(cnf, out=devnull)
409
410     def test_read_json_bytes(self):
411         cnf = cnfvar_old.read_cnf_json(demo_jsoncnf_bytes)
412         with open(os.devnull, "w") as devnull:
413             cnfvar_old.print_cnf(cnf, out=devnull)
414
415     def test_read_json_nonascii(self):
416         cnf = cnfvar_old.read_cnf_json(demo_nonascii)
417         with open(os.devnull, "wb") as devnull:
418             cnfvar_old.print_cnf(cnf, out=devnull)
419
420     def test_read_json_latin1(self):
421         cnf = cnfvar_old.read_cnf_json(demo_latin1crap)
422         with open(os.devnull, "wb") as devnull:
423             cnfvar_old.print_cnf(cnf, out=devnull)
424
425     def test_parse_cnf_quotes(self):
426         cnf = cnfvar_old.read_cnf(demo_cnf_escaped_quotes)
427         with open(os.devnull, "w") as devnull:
428             cnfvar_old.print_cnf_json(cnf, out=devnull)
429
430     def test_parse_json_quotes(self):
431         cnf = cnfvar_old.read_cnf_json(demo_json_escaped_quotes)
432         with open(os.devnull, "w") as devnull:
433             cnfvar_old.print_cnf_json(cnf, out=devnull)
434
435
436 class CnfVarUnittestVarnameCase(unittest.TestCase):
437     """Tests for verifying that uppercasing/lowercasing of varname works."""
438     # TODO: rethink whether this lower-casing is worth all the effort it causes
439
440     def test_dump_cnf_uppercase(self):
441         """Test dump of cnfvars results in uppercase var names."""
442         cnf = {"cnf": [
443             {"instance": 0, "varname": "dialout_mode",
444               "data": "ONLINE", "number": 1, "comment": None},
445             {"instance": 0, "varname": "dialout_defaultprovider_ref",
446              "data": "1", "number": 2, "comment": None},
447             {"instance": 0, "varname": "hypothetical_parent",
448              "data": "parent value", "number": 3, "comment": None,
449              "children": [
450             {"instance": 0, "varname": "hypothetical_child",
451              "data": "0", "number": 4, "parent": 3, "comment": None},
452             {"instance": 1, "varname": "hypothetical_child",
453              "data": "1", "number": 5, "parent": 3, "comment": None}]}
454         ]}
455         serialization = cnfvar_old.dump_json_string(cnf)
456         self.assertIn('DIALOUT_MODE', serialization)
457         self.assertIn('DIALOUT_DEFAULTPROVIDER_REF', serialization)
458         self.assertIn('HYPOTHETICAL_CHILD', serialization)
459         self.assertNotIn('dialout_mode', serialization)
460         self.assertNotIn('dialout_defaultprovider_ref', serialization)
461         self.assertNotIn('hypothetical_child', serialization)
462
463     def test_read_cnf_lowercase(self):
464         """Test that after reading, varnames are lowercase."""
465         cnf = cnfvar_old.read_cnf_json(demo_jsoncnf.encode('latin1'))
466         for parentvar  in cnf['cnf']:
467             self.assertEqual(parentvar['varname'],
468                              parentvar['varname'].lower())
469             if 'children' in parentvar:
470                 for childvar in parentvar['children']:
471                     self.assertEqual(parentvar['varname'],
472                                      parentvar['varname'].lower())
473
474
475 if __name__ == '__main__':
476     unittest.main()