Skip to content

Commit

Permalink
Refactor syncrepl tests to run with bytes_mode
Browse files Browse the repository at this point in the history
https://github.com/python-ldap/python-ldap/pull/150
Signed-off-by: Christian Heimes <cheimes@redhat.com>
  • Loading branch information
Christian Heimes authored and Petr Viktorin committed Jan 5, 2018
1 parent b32bcaf commit cf94943
Showing 1 changed file with 53 additions and 65 deletions.
118 changes: 53 additions & 65 deletions Tests/t_ldap_syncrepl.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,14 @@


import os
import unittest
import shelve
import sys
import unittest

if sys.version_info[0] <= 2:
PY2 = True
else:
PY2 = False

from slapdtest import SlapdObject, SlapdTestCase

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

def __init__(self, uri, dn, password, storage=None):
def __init__(self, uri, dn, password, storage=None, filterstr=None,
**kwargs):
"""
Set up our object by creating a search client, connecting, and binding.
"""
Expand All @@ -146,11 +152,11 @@ def __init__(self, uri, dn, password, storage=None):
self.data['cookie'] = None
self.present = []
self.refresh_done = False
self.filterstr = filterstr

SimpleLDAPObject.__init__(self, uri)
SimpleLDAPObject.__init__(self, uri, **kwargs)
self.simple_bind_s(dn, password)


def unbind_s(self):
"""
In addition to unbinding from LDAP, we need to close the shelf.
Expand All @@ -161,7 +167,6 @@ def unbind_s(self):
self.dn_attrs.close()
SimpleLDAPObject.unbind_s(self)


def search(self, search_base, search_mode):
"""
Start a syncrepl search operation, given a base DN and search mode.
Expand All @@ -170,17 +175,15 @@ def search(self, search_base, search_mode):
search_base,
ldap.SCOPE_SUBTREE,
mode=search_mode,
filterstr='(objectClass=*)'
filterstr=self.filterstr
)


def cancel(self):
"""
A simple wrapper to call parent class with syncrepl search ID.
"""
SimpleLDAPObject.cancel(self, self.search_id)


def poll(self, timeout=None, all=0):
"""
Take the params, add the syncrepl search ID, and call the proper poll.
Expand All @@ -191,28 +194,24 @@ def poll(self, timeout=None, all=0):
all=all
)


def syncrepl_get_cookie(self):
"""
Pull cookie from storage, if one exists.
"""
return self.data['cookie']


def syncrepl_set_cookie(self, cookie):
"""
Update stored cookie.
"""
self.data['cookie'] = cookie


def syncrepl_refreshdone(self):
"""
Just update a variable.
"""
self.refresh_done = True


def syncrepl_delete(self, uuids):
"""
Delete the given items from both maps.
Expand All @@ -221,7 +220,6 @@ def syncrepl_delete(self, uuids):
del self.dn_attrs[self.uuid_dn[uuid]]
del self.uuid_dn[uuid]


def syncrepl_entry(self, dn, attrs, uuid):
"""
Handles adds and changes (including DN changes).
Expand All @@ -236,7 +234,6 @@ def syncrepl_entry(self, dn, attrs, uuid):
self.uuid_dn[uuid] = dn
self.dn_attrs[dn] = attrs


def syncrepl_present(self, uuids, refreshDeletes=False):
"""
The 'present' message from the LDAP server is the most complicated
Expand All @@ -262,7 +259,7 @@ def syncrepl_present(self, uuids, refreshDeletes=False):
pass


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

@classmethod
def setUpClass(cls):
super(Test00_Syncrepl, cls).setUpClass()
super(BaseSyncreplTests, cls).setUpClass()
# insert some Foo* objects via ldapadd
cls.server.ldapadd(
LDIF_TEMPLATE % {
Expand All @@ -287,57 +284,39 @@ def setUpClass(cls):
}
)


def setUp(self):
try:
self._ldap_conn
except AttributeError:
# open local LDAP connection
self._ldap_conn = self._open_ldap_conn()

super(BaseSyncreplTests, self).setUp()
self.tester = None
self.suffix = None

def tearDown(self):
self.tester.unbind_s()
super(BaseSyncreplTests, self).tearDown()

def create_client(self):
raise NotImplementedError

def test_refreshOnly_search(self):
'''
Test to see if we can initialize a syncrepl search.
'''
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw
)
self.tester.search(
self.server.suffix,
self.suffix,
'refreshOnly'
)


def test_refreshAndPersist_search(self):
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw
)
self.tester.search(
self.server.suffix,
self.suffix,
'refreshAndPersist'
)


def test_refreshOnly_poll_full(self):
"""
Test doing a full refresh cycle, and check what we got.
"""
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw
)
self.tester.search(
self.server.suffix,
self.suffix,
'refreshOnly'
)
poll_result = self.tester.poll(
Expand All @@ -347,18 +326,12 @@ def test_refreshOnly_poll_full(self):
self.assertFalse(poll_result)
self.assertEqual(self.tester.dn_attrs, LDAP_ENTRIES)


def test_refreshAndPersist_poll_only(self):
"""
Test the refresh part of refresh-and-persist, and check what we got.
"""
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw
)
self.tester.search(
self.server.suffix,
self.suffix,
'refreshAndPersist'
)

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

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


def test_refreshAndPersist_timeout(self):
"""
Make sure refreshAndPersist can handle a search with timeouts.
"""
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw
)
self.tester.search(
self.server.suffix,
self.suffix,
'refreshAndPersist'
)

Expand All @@ -407,18 +374,12 @@ def test_refreshAndPersist_timeout(self):
timeout=1
)


def test_refreshAndPersist_cancelled(self):
"""
Make sure refreshAndPersist can handle cancelling a syncrepl search.
"""
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw
)
self.tester.search(
self.server.suffix,
self.suffix,
'refreshAndPersist'
)

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


class TestSyncrepl(BaseSyncreplTests, SlapdTestCase):
def setUp(self):
super(TestSyncrepl, self).setUp()
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn,
self.server.root_pw,
filterstr=u'(objectClass=*)',
bytes_mode=False
)
self.suffix = self.server.suffix


@unittest.skipUnless(PY2, "no bytes_mode under Py3")
class TestSyncreplBytesMode(BaseSyncreplTests, SlapdTestCase):
def setUp(self):
super(TestSyncreplBytesMode, self).setUp()
self.tester = SyncreplClient(
self.server.ldap_uri,
self.server.root_dn.encode('utf-8'),
self.server.root_pw.encode('utf-8'),
filterstr=b'(objectClass=*)',
bytes_mode=True
)
self.suffix = self.server.suffix.encode('utf-8')


if __name__ == '__main__':
unittest.main()

0 comments on commit cf94943

Please sign in to comment.