43b09df8ecce7155c338becb5155119a1832e31c
[amitay/samba.git] / lib / talloc / test_pytalloc.py
1 #!/usr/bin/env python
2 # Simple tests for the talloc python bindings.
3 # Copyright (C) 2015 Petr Viktorin <pviktori@redhat.com>
4
5 import unittest
6 import subprocess
7 import sys
8 import gc
9
10 import talloc
11 import _test_pytalloc
12
13
14 def dummy_func():
15     pass
16
17
18 class TallocTests(unittest.TestCase):
19
20     def test_report_full(self):
21         # report_full is hardcoded to print to stdout, so use a subprocess
22         process = subprocess.Popen([
23             sys.executable, '-c',
24             """if True:
25             import talloc, _test_pytalloc
26             obj = _test_pytalloc.new()
27             talloc.report_full(obj)
28             """
29         ], stdout=subprocess.PIPE)
30         output, stderr = process.communicate()
31         output = str(output)
32         self.assertTrue("full talloc report on 'talloc.Object" in output)
33         self.assertTrue("This is a test string" in output)
34
35     def test_totalblocks(self):
36         obj = _test_pytalloc.new()
37         # Two blocks: the string, and the name
38         self.assertEqual(talloc.total_blocks(obj), 2)
39
40     def test_repr(self):
41         obj = _test_pytalloc.new()
42         prefix = '<talloc.Object talloc object at'
43         self.assertTrue(repr(obj).startswith(prefix))
44         self.assertEqual(repr(obj), str(obj))
45
46     def test_base_repr(self):
47         obj = _test_pytalloc.base_new()
48         prefix = '<talloc.BaseObject talloc based object at'
49         self.assertTrue(repr(obj).startswith(prefix))
50         self.assertEqual(repr(obj), str(obj))
51
52     def test_destructor(self):
53         # Check correct lifetime of the talloc'd data
54         lst = []
55         obj = _test_pytalloc.DObject(lambda: lst.append('dead'))
56         self.assertEqual(lst, [])
57         del obj
58         gc.collect()
59         self.assertEqual(lst, ['dead'])
60
61     def test_base_destructor(self):
62         # Check correct lifetime of the talloc'd data
63         lst = []
64         obj = _test_pytalloc.DBaseObject(lambda: lst.append('dead'))
65         self.assertEqual(lst, [])
66         del obj
67         gc.collect()
68         self.assertEqual(lst, ['dead'])
69
70
71 class TallocComparisonTests(unittest.TestCase):
72
73     def test_compare_same(self):
74         obj1 = _test_pytalloc.new()
75         self.assertTrue(obj1 == obj1)
76         self.assertFalse(obj1 != obj1)
77         self.assertTrue(obj1 <= obj1)
78         self.assertFalse(obj1 < obj1)
79         self.assertTrue(obj1 >= obj1)
80         self.assertFalse(obj1 > obj1)
81
82     def test_compare_different(self):
83         # object comparison is consistent
84         obj1, obj2 = sorted([
85             _test_pytalloc.new(),
86             _test_pytalloc.new()])
87         self.assertFalse(obj1 == obj2)
88         self.assertTrue(obj1 != obj2)
89         self.assertTrue(obj1 <= obj2)
90         self.assertTrue(obj1 < obj2)
91         self.assertFalse(obj1 >= obj2)
92         self.assertFalse(obj1 > obj2)
93
94     def test_compare_different_types(self):
95         # object comparison falls back to comparing types
96         if sys.version_info >= (3, 0):
97             # In Python 3, types are unorderable -- nothing to test
98             return
99         if talloc.Object < _test_pytalloc.DObject:
100             obj1 = _test_pytalloc.new()
101             obj2 = _test_pytalloc.DObject(dummy_func)
102         else:
103             obj2 = _test_pytalloc.new()
104             obj1 = _test_pytalloc.DObject(dummy_func)
105         self.assertFalse(obj1 == obj2)
106         self.assertTrue(obj1 != obj2)
107         self.assertTrue(obj1 <= obj2)
108         self.assertTrue(obj1 < obj2)
109         self.assertFalse(obj1 >= obj2)
110         self.assertFalse(obj1 > obj2)
111
112
113 class TallocBaseComparisonTests(unittest.TestCase):
114
115     def test_compare_same(self):
116         obj1 = _test_pytalloc.base_new()
117         self.assertTrue(obj1 == obj1)
118         self.assertFalse(obj1 != obj1)
119         self.assertTrue(obj1 <= obj1)
120         self.assertFalse(obj1 < obj1)
121         self.assertTrue(obj1 >= obj1)
122         self.assertFalse(obj1 > obj1)
123
124     def test_compare_different(self):
125         # object comparison is consistent
126         obj1, obj2 = sorted([
127             _test_pytalloc.base_new(),
128             _test_pytalloc.base_new()])
129         self.assertFalse(obj1 == obj2)
130         self.assertTrue(obj1 != obj2)
131         self.assertTrue(obj1 <= obj2)
132         self.assertTrue(obj1 < obj2)
133         self.assertFalse(obj1 >= obj2)
134         self.assertFalse(obj1 > obj2)
135
136     def test_compare_different_types(self):
137         # object comparison falls back to comparing types
138         if sys.version_info >= (3, 0):
139             # In Python 3, types are unorderable -- nothing to test
140             return
141         if talloc.BaseObject < _test_pytalloc.DBaseObject:
142             obj1 = _test_pytalloc.base_new()
143             obj2 = _test_pytalloc.DBaseObject(dummy_func)
144         else:
145             obj2 = _test_pytalloc.base_new()
146             obj1 = _test_pytalloc.DBaseObject(dummy_func)
147         self.assertFalse(obj1 == obj2)
148         self.assertTrue(obj1 != obj2)
149         self.assertTrue(obj1 <= obj2)
150         self.assertTrue(obj1 < obj2)
151         self.assertFalse(obj1 >= obj2)
152         self.assertFalse(obj1 > obj2)
153
154
155 class TallocUtilTests(unittest.TestCase):
156
157     def test_get_type(self):
158         self.assertTrue(talloc.Object is _test_pytalloc.get_object_type())
159
160     def test_reference(self):
161         # Check correct lifetime of the talloc'd data with multiple references
162         lst = []
163         obj = _test_pytalloc.DObject(lambda: lst.append('dead'))
164         ref = _test_pytalloc.reference(obj)
165         del obj
166         gc.collect()
167         self.assertEqual(lst, [])
168         del ref
169         gc.collect()
170         self.assertEqual(lst, ['dead'])
171
172     def test_get_base_type(self):
173         self.assertTrue(talloc.BaseObject is _test_pytalloc.base_get_object_type())
174
175     def test_base_reference(self):
176         # Check correct lifetime of the talloc'd data with multiple references
177         lst = []
178         obj = _test_pytalloc.DBaseObject(lambda: lst.append('dead'))
179         ref = _test_pytalloc.base_reference(obj)
180         del obj
181         gc.collect()
182         self.assertEqual(lst, [])
183         del ref
184         gc.collect()
185         self.assertEqual(lst, ['dead'])
186
187
188 if __name__ == '__main__':
189     unittest.TestProgram()