Skip to content

Commit cf94943

Browse files
tiranencukou
authored andcommitted
Refactor syncrepl tests to run with bytes_mode
#150 Signed-off-by: Christian Heimes <cheimes@redhat.com>
1 parent b32bcaf commit cf94943

File tree

1 file changed

+53
-65
lines changed

1 file changed

+53
-65
lines changed

Tests/t_ldap_syncrepl.py

Lines changed: 53 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,14 @@
77

88

99
import os
10-
import unittest
1110
import shelve
11+
import sys
12+
import unittest
13+
14+
if sys.version_info[0] <= 2:
15+
PY2 = True
16+
else:
17+
PY2 = False
1218

1319
from slapdtest import SlapdObject, SlapdTestCase
1420

@@ -125,9 +131,9 @@ class SyncreplClient(SimpleLDAPObject, SyncreplConsumer):
125131
Needs to be separate, because once an LDAP client starts a syncrepl
126132
search, it can't be used for anything else.
127133
"""
128-
server_class = SyncreplProvider
129134

130-
def __init__(self, uri, dn, password, storage=None):
135+
def __init__(self, uri, dn, password, storage=None, filterstr=None,
136+
**kwargs):
131137
"""
132138
Set up our object by creating a search client, connecting, and binding.
133139
"""
@@ -146,11 +152,11 @@ def __init__(self, uri, dn, password, storage=None):
146152
self.data['cookie'] = None
147153
self.present = []
148154
self.refresh_done = False
155+
self.filterstr = filterstr
149156

150-
SimpleLDAPObject.__init__(self, uri)
157+
SimpleLDAPObject.__init__(self, uri, **kwargs)
151158
self.simple_bind_s(dn, password)
152159

153-
154160
def unbind_s(self):
155161
"""
156162
In addition to unbinding from LDAP, we need to close the shelf.
@@ -161,7 +167,6 @@ def unbind_s(self):
161167
self.dn_attrs.close()
162168
SimpleLDAPObject.unbind_s(self)
163169

164-
165170
def search(self, search_base, search_mode):
166171
"""
167172
Start a syncrepl search operation, given a base DN and search mode.
@@ -170,17 +175,15 @@ def search(self, search_base, search_mode):
170175
search_base,
171176
ldap.SCOPE_SUBTREE,
172177
mode=search_mode,
173-
filterstr='(objectClass=*)'
178+
filterstr=self.filterstr
174179
)
175180

176-
177181
def cancel(self):
178182
"""
179183
A simple wrapper to call parent class with syncrepl search ID.
180184
"""
181185
SimpleLDAPObject.cancel(self, self.search_id)
182186

183-
184187
def poll(self, timeout=None, all=0):
185188
"""
186189
Take the params, add the syncrepl search ID, and call the proper poll.
@@ -191,28 +194,24 @@ def poll(self, timeout=None, all=0):
191194
all=all
192195
)
193196

194-
195197
def syncrepl_get_cookie(self):
196198
"""
197199
Pull cookie from storage, if one exists.
198200
"""
199201
return self.data['cookie']
200202

201-
202203
def syncrepl_set_cookie(self, cookie):
203204
"""
204205
Update stored cookie.
205206
"""
206207
self.data['cookie'] = cookie
207208

208-
209209
def syncrepl_refreshdone(self):
210210
"""
211211
Just update a variable.
212212
"""
213213
self.refresh_done = True
214214

215-
216215
def syncrepl_delete(self, uuids):
217216
"""
218217
Delete the given items from both maps.
@@ -221,7 +220,6 @@ def syncrepl_delete(self, uuids):
221220
del self.dn_attrs[self.uuid_dn[uuid]]
222221
del self.uuid_dn[uuid]
223222

224-
225223
def syncrepl_entry(self, dn, attrs, uuid):
226224
"""
227225
Handles adds and changes (including DN changes).
@@ -236,7 +234,6 @@ def syncrepl_entry(self, dn, attrs, uuid):
236234
self.uuid_dn[uuid] = dn
237235
self.dn_attrs[dn] = attrs
238236

239-
240237
def syncrepl_present(self, uuids, refreshDeletes=False):
241238
"""
242239
The 'present' message from the LDAP server is the most complicated
@@ -262,7 +259,7 @@ def syncrepl_present(self, uuids, refreshDeletes=False):
262259
pass
263260

264261

265-
class Test00_Syncrepl(SlapdTestCase):
262+
class BaseSyncreplTests(object):
266263
"""
267264
This is a test of all the basic Syncrepl operations. It covers starting a
268265
search (both types of search), doing the refresh part of the search,
@@ -275,7 +272,7 @@ class Test00_Syncrepl(SlapdTestCase):
275272

276273
@classmethod
277274
def setUpClass(cls):
278-
super(Test00_Syncrepl, cls).setUpClass()
275+
super(BaseSyncreplTests, cls).setUpClass()
279276
# insert some Foo* objects via ldapadd
280277
cls.server.ldapadd(
281278
LDIF_TEMPLATE % {
@@ -287,57 +284,39 @@ def setUpClass(cls):
287284
}
288285
)
289286

