range_search_test.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # --- BEGIN COPYRIGHT BLOCK ---
  2. # Copyright (C) 2015 Red Hat, Inc.
  3. # All rights reserved.
  4. #
  5. # License: GPL (version 3 or any later version).
  6. # See LICENSE for details.
  7. # --- END COPYRIGHT BLOCK ---
  8. #
  9. import os
  10. import sys
  11. import time
  12. import ldap
  13. import logging
  14. import pytest
  15. from lib389 import DirSrv, Entry, tools, tasks
  16. from lib389.tools import DirSrvTools
  17. from lib389._constants import *
  18. from lib389.properties import *
  19. from lib389.tasks import *
  20. from lib389.utils import *
  21. logging.getLogger(__name__).setLevel(logging.DEBUG)
  22. log = logging.getLogger(__name__)
  23. installation1_prefix = None
  24. class TopologyStandalone(object):
  25. def __init__(self, standalone):
  26. standalone.open()
  27. self.standalone = standalone
  28. @pytest.fixture(scope="module")
  29. def topology(request):
  30. global installation1_prefix
  31. if installation1_prefix:
  32. args_instance[SER_DEPLOYED_DIR] = installation1_prefix
  33. # Creating standalone instance ...
  34. standalone = DirSrv(verbose=False)
  35. args_instance[SER_HOST] = HOST_STANDALONE
  36. args_instance[SER_PORT] = PORT_STANDALONE
  37. args_instance[SER_SERVERID_PROP] = SERVERID_STANDALONE
  38. args_instance[SER_CREATION_SUFFIX] = DEFAULT_SUFFIX
  39. args_standalone = args_instance.copy()
  40. standalone.allocate(args_standalone)
  41. instance_standalone = standalone.exists()
  42. if instance_standalone:
  43. standalone.delete()
  44. standalone.create()
  45. standalone.open()
  46. # Clear out the tmp dir
  47. standalone.clearTmpDir(__file__)
  48. return TopologyStandalone(standalone)
  49. def test_range_search_init(topology):
  50. '''
  51. Enable retro cl, and valgrind. Since valgrind tests move the ns-slapd binary
  52. around it's important to always "valgrind_disable" before "assert False"ing,
  53. otherwise we leave the wrong ns-slapd in place if there is a failure
  54. '''
  55. log.info('Initializing test_range_search...')
  56. topology.standalone.plugins.enable(name=PLUGIN_RETRO_CHANGELOG)
  57. # First stop the instance
  58. topology.standalone.stop(timeout=10)
  59. # Get the sbin directory so we know where to replace 'ns-slapd'
  60. sbin_dir = get_sbin_dir(prefix=topology.standalone.prefix)
  61. # Enable valgrind
  62. valgrind_enable(sbin_dir)
  63. # Now start the server with a longer timeout
  64. topology.standalone.start(timeout=60)
  65. def test_range_search(topology):
  66. '''
  67. Add a 100 entries, and run a range search. When we encounter an error we
  68. still need to disable valgrind before exiting
  69. '''
  70. log.info('Running test_range_search...')
  71. sbin_dir = get_sbin_dir(prefix=topology.standalone.prefix)
  72. success = True
  73. # Add 100 test entries
  74. for idx in range(1, 100):
  75. idx = str(idx)
  76. USER_DN = 'uid=user' + idx + ',' + DEFAULT_SUFFIX
  77. try:
  78. topology.standalone.add_s(Entry((USER_DN, {'objectclass': "top extensibleObject".split(),
  79. 'uid': 'user' + idx})))
  80. except ldap.LDAPError as e:
  81. log.fatal('test_range_search: Failed to add test user ' + USER_DN + ': error ' + e.message['desc'])
  82. success = False
  83. time.sleep(1)
  84. if success:
  85. # Issue range search
  86. try:
  87. topology.standalone.search_s(RETROCL_SUFFIX, ldap.SCOPE_SUBTREE,
  88. '(&(changenumber>=74)(changenumber<=84))')
  89. except ldap.LDAPError as e:
  90. log.fatal('test_range_search: Failed to search retro changelog(%s), error: %s' %
  91. (RETROCL_SUFFIX, e.message('desc')))
  92. test_range_search_final(topology) # With valgrind we always need to cleanup
  93. success = False
  94. if success:
  95. # Check valgrind(this stops the server)
  96. if valgrind_check_leak(topology.standalone, 'range_candidates'):
  97. log.fatal('test_range_search: Memory leak is still present!')
  98. test_range_search_final(topology) # With valgrind we always need to cleanup
  99. success = False
  100. # Disable valgrind
  101. sbin_dir = get_sbin_dir(prefix=topology.standalone.prefix)
  102. valgrind_disable(sbin_dir)
  103. if success:
  104. log.info('test_range_search: PASSED')
  105. else:
  106. log.fatal('test_range_search: FAILED')
  107. def test_range_search_final(topology):
  108. # Remove the instance
  109. topology.standalone.delete()
  110. def run_isolated():
  111. global installation1_prefix
  112. installation1_prefix = None
  113. topo = topology(True)
  114. test_range_search_init(topo)
  115. test_range_search(topo)
  116. test_range_search_final(topo)
  117. if __name__ == '__main__':
  118. run_isolated()