s4-drs: implementation of some delete test cases
[Samba/fernandojvsilva.git] / source4 / lib / ldb / tests / python / deletetest.py
blobfcd27fcd526bbbb869c5a796e8d4bc0627ccbb9b
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
4 import getopt
5 import optparse
6 import sys
7 import os
9 sys.path.append("bin/python")
10 sys.path.append("../lib/subunit/python")
12 import samba.getopt as options
14 from samba.auth import system_session
15 from ldb import SCOPE_BASE, LdbError
16 from ldb import ERR_NO_SUCH_OBJECT
17 from samba import Ldb
19 from subunit import SubunitTestRunner
20 import unittest
22 parser = optparse.OptionParser("deletetest.py [options] <host|file>")
23 sambaopts = options.SambaOptions(parser)
24 parser.add_option_group(sambaopts)
25 parser.add_option_group(options.VersionOptions(parser))
26 # use command line creds if available
27 credopts = options.CredentialsOptions(parser)
28 parser.add_option_group(credopts)
29 opts, args = parser.parse_args()
31 if len(args) < 1:
32 parser.print_usage()
33 sys.exit(1)
35 host = args[0]
37 lp = sambaopts.get_loadparm()
38 creds = credopts.get_credentials(lp)
40 class BasicDeleteTests(unittest.TestCase):
42 def delete_force(self, ldb, dn):
43 try:
44 ldb.delete(dn)
45 except LdbError, (num, _):
46 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
48 def GUID_string(self, guid):
49 return self.ldb.schema_format_value("objectGUID", guid)
51 def find_basedn(self, ldb):
52 res = ldb.search(base="", expression="", scope=SCOPE_BASE,
53 attrs=["defaultNamingContext"])
54 self.assertEquals(len(res), 1)
55 return res[0]["defaultNamingContext"][0]
57 def setUp(self):
58 self.ldb = ldb
59 self.base_dn = self.find_basedn(ldb)
61 def search_guid(self,guid):
62 print "SEARCH by GUID %s" % self.GUID_string(guid)
64 expression = "(objectGUID=%s)" % self.GUID_string(guid)
65 res = ldb.search(expression=expression,
66 controls=["show_deleted:1"])
67 self.assertEquals(len(res), 1)
68 return res[0]
70 def search_dn(self,dn):
71 print "SEARCH by DN %s" % dn
73 res = ldb.search(expression="(objectClass=*)",
74 base=dn,
75 scope=SCOPE_BASE,
76 controls=["show_deleted:1"])
77 self.assertEquals(len(res), 1)
78 return res[0]
80 def del_attr_values(self, delObj):
81 print "Checking attributes for %s" % delObj["dn"]
83 self.assertEquals(delObj["isDeleted"][0],"TRUE")
84 self.assertTrue(not("objectCategory" in delObj))
85 self.assertTrue(not("sAMAccountType" in delObj))
87 def preserved_attributes_list(self, liveObj, delObj):
88 print "Checking for preserved attributes list"
90 preserved_list = ["nTSecurityDescriptor", "attributeID", "attributeSyntax", "dNReferenceUpdate", "dNSHostName",
91 "flatName", "governsID", "groupType", "instanceType", "lDAPDisplayName", "legacyExchangeDN",
92 "isDeleted", "isRecycled", "lastKnownParent", "msDS-LastKnownRDN", "mS-DS-CreatorSID",
93 "mSMQOwnerID", "nCName", "objectClass", "distinguishedName", "objectGUID", "objectSid",
94 "oMSyntax", "proxiedObjectName", "name", "replPropertyMetaData", "sAMAccountName",
95 "securityIdentifier", "sIDHistory", "subClassOf", "systemFlags", "trustPartner", "trustDirection",
96 "trustType", "trustAttributes", "userAccountControl", "uSNChanged", "uSNCreated", "whenCreated"]
98 for a in liveObj:
99 if a in preserved_list:
100 self.assertTrue(a in delObj)
102 def check_rdn(self, liveObj, delObj, rdnName):
103 print "Checking for correct rDN"
104 rdn=liveObj[rdnName][0]
105 rdn2=delObj[rdnName][0]
106 name2=delObj[rdnName][0]
107 guid=liveObj["objectGUID"][0]
108 self.assertEquals(rdn2, rdn + "\nDEL:" + self.GUID_string(guid))
109 self.assertEquals(name2, rdn + "\nDEL:" + self.GUID_string(guid))
111 def delete_deleted(self, ldb, dn):
112 print "Testing the deletion of the already deleted dn %s" % dn
114 try:
115 ldb.delete(dn)
116 self.fail()
117 except LdbError, (num, _):
118 self.assertEquals(num, ERR_NO_SUCH_OBJECT)
120 def test_all(self):
121 """Basic delete tests"""
123 print self.base_dn
125 dn1="cn=testuser,cn=users," + self.base_dn
126 dn2="cn=testuser2,cn=users," + self.base_dn
127 grp1="cn=testdelgroup1,cn=users," + self.base_dn
129 self.delete_force(self.ldb, dn1)
130 self.delete_force(self.ldb, dn2)
131 self.delete_force(self.ldb, grp1)
133 ldb.add({
134 "dn": dn1,
135 "objectclass": "user",
136 "cn": "testuser",
137 "description": "test user description",
138 "samaccountname": "testuser"})
140 ldb.add({
141 "dn": dn2,
142 "objectclass": "user",
143 "cn": "testuser2",
144 "description": "test user 2 description",
145 "samaccountname": "testuser2"})
147 ldb.add({
148 "dn": grp1,
149 "objectclass": "group",
150 "cn": "testdelgroup1",
151 "description": "test group",
152 "samaccountname": "testdelgroup1",
153 "member": [ dn1, dn2 ] })
155 objLive1 = self.search_dn(dn1)
156 guid1=objLive1["objectGUID"][0]
158 objLive2 = self.search_dn(dn2)
159 guid2=objLive2["objectGUID"][0]
161 objLive3 = self.search_dn(grp1)
162 guid3=objLive3["objectGUID"][0]
164 ldb.delete(dn1)
165 ldb.delete(dn2)
166 ldb.delete(grp1)
168 objDeleted1 = self.search_guid(guid1)
169 objDeleted2 = self.search_guid(guid2)
170 objDeleted3 = self.search_guid(guid3)
172 self.del_attr_values(objDeleted1)
173 self.del_attr_values(objDeleted2)
174 self.del_attr_values(objDeleted3)
176 self.preserved_attributes_list(objLive1, objDeleted1)
177 self.preserved_attributes_list(objLive2, objDeleted2)
179 self.check_rdn(objLive1, objDeleted1, "cn")
180 self.check_rdn(objLive2, objDeleted2, "cn")
181 self.check_rdn(objLive3, objDeleted3, "cn")
183 self.delete_deleted(ldb, dn1)
184 self.delete_deleted(ldb, dn2)
185 self.delete_deleted(ldb, grp1)
187 if not "://" in host:
188 if os.path.isfile(host):
189 host = "tdb://%s" % host
190 else:
191 host = "ldap://%s" % host
193 ldb = Ldb(host, credentials=creds, session_info=system_session(), lp=lp)
195 runner = SubunitTestRunner()
196 rc = 0
197 if not runner.run(unittest.makeSuite(BasicDeleteTests)).wasSuccessful():
198 rc = 1
200 sys.exit(rc)