python tests: assert string equality, with diff
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Fri, 5 Jan 2018 03:45:37 +0000 (16:45 +1300)
committerKarolin Seeger <kseeger@samba.org>
Sat, 13 Jan 2018 16:37:06 +0000 (17:37 +0100)
In the success case this works just like self.assertEqual(),
but when things fail you get a better representation of where it went
wrong (a unified diff).

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

index d634acab236e32430fd141bcdfedf47d878e533e..c4d24fa913f0ba641b263c36eea2c1ff6c635215 100644 (file)
@@ -216,6 +216,29 @@ class TestCase(unittest.TestCase):
             finally:
                 result.stopTest(self)
 
+    def assertStringsEqual(self, a, b, msg=None, strip=False):
+        """Assert equality between two strings and highlight any differences.
+        If strip is true, leading and trailing whitespace is ignored."""
+        if strip:
+            a = a.strip()
+            b = b.strip()
+
+        if a != b:
+            sys.stderr.write("The strings differ %s(lengths %d vs %d); "
+                             "a diff follows\n"
+                             % ('when stripped ' if strip else '',
+                                len(a), len(b),
+                             ))
+
+            from difflib import unified_diff
+            diff = unified_diff(a.splitlines(True),
+                                b.splitlines(True),
+                                'a', 'b')
+            for line in diff:
+                sys.stderr.write(line)
+
+            self.fail(msg)
+
 
 class LdbTestCase(TestCase):
     """Trivial test case for running tests against a LDB."""