]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
pytest:dsdb_dn: expand and rework tests
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 26 Jun 2025 04:17:14 +0000 (16:17 +1200)
committerDouglas Bagnall <dbagnall@samba.org>
Thu, 7 Aug 2025 23:28:33 +0000 (23:28 +0000)
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 <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Gary Lockyer <gary@catalyst.net.nz>
python/samba/tests/dsdb_dn.py

index d09490a5307d53321b8b78e7b1523c22d860a0de..50965cef33aa30f3d23fc03e2e8c45ab2d1d2331 100644 (file)
 
 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:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;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:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;DC=samba,DC=example,DC=com")
+        dn2 = BinaryDn(sam, "B:8:0000000D:<GUID=b3f0ec29-17f4-452a-b002-963e1909d102>;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:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;OU=dn1,DC=samba,DC=example,DC=com")
-            dn2 = dsdb_Dn(sam, "B:8:0000000C:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;OU=dn1,DC=samba,DC=example,DC=com")
-            dn3 = dsdb_Dn(sam, "B:8:0000000F:<GUID=00000000-17f4-452a-b002-963e1909d101>;OU=dn3,DC=samba,DC=example,DC=com")
-            dn4 = dsdb_Dn(sam, "B:8:00000000:<GUID=ffffffff-17f4-452a-b002-963e1909d101>;OU=dn4,DC=samba,DC=example,DC=com")
-            dn5 = dsdb_Dn(sam, "<GUID=ffffffff-27f4-452a-b002-963e1909d101>;OU=dn5,DC=samba,DC=example,DC=com")
-            dn6 = dsdb_Dn(sam, "<GUID=00000000-27f4-452a-b002-963e1909d101>;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:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;DC=samba,DC=example,DC=com")
+        dn2 = StringDn(sam, "S:8:0000000D:<GUID=b3f0ec29-17f4-452a-b002-963e1909d102>;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:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;OU=dn1,DC=samba,DC=example,DC=com")
+        dn2 = BinaryDn(sam, "B:8:0000000C:<GUID=b3f0ec29-17f4-452a-b002-963e1909d101>;OU=dn1,DC=samba,DC=example,DC=com")
+        dn3 = BinaryDn(sam, "B:8:0000000F:<GUID=00000000-17f4-452a-b002-963e1909d101>;OU=dn3,DC=samba,DC=example,DC=com")
+        dn4 = BinaryDn(sam, "B:8:00000000:<GUID=ffffffff-17f4-452a-b002-963e1909d101>;OU=dn4,DC=samba,DC=example,DC=com")
+        dn5 = PlainDn(sam, "<GUID=ffffffff-27f4-452a-b002-963e1909d101>;OU=dn5,DC=samba,DC=example,DC=com")
+        dn6 = PlainDn(sam, "<GUID=00000000-27f4-452a-b002-963e1909d101>;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))