From: Douglas Bagnall Date: Thu, 26 Jun 2025 04:17:14 +0000 (+1200) Subject: pytest:dsdb_dn: expand and rework tests X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=1109a9d6d70048039272be4df84cf6b89237cd4f;p=thirdparty%2Fsamba.git pytest:dsdb_dn: expand and rework tests We now test the specialised StringDn and BinaryDn types. There are new assertions about case-insensitivity in binary hex strings and BinaryDn prefix validation. Signed-off-by: Douglas Bagnall Reviewed-by: Gary Lockyer --- diff --git a/python/samba/tests/dsdb_dn.py b/python/samba/tests/dsdb_dn.py index d09490a5307..50965cef33a 100644 --- a/python/samba/tests/dsdb_dn.py +++ b/python/samba/tests/dsdb_dn.py @@ -19,40 +19,88 @@ import os import samba -from samba.samdb import dsdb_Dn +from samba.samdb import BinaryDn, PlainDn, StringDn from samba.tests import TestCaseInTempDir class DsdbDnTests(TestCaseInTempDir): - def test_dsdb_Dn_binary(self): - url = self.tempdir + "/test_dsdb_Dn_binary.ldb" + def _temp_ldb(self, name=None): + if name is None: + name = f"{self.unique_name()}.ldb" + url = os.path.join(self.tempdir, name) sam = samba.Ldb(url=url) - dn1 = dsdb_Dn(sam, "DC=foo,DC=bar") - dn2 = dsdb_Dn(sam, "B:8:0000000D:;DC=samba,DC=example,DC=com") - self.assertEqual(dn2.binary, b"\x00\x00\x00\x0D") + def _cleanup(): + sam.disconnect() + os.unlink(url) + self.addCleanup(_cleanup) + return sam + + def test_BinaryDn(self): + sam = self._temp_ldb() + dn1 = BinaryDn(sam, "B:8:0000000d:;DC=samba,DC=example,DC=com") + dn2 = BinaryDn(sam, "B:8:0000000D:;DC=samba,DC=example,DC=com") + self.assertEqual(dn2.binary, b"\0\0\0\x0d") + self.assertEqual(dn1.binary, dn2.binary) + self.assertEqual(dn1.prefix, "B:8:0000000D:") self.assertEqual(13, dn2.get_binary_integer()) - os.unlink(url) + self.assertEqual(list(dn1.binary), [0, 0, 0, 13]) + dn2.binary = b'123' + self.assertEqual(dn2.prefix, "B:6:313233:") + dn2.prefix = 'B:10:1234abcdef:' + self.assertEqual(dn2.prefix, "B:10:1234ABCDEF:") + self.assertEqual(dn2.get_binary_integer(), 0x1234ABCDEF) + self.assertEqual(list(dn2.binary), [0x12, 0x34, 0xAB, 0xCD, 0xEF]) + for badstring, errmsg in (('B:11:1234abcdef0:', "Invalid hex string"), + ('B:6:1234:', "Invalid length"), + ('B:2:1234:', "Invalid length"), + ('B:0:1234:', "Invalid length"), + ('B:4:123g:', "Invalid prefix"), + ('B:4:1234 :', "Invalid prefix"), + ('b:4:1234:', "Invalid prefix"), + ('S:4:1234:', "Invalid prefix"), + ('S:4:123¼:', "Invalid prefix"), + ('S:4:1234', "Invalid prefix"), + ('B:4:1234', "Invalid prefix"), + ): + with self.assertRaises(ValueError) as cm: + dn2.prefix = badstring + self.assertIn(errmsg, str(cm.exception)) - def test_dsdb_Dn_sorted(self): - url = self.tempdir + "/test_dsdb_Dn_sorted.ldb" + def test_PlainDn(self): + sam = self._temp_ldb("test_PlainDn.ldb") + url = self.tempdir + "/test_PlainDn.ldb" sam = samba.Ldb(url=url) - try: - dn1 = dsdb_Dn(sam, "B:8:0000000D:;OU=dn1,DC=samba,DC=example,DC=com") - dn2 = dsdb_Dn(sam, "B:8:0000000C:;OU=dn1,DC=samba,DC=example,DC=com") - dn3 = dsdb_Dn(sam, "B:8:0000000F:;OU=dn3,DC=samba,DC=example,DC=com") - dn4 = dsdb_Dn(sam, "B:8:00000000:;OU=dn4,DC=samba,DC=example,DC=com") - dn5 = dsdb_Dn(sam, ";OU=dn5,DC=samba,DC=example,DC=com") - dn6 = dsdb_Dn(sam, ";OU=dn6,DC=samba,DC=example,DC=com") - unsorted_links14 = [dn1, dn2, dn3, dn4] - sorted_vals14 = [str(dn) for dn in sorted(unsorted_links14)] - self.assertEqual(sorted_vals14[0], str(dn3)) - self.assertEqual(sorted_vals14[1], str(dn2)) - self.assertEqual(sorted_vals14[2], str(dn1)) - self.assertEqual(sorted_vals14[3], str(dn4)) - unsorted_links56 = [dn5, dn6] - sorted_vals56 = [str(dn) for dn in sorted(unsorted_links56)] - self.assertEqual(sorted_vals56[0], str(dn6)) - self.assertEqual(sorted_vals56[1], str(dn5)) - finally: - del sam - os.unlink(url) + dn1 = PlainDn(sam, "DC=foo,DC=bar") + self.assertEqual(dn1.prefix, '') + self.assertIsNone(dn1.binary) + + def test_StringDn(self): + sam = self._temp_ldb("test_StringDn.ldb") + dn1 = StringDn(sam, "S:8:0000000d:;DC=samba,DC=example,DC=com") + dn2 = StringDn(sam, "S:8:0000000D:;DC=samba,DC=example,DC=com") + self.assertEqual(dn1.binary, b"0000000d") + self.assertEqual(dn2.binary, b"0000000D") + # TODO: determine whether string DNs should have case-insensitive comparisons + self.assertNotEqual(dn1.binary, dn2.binary) + dn1.prefix = 'S:5:ā”:' + self.assertEqual(dn1.binary, b'\xc4\x81\xe2\x80\x9d') + self.assertEqual(dn1.prefix, 'S:5:ā”:') + + def test_dsdb_Dn_sorted(self): + sam = self._temp_ldb("test_dsdb_Dn_sorted.ldb") + dn1 = BinaryDn(sam, "B:8:0000000D:;OU=dn1,DC=samba,DC=example,DC=com") + dn2 = BinaryDn(sam, "B:8:0000000C:;OU=dn1,DC=samba,DC=example,DC=com") + dn3 = BinaryDn(sam, "B:8:0000000F:;OU=dn3,DC=samba,DC=example,DC=com") + dn4 = BinaryDn(sam, "B:8:00000000:;OU=dn4,DC=samba,DC=example,DC=com") + dn5 = PlainDn(sam, ";OU=dn5,DC=samba,DC=example,DC=com") + dn6 = PlainDn(sam, ";OU=dn6,DC=samba,DC=example,DC=com") + unsorted_links14 = [dn1, dn2, dn3, dn4] + sorted_vals14 = [str(dn) for dn in sorted(unsorted_links14)] + self.assertEqual(sorted_vals14[0], str(dn3)) + self.assertEqual(sorted_vals14[1], str(dn2)) + self.assertEqual(sorted_vals14[2], str(dn1)) + self.assertEqual(sorted_vals14[3], str(dn4)) + unsorted_links56 = [dn5, dn6] + sorted_vals56 = [str(dn) for dn in sorted(unsorted_links56)] + self.assertEqual(sorted_vals56[0], str(dn6)) + self.assertEqual(sorted_vals56[1], str(dn5))