1ea3e76da94f245981e4674393985704695d011e
[pyi2ncommon] / test / test_build_cnfvar.py
1 #!/usr/bin/env python
2
3 # The software in this package is distributed under the GNU General
4 # Public License version 2 (with a special exception described below).
5 #
6 # A copy of GNU General Public License (GPL) is included in this distribution,
7 # in the file COPYING.GPL.
8 #
9 # As a special exception, if other files instantiate templates or use macros
10 # or inline functions from this file, or you compile this file and link it
11 # with other works to produce a work based on this file, this file
12 # does not by itself cause the resulting work to be covered
13 # by the GNU General Public License.
14 #
15 # However the source code for this file must still be made available
16 # in accordance with section (3) of the GNU General Public License.
17 #
18 # This exception does not invalidate any other reasons why a work based
19 # on this file might be covered by the GNU General Public License.
20 #
21 # Copyright (c) 2016-2018 Intra2net AG <info@intra2net.com>
22
23 """Unit test for build_cnfvar.py"""
24 import unittest
25 import os
26 from src.cnfline.build_cnfvar import BuildCnfVar
27
28 TEST_CONFIG_FILENAME = 'some_config.cnf'
29
30
31 class BuildCnfVarTest(unittest.TestCase):
32     def tearDown(self):
33         if os.path.isfile(TEST_CONFIG_FILENAME):
34             os.unlink(TEST_CONFIG_FILENAME)
35
36     def test_simple(self):
37         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
38
39         self.assertEqual('FOOBAR', cnfvar.name)
40         self.assertEqual(123, cnfvar.instance)
41         self.assertEqual('some_data', cnfvar.data)
42         self.assertEqual(10, cnfvar.line_no)
43
44     def test_find_child_line_no(self):
45         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
46         new_child_line_no = cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
47
48         self.assertEqual(new_child_line_no,
49                          cnfvar.find_child_line_no('FOOBAR_CHILD'))
50
51         # Should not be found
52         self.assertEqual(0, cnfvar.find_child_line_no('FOOBAR_SPACESHARK'))
53
54     def test_find_free_line_no(self):
55         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
56         self.assertEqual(11, cnfvar.find_free_line_no())
57
58         cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
59         self.assertEqual(12, cnfvar.find_free_line_no())
60
61     def test_find_free_child_instance(self):
62         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
63         cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
64
65         self.assertEqual(0, cnfvar.find_free_child_instance('FOOBAR_OTHER'))
66         self.assertEqual(1, cnfvar.find_free_child_instance('FOOBAR_CHILD'))
67
68     def test_update_cnf(self):
69         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
70         cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
71
72         # Update existing cnfvar
73         cnfvar.update_cnf('FOOBAR_CHILD', 0, 'abc')
74
75         self.assertEqual('10 FOOBAR,123: "some_data"\n'
76                          '11 (10) FOOBAR_CHILD,0: "abc"\n', str(cnfvar))
77
78     def test_string_output(self):
79         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
80         cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
81         cnfvar.update_cnf('FOOBAR_CHILD', 0, 'abc')
82         cnfvar.add_cnf('FOOBAR_CHILD', 1, 'more data')
83
84         self.assertEqual('10 FOOBAR,123: "some_data"\n'
85                          '11 (10) FOOBAR_CHILD,0: "abc"\n'
86                          '12 (10) FOOBAR_CHILD,1: "more data"\n', str(cnfvar))
87
88     def test_del_cnf(self):
89         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
90         cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
91         cnfvar.add_cnf('FOOBAR_CHILD', 1, 'more data')
92
93         cnfvar.del_cnf('FOOBAR_CHILD')
94
95         self.assertEqual('10 FOOBAR,123: "some_data"\n', str(cnfvar))
96
97     def test_add_different_parent_no(self):
98         cnfvar = BuildCnfVar('FOOBAR', 123, 'some_data', 10)
99         sub_parent = cnfvar.add_cnf('FOOBAR_CHILD', 0, 'xxx')
100         cnfvar.add_cnf('FOOBAR_OTHER', 0, 'foo')
101         cnfvar.add_cnf('FOOBAR_CHILD_TYPE', 1, 'spaceshark', sub_parent)
102         cnfvar.add_cnf('FOOBAR_OTHER2', 0, 'foo2')
103
104         self.assertEqual('10 FOOBAR,123: "some_data"\n'
105                          '11 (10) FOOBAR_CHILD,0: "xxx"\n'
106                          '12 (10) FOOBAR_OTHER,0: "foo"\n'
107                          '13 (11) FOOBAR_CHILD_TYPE,1: "spaceshark"\n'
108                          '14 (10) FOOBAR_OTHER2,0: "foo2"\n', str(cnfvar))
109
110     def test_add_defaults(self):
111         cnfvar = BuildCnfVar('FOOBAR', 0, 'some_data')
112
113         defaults = {'FOOBAR_SOMETHING': 'abc',
114                     'FOOBAR_MODE': 'optimize'}
115         cnfvar.add_defaults(defaults)
116
117         self.assertTrue('1 FOOBAR,0: "some_data"\n'
118                         '2 (1) FOOBAR_SOMETHING,0: "abc"\n'
119                         '3 (1) FOOBAR_MODE,0: "optimize"\n' == str(cnfvar)
120                      or '1 FOOBAR,0: "some_data"\n'
121                         '2 (1) FOOBAR_MODE,0: "optimize"\n'
122                         '3 (1) FOOBAR_SOMETHING,0: "abc"\n' == str(cnfvar))
123
124     def test_mark_as_own_parent(self):
125         cnfvar = BuildCnfVar('FOOBAR_SOMETHING', 123, 'some_data', 10)
126
127         line_no = cnfvar.add_cnf('FOOBAR_OTHER', 0, 'xxx')
128         cnfvar.mark_as_own_parent(line_no)
129
130         self.assertEqual('10 FOOBAR_SOMETHING,123: "some_data"\n'
131                          '11 FOOBAR_OTHER,0: "xxx"\n', str(cnfvar))
132
133     def test_save(self):
134         cnfvar = BuildCnfVar('FOOBAR', 0, 'some_data')
135
136         defaults = {'FOOBAR_SOMETHING': 'abc',
137                     'FOOBAR_MODE': 'optimize'}
138         cnfvar.add_defaults(defaults)
139
140         cnfvar.save(TEST_CONFIG_FILENAME)
141         with open(TEST_CONFIG_FILENAME, 'r') as input:
142             read_back = input.read()
143
144             self.assertTrue('1 FOOBAR,0: "some_data"\n'
145                             '2 (1) FOOBAR_SOMETHING,0: "abc"\n'
146                             '3 (1) FOOBAR_MODE,0: "optimize"\n' == read_back
147                          or '1 FOOBAR,0: "some_data"\n'
148                             '2 (1) FOOBAR_MODE,0: "optimize"\n'
149                             '3 (1) FOOBAR_SOMETHING,0: "abc"\n' == read_back)
150
151         os.unlink(TEST_CONFIG_FILENAME)
152
153
154 if __name__ == '__main__':
155     unittest.main()