Browse Source

Ticket - lib389 - Python 3 support for memberof plugin test suit

Bug Description: ticket49064_test.py tests did not support python 3

Fix Description: Move the test file from tickets to suits/memberof_plugin/regression_test.py,
fix config_memberof and other methods to use DSLdapObject,
create test users and test groups using DSLdapObject in test case,
fix some docstrings and add more comments. Remove add_user,
add_group, update_member and memberof_fixup_task methods.
Remove ticket49064_test.py from dirsrvtests/tests/tickets/

https://pagure.io/lib389/issue/3

Reviewed by: William Brown (Huge Thanks!), spichugi

Signed-off-by: Simon Pichugin <[email protected]>
Amita Sharma 8 years ago
parent
commit
f02cbddfa4

+ 241 - 0
dirsrvtests/tests/suites/memberof_plugin/regression_test.py

@@ -0,0 +1,241 @@
+import logging
+import pytest
+import os
+import time
+import ldap
+import subprocess
+from lib389.utils import ds_is_older
+from lib389.topologies import topology_m1h1c1 as topo
+from lib389._constants import *
+from lib389.plugins import MemberOfPlugin
+from lib389 import agreement
+from lib389.idm.user import UserAccount, UserAccounts, TEST_USER_PROPERTIES
+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_'
+
+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__)
+
+
+def config_memberof(server):
+    # Configure fractional to prevent total init to send memberof
+    memberof = MemberOfPlugin(server)
+    memberof.enable()
+    memberof.set_autoaddoc('nsMemberOf')
+    server.restart()
+    ents = server.agreement.list(suffix=DEFAULT_SUFFIX)
+    for ent in ents:
+        log.info('update %s to add nsDS5ReplicatedAttributeListTotal' % ent.dn)
+        server.agreement.setProperties(agmnt_dn=ents[0].dn,
+                                       properties={RA_FRAC_EXCLUDE:'(objectclass=*) $ EXCLUDE memberOf',
+                                                   RA_FRAC_EXCLUDE_TOTAL_UPDATE:'(objectclass=*) $ EXCLUDE '})
+
+
+def send_updates_now(server):
+    ents = server.agreement.list(suffix=DEFAULT_SUFFIX)
+    for ent in ents:
+        server.agreement.pause(ent.dn)
+        server.agreement.resume(ent.dn)
+
+
+def _find_memberof(server, member_dn, group_dn):
+    #To get the specific server's (M1, C1 and H1) user and group
+    user = UserAccount(server, member_dn)
+    assert user.exists()
+    group = Group(server, group_dn)
+    assert group.exists()
+
+    #test that the user entry should have memberof attribute with sepecified group dn value
+    assert group._dn in user.get_attr_vals_utf8('memberOf')
+
+
[email protected]
+def test_memberof_with_repl(topo):
+    """Test that we allowed to enable MemberOf plugin in dedicated consumer
+
+    :id: 60c11636-55a1-4704-9e09-2c6bcc828de4
+    :setup: 1 Master - 1 Hub - 1 Consumer
+    :steps:
+        1. Configure replication to EXCLUDE memberof
+        2. Enable memberof plugin
+        3. Create users/groups
+        4. Make user_0 member of group_0
+        5. Checks that user_0 is memberof group_0 on M,H,C
+        6. Make group_0 member of group_1 (nest group)
+        7. Checks that user_0 is memberof group_0 and group_1 on M,H,C
+        8. Check group_0 is memberof group_1 on M,H,C
+        9. Remove group_0 from group_1
+        10. Check group_0 and user_0 are NOT memberof group_1 on M,H,C
+        11. Remove user_0 from group_0
+        12. Check user_0 is not memberof group_0 and group_1 on M,H,C
+        13. Disable memberof on C
+        14. make user_0 member of group_1
+        15. Checks that user_0 is memberof group_0 on M,H but not on C
+        16. Enable memberof on C
+        17. Checks that user_0 is memberof group_0 on M,H but not on C
+        18. Run memberof fixup task
+        19. Checks that user_0 is memberof group_0 on M,H,C
+    :expectedresults:
+        1. Configuration should be successful
+        2. Plugin should be enabled
+        3. Users and groups should be created
+        4. user_0 should be member of group_0
+        5. user_0 should be memberof group_0 on M,H,C
+        6. group_0 should be member of group_1
+        7. user_0 should be memberof group_0 and group_1 on M,H,C
+        8. group_0 should be memberof group_1 on M,H,C
+        9. group_0 from group_1 removal should be successful
+        10. group_0 and user_0 should not be memberof group_1 on M,H,C
+        11. user_0 from group_0 remove should be successful
+        12. user_0 should not be memberof group_0 and group_1 on M,H,C
+        13. memberof should be disabled on C
+        14. user_0 should be member of group_1
+        15. user_0 should be memberof group_0 on M,H and should not on C
+        16. Enable memberof on C should be successful
+        17. user_0 should be memberof group_0 on M,H should not on C
+        18. memberof fixup task should be successful
+        19. user_0 should be memberof group_0 on M,H,C
+    """
+
+    M1 = topo.ms["master1"]
+    H1 = topo.hs["hub1"]
+    C1 = topo.cs["consumer1"]
+
+    # Step 1 & 2
+    M1.config.enable_log('audit')
+    config_memberof(M1)
+    M1.restart()
+
+    H1.config.enable_log('audit')
+    config_memberof(H1)
+    H1.restart()
+
+    C1.config.enable_log('audit')
+    config_memberof(C1)
+    C1.restart()
+
+    #Declare lists of users and groups
+    test_users = []
+    test_groups = []
+
+    # Step 3
+    #In for loop create users and add them in the user list
+    #it creates user_0 to user_9 (range is fun)
+    for i in range(10):
+        CN = '%s%d' % (USER_CN, i)
+        users = UserAccounts(M1, SUFFIX)
+        user_props = TEST_USER_PROPERTIES.copy()
+        user_props.update({'uid': CN, 'cn': CN, 'sn': '_%s' % CN})
+        testuser = users.create(properties=user_props)
+        time.sleep(2)
+        test_users.append(testuser)
+
+    #In for loop create groups and add them to the group list
+    #it creates group_0 to group_2 (range is fun)
+    for i in range(3):
+        CN = '%s%d' % (GROUP_CN, i)
+        groups = Groups(M1, SUFFIX)
+        testgroup = groups.create(properties={'cn' : CN})
+        time.sleep(2)
+        test_groups.append(testgroup)
+
+    # Step 4
+    #Now start testing by adding differnt user to differn group
+    if not ds_is_older('1.3.7'):
+           test_groups[0].remove('objectClass', 'nsMemberOf')
+
+    member_dn = test_users[0].dn
+    grp0_dn = test_groups[0].dn
+    grp1_dn = test_groups[1].dn
+
+    test_groups[0].add_member(member_dn)
+    time.sleep(5)
+
+    # Step 5
+    for i in [M1, H1, C1]:
+        _find_memberof(i, member_dn, grp0_dn)
+
+    # Step 6
+    test_groups[1].add_member(test_groups[0].dn)
+    time.sleep(5)
+
+    # Step 7
+    for i in [grp0_dn, grp1_dn]:
+        for inst in [M1, H1, C1]:
+             _find_memberof(inst, member_dn, i)
+
+    # Step 8
+    for i in [M1, H1, C1]:
+        _find_memberof(i, grp0_dn, grp1_dn)
+
+    # Step 9
+    test_groups[1].remove_member(test_groups[0].dn)
+    time.sleep(5)
+
+    # Step 10
+    # For negative testcase, we are using assertionerror
+    for inst in [M1, H1, C1]:
+        for i in [grp0_dn, member_dn]:
+             with pytest.raises(AssertionError):
+                _find_memberof(inst, i, grp1_dn)
+
+    # Step 11
+    test_groups[0].remove_member(member_dn)
+    time.sleep(5)
+
+    # Step 12
+    for inst in [M1, H1, C1]:
+        for grp in [grp0_dn, grp1_dn]:
+            with pytest.raises(AssertionError):
+                _find_memberof(inst, member_dn, grp)
+
+    # Step 13
+    C1.plugins.disable(name=PLUGIN_MEMBER_OF)
+    C1.restart()
+
+    # Step 14
+    test_groups[0].add_member(member_dn)
+    time.sleep(5)
+
+    # Step 15
+    for i in [M1, H1]:
+        _find_memberof(i, member_dn, grp0_dn)
+    with pytest.raises(AssertionError):
+        _find_memberof(C1, member_dn, grp0_dn)
+
+    # Step 16
+    memberof = MemberOfPlugin(C1)
+    memberof.enable()
+    C1.restart()
+
+    # Step 17
+    for i in [M1, H1]:
+        _find_memberof(i, member_dn, grp0_dn)
+    with pytest.raises(AssertionError):
+        _find_memberof(C1, member_dn, grp0_dn)
+
+    # Step 18
+    memberof.fixup(SUFFIX)
+    time.sleep(5)
+
+    # Step 19
+    for i in [M1, H1, C1]:
+        _find_memberof(i, member_dn, grp0_dn)
+
+
+if __name__ == '__main__':
+    # Run isolated
+    # -s for DEBUG mode
+    CURRENT_FILE = os.path.realpath(__file__)
+    pytest.main("-s %s" % CURRENT_FILE)
+
+

