CVE-2023-4154 dsdb/tests: Add test for SEARCH_FLAG_RODC_ATTRIBUTE behaviour
[Samba.git] / lib / talloc / test_pytalloc.py
blob809510fea8dc119fb9f1b3630c51b0f367f7b4c5
1 #!/usr/bin/env python3
2 # Simple tests for the talloc python bindings.
3 # Copyright (C) 2015 Petr Viktorin <pviktori@redhat.com>
5 import unittest
6 import subprocess
7 import sys
8 import gc
10 import talloc
11 import _test_pytalloc
14 def dummy_func():
15 pass
18 class TallocTests(unittest.TestCase):
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)
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)
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))
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))
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'])
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'])
71 class TallocComparisonTests(unittest.TestCase):
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)
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)
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)
113 class TallocBaseComparisonTests(unittest.TestCase):
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)
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)
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)
155 class TallocUtilTests(unittest.TestCase):
157 def test_get_type(self):
158 self.assertTrue(talloc.Object is _test_pytalloc.get_object_type())
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'])
172 def test_get_base_type(self):
173 self.assertTrue(talloc.BaseObject is _test_pytalloc.base_get_object_type())
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'])
188 if __name__ == '__main__':
189 unittest.TestProgram()