PEP8: fix E303: too many blank lines (2)
[sfrench/samba-autobuild/.git] / source4 / dsdb / tests / python / dirsync.py
index f36a3c0d2c615f8d4df91acd6822c945494041ac..67ba2bbc74b275be13cf43d72b697229b34837a2 100755 (executable)
@@ -2,7 +2,7 @@
 #
 # Unit tests for dirsync control
 # Copyright (C) Matthieu Patou <mat@matws.net> 2011
-#
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2014
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
+from __future__ import print_function
 import optparse
 import sys
 sys.path.insert(0, "bin/python")
 import samba
-samba.ensure_external_module("testtools", "testtools")
-samba.ensure_external_module("subunit", "subunit/python")
+from samba.tests.subunitrun import TestProgram, SubunitOptions
 
 import samba.getopt as options
 import base64
@@ -31,7 +31,7 @@ import base64
 from ldb import LdbError, SCOPE_BASE
 from ldb import Message, MessageElement, Dn
 from ldb import FLAG_MOD_ADD, FLAG_MOD_DELETE
-from samba.dcerpc import security, misc, drsblobs
+from samba.dcerpc import security, misc, drsblobs, security
 from samba.ndr import ndr_unpack, ndr_pack
 
 from samba.auth import system_session
@@ -40,8 +40,6 @@ from samba.samdb import SamDB
 from samba.credentials import Credentials, DONT_USE_KERBEROS
 import samba.tests
 from samba.tests import delete_force
-from subunit.run import SubunitTestRunner
-import unittest
 
 parser = optparse.OptionParser("dirsync.py [options] <host>")
 sambaopts = options.SambaOptions(parser)
@@ -51,20 +49,22 @@ parser.add_option_group(options.VersionOptions(parser))
 # use command line creds if available
 credopts = options.CredentialsOptions(parser)
 parser.add_option_group(credopts)
+subunitopts = SubunitOptions(parser)
+parser.add_option_group(subunitopts)
 opts, args = parser.parse_args()
 
 if len(args) < 1:
     parser.print_usage()
     sys.exit(1)
 
-host = args[0]
+host = args.pop()
 if not "://" in host:
     ldaphost = "ldap://%s" % host
     ldapshost = "ldaps://%s" % host
 else:
     ldaphost = host
     start = host.rindex("://")
-    host = host.lstrip(start+3)
+    host = host.lstrip(start + 3)
 
 lp = sambaopts.get_loadparm()
 creds = credopts.get_credentials(lp)
@@ -73,18 +73,19 @@ creds = credopts.get_credentials(lp)
 # Tests start here
 #
 
+
 class DirsyncBaseTests(samba.tests.TestCase):
 
     def setUp(self):
         super(DirsyncBaseTests, self).setUp()
-        self.ldb_admin = ldb
-        self.base_dn = ldb.domain_dn()
-        self.domain_sid = security.dom_sid(ldb.get_domain_sid())
-        self.user_pass = "samba123@AAA"
+        self.ldb_admin = SamDB(ldapshost, credentials=creds, session_info=system_session(lp), lp=lp)
+        self.base_dn = self.ldb_admin.domain_dn()
+        self.domain_sid = security.dom_sid(self.ldb_admin.get_domain_sid())
+        self.user_pass = samba.generate_random_password(12, 16)
         self.configuration_dn = self.ldb_admin.get_config_basedn().get_linearized()
-        self.sd_utils = sd_utils.SDUtils(ldb)
-        #used for anonymous login
-        print "baseDN: %s" % self.base_dn
+        self.sd_utils = sd_utils.SDUtils(self.ldb_admin)
+        # used for anonymous login
+        print("baseDN: %s" % self.base_dn)
 
     def get_user_dn(self, name):
         return "CN=%s,CN=Users,%s" % (name, self.base_dn)
@@ -98,12 +99,12 @@ class DirsyncBaseTests(samba.tests.TestCase):
         creds_tmp.set_workstation(creds.get_workstation())
         creds_tmp.set_gensec_features(creds_tmp.get_gensec_features()
                                       | gensec.FEATURE_SEAL)