+ 0 - 261
dirsrvtests/tests/tickets/ticket49064_test.py

@@ -1,261 +0,0 @@
-import logging
-import pytest
-import os
-import time
-import ldap
-import subprocess
-from lib389.utils import ds_is_older
-from lib389.topologies import topology_m1h1c1 as topo
-from lib389._constants import *
-from lib389 import Entry
-
-# Skip on older versions
-pytestmark = pytest.mark.skipif(ds_is_older('1.3.7'), reason="Not implemented")
-
-USER_CN='user_'
-GROUP_CN='group_'
-FIXUP_FILTER = '(objectClass=*)'
-FIXUP_CMD = 'fixup-memberof.pl'
-
-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__)
-
-def memberof_fixup_task(server):
-    sbin_dir = server.get_sbin_dir()
-    memof_task = os.path.join(sbin_dir, FIXUP_CMD)
-    try:
-        output = subprocess.check_output(
-            [memof_task, '-D', DN_DM, '-w', PASSWORD, '-b', SUFFIX, '-Z', SERVERID_CONSUMER_1, '-f', FIXUP_FILTER])
-    except subprocess.CalledProcessError as err:
-        output = err.output
-    log.info('output: {}'.format(output))
-    expected = "Successfully added task entry"
-    assert expected in output
-
-def config_memberof(server):
-
-    server.plugins.enable(name=PLUGIN_MEMBER_OF)
-    MEMBEROF_PLUGIN_DN = ('cn=' + PLUGIN_MEMBER_OF + ',cn=plugins,cn=config')
-    server.modify_s(MEMBEROF_PLUGIN_DN, [(ldap.MOD_REPLACE,
-                                          'memberOfAllBackends',
-                                          'on'),
-                                          (ldap.MOD_REPLACE, 'memberOfAutoAddOC', 'nsMemberOf')])
-    # Configure fractional to prevent total init to send memberof
-    ents = server.agreement.list(suffix=DEFAULT_SUFFIX)
-    for ent in ents:
-        log.info('update %s to add nsDS5ReplicatedAttributeListTotal' % ent.dn)
-        server.modify_s(ent.dn,
-                              [(ldap.MOD_REPLACE,
-                                'nsDS5ReplicatedAttributeListTotal',
-                                '(objectclass=*) $ EXCLUDE '),
-                               (ldap.MOD_REPLACE,
-                                'nsDS5ReplicatedAttributeList',
-                                '(objectclass=*) $ EXCLUDE memberOf')])
-
-
-def send_updates_now(server):
-
-    ents = server.agreement.list(suffix=DEFAULT_SUFFIX)
-    for ent in ents:
-        server.agreement.pause(ent.dn)
-        server.agreement.resume(ent.dn)
-                                
-def add_user(server, no, desc='dummy', sleep=True):
-    cn = '%s%d' % (USER_CN, no)
-    dn = 'cn=%s,ou=people,%s' % (cn, SUFFIX)
-    log.fatal('Adding user (%s): ' % dn)
-    server.add_s(Entry((dn, {'objectclass': ['top', 'person', 'inetuser'],
-                             'sn': ['_%s' % cn],
-                             'description': [desc]})))
-    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 test_ticket49064(topo):
-    """Specify a test case purpose or name here
-
-    :id: 60c11636-55a1-4704-9e09-2c6bcc828de4
-    :setup: 1 Master - 1 Hub - 1 Consumer
-    :steps:
-        1. Configure replication to EXCLUDE memberof
-        2. Enable memberof plugin
-        3. Create users/groups
-        4. make user_1 member of group_1
-        5. Checks that user_1 is memberof group_1 on M,H,C
-        6. make group_1 member of group_2 (nest group)
-        7. Checks that user_1 is memberof group_1 and group_2 on M,H,C
-        8. Check group_1 is memberof group_2 on M,H,C
-        9. remove group_1 from group_2
-        10. Check group_1 and user_1 are NOT memberof group_2 on M,H,C
-        11. remove user_1 from group_1
-        12. Check user_1 is NOT memberof group_1 and group_2 on M,H,C
-        13. Disable memberof on C1
-        14. make user_1 member of group_1
-        15. Checks that user is memberof group_1 on M,H but not on C
-        16. Enable memberof on C1
-        17. Checks that user is memberof group_1 on M,H but not on C
-        18. Run memberof fixup task
-        19. Checks that user is memberof group_1 on M,H,C
-
-        
-    :expectedresults:
-        no assert for membership check
-    """
-
-
-    M1 = topo.ms["master1"]
-    H1 = topo.hs["hub1"]
-    C1 = topo.cs["consumer1"]
-
-    # Step 1 & 2
-    M1.config.enable_log('audit')
-    config_memberof(M1)
-    M1.restart()
-    
-    H1.config.enable_log('audit')
-    config_memberof(H1)
-    H1.restart()
-    
-    C1.config.enable_log('audit')
-    config_memberof(C1)
-    C1.restart()
-    
-    # Step 3
-    for i in range(10):
-        add_user(M1, i, desc='add on m1')
-    for i in range(3):
-        add_group(M1, i)
-        
-    # Step 4
-    member_dn = 'cn=%s%d,ou=people,%s' % (USER_CN,  1, SUFFIX)
-    group_dn  = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX)
-    update_member(M1, member_dn, group_dn, ldap.MOD_ADD, sleep=True)
-    
-    # Step 5
-    for i in [M1, H1, C1]:
-        _find_memberof(i, member_dn, group_dn, find_result=True)
- 
-
-    # Step 6
-    user_dn = 'cn=%s%d,ou=people,%s' % (USER_CN,  1, SUFFIX)
-    grp1_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX)
-    grp2_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 2, SUFFIX)
-    update_member(M1, grp1_dn, grp2_dn, ldap.MOD_ADD, sleep=True)
-    
-    # Step 7
-    for i in [grp1_dn, grp2_dn]:
-        for inst in [M1, H1, C1]:
-            _find_memberof(inst, user_dn, i, find_result=True)
-
-    # Step 8
-    for i in [M1, H1, C1]:
-        _find_memberof(i, grp1_dn, grp2_dn, find_result=True)
-        
-    # Step 9
-    user_dn = 'cn=%s%d,ou=people,%s' % (USER_CN,  1, SUFFIX)
-    grp1_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX)
-    grp2_dn = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 2, SUFFIX)
-    update_member(M1, grp1_dn, grp2_dn, ldap.MOD_DELETE, sleep=True)
-
-    # Step 10
-    for inst in [M1, H1, C1]:
-        for i in [grp1_dn, user_dn]:
-            _find_memberof(inst, i, grp2_dn, find_result=False)
-    
-    # Step 11
-    member_dn = 'cn=%s%d,ou=people,%s' % (USER_CN,  1, SUFFIX)
-    group_dn  = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX)
-    update_member(M1, member_dn, group_dn, ldap.MOD_DELETE, sleep=True)
-    
-    # Step 12
-    for inst in [M1, H1, C1]:
-        for grp in [grp1_dn, grp2_dn]:
-            _find_memberof(inst, member_dn, grp, find_result=False)
-    
-    # Step 13
-    C1.plugins.disable(name=PLUGIN_MEMBER_OF)
-    C1.restart()
-    
-    # Step 14
-    member_dn = 'cn=%s%d,ou=people,%s' % (USER_CN,  1, SUFFIX)
-    group_dn  = 'cn=%s%d,ou=groups,%s' % (GROUP_CN, 1, SUFFIX)
-    update_member(M1, member_dn, group_dn, ldap.MOD_ADD, sleep=True)
-    # to give time to the update to go up to the C1
-    time.sleep(10)
-    
-    # Step 15
-    for i in [M1, H1]:
-        _find_memberof(i, member_dn, group_dn, find_result=True)
-    _find_memberof(C1, member_dn, group_dn, find_result=False)
-    
-    # Step 16
-    C1.plugins.enable(name=PLUGIN_MEMBER_OF)
-    C1.restart()
-    
-    # Step 17
-    for i in [M1, H1]:
-        _find_memberof(i, member_dn, group_dn, find_result=True)
-    _find_memberof(C1, member_dn, group_dn, find_result=False)
-    
-    # Step 18
-    memberof_fixup_task(C1)
-    time.sleep(5)
-
-    # Step 19
-    for i in [M1, H1, C1]:
-        _find_memberof(i, member_dn, group_dn, find_result=True)
-        
-    # 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)
-
-    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)
-