]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
pytest:security descriptors: hack to capture results as json
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Mon, 4 Sep 2023 23:27:33 +0000 (11:27 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 26 Sep 2023 23:45:35 +0000 (23:45 +0000)
This makes it easy to separate a large number of examples into
successes and knownfails.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/tests/security_descriptors.py

index ef8031708c4f5f85c33dcb76b8e75fe4da8b0480..fe42695da55e907c70230df4998ec12e542a89d1 100644 (file)
@@ -45,6 +45,8 @@ class SDDLvsDescriptorBase(TestCase):
     json_file = TEST_DIR / 'conditional_aces.txt.json'
     munge_to_v4 = True
     domain_sid = security.dom_sid("S-1-5-21-2457507606-2709100691-398136650")
+    failure_json = None
+    success_json = None
 
     @classmethod
     def filter_test_cases(cls, data):
@@ -73,22 +75,44 @@ class SDDLvsDescriptorBase(TestCase):
                 name = f"{name[:100]}+{len(name) - 100}-more-characters-{tag}"
             cls.generate_dynamic_test('test_sddl_vs_sd', name, sddl, sdl)
 
+        if cls.failure_json:
+            cls.failures = {}
+            cls.failure_file = open(cls.failure_json, 'w')
+            cls.addClassCleanup(json.dump, cls.failures, cls.failure_file)
+        if cls.success_json:
+            cls.successes = {}
+            cls.success_file = open(cls.success_json, 'w')
+            cls.addClassCleanup(json.dump, cls.successes, cls.success_file)
+
     def _test_sddl_vs_sd_with_args(self, sddl, sdl):
         sdb_win = bytes(sdl)
         try:
             sd_sam = security.descriptor.from_sddl(sddl, self.domain_sid)
         except (TypeError, ValueError) as e:
+
+            try:
+                sd_win = ndr_unpack(security.descriptor, sdb_win)
+                win_ndr_print = ndr_print(sd_win)
+            except RuntimeError as e2:
+                win_ndr_print = f"not parseable: {e2}"
+            if self.failure_json:
+                self.failures[sddl] = sdl
+
             self.fail(f"failed to parse {sddl} into SD: {e}")
 
         try:
             sdb_sam = ndr_pack(sd_sam)
         except RuntimeError as e:
+            if self.failure_json:
+                self.failures[sddl] = sdl
             self.fail(f"failed to pack samba SD from {sddl} into bytes: {e}\n"
                       f"{ndr_print(sd_sam)}")
 
         try:
             sd_win = ndr_unpack(security.descriptor, sdb_win)
         except RuntimeError as e:
+            if self.failure_json:
+                self.failures[sddl] = sdl
             self.fail(f"could not unpack windows descriptor for {sddl}: {e}")
 
         if self.munge_to_v4:
@@ -120,8 +144,13 @@ class SDDLvsDescriptorBase(TestCase):
                 sd_win.sacl.revision = 4
 
         if (sd_win != sd_sam):
+            if self.failure_json:
+                self.failures[sddl] = sdl
             self.fail(f"Descriptors differ for {sddl}")
 
+        if self.success_json:
+            self.successes[sddl] = sdl
+
 
 @DynamicTestCase
 class SDDLvsDescriptorShortOrdinaryAcls(SDDLvsDescriptorBase):