-        creds_tmp.set_kerberos_state(DONT_USE_KERBEROS) # kinit is too expensive to use in a tight loop
+        creds_tmp.set_kerberos_state(DONT_USE_KERBEROS)  # kinit is too expensive to use in a tight loop
         ldb_target = SamDB(url=ldaphost, credentials=creds_tmp, lp=lp)
         return ldb_target
 
 
-#tests on ldap add operations
+# tests on ldap add operations
 class SimpleDirsyncTests(DirsyncBaseTests):
 
     def setUp(self):
@@ -120,12 +121,13 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         self.desc_sddl = self.sd_utils.get_sd_as_sddl(self.base_dn)
 
         user_sid = self.sd_utils.get_object_sid(self.get_user_dn(self.dirsync_user))
-        mod = "(A;;CR;1131f6aa-9c07-11d1-f79f-00c04fc2dcd2;;%s)" % str(user_sid)
+        mod = "(OA;;CR;%s;;%s)" % (security.GUID_DRS_GET_CHANGES,
+                                   str(user_sid))
         self.sd_utils.dacl_add_ace(self.base_dn, mod)
 
         # add admins to the Domain Admins group
         self.ldb_admin.add_remove_group_members("Domain Admins", [self.admin_user],
-                       add_members_operation=True)
+                                                add_members_operation=True)
 
     def tearDown(self):
         super(SimpleDirsyncTests, self).tearDown()
@@ -140,8 +142,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         except Exception:
             pass
 
-    #def test_dirsync_errors(self):
-
+    # def test_dirsync_errors(self):
 
     def test_dirsync_supported(self):
         """Test the basic of the dirsync is supported"""
@@ -151,24 +152,24 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         res = self.ldb_dirsync.search(self.base_dn, expression="samaccountname=*", controls=["dirsync:1:0:1"])
         try:
             self.ldb_simple.search(self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:0:1"])
-        except LdbError,l:
-           self.assertTrue(str(l).find("LDAP_INSUFFICIENT_ACCESS_RIGHTS") != -1)
+                                   expression="samaccountname=*",
+                                   controls=["dirsync:1:0:1"])
+        except LdbError as l:
+            self.assertTrue(str(l).find("LDAP_INSUFFICIENT_ACCESS_RIGHTS") != -1)
 
     def test_parentGUID_referrals(self):
         res2 = self.ldb_admin.search(self.base_dn, scope=SCOPE_BASE, attrs=["objectGUID"])
 
         res = self.ldb_admin.search(self.base_dn,
-                                        expression="name=Configuration",
-                                        controls=["dirsync:1:0:1"])
+                                    expression="name=Configuration",
+                                    controls=["dirsync:1:0:1"])
         self.assertEqual(res2[0].get("objectGUID"), res[0].get("parentGUID"))
 
     def test_ok_not_rootdc(self):
         """Test if it's ok to do dirsync on another NC that is not the root DC"""
         self.ldb_admin.search(self.ldb_admin.get_config_basedn(),
-                                    expression="samaccountname=*",
-                                    controls=["dirsync:1:0:1"])
+                              expression="samaccountname=*",
+                              controls=["dirsync:1:0:1"])
 
     def test_dirsync_errors(self):
         """Test if dirsync returns the correct LDAP errors in case of pb"""
