|
7 | 7 | import linecache
|
8 | 8 | import os
|
9 | 9 | import socket
|
| 10 | +import threading |
| 11 | +import time |
10 | 12 | import unittest
|
11 | 13 | import pickle
|
12 | 14 |
|
| 15 | + |
13 | 16 | # Switch off processing .ldaprc or ldap.conf before importing _ldap
|
14 | 17 | os.environ['LDAPNOINIT'] = '1'
|
15 | 18 |
|
@@ -547,6 +550,7 @@ def test103_reconnect_get_state(self):
|
547 | 550 | {}
|
548 | 551 | ),
|
549 | 552 | '_options': [(17, 3)],
|
| 553 | + '_reconnect_exceptions': (ldap.SERVER_DOWN, ldap.UNAVAILABLE), |
550 | 554 | '_reconnects_done': 0,
|
551 | 555 | '_retry_delay': 60.0,
|
552 | 556 | '_retry_max': 1,
|
@@ -585,6 +589,63 @@ def test105_reconnect_restore(self):
|
585 | 589 | self.server._start_slapd()
|
586 | 590 | self.assertEqual(l1.whoami_s(), 'dn:'+bind_dn)
|
587 | 591 |
|
| 592 | + def test_106_reconnect_restore(self): |
| 593 | + lo = self.ldap_object_class(self.server.ldap_uri, retry_max=2, retry_delay=1) |
| 594 | + bind_dn = 'cn=user1,' + self.server.suffix |
| 595 | + lo.simple_bind_s(bind_dn, 'user1_pw') |
| 596 | + |
| 597 | + dn = lo.whoami_s()[3:] |
| 598 | + |
| 599 | + self.server._proc.terminate() |
| 600 | + self.server.wait() |
| 601 | + |
| 602 | + # do a search, wait for the timeout, handle SERVER_DOWN exception |
| 603 | + try: |
| 604 | + print(lo.search_s(dn, ldap.SCOPE_BASE, '(objectClass=*)')) |
| 605 | + except ldap.SERVER_DOWN: |
| 606 | + pass # some handling here |
| 607 | + else: |
| 608 | + self.assertEqual(True, False) |
| 609 | + |
| 610 | + self.server._start_slapd() |
| 611 | + |
| 612 | + # try to use the connection again |
| 613 | + print(lo.search_s(dn, ldap.SCOPE_BASE, '(objectClass=*)')) |
| 614 | + # this now raises ldap.INSUFFICIENT_ACCESS, as it is now a unbound connection and does everything anonymously. |
| 615 | + |
| 616 | + def test_107_reconnect_restore(self): |
| 617 | + def foo(): |
| 618 | + lo = self.ldap_object_class(self.server.ldap_uri) |
| 619 | + bind_dn = 'cn=user1,' + self.server.suffix |
| 620 | + lo.simple_bind_s(bind_dn, 'user1_pw') |
| 621 | + lo._retry_max = 10E4 |
| 622 | + lo._retry_delay = .001 |
| 623 | + x = 0 |
| 624 | + lo.search_ext_s(self.server.suffix, ldap.SCOPE_SUBTREE, "cn=user1", attrlist=["cn"]) |
| 625 | + s = time.time() |
| 626 | + print("go") |
| 627 | + while (time.time() - s) < run_time: |
| 628 | + x += 1 |
| 629 | + lo.search_ext_s(self.server.suffix, ldap.SCOPE_SUBTREE, filterstr="cn=user1", attrlist=["cn"]) |
| 630 | + print("Searches per sec: {}".format(x / run_time)) |
| 631 | + |
| 632 | + thread_count = 100 |
| 633 | + run_time = 10.0 |
| 634 | + my_thread = [None] * thread_count |
| 635 | + for i in range(0, thread_count): |
| 636 | + my_thread[i] = threading.Thread(target=foo) |
| 637 | + for t in my_thread: |
| 638 | + t.start() |
| 639 | + print("warmup") |
| 640 | + time.sleep(3) |
| 641 | + print("restart slapd") |
| 642 | + self.server.restart() |
| 643 | + print("restarted") |
| 644 | + for t in my_thread: |
| 645 | + t.join() |
| 646 | + |
| 647 | + print("done") |
| 648 | + |
588 | 649 |
|
589 | 650 | @requires_init_fd()
|
590 | 651 | class Test03_SimpleLDAPObjectWithFileno(Test00_SimpleLDAPObject):
|
|
0 commit comments