summaryrefslogtreecommitdiffstats
path: root/tests/test_ipalib/test_dn.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_ipalib/test_dn.py')
-rw-r--r--[-rwxr-xr-x]tests/test_ipalib/test_dn.py184
1 files changed, 116 insertions, 68 deletions
diff --git a/tests/test_ipalib/test_dn.py b/tests/test_ipalib/test_dn.py
index c47f38827..029297f69 100755..100644
--- a/tests/test_ipalib/test_dn.py
+++ b/tests/test_ipalib/test_dn.py
@@ -3,27 +3,36 @@
import unittest
from ipalib.dn import AVA, RDN, DN
+def default_rdn_attr_arg(i):
+ return 'a%d' % i
+
+def default_rdn_value_arg(i):
+ return str(i)
+
+def alt_rdn_attr_arg(i):
+ return 'b%d' % i
+
+def alt_rdn_value_arg(i):
+ return str(i*10)
+
def make_rdn_args(low, high, kind, attr=None, value=None):
result=[]
for i in range(low, high):
if attr is None:
- new_attr = 'a%d' % i
+ new_attr = default_rdn_attr_arg(i)
elif callable(attr):
new_attr = attr(i)
else:
new_attr = attr
if value is None:
- new_value = str(i)
+ new_value = default_rdn_value_arg(i)
elif callable(value):
new_value = value(i)
else:
new_value = value
- if kind == 'sequence':
- result.append(new_attr)
- result.append(new_value)
- elif kind == 'tuple':
+ if kind == 'tuple':
result.append((new_attr, new_value))
elif kind == 'list':
result.append([new_attr, new_value])
@@ -526,9 +535,21 @@ class TestDN(unittest.TestCase):
self.str_dn3 = '%s,%s' % (self.str_rdn1, self.str_rdn2)
self.dn3 = DN(self.rdn1, self.rdn2)
+ self.base_rdn1 = RDN('dc', 'redhat')
+ self.base_rdn2 = RDN('dc', 'com')
+ self.base_dn = DN(self.base_rdn1, self.base_rdn2)
+
+ self.container_rdn1 = RDN('cn', 'sudorules')
+ self.container_rdn2 = RDN('cn', 'sudo')
+ self.container_dn = DN(self.container_rdn1, self.container_rdn2)
+
+ self.base_container_dn = DN((self.attr1, self.value1),
+ self.container_dn, self.base_dn)
+
+
def test_create(self):
# Create with single attr,value pair
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
self.assertEqual(len(dn1), 1)
self.assertIsInstance(dn1[0], RDN)
self.assertIsInstance(dn1[0].attr, unicode)
@@ -543,8 +564,12 @@ class TestDN(unittest.TestCase):
self.assertIsInstance(dn1[0].value, unicode)
self.assertEqual(dn1[0], self.rdn1)
- # Create with multiple attr,value pairs
- dn1 = DN(self.attr1, self.value1, self.attr2, self.value2)
+ # Creation with multiple attr,value string pairs should fail
+ with self.assertRaises(ValueError):
+ dn1 = DN(self.attr1, self.value1, self.attr2, self.value2)
+
+ # Create with multiple attr,value pairs passed as tuples & lists
+ dn1 = DN((self.attr1, self.value1), [self.attr2, self.value2])
self.assertEqual(len(dn1), 2)
self.assertIsInstance(dn1[0], RDN)
self.assertIsInstance(dn1[0].attr, unicode)
@@ -555,8 +580,8 @@ class TestDN(unittest.TestCase):
self.assertIsInstance(dn1[1].value, unicode)
self.assertEqual(dn1[1], self.rdn2)
- # Create with multiple attr,value pairs passed as lists
- dn1 = DN([self.attr1, self.value1], [self.attr2, self.value2])
+ # Create with multiple attr,value pairs passed as tuple and RDN
+ dn1 = DN((self.attr1, self.value1), RDN(self.attr2, self.value2))
self.assertEqual(len(dn1), 2)
self.assertIsInstance(dn1[0], RDN)
self.assertIsInstance(dn1[0].attr, unicode)
@@ -570,7 +595,7 @@ class TestDN(unittest.TestCase):
# Create with multiple attr,value pairs but reverse
# constructor parameter ordering. RDN ordering should also be
# reversed because DN's are a ordered sequence of RDN's
- dn1 = DN(self.attr2, self.value2, self.attr1, self.value1)
+ dn1 = DN((self.attr2, self.value2), (self.attr1, self.value1))
self.assertEqual(len(dn1), 2)
self.assertIsInstance(dn1[0], RDN)
self.assertIsInstance(dn1[0].attr, unicode)
@@ -634,6 +659,14 @@ class TestDN(unittest.TestCase):
self.assertIsInstance(dn1[1].value, unicode)
self.assertEqual(dn1[1], self.rdn2)
+ # Create with RDN, and 2 DN's (e.g. attr + container + base)
+ dn1 = DN((self.attr1, self.value1), self.container_dn, self.base_dn)
+ self.assertEqual(len(dn1), 5)
+ dn_str = ','.join([str(self.rdn1),
+ str(self.container_rdn1), str(self.container_rdn2),
+ str(self.base_rdn1), str(self.base_rdn2)])
+ self.assertEqual(str(dn1), dn_str)
+
def test_str(self):
self.assertEqual(str(self.dn1), self.str_dn1)
self.assertIsInstance(str(self.dn1), str)
@@ -646,7 +679,7 @@ class TestDN(unittest.TestCase):
def test_cmp(self):
# Equality
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
self.assertTrue(dn1 == self.dn1)
self.assertFalse(dn1 != self.dn1)
@@ -688,6 +721,40 @@ class TestDN(unittest.TestCase):
result = cmp(self.dn3, self.dn1)
self.assertEqual(result, 1)
+ # Test startswith, endswith
+ self.assertTrue(self.base_container_dn.startswith(self.rdn1))
+ self.assertTrue(self.base_container_dn.startswith(self.dn1))
+ self.assertTrue(self.base_container_dn.startswith(self.dn1 + self.container_dn))
+ self.assertFalse(self.base_container_dn.startswith(self.dn2))
+ self.assertFalse(self.base_container_dn.startswith(self.rdn2))
+ self.assertTrue(self.base_container_dn.startswith((self.dn1)))
+ self.assertTrue(self.base_container_dn.startswith((self.rdn1)))
+ self.assertFalse(self.base_container_dn.startswith((self.rdn2)))
+ self.assertTrue(self.base_container_dn.startswith((self.rdn2, self.rdn1)))
+ self.assertTrue(self.base_container_dn.startswith((self.dn1, self.dn2)))
+
+ self.assertTrue(self.base_container_dn.endswith(self.base_dn))
+ self.assertTrue(self.base_container_dn.endswith(self.container_dn + self.base_dn))
+ self.assertFalse(self.base_container_dn.endswith(DN(self.base_rdn1)))
+ self.assertTrue(self.base_container_dn.endswith(DN(self.base_rdn2)))
+ self.assertTrue(self.base_container_dn.endswith((DN(self.base_rdn1), DN(self.base_rdn2))))
+
+ # Test "in" membership
+ self.assertTrue(self.container_rdn1 in self.container_dn)
+ self.assertTrue(self.container_dn in self.container_dn)
+ self.assertFalse(self.base_rdn1 in self.container_dn)
+
+ self.assertTrue(self.container_rdn1 in self.base_container_dn)
+ self.assertTrue(self.container_dn in self.base_container_dn)
+ self.assertTrue(self.container_dn + self.base_dn in
+ self.base_container_dn)
+ self.assertTrue(self.dn1 + self.container_dn + self.base_dn in
+ self.base_container_dn)
+ self.assertTrue(self.dn1 + self.container_dn + self.base_dn ==
+ self.base_container_dn)
+
+ self.assertFalse(self.container_rdn1 in self.base_dn)
+
def test_indexing(self):
self.assertEqual(self.dn1[0], self.rdn1)
self.assertEqual(self.dn1[self.rdn1.attr], self.rdn1.value)
@@ -713,30 +780,33 @@ class TestDN(unittest.TestCase):
dn_low = 0
dn_high = 6
- rdn_args = make_rdn_args(dn_low, dn_high, 'sequence')
+ rdn_args = make_rdn_args(dn_low, dn_high, 'tuple',
+ default_rdn_attr_arg, default_rdn_value_arg)
dn1 = DN(*rdn_args)
- rdn_args = make_rdn_args(dn_low, dn_high, 'tuple')
+ rdn_args = make_rdn_args(dn_low, dn_high, 'list',
+ default_rdn_attr_arg, default_rdn_value_arg)
dn2 = DN(*rdn_args)
- rdn_args = make_rdn_args(dn_low, dn_high, 'RDN')
+ rdn_args = make_rdn_args(dn_low, dn_high, 'RDN',
+ default_rdn_attr_arg, default_rdn_value_arg)
dn3 = DN(*rdn_args)
self.assertEqual(dn1, dn2)
self.assertEqual(dn1, dn3)
for i in range(dn_low, dn_high):
- attr = 'a%d' % i
- value = str(i)
+ attr = default_rdn_attr_arg(i)
+ value = default_rdn_value_arg(i)
self.assertEqual(dn1[i].attr, attr)
self.assertEqual(dn1[i].value, value)
self.assertEqual(dn1[attr], value)
for i in range(dn_low, dn_high):
if i % 2:
- orig_attr = 'a%d' % i
- attr = 'b%d' % i
- value = str(i*10)
+ orig_attr = default_rdn_attr_arg(i)
+ attr = alt_rdn_attr_arg(i)
+ value = alt_rdn_value_arg(i)
dn1[i] = attr, value
dn2[orig_attr] = (attr, value)
dn3[i] = RDN(attr, value)
@@ -746,11 +816,11 @@ class TestDN(unittest.TestCase):
for i in range(dn_low, dn_high):
if i % 2:
- attr = 'b%d' % i
- value = str(i*10)
+ attr = alt_rdn_attr_arg(i)
+ value = alt_rdn_value_arg(i)
else:
- attr = 'a%d' % i
- value = str(i)
+ attr = default_rdn_attr_arg(i)
+ value = default_rdn_value_arg(i)
self.assertEqual(dn1[i].value, dn1[i].value)
self.assertEqual(dn1[attr], value)
@@ -759,47 +829,24 @@ class TestDN(unittest.TestCase):
slice_high = 4
interval = range(slice_low, slice_high)
- # Assign via sequence
- rdn_args = make_rdn_args(dn_low, dn_high, 'sequence')
- dn1 = DN(*rdn_args)
-
- dn_slice = make_rdn_args(slice_low, slice_high, 'sequence',
- lambda i: 'b%d' % i, lambda i: str(i*10))
-
- dn1[slice_low:slice_high] = dn_slice
-
- for i in range(dn_low, dn_high):
- if i in interval:
- attr = 'b%d' % i
- value = str(i*10)
- else:
- attr = 'a%d' % i
- value = str(i)
- self.assertEqual(dn1[i].value, dn1[i].value)
- self.assertEqual(dn1[attr], value)
-
- query_slice = dn1[slice_low:slice_high]
- for i, query_rdn in enumerate(query_slice):
- slice_rdn = RDN(dn_slice[i*2], dn_slice[i*2+1])
- self.assertEqual(slice_rdn, query_rdn)
-
# Slices
# Assign via tuple
- rdn_args = make_rdn_args(dn_low, dn_high, 'sequence')
+ rdn_args = make_rdn_args(dn_low, dn_high, 'tuple',
+ default_rdn_attr_arg, default_rdn_value_arg)
dn1 = DN(*rdn_args)
dn_slice = make_rdn_args(slice_low, slice_high, 'tuple',
- lambda i: 'b%d' % i, lambda i: str(i*10))
+ alt_rdn_attr_arg, alt_rdn_value_arg)
dn1[slice_low:slice_high] = dn_slice
for i in range(dn_low, dn_high):
if i in interval:
- attr = 'b%d' % i
- value = str(i*10)
+ attr = alt_rdn_attr_arg(i)
+ value = alt_rdn_value_arg(i)
else:
- attr = 'a%d' % i
- value = str(i)
+ attr = default_rdn_attr_arg(i)
+ value = default_rdn_value_arg(i)
self.assertEqual(dn1[i].value, dn1[i].value)
self.assertEqual(dn1[attr], value)
@@ -810,21 +857,22 @@ class TestDN(unittest.TestCase):
# Slices
# Assign via RDN
- rdn_args = make_rdn_args(dn_low, dn_high, 'sequence')
+ rdn_args = make_rdn_args(dn_low, dn_high, 'tuple',
+ default_rdn_attr_arg, default_rdn_value_arg)
dn1 = DN(*rdn_args)
dn_slice = make_rdn_args(slice_low, slice_high, 'RDN',
- lambda i: 'b%d' % i, lambda i: str(i*10))
+ alt_rdn_attr_arg, alt_rdn_value_arg)
dn1[slice_low:slice_high] = dn_slice
for i in range(dn_low, dn_high):
if i in interval:
- attr = 'b%d' % i
- value = str(i*10)
+ attr = alt_rdn_attr_arg(i)
+ value = alt_rdn_value_arg(i)
else:
- attr = 'a%d' % i
- value = str(i)
+ attr = default_rdn_attr_arg(i)
+ value = default_rdn_value_arg(i)
self.assertEqual(dn1[i].value, dn1[i].value)
self.assertEqual(dn1[attr], value)
@@ -863,31 +911,31 @@ class TestDN(unittest.TestCase):
def test_concat(self):
- dn1 = DN(self.attr1, self.value1)
- dn2 = DN(self.attr2, self.value2)
+ dn1 = DN((self.attr1, self.value1))
+ dn2 = DN([self.attr2, self.value2])
# in-place addtion
dn1 += dn2
self.assertEqual(dn1, self.dn3)
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
dn1 += self.rdn2
self.assertEqual(dn1, self.dn3)
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
dn1 += self.dn2
self.assertEqual(dn1, self.dn3)
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
dn1 += self.str_dn2
self.assertEqual(dn1, self.dn3)
# concatenation
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
dn3 = dn1 + dn2
self.assertEqual(dn3, self.dn3)
- dn1 = DN(self.attr1, self.value1)
+ dn1 = DN((self.attr1, self.value1))
dn3 = dn1 + self.rdn2
self.assertEqual(dn3, self.dn3)