@@ -176,55 +177,52 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         self.ldb_dirsync = self.get_ldb_connection(self.dirsync_user, self.user_pass)
         try:
             self.ldb_simple.search(self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:0:1"])
-        except LdbError,l:
-            print l
+                                   expression="samaccountname=*",
+                                   controls=["dirsync:1:0:1"])
+        except LdbError as l:
+            print(l)
             self.assertTrue(str(l).find("LDAP_INSUFFICIENT_ACCESS_RIGHTS") != -1)
 
         try:
             self.ldb_simple.search("CN=Users,%s" % self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:0:1"])
-        except LdbError,l:
-            print l
+                                   expression="samaccountname=*",
+                                   controls=["dirsync:1:0:1"])
+        except LdbError as l:
+            print(l)
             self.assertTrue(str(l).find("LDAP_INSUFFICIENT_ACCESS_RIGHTS") != -1)
 
         try:
             self.ldb_simple.search("CN=Users,%s" % self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:1:1"])
-        except LdbError,l:
-            print l
+                                   expression="samaccountname=*",
+                                   controls=["dirsync:1:1:1"])
+        except LdbError as l:
+            print(l)
             self.assertTrue(str(l).find("LDAP_UNWILLING_TO_PERFORM") != -1)
 
         try:
             self.ldb_dirsync.search("CN=Users,%s" % self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:0:1"])
-        except LdbError,l:
-            print l
+                                    expression="samaccountname=*",
+                                    controls=["dirsync:1:0:1"])
+        except LdbError as l:
+            print(l)
             self.assertTrue(str(l).find("LDAP_INSUFFICIENT_ACCESS_RIGHTS") != -1)
 
         try:
             self.ldb_admin.search("CN=Users,%s" % self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:0:1"])
-        except LdbError,l:
-            print l
+                                  expression="samaccountname=*",
+                                  controls=["dirsync:1:0:1"])
+        except LdbError as l:
+            print(l)
             self.assertTrue(str(l).find("LDAP_INSUFFICIENT_ACCESS_RIGHTS") != -1)
 
         try:
             self.ldb_admin.search("CN=Users,%s" % self.base_dn,
-                expression="samaccountname=*",
-                controls=["dirsync:1:1:1"])
-        except LdbError,l:
-            print l
+                                  expression="samaccountname=*",
+                                  controls=["dirsync:1:1:1"])
+        except LdbError as l:
+            print(l)
             self.assertTrue(str(l).find("LDAP_UNWILLING_TO_PERFORM") != -1)
 
-
-
-
     def test_dirsync_attributes(self):
         """Check behavior with some attributes """
         res = self.ldb_admin.search(self.base_dn,
@@ -262,7 +260,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         self.assertTrue(res.msgs[0].get("parentGUID") == None)
         self.assertTrue(res.msgs[0].get("instanceType") != None)
 
-         # Asking for name will return also objectGUID and parentGUID
+        # Asking for name will return also objectGUID and parentGUID
         # and instanceType and of course name
         res = self.ldb_admin.search(self.base_dn,
                                     expression="samaccountname=Administrator",
@@ -281,8 +279,8 @@ class SimpleDirsyncTests(DirsyncBaseTests):
                                     controls=["dirsync:1:0:1"])
         count = len(res.msgs[0])
         res2 = self.ldb_admin.search(self.base_dn,
-                                    expression="samaccountname=Administrator",
-                                    controls=["dirsync:1:0:1"])
+                                     expression="samaccountname=Administrator",
+                                     controls=["dirsync:1:0:1"])
         count2 = len(res2.msgs[0])
         self.assertEqual(count, count2)
 
@@ -298,14 +296,14 @@ class SimpleDirsyncTests(DirsyncBaseTests):
                                     attrs=["parentGUID"],
                                     controls=["dirsync:1:0:1"])
         self.assertEqual(len(res.msgs), 0)
-        ouname="OU=testou,%s" % self.base_dn
+        ouname = "OU=testou,%s" % self.base_dn
         self.ouname = ouname
         self.ldb_admin.create_ou(ouname)
         delta = Message()
         delta.dn = Dn(self.ldb_admin, str(ouname))
         delta["cn"] = MessageElement("test ou",
-                                        FLAG_MOD_ADD,
-                                        "cn" )
+                                     FLAG_MOD_ADD,
+                                     "cn")
         self.ldb_admin.modify(delta)
         res = self.ldb_admin.search(self.base_dn,
                                     expression="name=testou",
@@ -375,7 +373,6 @@ class SimpleDirsyncTests(DirsyncBaseTests):
                                         attrs=["objectGUID"],
                                         controls=["dirsync:1:0:0"])
 
