From c1cbb551046bffbe2bc975e9f37837c162aa0d48 Mon Sep 17 00:00:00 2001 From: Simon Pichugin Date: Mon, 8 Jan 2018 14:42:20 +0100 Subject: [PATCH] Ticket 49523 - Refactor CI test Description: Add Python 3 support, move the test case to suites/memberof_plugin/regression-test.py and refactor its structure with lib389 wrappers. https://pagure.io/389-ds-base/issue/49523 Reviewed by: ? --- .../suites/memberof_plugin/regression_test.py | 66 ++++++++- dirsrvtests/tests/tickets/ticket49523_test.py | 154 --------------------- 2 files changed, 64 insertions(+), 156 deletions(-) delete mode 100644 dirsrvtests/tests/tickets/ticket49523_test.py diff --git a/dirsrvtests/tests/suites/memberof_plugin/regression_test.py b/dirsrvtests/tests/suites/memberof_plugin/regression_test.py index 6ba421799..bc7affeaf 100644 --- a/dirsrvtests/tests/suites/memberof_plugin/regression_test.py +++ b/dirsrvtests/tests/suites/memberof_plugin/regression_test.py @@ -1,3 +1,11 @@ +# --- BEGIN COPYRIGHT BLOCK --- +# Copyright (C) 2017 Red Hat, Inc. +# All rights reserved. +# +# License: GPL (version 3 or any later version). +# See LICENSE for details. +# --- END COPYRIGHT BLOCK --- +# import logging import pytest import os @@ -15,8 +23,9 @@ from lib389.idm.group import Groups, Group # Skip on older versions pytestmark = pytest.mark.skipif(ds_is_older('1.3.7'), reason="Not implemented") -USER_CN='user_' -GROUP_CN='group_' +USER_CN = 'user_' +GROUP_CN = 'group1' + DEBUGGING = os.getenv("DEBUGGING", default=False) if DEBUGGING: @@ -232,6 +241,59 @@ def test_memberof_with_repl(topo): _find_memberof(i, member_dn, grp0_dn) +@pytest.mark.skipif(ds_is_older('1.4.0'), reason="Not implemented") +def test_scheme_violation_errors_logged(topo): + """Check that ERR messages are verbose enough, if a member entry + doesn't have the appropriate objectclass to support 'memberof' attribute + + :id: e2af0aaa-447e-4e85-a5ce-57ae66260d0b + :setup: Standalone instance + :steps: + 1. Enable memberofPlugin and set autoaddoc to nsMemberOf + 2. Restart the instance + 3. Add a user without nsMemberOf attribute + 4. Create a group and add the user to the group + 5. Check that user has memberOf attribute + 6. Check the error log for ".*oc_check_allowed_sv.*USER_DN.*memberOf.*not allowed.*" + and ".*schema violation caught - repair operation.*" patterns + :expectedresults: + 1. Should be successful + 2. Should be successful + 3. Should be successful + 4. Should be successful + 5. User should have the attribute + 6. Errors should be logged + """ + + inst = topo.ms["master1"] + memberof = MemberOfPlugin(inst) + memberof.enable() + memberof.set_autoaddoc('nsMemberOf') + inst.restart() + + users = UserAccounts(inst, SUFFIX) + user_props = TEST_USER_PROPERTIES.copy() + user_props.update({'uid': USER_CN, 'cn': USER_CN, 'sn': USER_CN}) + testuser = users.create(properties=user_props) + testuser.remove('objectclass', 'nsMemberOf') + + groups = Groups(inst, SUFFIX) + testgroup = groups.create(properties={'cn': GROUP_CN}) + + testgroup.add('member', testuser.dn) + + user_memberof_attr = testuser.get_attr_val_utf8('memberof') + assert user_memberof_attr + log.info('memberOf attr value - '.format(user_memberof_attr)) + + pattern = ".*oc_check_allowed_sv.*{}.*memberOf.*not allowed.*".format(testuser.dn) + log.info("pattern = %s" % pattern) + assert inst.ds_error_log.match(pattern) + + pattern = ".*schema violation caught - repair operation.*" + assert inst.ds_error_log.match(pattern) + + if __name__ == '__main__': # Run isolated # -s for DEBUG mode diff --git a/dirsrvtests/tests/tickets/ticket49523_test.py b/dirsrvtests/tests/tickets/ticket49523_test.py deleted file mode 100644 index c3296ef07..000000000 --- a/dirsrvtests/tests/tickets/ticket49523_test.py +++ /dev/null @@ -1,154 +0,0 @@ -import logging -import pytest -import os -import ldap -import time -import re -from lib389.plugins import MemberOfPlugin -from lib389._constants import * -from lib389.topologies import topology_st as topo -from lib389 import Entry - -DEBUGGING = os.getenv("DEBUGGING", default=False) -if DEBUGGING: - logging.getLogger(__name__).setLevel(logging.DEBUG) -else: - logging.getLogger(__name__).setLevel(logging.INFO) -log = logging.getLogger(__name__) - - -USER_CN='user_' -GROUP_CN='group_' -def _user_get_dn(no): - cn = '%s%d' % (USER_CN, no) - dn = 'cn=%s,ou=people,%s' % (cn, SUFFIX) - return (cn, dn) - -def add_user(server, no, desc='dummy', sleep=True): - (cn, dn) = _user_get_dn(no) - log.fatal('Adding user (%s): ' % dn) - server.add_s(Entry((dn, {'objectclass': ['top', 'person'], - 'cn': [cn], - 'description': [desc], - 'sn': [cn], - 'description': ['add on that host']}))) - if sleep: - time.sleep(2) - -def add_group(server, nr, sleep=True): - cn = '%s%d' % (GROUP_CN, nr) - dn = 'cn=%s,ou=groups,%s' % (cn, SUFFIX) - server.add_s(Entry((dn, {'objectclass': ['top', 'groupofnames'], - 'description': 'group %d' % nr}))) - if sleep: - time.sleep(2) - -def update_member(server, member_dn, group_dn, op, sleep=True): - mod = [(op, 'member', member_dn)] - server.modify_s(group_dn, mod) - if sleep: - time.sleep(2) - -def _find_memberof(server, member_dn, group_dn, find_result=True): - ent = server.getEntry(member_dn, ldap.SCOPE_BASE, "(objectclass=*)", ['memberof']) - found = False - if ent.hasAttr('memberof'): - - for val in ent.getValues('memberof'): - server.log.info("!!!!!!! %s: memberof->%s" % (member_dn, val)) - server.log.info("!!!!!!! %s" % (val)) - server.log.info("!!!!!!! %s" % (group_dn)) - if val.lower() == group_dn.lower(): - found = True - break - - if find_result: - assert (found) - else: - assert (not found) - -def pattern_accesslog(server, log_pattern): - file_obj = open(server.accesslog, "r") - - found = False - # Use a while true iteration because 'for line in file: hit a - while True: - line = file_obj.readline() - found = log_pattern.search(line) - if ((line == '') or (found)): - break - - return found - -def pattern_errorlog(server, log_pattern): - file_obj = open(server.errlog, "r") - - found = None - # Use a while true iteration because 'for line in file: hit a - while True: - line = file_obj.readline() - found = log_pattern.search(line) - server.log.fatal("%s --> %s" % (line, found)) - if ((line == '') or (found)): - break - - return found - -def test_ticket49523(topo): - """Specify a test case purpose or name here - - :id: e2af0aaa-447e-4e85-a5ce-57ae66260d0b - :setup: Fill in set up configuration here - :steps: - 1. Fill in test case steps here - 2. And indent them like this (RST format requirement) - :expectedresults: - 1. Fill in the result that is expected - 2. For each test step - """ - - # If you need any test suite initialization, - # please, write additional fixture for that (including finalizer). - # Topology for suites are predefined in lib389/topologies.py. - - # If you need host, port or any other data about instance, - # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid) - inst = topo.standalone - memberof = MemberOfPlugin(inst) - memberof.enable() - memberof.set_autoaddoc('nsMemberOf') - inst.restart() - - # Step 2 - for i in range(10): - add_user(inst, i, desc='add user') - - add_group(inst, 1) - - group_parent_dn = 'ou=groups,%s' % (SUFFIX) - group_rdn = 'cn=%s%d' % (GROUP_CN, 1) - group_dn = '%s,%s' % (group_rdn, group_parent_dn) - (member_cn, member_dn) = _user_get_dn(1) - update_member(inst, member_dn, group_dn, ldap.MOD_ADD, sleep=False) - - _find_memberof(inst, member_dn, group_dn, find_result=True) - - pattern = ".*oc_check_allowed_sv - Entry.*cn=%s.* -- attribute.*not allowed.*" % member_cn - log.fatal("pattern = %s" % pattern) - regex = re.compile(pattern) - assert pattern_errorlog(inst, regex) - - regex = re.compile(".*schema violation caught - repair operation.*") - assert pattern_errorlog(inst, regex) - - if DEBUGGING: - # Add debugging steps(if any)... - pass - - -if __name__ == '__main__': - # Run isolated - # -s for DEBUG mode - CURRENT_FILE = os.path.realpath(__file__) - pytest.main("-s %s" % CURRENT_FILE) - -- 2.14.3