2 # This Python file uses the following encoding: utf-8
4 # The software in this package is distributed under the GNU General
5 # Public License version 2 (with a special exception described below).
7 # A copy of GNU General Public License (GPL) is included in this distribution,
8 # in the file COPYING.GPL.
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.
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.
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.
22 # Copyright (c) 2016-2018 Intra2net AG <info@intra2net.com>
27 from src import cnfvar
34 demo_cnfvar = {"cnf": [
36 "varname": "MY_FAVORITE_CNF_VAR",
39 "data": "string conf content",
43 "varname": "SOME_NESTED_CNF_VAR",
50 "varname": "SOME_CHILD_VAR",
61 # duplicate line number
62 demo_invalid_cnfvar = {"cnf": [
64 "varname": "SOME_PARTICULARLY_TASTY_CNF_VAR",
67 "data": "classic wingers",
71 "varname": "EXTRAORDINARILY_FANCY_CNF_VAR",
74 "data": "ab mentions",
78 "varname": "ANOTHER_POPULAR_CNF_VAR",
97 "varname" : "FIREWALL_SERVICEGROUP_PREDEFINED_ID"
107 "varname" : "FIREWALL_SERVICEGROUP_TYPE_COMMENT"
115 "varname" : "FIREWALL_SERVICEGROUP_TYPE_TCPUDP_DST_PORT"
123 "varname" : "FIREWALL_SERVICEGROUP_TYPE"
130 "varname" : "FIREWALL_SERVICEGROUP"
140 "varname" : "FIREWALL_SERVICEGROUP_PREDEFINED_ID"
150 "varname" : "FIREWALL_SERVICEGROUP_TYPE_COMMENT"
158 "varname" : "FIREWALL_SERVICEGROUP_TYPE_TCPUDP_DST_PORT"
166 "varname" : "FIREWALL_SERVICEGROUP_TYPE"
173 "varname" : "FIREWALL_SERVICEGROUP"
179 demo_jsoncnf_bytes = demo_jsoncnf.encode ("latin-1")
191 "varname" : "USER_DISABLED"
195 "data" : "Administrator",
199 "varname" : "USER_FULLNAME"
203 "data" : "INBOX/Kalender",
207 "varname" : "USER_GROUPWARE_FOLDER_CALENDAR"
211 "data" : "INBOX/Kontakte",
215 "varname" : "USER_GROUPWARE_FOLDER_CONTACTS"
219 "data" : "INBOX/Entwürfe",
223 "varname" : "USER_GROUPWARE_FOLDER_DRAFTS"
227 "data" : "INBOX/Notizen",
231 "varname" : "USER_GROUPWARE_FOLDER_NOTES"
235 "data" : "INBOX/Gesendete Elemente",
239 "varname" : "USER_GROUPWARE_FOLDER_OUTBOX"
243 "data" : "INBOX/Aufgaben",
247 "varname" : "USER_GROUPWARE_FOLDER_TASKS"
252 "data" : "INBOX/Gelöschte Elemente",
256 "varname" : "USER_GROUPWARE_FOLDER_TRASH"
264 "varname" : "USER_GROUP_MEMBER_REF"
272 "varname" : "USER_GROUP_MEMBER_REF"
280 "varname" : "USER_LOCALE"
288 "varname" : "USER_PASSWORD"
296 "varname" : "USER_TRASH_DELETEDAYS"
308 demo_latin1crap = demo_nonascii.encode('latin1')
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"
318 demo_cnf_group_bytes = demo_cnf_group.encode ("latin-1")
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"
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"
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"
349 demo_json_escaped_quotes = """
350 { "cnf": [ { "number" : 1,
351 "varname" : "HERE_BE_QUOTES",
355 "varname" : "HERE_BE_QUOTES",
357 "data" : "foo\\"bar\\"\\"\\"baz" },
359 "varname" : "HERE_BE_QUOTES",
361 "data" : "unquo\\\\\\"table" },
363 "varname" : "HERE_BE_QUOTES",
365 "data" : "unquo\\\\\\\\\\"\\"table" } ] }
372 class CnfVarUnittest(unittest.TestCase):
374 def test_print_cnf(self):
375 with open(os.devnull, "w") as devnull:
376 cnfvar.print_cnf(demo_cnfvar, out=devnull)
378 def test_parse_cnf_simple_str(self):
379 cnf = cnfvar.read_cnf(demo_cnf_group)
380 with open(os.devnull, "w") as devnull:
381 cnfvar.print_cnf_json(cnf, out=devnull)
383 def test_parse_cnf_simple_bytes(self):
384 cnf = cnfvar.read_cnf(demo_cnf_group_bytes)
385 with open(os.devnull, "w") as devnull:
386 cnfvar.print_cnf_json(cnf, out=devnull)
388 def test_parse_cnf_nested(self):
389 cnf = cnfvar.read_cnf(demo_cnf_filter)
390 with open(os.devnull, "w") as devnull:
391 cnfvar.print_cnf_json(cnf, out=devnull)
393 def test_parse_cnf_comments(self):
394 cnf = cnfvar.read_cnf(demo_cnf_comments)
395 with open(os.devnull, "w") as devnull:
396 cnfvar.print_cnf_json(cnf, out=devnull)
398 def test_print_cnf_garbage(self):
400 with open(os.devnull, "w") as devnull:
401 cnfvar.print_cnf(demo_invalid_cnfvar, out=devnull)
402 except cnfvar.InvalidCNF:
403 print ("Caught the duplicate line, bravo!")
405 def test_read_json_str(self):
406 cnf = cnfvar.read_cnf_json(demo_jsoncnf)
407 with open(os.devnull, "w") as devnull:
408 cnfvar.print_cnf(cnf, out=devnull)
410 def test_read_json_bytes(self):
411 cnf = cnfvar.read_cnf_json(demo_jsoncnf_bytes)
412 with open(os.devnull, "w") as devnull:
413 cnfvar.print_cnf(cnf, out=devnull)
415 def test_read_json_nonascii(self):
416 cnf = cnfvar.read_cnf_json(demo_nonascii)
417 with open(os.devnull, "wb") as devnull:
418 cnfvar.print_cnf(cnf, out=devnull)
420 def test_read_json_latin1(self):
421 cnf = cnfvar.read_cnf_json(demo_latin1crap)
422 with open(os.devnull, "wb") as devnull:
423 cnfvar.print_cnf(cnf, out=devnull)
425 def test_parse_cnf_quotes(self):
426 cnf = cnfvar.read_cnf(demo_cnf_escaped_quotes)
427 with open(os.devnull, "w") as devnull:
428 cnfvar.print_cnf_json(cnf, out=devnull)
430 def test_parse_json_quotes(self):
431 cnf = cnfvar.read_cnf_json(demo_json_escaped_quotes)
432 with open(os.devnull, "w") as devnull:
433 cnfvar.print_cnf_json(cnf, out=devnull)
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
440 def test_dump_cnf_uppercase(self):
441 """Test dump of cnfvars results in uppercase var names."""
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,
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}]}
455 serialization = cnfvar.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)
463 def test_read_cnf_lowercase(self):
464 """Test that after reading, varnames are lowercase."""
465 cnf = cnfvar.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())
475 if __name__ == '__main__':