-
     def test_dirsync_send_delta(self):
         """Check that dirsync return correct delta when sending the last cookie"""
         res = self.ldb_admin.search(self.base_dn,
@@ -402,7 +399,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         control2 = str(":".join(ctl))
 
         # Let's create an OU
-        ouname="OU=testou2,%s" % self.base_dn
+        ouname = "OU=testou2,%s" % self.base_dn
         self.ouname = ouname
         self.ldb_admin.create_ou(ouname)
         res = self.ldb_admin.search(self.base_dn,
@@ -419,8 +416,8 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         delta.dn = Dn(self.ldb_admin, str(ouname))
 
         delta["cn"] = MessageElement("test ou",
-                                        FLAG_MOD_ADD,
-                                        "cn" )
+                                     FLAG_MOD_ADD,
+                                     "cn")
         self.ldb_admin.modify(delta)
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(&(objectClass=organizationalUnit)(!(isDeleted=*)))",
@@ -433,8 +430,8 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         delta = Message()
         delta.dn = Dn(self.ldb_admin, str(ouname))
         delta["cn"] = MessageElement([],
-                                        FLAG_MOD_DELETE,
-                                        "cn" )
+                                     FLAG_MOD_DELETE,
+                                     "cn")
         self.ldb_admin.modify(delta)
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(&(objectClass=organizationalUnit)(!(isDeleted=*)))",
@@ -466,8 +463,8 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         # Let's search for members
         self.ldb_simple = self.get_ldb_connection(self.simple_user, self.user_pass)
         res = self.ldb_simple.search(self.base_dn,
-                                    expression="(name=Administrators)",
-                                    controls=["dirsync:1:1:1"])
+                                     expression="(name=Administrators)",
+                                     controls=["dirsync:1:1:1"])
 
         self.assertTrue(len(res[0].get("member")) > 0)
         size = len(res[0].get("member"))
@@ -478,11 +475,11 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         ctl[3] = "10000"
         control1 = str(":".join(ctl))
         self.ldb_admin.add_remove_group_members("Administrators", [self.simple_user],
-                       add_members_operation=True)
+                                                add_members_operation=True)
 
         res = self.ldb_simple.search(self.base_dn,
-                                    expression="(name=Administrators)",
-                                    controls=[control1])
+                                     expression="(name=Administrators)",
+                                     controls=[control1])
 
         self.assertEqual(len(res[0].get("member")), size + 1)
         ctl = str(res.controls[0]).split(":")
@@ -493,24 +490,24 @@ class SimpleDirsyncTests(DirsyncBaseTests):
 
         # remove the user from the group
         self.ldb_admin.add_remove_group_members("Administrators", [self.simple_user],
-                       add_members_operation=False)
+                                                add_members_operation=False)
 
         res = self.ldb_simple.search(self.base_dn,
-                                    expression="(name=Administrators)",
-                                    controls=[control1])
+                                     expression="(name=Administrators)",
+                                     controls=[control1])
 
-        self.assertEqual(len(res[0].get("member")), size )
+        self.assertEqual(len(res[0].get("member")), size)
 
         self.ldb_admin.newgroup("testgroup")
         self.ldb_admin.add_remove_group_members("testgroup", [self.simple_user],
-                       add_members_operation=True)
+                                                add_members_operation=True)
 
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=testgroup)",
                                     controls=["dirsync:1:0:1"])
 
         self.assertEqual(len(res[0].get("member")), 1)
-        self.assertTrue(res[0].get("member") != "" )
+        self.assertTrue(res[0].get("member") != "")
 
         ctl = str(res.controls[0]).split(":")
         ctl[1] = "1"
@@ -520,7 +517,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
 
         # Check that reasking the same question but with an updated cookie
         # didn't return any results.
-        print control1
+        print(control1)
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=testgroup)",
                                     controls=[control1])