290-
291287
def setUp(self):
292-
try:
293-
self._ldap_conn
294-
except AttributeError:
295-
# open local LDAP connection
296-
self._ldap_conn = self._open_ldap_conn()
297-
288+
super(BaseSyncreplTests, self).setUp()
289+
self.tester = None
290+
self.suffix = None
298291

299292
def tearDown(self):
300293
self.tester.unbind_s()
294+
super(BaseSyncreplTests, self).tearDown()
301295

296+
def create_client(self):
297+
raise NotImplementedError
302298

303299
def test_refreshOnly_search(self):
304300
'''
305301
Test to see if we can initialize a syncrepl search.
306302
'''
307-
self.tester = SyncreplClient(
308-
self.server.ldap_uri,
309-
self.server.root_dn,
310-
self.server.root_pw
311-
)
312303
self.tester.search(
313-
self.server.suffix,
304+
self.suffix,
314305
'refreshOnly'
315306
)
316307

317-
318308
def test_refreshAndPersist_search(self):
319-
self.tester = SyncreplClient(
320-
self.server.ldap_uri,
321-
self.server.root_dn,
322-
self.server.root_pw
323-
)
324309
self.tester.search(
325-
self.server.suffix,
310+
self.suffix,
326311
'refreshAndPersist'
327312
)
328313

329-
330314
def test_refreshOnly_poll_full(self):
331315
"""
332316
Test doing a full refresh cycle, and check what we got.
333317
"""
334-
self.tester = SyncreplClient(
335-
self.server.ldap_uri,
336-
self.server.root_dn,
337-
self.server.root_pw
338-
)
339318
self.tester.search(
340-
self.server.suffix,
319+
self.suffix,
341320
'refreshOnly'
342321
)
343322
poll_result = self.tester.poll(
@@ -347,18 +326,12 @@ def test_refreshOnly_poll_full(self):
347326
self.assertFalse(poll_result)
348327
self.assertEqual(self.tester.dn_attrs, LDAP_ENTRIES)
349328

350-
351329
def test_refreshAndPersist_poll_only(self):
352330
"""
353331
Test the refresh part of refresh-and-persist, and check what we got.
354332
"""
355-
self.tester = SyncreplClient(
356-
self.server.ldap_uri,
357-
self.server.root_dn,
358-
self.server.root_pw
359-
)
360333
self.tester.search(
361-
self.server.suffix,
334+
self.suffix,
362335
'refreshAndPersist'
363336
)
364337

@@ -372,18 +345,12 @@ def test_refreshAndPersist_poll_only(self):
372345

373346
self.assertEqual(self.tester.dn_attrs, LDAP_ENTRIES)
374347

375-
376348
def test_refreshAndPersist_timeout(self):
377349
"""
378350
Make sure refreshAndPersist can handle a search with timeouts.
379351
"""
380-
self.tester = SyncreplClient(
381-
self.server.ldap_uri,
382-
self.server.root_dn,
383-
self.server.root_pw
384-
)
385352
self.tester.search(
386-
self.server.suffix,
353+
self.suffix,
387354
'refreshAndPersist'
388355
)
389356

@@ -407,18 +374,12 @@ def test_refreshAndPersist_timeout(self):
407374
timeout=1
408375
)
409376

410-
411377
def test_refreshAndPersist_cancelled(self):
412378
"""
413379
Make sure refreshAndPersist can handle cancelling a syncrepl search.
414380
"""
415-
self.tester = SyncreplClient(
416-
self.server.ldap_uri,
417-
self.server.root_dn,
418-
self.server.root_pw
419-
)
420381
self.tester.search(
421-
self.server.suffix,
382+
self.suffix,
422383
'refreshAndPersist'
423384
)
424385

@@ -463,5 +424,32 @@ def test_refreshAndPersist_cancelled(self):
463424
# should pick it up during the persist phase.
464425

465426

427+
class TestSyncrepl(BaseSyncreplTests, SlapdTestCase):
428+
def setUp(self):
429+
super(TestSyncrepl, self).setUp()
430+
self.tester = SyncreplClient(
431+
self.server.ldap_uri,
432+
self.server.root_dn,
433+
self.server.root_pw,
434+
filterstr=u'(objectClass=*)',
435+
bytes_mode=False
436+
)
437+
self.suffix = self.server.suffix
438+
439+
440+
@unittest.skipUnless(PY2, "no bytes_mode under Py3")
441+
class TestSyncreplBytesMode(BaseSyncreplTests, SlapdTestCase):
442+
def setUp(self):
443+
super(TestSyncreplBytesMode, self).setUp()
444+
self.tester = SyncreplClient(
445+
self.server.ldap_uri,
446+
self.server.root_dn.encode('utf-8'),
447+
self.server.root_pw.encode('utf-8'),
448+
filterstr=b'(objectClass=*)',
449+
bytes_mode=True
450+
)
451+
self.suffix = self.server.suffix.encode('utf-8')
452+
453+
466454
if __name__ == '__main__':
467455
unittest.main()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy