s4-dsdb-tests: Move base tests for Tombstone reanimation in tombstone_reanimation...
authorKamen Mazdrashki <kamenim@samba.org>
Wed, 26 Nov 2014 05:23:51 +0000 (06:23 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 3 Feb 2015 04:02:12 +0000 (05:02 +0100)
So we have them all in one place.

While moving, I have:
* inherited from the base class for Tombstone reanimations
* replace self.ldb with self.samdb

Change-Id: Id3e4f02cc2e0877d736da812c14c91e2311203d2
Signed-off-by: Kamen Mazdrashki <kamenim@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
source4/dsdb/tests/python/deletetest.py
source4/dsdb/tests/python/tombstone_reanimation.py

index 60bb689485a31b3689d7127c1f5e1775c064cc8b..6044c9f7c0c8a1b6f085f8862bc2ac51b3b6bbba 100755 (executable)
@@ -387,179 +387,6 @@ class BasicDeleteTests(BaseDeleteTests):
         self.assertFalse("CN=Deleted Objects" in str(objDeleted6.dn))
         self.assertFalse("CN=Deleted Objects" in str(objDeleted7.dn))
 
-class BasicUndeleteTests(BaseDeleteTests):
-
-    def setUp(self):
-        super(BasicUndeleteTests, self).setUp()
-
-    def enable_recycle_bin(self):
-        msg = Message()
-        msg.dn = Dn(self.ldb, "")
-        msg["enableOptionalFeature"] = MessageElement(
-            "CN=Partitions," +  self.configuration_dn + ":766ddcd8-acd0-445e-f3b9-a7f9b6744f2a",
-            FLAG_MOD_ADD, "enableOptionalFeature")
-        try:
-            self.ldb.modify(msg)
-        except LdbError, (num, _):
-            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
-
-    def undelete_deleted(self, olddn, newdn, samldb):
-        msg = Message()
-        msg.dn = Dn(samldb, olddn)
-        msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted")
-        msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName")
-        samldb.modify(msg, ["show_deleted:1"])
-
-    def undelete_deleted_with_mod(self, olddn, newdn):
-        msg = Message()
-        msg.dn = Dn(self.ldb, olddn)
-        msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted")
-        msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName")
-        msg["url"] = MessageElement(["www.samba.org"], FLAG_MOD_REPLACE, "url")
-        self.ldb.modify(msg, ["show_deleted:1"])
-
-
-    def test_undelete(self):
-        print "Testing standard undelete operation"
-        usr1="cn=testuser,cn=users," + self.base_dn
-        delete_force(self.ldb, usr1)
-        self.ldb.add({
-            "dn": usr1,
-            "objectclass": "user",
-            "description": "test user description",
-            "samaccountname": "testuser"})
-        objLive1 = self.search_dn(usr1)
-        guid1=objLive1["objectGUID"][0]
-        self.ldb.delete(usr1)
-        objDeleted1 = self.search_guid(guid1)
-        self.undelete_deleted(str(objDeleted1.dn), usr1, self.ldb)
-        objLive2 = self.search_dn(usr1)
-        self.assertEqual(str(objLive2.dn).lower(),str(objLive1.dn).lower())
-        delete_force(self.ldb, usr1)
-
-    def __test_rename(self):
-        print "Testing attempt to rename deleted object"
-        usr1="cn=testuser,cn=users," + self.base_dn
-        self.ldb.add({
-            "dn": usr1,
-            "objectclass": "user",
-            "description": "test user description",
-            "samaccountname": "testuser"})
-        objLive1 = self.search_dn(usr1)
-        guid1=objLive1["objectGUID"][0]
-        self.ldb.delete(usr1)
-        objDeleted1 = self.search_guid(guid1)
-        #just to make sure we get the correct error if the show deleted is missing
-        try:
-            self.ldb.rename(str(objDeleted1.dn), usr1)
-            self.fail()
-        except LdbError, (num, _):
-            self.assertEquals(num,ERR_NO_SUCH_OBJECT)
-
-        try:
-            self.ldb.rename(str(objDeleted1.dn), usr1, ["show_deleted:1"])
-            self.fail()
-        except LdbError, (num, _):
-            self.assertEquals(num,ERR_UNWILLING_TO_PERFORM)
-
-    def test_undelete_with_mod(self):
-        print "Testing standard undelete operation with modification of additional attributes"
-        usr1="cn=testuser,cn=users," + self.base_dn
-        self.ldb.add({
-            "dn": usr1,
-            "objectclass": "user",
-            "description": "test user description",
-            "samaccountname": "testuser"})
-        objLive1 = self.search_dn(usr1)
-        guid1=objLive1["objectGUID"][0]
-        self.ldb.delete(usr1)
-        objDeleted1 = self.search_guid(guid1)
-        self.undelete_deleted_with_mod(str(objDeleted1.dn), usr1)
-        objLive2 = self.search_dn(usr1)
-        self.assertEqual(objLive2["url"][0],"www.samba.org")
-        delete_force(self.ldb, usr1)
-
-    def test_undelete_newuser(self):
-        print "Testing undelete user with a different dn"
-        usr1="cn=testuser,cn=users," + self.base_dn
-        usr2="cn=testuser2,cn=users," + self.base_dn
-        delete_force(self.ldb, usr1)
-        self.ldb.add({
-            "dn": usr1,
-            "objectclass": "user",
-            "description": "test user description",
-            "samaccountname": "testuser"})
-        objLive1 = self.search_dn(usr1)
-        guid1=objLive1["objectGUID"][0]
-        self.ldb.delete(usr1)
-        objDeleted1 = self.search_guid(guid1)
-        self.undelete_deleted(str(objDeleted1.dn), usr2, self.ldb)
-        objLive2 = self.search_dn(usr2)
-        delete_force(self.ldb, usr1)
-        delete_force(self.ldb, usr2)
-
-    def test_undelete_existing(self):
-        print "Testing undelete user after a user with the same dn has been created"
-        usr1="cn=testuser,cn=users," + self.base_dn
-        self.ldb.add({
-            "dn": usr1,
-            "objectclass": "user",
-            "description": "test user description",
-            "samaccountname": "testuser"})
-        objLive1 = self.search_dn(usr1)
-        guid1=objLive1["objectGUID"][0]
-        self.ldb.delete(usr1)
-        self.ldb.add({
-            "dn": usr1,
-            "objectclass": "user",
-            "description": "test user description",
-            "samaccountname": "testuser"})
-        objDeleted1 = self.search_guid(guid1)
-        try:
-            self.undelete_deleted(str(objDeleted1.dn), usr1, self.ldb)
-            self.fail()
-        except LdbError, (num, _):
-            self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
-
-    def test_undelete_cross_nc(self):
-        print "Cross NC undelete"
-        c1 = "cn=ldaptestcontainer," + self.base_dn
-        c2 = "cn=ldaptestcontainer2," + self.configuration_dn
-        c3 = "cn=ldaptestcontainer," + self.configuration_dn
-        c4 = "cn=ldaptestcontainer2," + self.base_dn
-        self.ldb.add({
-            "dn": c1,
-            "objectclass": "container"})
-        self.ldb.add({
-            "dn": c2,
-            "objectclass": "container"})
-        objLive1 = self.search_dn(c1)
-        objLive2 = self.search_dn(c2)
-        guid1=objLive1["objectGUID"][0]
-        guid2=objLive2["objectGUID"][0]
-        self.ldb.delete(c1)
-        self.ldb.delete(c2)
-        objDeleted1 = self.search_guid(guid1)
-        objDeleted2 = self.search_guid(guid2)
-        #try to undelete from base dn to config
-        try:
-            self.undelete_deleted(str(objDeleted1.dn), c3, self.ldb)
-            self.fail()
-        except LdbError, (num, _):
-            self.assertEquals(num, ERR_OPERATIONS_ERROR)
-        #try to undelete from config to base dn
-        try:
-            self.undelete_deleted(str(objDeleted2.dn), c4, self.ldb)
-            self.fail()
-        except LdbError, (num, _):
-            self.assertEquals(num, ERR_OPERATIONS_ERROR)
-        #assert undeletion will work in same nc
-        self.undelete_deleted(str(objDeleted1.dn), c4, self.ldb)
-        self.undelete_deleted(str(objDeleted2.dn), c3, self.ldb)
-        delete_force(self.ldb, c3)
-        delete_force(self.ldb, c4)
-
-
 
 if not "://" in host:
     if os.path.isfile(host):
index 21df42d291466c74db805cea16259e4bb93281ee..4bc15251f4308df3b34cf452008a01a7010928ae 100644 (file)
@@ -3,6 +3,7 @@
 # Tombstone reanimation tests
 #
 # Copyright (C) Kamen Mazdrashki <kamenim@samba.org> 2014
+# Copyright (C) Nadezhda Ivanova <nivanova@symas.com> 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
@@ -26,7 +27,10 @@ import samba
 
 import samba.tests
 import samba.getopt as options
-from ldb import (SCOPE_BASE, FLAG_MOD_DELETE, FLAG_MOD_REPLACE, Dn, Message, MessageElement)
+from ldb import (SCOPE_BASE, FLAG_MOD_ADD, FLAG_MOD_DELETE, FLAG_MOD_REPLACE, Dn, Message,
+                 MessageElement, LdbError,
+                 ERR_ATTRIBUTE_OR_VALUE_EXISTS, ERR_NO_SUCH_OBJECT, ERR_ENTRY_ALREADY_EXISTS,
+                 ERR_OPERATIONS_ERROR, ERR_UNWILLING_TO_PERFORM)
 
 
 class RestoredObjectAttributesBaseTestCase(samba.tests.TestCase):
@@ -41,6 +45,7 @@ class RestoredObjectAttributesBaseTestCase(samba.tests.TestCase):
         self.samdb = samba.tests.connect_samdb_env("TEST_SERVER", "TEST_USERNAME", "TEST_PASSWORD", lp=lp)
         self.base_dn = self.samdb.domain_dn()
         self.schema_dn = self.samdb.get_schema_basedn().get_linearized()
+        self.configuration_dn = self.samdb.get_config_basedn().get_linearized()
         # Get the old "dSHeuristics" if it was set
         self.dsheuristics = self.samdb.get_dsheuristics()
         # Set the "dSHeuristics" to activate the correct "userPassword" behaviour
@@ -120,6 +125,179 @@ class RestoredObjectAttributesBaseTestCase(samba.tests.TestCase):
         samdb.modify(msg, ["show_deleted:1"])
 
 
+class BaseRestoreObjectTestCase(RestoredObjectAttributesBaseTestCase):
+
+    def setUp(self):
+        super(BaseRestoreObjectTestCase, self).setUp()
+
+    def enable_recycle_bin(self):
+        msg = Message()
+        msg.dn = Dn(self.samdb, "")
+        msg["enableOptionalFeature"] = MessageElement(
+            "CN=Partitions," +  self.configuration_dn + ":766ddcd8-acd0-445e-f3b9-a7f9b6744f2a",
+            FLAG_MOD_ADD, "enableOptionalFeature")
+        try:
+            self.samdb.modify(msg)
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ATTRIBUTE_OR_VALUE_EXISTS)
+
+    def undelete_deleted(self, olddn, newdn, samldb):
+        msg = Message()
+        msg.dn = Dn(samldb, olddn)
+        msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted")
+        msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName")
+        samldb.modify(msg, ["show_deleted:1"])
+
+    def undelete_deleted_with_mod(self, olddn, newdn):
+        msg = Message()
+        msg.dn = Dn(self.samdb, olddn)
+        msg["isDeleted"] = MessageElement([], FLAG_MOD_DELETE, "isDeleted")
+        msg["distinguishedName"] = MessageElement([newdn], FLAG_MOD_REPLACE, "distinguishedName")
+        msg["url"] = MessageElement(["www.samba.org"], FLAG_MOD_REPLACE, "url")
+        self.samdb.modify(msg, ["show_deleted:1"])
+
+
+    def test_undelete(self):
+        print "Testing standard undelete operation"
+        usr1="cn=testuser,cn=users," + self.base_dn
+        samba.tests.delete_force(self.samdb, usr1)
+        self.samdb.add({
+            "dn": usr1,
+            "objectclass": "user",
+            "description": "test user description",
+            "samaccountname": "testuser"})
+        objLive1 = self.search_dn(usr1)
+        guid1=objLive1["objectGUID"][0]
+        self.samdb.delete(usr1)
+        objDeleted1 = self.search_guid(guid1)
+        self.undelete_deleted(str(objDeleted1.dn), usr1, self.samdb)
+        objLive2 = self.search_dn(usr1)
+        self.assertEqual(str(objLive2.dn).lower(),str(objLive1.dn).lower())
+        samba.tests.delete_force(self.samdb, usr1)
+
+    def test_rename(self):
+        print "Testing attempt to rename deleted object"
+        usr1="cn=testuser,cn=users," + self.base_dn
+        self.samdb.add({
+            "dn": usr1,
+            "objectclass": "user",
+            "description": "test user description",
+            "samaccountname": "testuser"})
+        objLive1 = self.search_dn(usr1)
+        guid1=objLive1["objectGUID"][0]
+        self.samdb.delete(usr1)
+        objDeleted1 = self.search_guid(guid1)
+        #just to make sure we get the correct error if the show deleted is missing
+        try:
+            self.samdb.rename(str(objDeleted1.dn), usr1)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num,ERR_NO_SUCH_OBJECT)
+
+        try:
+            self.samdb.rename(str(objDeleted1.dn), usr1, ["show_deleted:1"])
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_UNWILLING_TO_PERFORM)
+
+    def test_undelete_with_mod(self):
+        print "Testing standard undelete operation with modification of additional attributes"
+        usr1="cn=testuser,cn=users," + self.base_dn
+        self.samdb.add({
+            "dn": usr1,
+            "objectclass": "user",
+            "description": "test user description",
+            "samaccountname": "testuser"})
+        objLive1 = self.search_dn(usr1)
+        guid1=objLive1["objectGUID"][0]
+        self.samdb.delete(usr1)
+        objDeleted1 = self.search_guid(guid1)
+        self.undelete_deleted_with_mod(str(objDeleted1.dn), usr1)
+        objLive2 = self.search_dn(usr1)
+        self.assertEqual(objLive2["url"][0],"www.samba.org")
+        samba.tests.delete_force(self.samdb, usr1)
+
+    def test_undelete_newuser(self):
+        print "Testing undelete user with a different dn"
+        usr1="cn=testuser,cn=users," + self.base_dn
+        usr2="cn=testuser2,cn=users," + self.base_dn
+        samba.tests.delete_force(self.samdb, usr1)
+        self.samdb.add({
+            "dn": usr1,
+            "objectclass": "user",
+            "description": "test user description",
+            "samaccountname": "testuser"})
+        objLive1 = self.search_dn(usr1)
+        guid1=objLive1["objectGUID"][0]
+        self.samdb.delete(usr1)
+        objDeleted1 = self.search_guid(guid1)
+        self.undelete_deleted(str(objDeleted1.dn), usr2, self.samdb)
+        objLive2 = self.search_dn(usr2)
+        samba.tests.delete_force(self.samdb, usr1)
+        samba.tests.delete_force(self.samdb, usr2)
+
+    def test_undelete_existing(self):
+        print "Testing undelete user after a user with the same dn has been created"
+        usr1="cn=testuser,cn=users," + self.base_dn
+        self.samdb.add({
+            "dn": usr1,
+            "objectclass": "user",
+            "description": "test user description",
+            "samaccountname": "testuser"})
+        objLive1 = self.search_dn(usr1)
+        guid1=objLive1["objectGUID"][0]
+        self.samdb.delete(usr1)
+        self.samdb.add({
+            "dn": usr1,
+            "objectclass": "user",
+            "description": "test user description",
+            "samaccountname": "testuser"})
+        objDeleted1 = self.search_guid(guid1)
+        try:
+            self.undelete_deleted(str(objDeleted1.dn), usr1, self.samdb)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
+
+    def test_undelete_cross_nc(self):
+        print "Cross NC undelete"
+        c1 = "cn=ldaptestcontainer," + self.base_dn
+        c2 = "cn=ldaptestcontainer2," + self.configuration_dn
+        c3 = "cn=ldaptestcontainer," + self.configuration_dn
+        c4 = "cn=ldaptestcontainer2," + self.base_dn
+        self.samdb.add({
+            "dn": c1,
+            "objectclass": "container"})
+        self.samdb.add({
+            "dn": c2,
+            "objectclass": "container"})
+        objLive1 = self.search_dn(c1)
+        objLive2 = self.search_dn(c2)
+        guid1=objLive1["objectGUID"][0]
+        guid2=objLive2["objectGUID"][0]
+        self.samdb.delete(c1)
+        self.samdb.delete(c2)
+        objDeleted1 = self.search_guid(guid1)
+        objDeleted2 = self.search_guid(guid2)
+        #try to undelete from base dn to config
+        try:
+            self.undelete_deleted(str(objDeleted1.dn), c3, self.samdb)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_OPERATIONS_ERROR)
+        #try to undelete from config to base dn
+        try:
+            self.undelete_deleted(str(objDeleted2.dn), c4, self.samdb)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_OPERATIONS_ERROR)
+        #assert undeletion will work in same nc
+        self.undelete_deleted(str(objDeleted1.dn), c4, self.samdb)
+        self.undelete_deleted(str(objDeleted2.dn), c3, self.samdb)
+        samba.tests.delete_force(self.samdb, c3)
+        samba.tests.delete_force(self.samdb, c4)
+
+
 class RestoreUserObjectTestCase(RestoredObjectAttributesBaseTestCase):
     """Test cases for delete/reanimate user objects"""