@@ -533,7 +530,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         control1 = str(":".join(ctl))
 
         self.ldb_admin.add_remove_group_members("testgroup", [self.simple_user],
-                       add_members_operation=False)
+                                                add_members_operation=False)
 
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=testgroup)",
@@ -543,12 +540,10 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         self.ldb_admin.deletegroup("testgroup")
         self.assertEqual(len(res[0].get("member")), 0)
 
-
-
     def test_dirsync_deleted_items(self):
         """Check that dirsync returnd deleted objects too"""
         # Let's create an OU
-        ouname="OU=testou3,%s" % self.base_dn
+        ouname = "OU=testou3,%s" % self.base_dn
         self.ouname = ouname
         self.ldb_admin.create_ou(ouname)
         res = self.ldb_admin.search(self.base_dn,
@@ -557,7 +552,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         guid = None
         for e in res:
             if str(e["name"]) == "testou3":
-                guid = str(ndr_unpack(misc.GUID,e.get("objectGUID")[0]))
+                guid = str(ndr_unpack(misc.GUID, e.get("objectGUID")[0]))
 
         ctl = str(res.controls[0]).split(":")
         ctl[1] = "1"
@@ -573,7 +568,7 @@ class SimpleDirsyncTests(DirsyncBaseTests):
                                     expression="(objectClass=organizationalUnit)",
                                     controls=[control1])
         self.assertEqual(len(res), 1)
-        guid2 = str(ndr_unpack(misc.GUID,res[0].get("objectGUID")[0]))
+        guid2 = str(ndr_unpack(misc.GUID, res[0].get("objectGUID")[0]))
         self.assertEqual(guid2, guid)
         self.assertTrue(res[0].get("isDeleted"))
         self.assertTrue(res[0].get("name") != None)
@@ -585,12 +580,14 @@ class SimpleDirsyncTests(DirsyncBaseTests):
         ctl = str(res.controls[0]).split(":")
         cookie = ndr_unpack(drsblobs.ldapControlDirSyncCookie, base64.b64decode(str(ctl[4])))
         cookie.blob.guid1 = misc.GUID("128a99bf-abcd-1234-abcd-1fb625e530db")
-        controls=["dirsync:1:0:0:%s" % base64.b64encode(ndr_pack(cookie))]
+        controls = ["dirsync:1:0:0:%s" % base64.b64encode(ndr_pack(cookie)).decode('utf8')]
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(&(objectClass=organizationalUnit)(!(isDeleted=*)))",
                                     controls=controls)
 
+
 class ExtendedDirsyncTests(SimpleDirsyncTests):
+
     def test_dirsync_linkedattributes(self):
         flag_incr_linked = 2147483648
         self.ldb_simple = self.get_ldb_connection(self.simple_user, self.user_pass)
@@ -599,7 +596,7 @@ class ExtendedDirsyncTests(SimpleDirsyncTests):
                                     expression="(name=Administrators)",
                                     controls=["dirsync:1:%d:1" % flag_incr_linked])
 
-        self.assertTrue(res[0].get("member;range=1-1") != None )
+        self.assertTrue(res[0].get("member;range=1-1") != None)
         self.assertTrue(len(res[0].get("member;range=1-1")) > 0)
         size = len(res[0].get("member;range=1-1"))
 
@@ -609,10 +606,9 @@ class ExtendedDirsyncTests(SimpleDirsyncTests):
         ctl[3] = "10000"
         control1 = str(":".join(ctl))
         self.ldb_admin.add_remove_group_members("Administrators", [self.simple_user],
-                       add_members_operation=True)
+                                                add_members_operation=True)
         self.ldb_admin.add_remove_group_members("Administrators", [self.dirsync_user],
-                       add_members_operation=True)
-
+                                                add_members_operation=True)
 
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=Administrators)",
@@ -627,13 +623,13 @@ class ExtendedDirsyncTests(SimpleDirsyncTests):
 
         # remove the user from the group
         self.ldb_admin.add_remove_group_members("Administrators", [self.simple_user],
-                       add_members_operation=False)
+                                                add_members_operation=False)
 
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=Administrators)",
                                     controls=[control1])
 
-        self.assertEqual(res[0].get("member;range=1-1"), None )
+        self.assertEqual(res[0].get("member;range=1-1"), None)
         self.assertEqual(len(res[0].get("member;range=0-0")), 1)
 
         ctl = str(res.controls[0]).split(":")
@@ -643,39 +639,39 @@ class ExtendedDirsyncTests(SimpleDirsyncTests):
         control2 = str(":".join(ctl))
 
         self.ldb_admin.add_remove_group_members("Administrators", [self.dirsync_user],
-                       add_members_operation=False)
+                                                add_members_operation=False)
 
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=Administrators)",
                                     controls=[control2])
 
-        self.assertEqual(res[0].get("member;range=1-1"), None )
+        self.assertEqual(res[0].get("member;range=1-1"), None)
         self.assertEqual(len(res[0].get("member;range=0-0")), 1)
 
         res = self.ldb_admin.search(self.base_dn,
                                     expression="(name=Administrators)",
                                     controls=[control1])
 
-        self.assertEqual(res[0].get("member;range=1-1"), None )
+        self.assertEqual(res[0].get("member;range=1-1"), None)
         self.assertEqual(len(res[0].get("member;range=0-0")), 2)
 
     def test_dirsync_deleted_items(self):
         """Check that dirsync returnd deleted objects too"""
         # Let's create an OU
         self.ldb_simple = self.get_ldb_connection(self.simple_user, self.user_pass)
-        ouname="OU=testou3,%s" % self.base_dn
+        ouname = "OU=testou3,%s" % self.base_dn
         self.ouname = ouname
         self.ldb_admin.create_ou(ouname)
 
         # Specify LDAP_DIRSYNC_OBJECT_SECURITY
         res = self.ldb_simple.search(self.base_dn,
-                                    expression="(&(objectClass=organizationalUnit)(!(isDeleted=*)))",
-                                    controls=["dirsync:1:1:1"])
+                                     expression="(&(objectClass=organizationalUnit)(!(isDeleted=*)))",
+                                     controls=["dirsync:1:1:1"])
 
         guid = None
         for e in res:
             if str(e["name"]) == "testou3":
-                guid = str(ndr_unpack(misc.GUID,e.get("objectGUID")[0]))
+                guid = str(ndr_unpack(misc.GUID, e.get("objectGUID")[0]))
 
         self.assertTrue(guid != None)
         ctl = str(res.controls[0]).split(":")
@@ -690,22 +686,17 @@ class ExtendedDirsyncTests(SimpleDirsyncTests):
         delete_force(self.ldb_admin, ouname)
 
         res = self.ldb_simple.search(self.base_dn,
-                                    expression="(objectClass=organizationalUnit)",
-                                    controls=[control1])
+                                     expression="(objectClass=organizationalUnit)",
+                                     controls=[control1])
         self.assertEqual(len(res), 1)
-        guid2 = str(ndr_unpack(misc.GUID,res[0].get("objectGUID")[0]))
+        guid2 = str(ndr_unpack(misc.GUID, res[0].get("objectGUID")[0]))
         self.assertEqual(guid2, guid)
         self.assertEqual(str(res[0].dn), "")
 
 
-ldb = SamDB(ldapshost, credentials=creds, session_info=system_session(lp), lp=lp)
+if not getattr(opts, "listtests", False):
+    lp = sambaopts.get_loadparm()
+    samba.tests.cmdline_credentials = credopts.get_credentials(lp)
 
-runner = SubunitTestRunner()
-rc = 0
-#
-if not runner.run(unittest.makeSuite(SimpleDirsyncTests)).wasSuccessful():
-    rc = 1
-if not runner.run(unittest.makeSuite(ExtendedDirsyncTests)).wasSuccessful():
-    rc = 1
 
-sys.exit(rc)
+TestProgram(module=__name__, opts=subunitopts)