7
7
8
8
9
9
import os
10
- import unittest
11
10
import shelve
11
+ import sys
12
+ import unittest
13
+
14
+ if sys .version_info [0 ] <= 2 :
15
+ PY2 = True
16
+ else :
17
+ PY2 = False
12
18
13
19
from slapdtest import SlapdObject , SlapdTestCase
14
20
@@ -125,9 +131,9 @@ class SyncreplClient(SimpleLDAPObject, SyncreplConsumer):
125
131
Needs to be separate, because once an LDAP client starts a syncrepl
126
132
search, it can't be used for anything else.
127
133
"""
128
- server_class = SyncreplProvider
129
134
130
- def __init__ (self , uri , dn , password , storage = None ):
135
+ def __init__ (self , uri , dn , password , storage = None , filterstr = None ,
136
+ ** kwargs ):
131
137
"""
132
138
Set up our object by creating a search client, connecting, and binding.
133
139
"""
@@ -146,11 +152,11 @@ def __init__(self, uri, dn, password, storage=None):
146
152
self .data ['cookie' ] = None
147
153
self .present = []
148
154
self .refresh_done = False
155
+ self .filterstr = filterstr
149
156
150
- SimpleLDAPObject .__init__ (self , uri )
157
+ SimpleLDAPObject .__init__ (self , uri , ** kwargs )
151
158
self .simple_bind_s (dn , password )
152
159
153
-
154
160
def unbind_s (self ):
155
161
"""
156
162
In addition to unbinding from LDAP, we need to close the shelf.
@@ -161,7 +167,6 @@ def unbind_s(self):
161
167
self .dn_attrs .close ()
162
168
SimpleLDAPObject .unbind_s (self )
163
169
164
-
165
170
def search (self , search_base , search_mode ):
166
171
"""
167
172
Start a syncrepl search operation, given a base DN and search mode.
@@ -170,17 +175,15 @@ def search(self, search_base, search_mode):
170
175
search_base ,
171
176
ldap .SCOPE_SUBTREE ,
172
177
mode = search_mode ,
173
- filterstr = '(objectClass=*)'
178
+ filterstr = self . filterstr
174
179
)
175
180
176
-
177
181
def cancel (self ):
178
182
"""
179
183
A simple wrapper to call parent class with syncrepl search ID.
180
184
"""
181
185
SimpleLDAPObject .cancel (self , self .search_id )
182
186
183
-
184
187
def poll (self , timeout = None , all = 0 ):
185
188
"""
186
189
Take the params, add the syncrepl search ID, and call the proper poll.
@@ -191,28 +194,24 @@ def poll(self, timeout=None, all=0):
191
194
all = all
192
195
)
193
196
194
-
195
197
def syncrepl_get_cookie (self ):
196
198
"""
197
199
Pull cookie from storage, if one exists.
198
200
"""
199
201
return self .data ['cookie' ]
200
202
201
-
202
203
def syncrepl_set_cookie (self , cookie ):
203
204
"""
204
205
Update stored cookie.
205
206
"""
206
207
self .data ['cookie' ] = cookie
207
208
208
-
209
209
def syncrepl_refreshdone (self ):
210
210
"""
211
211
Just update a variable.
212
212
"""
213
213
self .refresh_done = True
214
214
215
-
216
215
def syncrepl_delete (self , uuids ):
217
216
"""
218
217
Delete the given items from both maps.
@@ -221,7 +220,6 @@ def syncrepl_delete(self, uuids):
221
220
del self .dn_attrs [self .uuid_dn [uuid ]]
222
221
del self .uuid_dn [uuid ]
223
222
224
-
225
223
def syncrepl_entry (self , dn , attrs , uuid ):
226
224
"""
227
225
Handles adds and changes (including DN changes).
@@ -236,7 +234,6 @@ def syncrepl_entry(self, dn, attrs, uuid):
236
234
self .uuid_dn [uuid ] = dn
237
235
self .dn_attrs [dn ] = attrs
238
236
239
-
240
237
def syncrepl_present (self , uuids , refreshDeletes = False ):
241
238
"""
242
239
The 'present' message from the LDAP server is the most complicated
@@ -262,7 +259,7 @@ def syncrepl_present(self, uuids, refreshDeletes=False):
262
259
pass
263
260
264
261
265
- class Test00_Syncrepl ( SlapdTestCase ):
262
+ class BaseSyncreplTests ( object ):
266
263
"""
267
264
This is a test of all the basic Syncrepl operations. It covers starting a
268
265
search (both types of search), doing the refresh part of the search,
@@ -275,7 +272,7 @@ class Test00_Syncrepl(SlapdTestCase):
275
272
276
273
@classmethod
277
274
def setUpClass (cls ):
278
- super (Test00_Syncrepl , cls ).setUpClass ()
275
+ super (BaseSyncreplTests , cls ).setUpClass ()
279
276
# insert some Foo* objects via ldapadd
280
277
cls .server .ldapadd (
281
278
LDIF_TEMPLATE % {
@@ -287,57 +284,39 @@ def setUpClass(cls):
287
284
}
288
285
)
289
286
290
-
291
287
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
298
291
299
292
def tearDown (self ):
300
293
self .tester .unbind_s ()
294
+ super (BaseSyncreplTests , self ).tearDown ()
301
295
296
+ def create_client (self ):
297
+ raise NotImplementedError
302
298
303
299
def test_refreshOnly_search (self ):
304
300
'''
305
301
Test to see if we can initialize a syncrepl search.
306
302
'''
307
- self .tester = SyncreplClient (
308
- self .server .ldap_uri ,
309
- self .server .root_dn ,
310
- self .server .root_pw
311
- )
312
303
self .tester .search (
313
- self .server . suffix ,
304
+ self .suffix ,
314
305
'refreshOnly'
315
306
)
316
307
317
-
318
308
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
- )
324
309
self .tester .search (
325
- self .server . suffix ,
310
+ self .suffix ,
326
311
'refreshAndPersist'
327
312
)
328
313
329
-
330
314
def test_refreshOnly_poll_full (self ):
331
315
"""
332
316
Test doing a full refresh cycle, and check what we got.
333
317
"""
334
- self .tester = SyncreplClient (
335
- self .server .ldap_uri ,
336
- self .server .root_dn ,
337
- self .server .root_pw
338
- )
339
318
self .tester .search (
340
- self .server . suffix ,
319
+ self .suffix ,
341
320
'refreshOnly'
342
321
)
343
322
poll_result = self .tester .poll (
@@ -347,18 +326,12 @@ def test_refreshOnly_poll_full(self):
347
326
self .assertFalse (poll_result )
348
327
self .assertEqual (self .tester .dn_attrs , LDAP_ENTRIES )
349
328
350
-
351
329
def test_refreshAndPersist_poll_only (self ):
352
330
"""
353
331
Test the refresh part of refresh-and-persist, and check what we got.
354
332
"""
355
- self .tester = SyncreplClient (
356
- self .server .ldap_uri ,
357
- self .server .root_dn ,
358
- self .server .root_pw
359
- )
360
333
self .tester .search (
361
- self .server . suffix ,
334
+ self .suffix ,
362
335
'refreshAndPersist'
363
336
)
364
337
@@ -372,18 +345,12 @@ def test_refreshAndPersist_poll_only(self):
372
345
373
346
self .assertEqual (self .tester .dn_attrs , LDAP_ENTRIES )
374
347
375
-
376
348
def test_refreshAndPersist_timeout (self ):
377
349
"""
378
350
Make sure refreshAndPersist can handle a search with timeouts.
379
351
"""
380
- self .tester = SyncreplClient (
381
- self .server .ldap_uri ,
382
- self .server .root_dn ,
383
- self .server .root_pw
384
- )
385
352
self .tester .search (
386
- self .server . suffix ,
353
+ self .suffix ,
387
354
'refreshAndPersist'
388
355
)
389
356
@@ -407,18 +374,12 @@ def test_refreshAndPersist_timeout(self):
407
374
timeout = 1
408
375
)
409
376
410
-
411
377
def test_refreshAndPersist_cancelled (self ):
412
378
"""
413
379
Make sure refreshAndPersist can handle cancelling a syncrepl search.
414
380
"""
415
- self .tester = SyncreplClient (
416
- self .server .ldap_uri ,
417
- self .server .root_dn ,
418
- self .server .root_pw
419
- )
420
381
self .tester .search (
421
- self .server . suffix ,
382
+ self .suffix ,
422
383
'refreshAndPersist'
423
384
)
424
385
@@ -463,5 +424,32 @@ def test_refreshAndPersist_cancelled(self):
463
424
# should pick it up during the persist phase.
464
425
465
426
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
+
466
454
if __name__ == '__main__' :
467
455
unittest .main ()
0 commit comments