Hi everyone,

Here is a patch set fixing some things in integration tests and adding more
LDAP tests:

    * Adding/removing a user/group/membership with rfc2307(bis) schema.
    * Filtering users/groups with rfc2307(bis) schema.
    * The effect of override_homedir option.
    * The effect of fallback_homedir option.
    * The effect of override_shell option.
    * The effect of shell_fallback option.
    * The effect of default_shell option.
    * The effect of vetoed_shells option.

These are pretty basic, but I think they're good for the start.
Suggestions for more tests are welcome :)

NOTE: These still break test_memory_cache.py as seen in the attached log file.
      We need to figure out why and do something with it. Otherwise, the
      tests work fine.

Nick
>From d09a103901a6f86873f9510152c600a062e255ed Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Tue, 29 Sep 2015 20:00:14 +0300
Subject: [PATCH 1/7] intg: Get base DN from LDAP connection object

Don't use the global LDAP_BASE_DN in integration tests and fixtures, but
instead take it from the LDAP connection object (ldap_conn) passed to
them explicitly. This makes the tests and fixtures a bit more modular.
---
 src/tests/intg/ldap_test.py         | 8 ++++----
 src/tests/intg/test_memory_cache.py | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/tests/intg/ldap_test.py b/src/tests/intg/ldap_test.py
index ea114dc..0287a28 100644
--- a/src/tests/intg/ldap_test.py
+++ b/src/tests/intg/ldap_test.py
@@ -105,7 +105,7 @@ def create_sssd_fixture(request):
 
 @pytest.fixture
 def sanity_rfc2307(request, ldap_conn):
-    ent_list = ldap_ent.List(LDAP_BASE_DN)
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user("user1", 1001, 2001)
     ent_list.add_user("user2", 1002, 2002)
     ent_list.add_user("user3", 1003, 2003)
@@ -150,7 +150,7 @@ def sanity_rfc2307(request, ldap_conn):
 
 @pytest.fixture
 def simple_rfc2307(request, ldap_conn):
-    ent_list = ldap_ent.List(LDAP_BASE_DN)
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user('usr\\\\001', 181818, 181818)
     ent_list.add_group("group1", 181818)
 
@@ -181,7 +181,7 @@ def simple_rfc2307(request, ldap_conn):
 
 @pytest.fixture
 def sanity_rfc2307_bis(request, ldap_conn):
-    ent_list = ldap_ent.List(LDAP_BASE_DN)
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user("user1", 1001, 2001)
     ent_list.add_user("user2", 1002, 2002)
     ent_list.add_user("user3", 1003, 2003)
@@ -309,7 +309,7 @@ def test_sanity_rfc2307_bis(ldap_conn, sanity_rfc2307_bis):
 
 @pytest.fixture
 def refresh_after_cleanup_task(request, ldap_conn):
-    ent_list = ldap_ent.List(LDAP_BASE_DN)
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user("user1", 1001, 2001)
 
     ent_list.add_group_bis("group1", 2001, ["user1"])
diff --git a/src/tests/intg/test_memory_cache.py b/src/tests/intg/test_memory_cache.py
index 1f4ccb0..76d85fd 100644
--- a/src/tests/intg/test_memory_cache.py
+++ b/src/tests/intg/test_memory_cache.py
@@ -109,7 +109,7 @@ def create_sssd_fixture(request):
 
 
 def load_data_to_ldap(request, ldap_conn):
-    ent_list = ldap_ent.List(LDAP_BASE_DN)
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user("user1", 1001, 2001)
     ent_list.add_user("user2", 1002, 2002)
     ent_list.add_user("user3", 1003, 2003)
-- 
2.5.1

>From 8eb90565998f43fdc6b9ea3564527620c862f7fb Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Tue, 29 Sep 2015 20:13:04 +0300
Subject: [PATCH 2/7] intg: Remove _rfc2307 from function names

Remove "_rfc2307" from integration test function names for brevity.
---
 src/tests/intg/ldap_test.py         | 12 +++----
 src/tests/intg/test_memory_cache.py | 70 ++++++++++++++++++-------------------
 2 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/src/tests/intg/ldap_test.py b/src/tests/intg/ldap_test.py
index 0287a28..e359ab4 100644
--- a/src/tests/intg/ldap_test.py
+++ b/src/tests/intg/ldap_test.py
@@ -104,7 +104,7 @@ def create_sssd_fixture(request):
 
 
 @pytest.fixture
-def sanity_rfc2307(request, ldap_conn):
+def sanity(request, ldap_conn):
     ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user("user1", 1001, 2001)
     ent_list.add_user("user2", 1002, 2002)
@@ -149,7 +149,7 @@ def sanity_rfc2307(request, ldap_conn):
 
 
 @pytest.fixture
-def simple_rfc2307(request, ldap_conn):
+def simple(request, ldap_conn):
     ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user('usr\\\\001', 181818, 181818)
     ent_list.add_group("group1", 181818)
@@ -180,7 +180,7 @@ def simple_rfc2307(request, ldap_conn):
 
 
 @pytest.fixture
-def sanity_rfc2307_bis(request, ldap_conn):
+def sanity_bis(request, ldap_conn):
     ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user("user1", 1001, 2001)
     ent_list.add_user("user2", 1002, 2002)
@@ -238,14 +238,14 @@ def sanity_rfc2307_bis(request, ldap_conn):
     return None
 
 
-def test_regression_ticket2163(ldap_conn, simple_rfc2307):
+def test_regression_ticket2163(ldap_conn, simple):
     ent.assert_passwd_by_name(
         'usr\\001',
         dict(name='usr\\001', passwd='*', uid=181818, gid=181818,
              gecos='181818', shell='/bin/bash'))
 
 
-def test_sanity_rfc2307(ldap_conn, sanity_rfc2307):
+def test_sanity(ldap_conn, sanity):
     passwd_pattern = ent.contains_only(
         dict(name='user1', passwd='*', uid=1001, gid=2001, gecos='1001', dir='/home/user1', shell='/bin/bash'),
         dict(name='user2', passwd='*', uid=1002, gid=2002, gecos='1002', dir='/home/user2', shell='/bin/bash'),
@@ -272,7 +272,7 @@ def test_sanity_rfc2307(ldap_conn, sanity_rfc2307):
         grp.getgrgid(1)
 
 
-def test_sanity_rfc2307_bis(ldap_conn, sanity_rfc2307_bis):
+def test_sanity_bis(ldap_conn, sanity_bis):
     passwd_pattern = ent.contains_only(
         dict(name='user1', passwd='*', uid=1001, gid=2001, gecos='1001', dir='/home/user1', shell='/bin/bash'),
         dict(name='user2', passwd='*', uid=1002, gid=2002, gecos='1002', dir='/home/user2', shell='/bin/bash'),
diff --git a/src/tests/intg/test_memory_cache.py b/src/tests/intg/test_memory_cache.py
index 76d85fd..1a98a53 100644
--- a/src/tests/intg/test_memory_cache.py
+++ b/src/tests/intg/test_memory_cache.py
@@ -131,7 +131,7 @@ def load_data_to_ldap(request, ldap_conn):
 
 
 @pytest.fixture
-def sanity_rfc2307(request, ldap_conn):
+def sanity(request, ldap_conn):
     load_data_to_ldap(request, ldap_conn)
 
     conf = unindent("""\
@@ -156,7 +156,7 @@ def sanity_rfc2307(request, ldap_conn):
 
 
 @pytest.fixture
-def fqname_rfc2307(request, ldap_conn):
+def fqname(request, ldap_conn):
     load_data_to_ldap(request, ldap_conn)
 
     conf = unindent("""\
@@ -182,7 +182,7 @@ def fqname_rfc2307(request, ldap_conn):
 
 
 @pytest.fixture
-def fqname_case_insensitive_rfc2307(request, ldap_conn):
+def fqname_case_insensitive(request, ldap_conn):
     load_data_to_ldap(request, ldap_conn)
 
     conf = unindent("""\
@@ -208,7 +208,7 @@ def fqname_case_insensitive_rfc2307(request, ldap_conn):
     return None
 
 
-def test_getpwnam(ldap_conn, sanity_rfc2307):
+def test_getpwnam(ldap_conn, sanity):
     ent.assert_passwd_by_name(
         'user1',
         dict(name='user1', passwd='*', uid=1001, gid=2001,
@@ -291,13 +291,13 @@ def test_getpwnam(ldap_conn, sanity_rfc2307):
              gecos='1023', shell='/bin/bash'))
 
 
-def test_getpwnam_with_mc(ldap_conn, sanity_rfc2307):
-    test_getpwnam(ldap_conn, sanity_rfc2307)
+def test_getpwnam_with_mc(ldap_conn, sanity):
+    test_getpwnam(ldap_conn, sanity)
     stop_sssd()
-    test_getpwnam(ldap_conn, sanity_rfc2307)
+    test_getpwnam(ldap_conn, sanity)
 
 
-def test_getgrnam_simple(ldap_conn, sanity_rfc2307):
+def test_getgrnam_simple(ldap_conn, sanity):
     ent.assert_group_by_name("group1", dict(name="group1", gid=2001))
     ent.assert_group_by_gid(2001, dict(name="group1", gid=2001))
 
@@ -317,13 +317,13 @@ def test_getgrnam_simple(ldap_conn, sanity_rfc2307):
     ent.assert_group_by_gid(2020, dict(name="group2x", gid=2020))
 
 
-def test_getgrnam_simple_with_mc(ldap_conn, sanity_rfc2307):
-    test_getgrnam_simple(ldap_conn, sanity_rfc2307)
+def test_getgrnam_simple_with_mc(ldap_conn, sanity):
+    test_getgrnam_simple(ldap_conn, sanity)
     stop_sssd()
-    test_getgrnam_simple(ldap_conn, sanity_rfc2307)
+    test_getgrnam_simple(ldap_conn, sanity)
 
 
-def test_getgrnam_membership(ldap_conn, sanity_rfc2307):
+def test_getgrnam_membership(ldap_conn, sanity):
     ent.assert_group_by_name(
         "group1",
         dict(mem=ent.contains_only("user1", "user11", "user21")))
@@ -367,10 +367,10 @@ def test_getgrnam_membership(ldap_conn, sanity_rfc2307):
         dict(mem=ent.contains_only("user21", "user22", "user23")))
 
 
-def test_getgrnam_membership_with_mc(ldap_conn, sanity_rfc2307):
-    test_getgrnam_membership(ldap_conn, sanity_rfc2307)
+def test_getgrnam_membership_with_mc(ldap_conn, sanity):
+    test_getgrnam_membership(ldap_conn, sanity)
     stop_sssd()
-    test_getgrnam_membership(ldap_conn, sanity_rfc2307)
+    test_getgrnam_membership(ldap_conn, sanity)
 
 
 def assert_user_gids_equal(user, expected_gids):
@@ -385,7 +385,7 @@ def assert_user_gids_equal(user, expected_gids):
         )
 
 
-def test_initgroups(ldap_conn, sanity_rfc2307):
+def test_initgroups(ldap_conn, sanity):
     assert_user_gids_equal('user1', [2000, 2001])
     assert_user_gids_equal('user2', [2000, 2002])
     assert_user_gids_equal('user3', [2000, 2003])
@@ -399,13 +399,13 @@ def test_initgroups(ldap_conn, sanity_rfc2307):
     assert_user_gids_equal('user23', [2020, 2003])
 
 
-def test_initgroups_with_mc(ldap_conn, sanity_rfc2307):
-    test_initgroups(ldap_conn, sanity_rfc2307)
+def test_initgroups_with_mc(ldap_conn, sanity):
+    test_initgroups(ldap_conn, sanity)
     stop_sssd()
-    test_initgroups(ldap_conn, sanity_rfc2307)
+    test_initgroups(ldap_conn, sanity)
 
 
-def test_initgroups_fqname_with_mc(ldap_conn, fqname_rfc2307):
+def test_initgroups_fqname_with_mc(ldap_conn, fqname):
     assert_user_gids_equal('user1@LDAP', [2000, 2001])
     stop_sssd()
     assert_user_gids_equal('user1@LDAP', [2000, 2001])
@@ -447,7 +447,7 @@ def assert_stored_last_initgroups(user1_case1, user1_case2, user1_case_last,
 
 
 def test_initgroups_case_insensitive_with_mc1(ldap_conn,
-                                              fqname_case_insensitive_rfc2307):
+                                              fqname_case_insensitive):
     user1_case1 = 'User1@LDAP'
     user1_case2 = 'uSer1@LDAP'
     user1_case_last = 'usEr1@LDAP'
@@ -459,7 +459,7 @@ def test_initgroups_case_insensitive_with_mc1(ldap_conn,
 
 
 def test_initgroups_case_insensitive_with_mc2(ldap_conn,
-                                              fqname_case_insensitive_rfc2307):
+                                              fqname_case_insensitive):
     user1_case1 = 'usEr1@LDAP'
     user1_case2 = 'User1@LDAP'
     user1_case_last = 'uSer1@LDAP'
@@ -471,7 +471,7 @@ def test_initgroups_case_insensitive_with_mc2(ldap_conn,
 
 
 def test_initgroups_case_insensitive_with_mc3(ldap_conn,
-                                              fqname_case_insensitive_rfc2307):
+                                              fqname_case_insensitive):
     user1_case1 = 'uSer1@LDAP'
     user1_case2 = 'usEr1@LDAP'
     user1_case_last = 'User1@LDAP'
@@ -510,7 +510,7 @@ def run_simple_test_with_initgroups():
     assert_initgroups_equal("user1", 2001, [2000, 2001])
 
 
-def test_invalidation_of_gids_after_initgroups(ldap_conn, sanity_rfc2307):
+def test_invalidation_of_gids_after_initgroups(ldap_conn, sanity):
 
     # the sssd cache was empty and not all user's group were
     # resolved with getgr{nm,gid}. Therefore there is a change in
@@ -549,7 +549,7 @@ def test_invalidation_of_gids_after_initgroups(ldap_conn, sanity_rfc2307):
             grp.getgrgid(gid)
 
 
-def test_initgroups_without_change_in_membership(ldap_conn, sanity_rfc2307):
+def test_initgroups_without_change_in_membership(ldap_conn, sanity):
 
     # the sssd cache was empty and not all user's group were
     # resolved with getgr{nm,gid}. Therefore there is a change in
@@ -615,7 +615,7 @@ def assert_missing_mc_records_for_user1():
         "User user1, errno:%d" % err
 
 
-def test_invalidate_user_before_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_user_before_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -628,7 +628,7 @@ def test_invalidate_user_before_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_user_after_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_user_after_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -641,7 +641,7 @@ def test_invalidate_user_after_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_users_before_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_users_before_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -654,7 +654,7 @@ def test_invalidate_users_before_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_users_after_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_users_after_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -667,7 +667,7 @@ def test_invalidate_users_after_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_group_before_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_group_before_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -680,7 +680,7 @@ def test_invalidate_group_before_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_group_after_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_group_after_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -693,7 +693,7 @@ def test_invalidate_group_after_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_groups_before_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_groups_before_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -706,7 +706,7 @@ def test_invalidate_groups_before_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_groups_after_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_groups_after_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -719,7 +719,7 @@ def test_invalidate_groups_after_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_everything_before_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_everything_before_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
@@ -732,7 +732,7 @@ def test_invalidate_everything_before_stop(ldap_conn, sanity_rfc2307):
     assert_missing_mc_records_for_user1()
 
 
-def test_invalidate_everything_after_stop(ldap_conn, sanity_rfc2307):
+def test_invalidate_everything_after_stop(ldap_conn, sanity):
     # initialize cache with full ID
     (res, errno, _) = sssd_id.get_user_groups("user1")
     assert res == sssd_id.NssReturnCode.SUCCESS, \
-- 
2.5.1

>From 866570e06f449981891cdc39d5c67cb677654d8e Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Mon, 28 Sep 2015 16:12:48 +0300
Subject: [PATCH 3/7] intg: Add support for specifying all user attrs

Support passing all user attributes to ldap_ent.py's user-creation
functions, in integration tests.
---
 src/tests/intg/ldap_ent.py | 26 ++++++++++++++++++--------
 1 file changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/tests/intg/ldap_ent.py b/src/tests/intg/ldap_ent.py
index 30eed9d..0bac514 100644
--- a/src/tests/intg/ldap_ent.py
+++ b/src/tests/intg/ldap_ent.py
@@ -18,7 +18,7 @@
 #
 
 
-def user(base_dn, uid, uidNumber, gidNumber):
+def user(base_dn, uid, uidNumber, gidNumber, **kwargs):
     """
     Generate an RFC2307(bis) user add-modlist for passing to ldap.add*
     """
@@ -28,13 +28,23 @@ def user(base_dn, uid, uidNumber, gidNumber):
         "uid=" + uid + ",ou=Users," + base_dn,
         [
             ('objectClass',     ['top', 'inetOrgPerson', 'posixAccount']),
-            ('cn',              [uidNumber]),
-            ('sn',              ['User']),
+            ('cn',              [kwargs['cn'] \
+                                 if 'cn' in kwargs else \
+                                 uidNumber]),
+            ('sn',              [kwargs['sn'] \
+                                 if 'sn' in kwargs else \
+                                 'User']),
             ('uidNumber',       [uidNumber]),
             ('gidNumber',       [gidNumber]),
-            ('userPassword',    ['Password' + uidNumber]),
-            ('homeDirectory',   ['/home/' + uid]),
-            ('loginShell',      ['/bin/bash']),
+            ('userPassword',    [kwargs['userPassword'] \
+                                 if 'userPassword' in kwargs else \
+                                 'Password' + uidNumber]),
+            ('homeDirectory',   [kwargs['homeDirectory'] \
+                                 if 'homeDirectory' in kwargs else \
+                                 '/home/' + uid]),
+            ('loginShell',      [kwargs['loginShell'] \
+                                 if 'loginShell' in kwargs else \
+                                 '/bin/bash']),
         ]
     )
 
@@ -86,10 +96,10 @@ class List(list):
         self.base_dn = base_dn
 
     def add_user(self, uid, uidNumber, gidNumber,
-                 base_dn=None):
+                 base_dn=None, **kwargs):
         """Add an RFC2307(bis) user add-modlist."""
         self.append(user(base_dn or self.base_dn,
-                         uid, uidNumber, gidNumber))
+                         uid, uidNumber, gidNumber, **kwargs))
 
     def add_group(self, cn, gidNumber, member_uids=[],
                   base_dn=None):
-- 
2.5.1

>From 496f11e16d2949f085f5cc1cf59bfa4fd80090bc Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Tue, 29 Sep 2015 20:28:58 +0300
Subject: [PATCH 4/7] intg: Split LDAP test fixtures for flexibility

Split ldap_test.py fixtures into several functions to allow for partial
fixtures and direct use within tests.
---
 src/tests/intg/ldap_test.py | 113 ++++++++++++++++++++++++++++++++------------
 1 file changed, 83 insertions(+), 30 deletions(-)

diff --git a/src/tests/intg/ldap_test.py b/src/tests/intg/ldap_test.py
index e359ab4..d68a890 100644
--- a/src/tests/intg/ldap_test.py
+++ b/src/tests/intg/ldap_test.py
@@ -59,48 +59,101 @@ def ldap_conn(request, ds_inst):
     return ldap_conn
 
 
-def create_ldap_fixture(request, ldap_conn, ent_list):
-    """Add LDAP entries and add teardown for removing them"""
-    for entry in ent_list:
-        ldap_conn.add_s(entry[0], entry[1])
-    def teardown():
+def create_ldap_entries(ldap_conn, ent_list = None):
+    """Add LDAP entries from ent_list"""
+    if ent_list != None:
+        for entry in ent_list:
+            ldap_conn.add_s(entry[0], entry[1])
+
+
+def cleanup_ldap_entries(ldap_conn, ent_list = None):
+    """Remove LDAP entries added by create_ldap_entries"""
+    if ent_list == None:
+        for ou in ("Users", "Groups", "Netgroups", "Services", "Policies"):
+            for entry in ldap_conn.search_s("ou=" + ou + "," +
+                                            ldap_conn.ds_inst.base_dn,
+                                            ldap.SCOPE_ONELEVEL,
+                                            attrlist=[]):
+                ldap_conn.delete_s(entry[0])
+    else:
         for entry in ent_list:
             ldap_conn.delete_s(entry[0])
-    request.addfinalizer(teardown)
 
 
-def create_conf_fixture(request, contents):
-    """Generate sssd.conf and add teardown for removing it"""
+def create_ldap_cleanup(request, ldap_conn, ent_list = None):
+    """Add teardown for removing all user/group LDAP entries"""
+    request.addfinalizer(lambda: cleanup_ldap_entries(ldap_conn, ent_list))
+
+
+def create_ldap_fixture(request, ldap_conn, ent_list = None):
+    """Add LDAP entries and add teardown for removing them"""
+    create_ldap_entries(ldap_conn, ent_list)
+    create_ldap_cleanup(request, ldap_conn, ent_list)
+
+
+def create_conf_file(contents):
+    """Create sssd.conf with specified contents"""
     conf = open(config.CONF_PATH, "w")
     conf.write(contents)
     conf.close()
     os.chmod(config.CONF_PATH, stat.S_IRUSR | stat.S_IWUSR)
-    request.addfinalizer(lambda: os.unlink(config.CONF_PATH))
 
 
-def create_sssd_fixture(request):
-    """Start sssd and add teardown for stopping it and removing state"""
+def cleanup_conf_file():
+    """Remove sssd.conf, if it exists"""
+    if os.path.lexists(config.CONF_PATH):
+        os.unlink(config.CONF_PATH)
+
+
+def create_conf_cleanup(request):
+    """Add teardown for removing sssd.conf"""
+    request.addfinalizer(cleanup_conf_file)
+
+
+def create_conf_fixture(request, contents):
+    """
+    Create sssd.conf with specified contents and add teardown for removing it
+    """
+    create_conf_file(contents)
+    create_conf_cleanup(request)
+
+
+def create_sssd_process():
+    """Start the SSSD process"""
     if subprocess.call(["sssd", "-D", "-f"]) != 0:
         raise Exception("sssd start failed")
-    def teardown():
-        try:
-            pid_file = open(config.PIDFILE_PATH, "r")
-            pid = int(pid_file.read())
-            os.kill(pid, signal.SIGTERM)
-            while True:
-                try:
-                    os.kill(pid, signal.SIGCONT)
-                except:
-                    break
-                time.sleep(1)
-        except:
-            pass
-        subprocess.call(["sss_cache", "-E"])
-        for path in os.listdir(config.DB_PATH):
-            os.unlink(config.DB_PATH + "/" + path)
-        for path in os.listdir(config.MCACHE_PATH):
-            os.unlink(config.MCACHE_PATH + "/" + path)
-    request.addfinalizer(teardown)
+
+
+def cleanup_sssd_process():
+    """Stop the SSSD process and remove its state"""
+    try:
+        pid_file = open(config.PIDFILE_PATH, "r")
+        pid = int(pid_file.read())
+        os.kill(pid, signal.SIGTERM)
+        while True:
+            try:
+                os.kill(pid, signal.SIGCONT)
+            except:
+                break
+            time.sleep(1)
+    except:
+        pass
+    subprocess.call(["sss_cache", "-E"])
+    for path in os.listdir(config.DB_PATH):
+        os.unlink(config.DB_PATH + "/" + path)
+    for path in os.listdir(config.MCACHE_PATH):
+        os.unlink(config.MCACHE_PATH + "/" + path)
+
+
+def create_sssd_cleanup(request):
+    """Add teardown for stopping SSSD and removing its state"""
+    request.addfinalizer(cleanup_sssd_process)
+
+
+def create_sssd_fixture(request):
+    """Start SSSD and add teardown for stopping it and removing its state"""
+    create_sssd_process()
+    create_sssd_cleanup(request)
 
 
 @pytest.fixture
-- 
2.5.1

>From f7b700da9e12b877cdb0d2eb24a3c0978c730ddb Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Tue, 29 Sep 2015 20:46:06 +0300
Subject: [PATCH 5/7] intg: Reduce sssd.conf duplication in test_ldap.py

Use a function to generate basic sssd.conf in test_ldap.py to reduce
code duplication.
---
 src/tests/intg/ldap_test.py | 145 ++++++++++++++------------------------------
 1 file changed, 47 insertions(+), 98 deletions(-)

diff --git a/src/tests/intg/ldap_test.py b/src/tests/intg/ldap_test.py
index d68a890..a29f701 100644
--- a/src/tests/intg/ldap_test.py
+++ b/src/tests/intg/ldap_test.py
@@ -91,6 +91,42 @@ def create_ldap_fixture(request, ldap_conn, ent_list = None):
     create_ldap_cleanup(request, ldap_conn, ent_list)
 
 
+def format_basic_conf(ldap_conn, bis, enum):
+    """Format a basic SSSD configuration"""
+    if bis:
+        schema_conf = unindent("""\
+            ldap_schema             = rfc2307bis
+            ldap_group_object_class = groupOfNames
+        """)
+    else:
+        schema_conf = unindent("""\
+            ldap_schema             = rfc2307
+        """)
+    return unindent("""\
+        [sssd]
+        debug_level         = 0xffff
+        domains             = LDAP
+        services            = nss, pam
+
+        [nss]
+        debug_level         = 0xffff
+        memcache_timeout    = 0
+
+        [pam]
+        debug_level         = 0xffff
+
+        [domain/LDAP]
+        ldap_auth_disable_tls_never_use_in_production = true
+        debug_level         = 0xffff
+        enumerate           = {enum}
+        {schema_conf}
+        id_provider         = ldap
+        auth_provider       = ldap
+        ldap_uri            = {ldap_conn.ds_inst.ldap_url}
+        ldap_search_base    = {ldap_conn.ds_inst.base_dn}
+    """).format(**locals())
+
+
 def create_conf_file(contents):
     """Create sssd.conf with specified contents"""
     conf = open(config.CONF_PATH, "w")
@@ -172,31 +208,7 @@ def sanity(request, ldap_conn):
     ent_list.add_group("two_user_group", 2012, ["user1", "user2"])
     create_ldap_fixture(request, ldap_conn, ent_list)
 
-    conf = unindent("""\
-        [sssd]
-        debug_level         = 0xffff
-        domains             = LDAP
-        services            = nss, pam
-
-        [nss]
-        debug_level         = 0xffff
-        memcache_timeout    = 0
-
-        [pam]
-        debug_level         = 0xffff
-
-        [domain/LDAP]
-        ldap_auth_disable_tls_never_use_in_production = true
-        debug_level         = 0xffff
-        enumerate           = true
-        ldap_schema         = rfc2307
-        id_provider         = ldap
-        auth_provider       = ldap
-        sudo_provider       = ldap
-        ldap_uri            = {ldap_conn.ds_inst.ldap_url}
-        ldap_search_base    = {ldap_conn.ds_inst.base_dn}
-    """).format(**locals())
-    create_conf_fixture(request, conf)
+    create_conf_fixture(request, format_basic_conf(ldap_conn, False, True))
     create_sssd_fixture(request)
     return None
 
@@ -206,28 +218,8 @@ def simple(request, ldap_conn):
     ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
     ent_list.add_user('usr\\\\001', 181818, 181818)
     ent_list.add_group("group1", 181818)
-
     create_ldap_fixture(request, ldap_conn, ent_list)
-
-    conf = unindent("""\
-        [sssd]
-        config_file_version = 2
-        domains             = LDAP
-        services            = nss, pam
-
-        [nss]
-
-        [pam]
-
-        [domain/LDAP]
-        ldap_auth_disable_tls_never_use_in_production = true
-        ldap_schema         = rfc2307
-        id_provider         = ldap
-        auth_provider       = ldap
-        ldap_uri            = {ldap_conn.ds_inst.ldap_url}
-        ldap_search_base    = {ldap_conn.ds_inst.base_dn}
-    """).format(**locals())
-    create_conf_fixture(request, conf)
+    create_conf_fixture(request, format_basic_conf(ldap_conn, False, False))
     create_sssd_fixture(request)
     return None
 
@@ -260,33 +252,7 @@ def sanity_bis(request, ldap_conn):
                            [], ["one_user_group1", "one_user_group2"])
 
     create_ldap_fixture(request, ldap_conn, ent_list)
-
-    conf = unindent("""\
-        [sssd]
-        debug_level             = 0xffff
-        domains                 = LDAP
-        services                = nss, pam
-
-        [nss]
-        debug_level             = 0xffff
-        memcache_timeout        = 0
-
-        [pam]
-        debug_level             = 0xffff
-
-        [domain/LDAP]
-        ldap_auth_disable_tls_never_use_in_production = true
-        debug_level             = 0xffff
-        enumerate               = true
-        ldap_schema             = rfc2307bis
-        ldap_group_object_class = groupOfNames
-        id_provider             = ldap
-        auth_provider           = ldap
-        sudo_provider           = ldap
-        ldap_uri                = {ldap_conn.ds_inst.ldap_url}
-        ldap_search_base        = {ldap_conn.ds_inst.base_dn}
-    """).format(**locals())
-    create_conf_fixture(request, conf)
+    create_conf_fixture(request, format_basic_conf(ldap_conn, True, True))
     create_sssd_fixture(request)
     return None
 
@@ -370,31 +336,14 @@ def refresh_after_cleanup_task(request, ldap_conn):
 
     create_ldap_fixture(request, ldap_conn, ent_list)
 
-    conf = unindent("""\
-        [sssd]
-        config_file_version     = 2
-        domains                 = LDAP
-        services                = nss
-
-        [nss]
-        memcache_timeout        = 0
-
-        [domain/LDAP]
-        ldap_auth_disable_tls_never_use_in_production = true
-        debug_level             = 0xffff
-        ldap_schema             = rfc2307bis
-        ldap_group_object_class = groupOfNames
-        id_provider             = ldap
-        auth_provider           = ldap
-        sudo_provider           = ldap
-        ldap_uri                = {ldap_conn.ds_inst.ldap_url}
-        ldap_search_base        = {ldap_conn.ds_inst.base_dn}
-
-        entry_cache_user_timeout = 1
-        entry_cache_group_timeout = 5000
-        ldap_purge_cache_timeout = 3
-
-    """).format(**locals())
+    conf = \
+        format_basic_conf(ldap_conn, True, False) + \
+        unindent("""
+            [domain/LDAP]
+            entry_cache_user_timeout = 1
+            entry_cache_group_timeout = 5000
+            ldap_purge_cache_timeout = 3
+        """).format(**locals())
     create_conf_fixture(request, conf)
     create_sssd_fixture(request)
     return None
-- 
2.5.1

>From e1feef5e13125301e0281de102f56b2301c5cc89 Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Wed, 30 Sep 2015 14:13:22 +0300
Subject: [PATCH 6/7] intg: Fix RFC2307bis group member creation

Fix creation of mixed user/group "member" attribute for RFC2307bis
group entries in ldap_ent.py.
---
 src/tests/intg/ldap_ent.py | 21 +++++++--------------
 1 file changed, 7 insertions(+), 14 deletions(-)

diff --git a/src/tests/intg/ldap_ent.py b/src/tests/intg/ldap_ent.py
index 0bac514..1407349 100644
--- a/src/tests/intg/ldap_ent.py
+++ b/src/tests/intg/ldap_ent.py
@@ -72,20 +72,13 @@ def group_bis(base_dn, cn, gidNumber, member_uids=[], member_gids=[]):
         ('objectClass', ['top', 'extensibleObject', 'groupOfNames']),
         ('gidNumber', [gidNumber])
     ]
-    if len(member_uids) > 0:
-        attr_list.append(
-            ('member', [
-                "uid=" + uid + ",ou=Users," + base_dn for
-                    uid in member_uids
-            ])
-        )
-    if len(member_gids) > 0:
-        attr_list.append(
-            ('member', [
-                "cn=" + gid + ",ou=Groups," + base_dn for
-                    gid in member_gids
-            ])
-        )
+    member_list = []
+    for uid in member_uids:
+        member_list.append("uid=" + uid + ",ou=Users," + base_dn)
+    for gid in member_gids:
+        member_list.append("cn=" + gid + ",ou=Groups," + base_dn)
+    if len(member_list) > 0:
+        attr_list.append(('member', member_list))
     return ("cn=" + cn + ",ou=Groups," + base_dn, attr_list)
 
 
-- 
2.5.1

>From 72222b8fbc565de66874cfaa62ea0213ebf0f5a9 Mon Sep 17 00:00:00 2001
From: Nikolai Kondrashov <nikolai.kondras...@redhat.com>
Date: Tue, 29 Sep 2015 21:18:18 +0300
Subject: [PATCH 7/7] intg: Add more LDAP tests

Add a bunch of LDAP tests.

    * Adding/removing a user/group/membership with rfc2307(bis) schema.
    * Filtering users/groups with rfc2307(bis) schema.
    * The effect of override_homedir option.
    * The effect of fallback_homedir option.
    * The effect of override_shell option.
    * The effect of shell_fallback option.
    * The effect of default_shell option.
    * The effect of vetoed_shells option.
---
 src/tests/intg/ldap_test.py | 536 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 536 insertions(+)

diff --git a/src/tests/intg/ldap_test.py b/src/tests/intg/ldap_test.py
index a29f701..b20d648 100644
--- a/src/tests/intg/ldap_test.py
+++ b/src/tests/intg/ldap_test.py
@@ -127,6 +127,23 @@ def format_basic_conf(ldap_conn, bis, enum):
     """).format(**locals())
 
 
+def format_interactive_conf(ldap_conn, bis):
+    """Format an SSSD configuration with all caches refreshing in 4 seconds"""
+    return \
+        format_basic_conf(ldap_conn, bis, True) + \
+        unindent("""
+            [nss]
+            memcache_timeout                    = 4
+            enum_cache_timeout                  = 4
+            entry_negative_timeout              = 4
+
+            [domain/LDAP]
+            ldap_enumeration_refresh_timeout    = 4
+            ldap_purge_cache_timeout            = 1
+            entry_cache_timeout                 = 4
+        """)
+
+
 def create_conf_file(contents):
     """Create sssd.conf with specified contents"""
     conf = open(config.CONF_PATH, "w")
@@ -368,3 +385,522 @@ def test_refresh_after_cleanup_task(ldap_conn, refresh_after_cleanup_task):
     ent.assert_group_by_name(
         "group2",
         dict(mem=ent.contains_only("user1")))
+
+
+@pytest.fixture
+def blank(request, ldap_conn):
+    """Create blank RFC2307 directory fixture with interactive SSSD conf"""
+    create_ldap_cleanup(request, ldap_conn)
+    create_conf_fixture(request, format_interactive_conf(ldap_conn, False))
+    create_sssd_fixture(request)
+
+
+@pytest.fixture
+def blank_bis(request, ldap_conn):
+    """Create blank RFC2307bis directory fixture with interactive SSSD conf"""
+    create_ldap_cleanup(request, ldap_conn)
+    create_conf_fixture(request, format_interactive_conf(ldap_conn, True))
+    create_sssd_fixture(request)
+
+
+@pytest.fixture
+def user_and_group(request, ldap_conn):
+    """
+    Create an RFC2307 directory fixture with interactive SSSD conf,
+    one user and one group
+    """
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user", 1001, 2000)
+    ent_list.add_group("group", 2001)
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    create_conf_fixture(request, format_interactive_conf(ldap_conn, False))
+    create_sssd_fixture(request)
+    return None
+
+
+@pytest.fixture
+def user_and_groups_bis(request, ldap_conn):
+    """
+    Create an RFC2307bis directory fixture with interactive SSSD conf,
+    one user and two groups
+    """
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user", 1001, 2000)
+    ent_list.add_group_bis("group1", 2001)
+    ent_list.add_group_bis("group2", 2002)
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    create_conf_fixture(request, format_interactive_conf(ldap_conn, True))
+    create_sssd_fixture(request)
+    return None
+
+
+def test_add_remove_user(ldap_conn, blank):
+    """Test user addition and removal are reflected by SSSD"""
+    e = ldap_ent.user(ldap_conn.ds_inst.base_dn, "user", 1001, 2000)
+    time.sleep(2)
+    # Add the user
+    ent.assert_passwd(ent.contains_only())
+    ldap_conn.add_s(*e)
+    ent.assert_passwd(ent.contains_only())
+    time.sleep(4)
+    ent.assert_passwd(ent.contains_only(dict(name="user", uid=1001)))
+    # Remove the user
+    ldap_conn.delete_s(e[0])
+    ent.assert_passwd(ent.contains_only(dict(name="user", uid=1001)))
+    time.sleep(4)
+    ent.assert_passwd(ent.contains_only())
+
+
+def test_add_remove_group(ldap_conn, blank):
+    """Test RFC2307 group addition and removal are reflected by SSSD"""
+    e = ldap_ent.group(ldap_conn.ds_inst.base_dn, "group", 2001)
+    time.sleep(2)
+    # Add the group
+    ent.assert_group(ent.contains_only())
+    ldap_conn.add_s(*e)
+    ent.assert_group(ent.contains_only())
+    time.sleep(4)
+    ent.assert_group(ent.contains_only(dict(name="group", gid=2001)))
+    # Remove the group
+    ldap_conn.delete_s(e[0])
+    ent.assert_group(ent.contains_only(dict(name="group", gid=2001)))
+    time.sleep(4)
+    ent.assert_group(ent.contains_only())
+
+
+def test_add_remove_group_bis(ldap_conn, blank_bis):
+    """Test RFC2307bis group addition and removal are reflected by SSSD"""
+    e = ldap_ent.group_bis(ldap_conn.ds_inst.base_dn, "group", 2001)
+    time.sleep(2)
+    # Add the group
+    ent.assert_group(ent.contains_only())
+    ldap_conn.add_s(*e)
+    ent.assert_group(ent.contains_only())
+    time.sleep(4)
+    ent.assert_group(ent.contains_only(dict(name="group", gid=2001)))
+    # Remove the group
+    ldap_conn.delete_s(e[0])
+    ent.assert_group(ent.contains_only(dict(name="group", gid=2001)))
+    time.sleep(4)
+    ent.assert_group(ent.contains_only())
+
+
+def test_add_remove_membership(ldap_conn, user_and_group):
+    """Test user membership addition and removal are reflected by SSSD"""
+    time.sleep(2)
+    # Add user to group
+    ent.assert_group_by_name("group", dict(mem = ent.contains_only()))
+    ldap_conn.modify_s("cn=group,ou=Groups," + ldap_conn.ds_inst.base_dn,
+                       [(ldap.MOD_REPLACE, "memberUid", "user")])
+    ent.assert_group_by_name("group", dict(mem = ent.contains_only()))
+    time.sleep(4)
+    ent.assert_group_by_name("group", dict(mem = ent.contains_only("user")))
+    # Remove user from group
+    ldap_conn.modify_s("cn=group,ou=Groups," + ldap_conn.ds_inst.base_dn,
+                       [(ldap.MOD_DELETE, "memberUid", None)])
+    ent.assert_group_by_name("group", dict(mem = ent.contains_only("user")))
+    time.sleep(4)
+    ent.assert_group_by_name("group", dict(mem = ent.contains_only()))
+
+
+def test_add_remove_membership_bis(ldap_conn, user_and_groups_bis):
+    """
+    Test user and group membership addition and removal are reflected by SSSD,
+    with RFC2307bis schema
+    """
+    time.sleep(2)
+    # Add user to group1
+    ent.assert_group_by_name("group1", dict(mem = ent.contains_only()))
+    ldap_conn.modify_s("cn=group1,ou=Groups," + ldap_conn.ds_inst.base_dn,
+                       [(ldap.MOD_REPLACE, "member",
+                         "uid=user,ou=Users," + ldap_conn.ds_inst.base_dn)])
+    ent.assert_group_by_name("group1", dict(mem = ent.contains_only()))
+    time.sleep(4)
+    ent.assert_group_by_name("group1", dict(mem = ent.contains_only("user")))
+
+    # Add group1 to group2
+    ldap_conn.modify_s("cn=group2,ou=Groups," + ldap_conn.ds_inst.base_dn,
+                       [(ldap.MOD_REPLACE, "member",
+                         "cn=group1,ou=Groups," + ldap_conn.ds_inst.base_dn)])
+    ent.assert_group_by_name("group2", dict(mem = ent.contains_only()))
+    time.sleep(4)
+    ent.assert_group_by_name("group2", dict(mem = ent.contains_only("user")))
+
+    # Remove group1 from group2
+    ldap_conn.modify_s("cn=group2,ou=Groups," + ldap_conn.ds_inst.base_dn,
+                       [(ldap.MOD_DELETE, "member", None)])
+    ent.assert_group_by_name("group2", dict(mem = ent.contains_only("user")))
+    time.sleep(4)
+    ent.assert_group_by_name("group2", dict(mem = ent.contains_only()))
+
+    # Remove user from group1
+    ldap_conn.modify_s("cn=group1,ou=Groups," + ldap_conn.ds_inst.base_dn,
+                       [(ldap.MOD_DELETE, "member", None)])
+    ent.assert_group_by_name("group1", dict(mem = ent.contains_only("user")))
+    time.sleep(4)
+    ent.assert_group_by_name("group1", dict(mem = ent.contains_only()))
+
+
+@pytest.fixture
+def blank(request, ldap_conn):
+    """Create blank RFC2307 directory fixture with interactive SSSD conf"""
+    create_ldap_cleanup(request, ldap_conn)
+    create_conf_fixture(request, format_interactive_conf(ldap_conn, False))
+    create_sssd_fixture(request)
+
+
+@pytest.fixture
+def void_conf(request):
+    create_conf_cleanup(request)
+
+
+@pytest.fixture
+def void_sssd(request):
+    create_sssd_cleanup(request)
+
+
+@pytest.fixture
+def three_users_three_groups(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user1", 1001, 2001)
+    ent_list.add_user("user2", 1002, 2002)
+    ent_list.add_user("user3", 1003, 2003)
+    ent_list.add_group("group1", 2001, ["user1"])
+    ent_list.add_group("group2", 2002, ["user2"])
+    ent_list.add_group("group3", 2003, ["user3"])
+    create_ldap_fixture(request, ldap_conn, ent_list)
+
+
+def test_filter_users(request, ldap_conn, three_users_three_groups,
+                      void_conf, void_sssd):
+    """Test the effect of the "filter_users" option"""
+    all_users = frozenset([1, 2, 3])
+    for filter_users_in_groups in [False, True]:
+        for filter_users in [frozenset([]),
+                             frozenset([1]),
+                             frozenset([1, 2]),
+                             frozenset([1, 2, 3])]:
+            unfiltered_users = all_users - filter_users
+            filter_users_str = ",".join(map(lambda i: "user" + str(i),
+                                            filter_users))
+
+            conf = \
+                format_basic_conf(ldap_conn, False, True) + \
+                unindent("""
+                    [nss]
+                    filter_users            = {filter_users_str}
+                    filter_users_in_groups  = {filter_users_in_groups}
+                """).format(**locals())
+            create_conf_file(conf)
+            create_sssd_process()
+            ent.assert_passwd(
+                ent.contains_only(
+                    *map(
+                        lambda i: \
+                            dict(name = "user" + str(i), uid = 1000 + i),
+                        unfiltered_users
+                    )
+                )
+            )
+            ent.assert_group(
+                ent.contains_only(
+                    *map(
+                        lambda i: \
+                            dict(
+                                name = "group" + str(i),
+                                gid = 2000 + i,
+                                mem = ent.contains_only() \
+                                        if filter_users_in_groups and \
+                                           i in filter_users else \
+                                            ent.contains_only("user" + str(i))
+                            ),
+                        all_users
+                    )
+                )
+            )
+            cleanup_sssd_process()
+            cleanup_conf_file()
+
+
+def test_filter_groups(request, ldap_conn, three_users_three_groups,
+                       void_conf, void_sssd):
+    """Test the effect of the "filter_groups" option with RFC2307 groups"""
+    all_groups = frozenset([1, 2, 3])
+    for filter_groups in [frozenset([]),
+                          frozenset([1]),
+                          frozenset([1, 2]),
+                          frozenset([1, 2, 3])]:
+        unfiltered_groups = all_groups - filter_groups
+        filter_groups_str = ",".join(map(lambda i: "group" + str(i),
+                                         filter_groups))
+
+        conf = \
+            format_basic_conf(ldap_conn, False, True) + \
+            unindent("""
+                [nss]
+                filter_groups   = {filter_groups_str}
+            """).format(**locals())
+        create_conf_file(conf)
+        create_sssd_process()
+        ent.assert_group(
+            ent.contains_only(
+                *map(
+                    lambda i: \
+                        dict(
+                            name = "group" + str(i),
+                            gid = 2000 + i,
+                            mem = ent.contains_only("user" + str(i))
+                        ),
+                    unfiltered_groups
+                )
+            )
+        )
+        cleanup_sssd_process()
+        cleanup_conf_file()
+
+
+@pytest.fixture
+def three_users_three_groups_bis(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user1", 1001, 2001)
+    ent_list.add_user("user2", 1002, 2002)
+    ent_list.add_user("user3", 1003, 2003)
+    ent_list.add_group_bis("group1", 2001, ["user1"])
+    ent_list.add_group_bis("group2", 2002, ["user2"], ["group1"])
+    ent_list.add_group_bis("group3", 2003, ["user3"], ["group2"])
+    create_ldap_fixture(request, ldap_conn, ent_list)
+
+
+def test_filter_groups_bis(request, ldap_conn, three_users_three_groups_bis,
+                           void_conf, void_sssd):
+    """Test the effect of the "filter_groups" option with RFC2307bis groups"""
+    all_groups = frozenset([1, 2, 3])
+    for filter_groups in [frozenset([]),
+                          frozenset([1]),
+                          frozenset([1, 2]),
+                          frozenset([1, 2, 3])]:
+        unfiltered_groups = all_groups - filter_groups
+        filter_groups_str = ",".join(map(lambda i: "group" + str(i),
+                                         filter_groups))
+
+        conf = \
+            format_basic_conf(ldap_conn, True, True) + \
+            unindent("""
+                [nss]
+                filter_groups   = {filter_groups_str}
+            """).format(**locals())
+        create_conf_file(conf)
+        create_sssd_process()
+        ent.assert_group(
+            ent.contains_only(
+                *map(
+                    lambda i: \
+                        dict(
+                            name = "group" + str(i),
+                            gid = 2000 + i,
+                            mem = ent.contains_only(
+                                    *map(lambda j: "user" + str(j),
+                                         range(1, i + 1)))
+                        ),
+                    unfiltered_groups
+                )
+            )
+        )
+        cleanup_sssd_process()
+        cleanup_conf_file()
+
+
+@pytest.fixture
+def override_homedir(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user_with_homedir_A", 1001, 2001,
+                      homeDirectory = "/home/A")
+    ent_list.add_user("user_with_homedir_B", 1002, 2002,
+                      homeDirectory = "/home/B")
+    ent_list.add_user("user_with_empty_homedir", 1003, 2003,
+                      homeDirectory = "")
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    conf = \
+        format_basic_conf(ldap_conn, False, True) + \
+        unindent("""\
+            [nss]
+            override_homedir    = /home/B
+        """).format(**locals())
+    create_conf_fixture(request, conf)
+    create_sssd_fixture(request)
+
+
+def test_override_homedir(override_homedir):
+    """Test the effect of the "override_homedir" option"""
+    ent.assert_passwd(
+        ent.contains_only(
+            dict(name="user_with_homedir_A", uid=1001, dir="/home/B"),
+            dict(name="user_with_homedir_B", uid=1002, dir="/home/B"),
+            dict(name="user_with_empty_homedir", uid=1003, dir="/home/B")
+        )
+    )
+
+
+@pytest.fixture
+def fallback_homedir(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user_with_homedir_A", 1001, 2001,
+                      homeDirectory = "/home/A")
+    ent_list.add_user("user_with_homedir_B", 1002, 2002,
+                      homeDirectory = "/home/B")
+    ent_list.add_user("user_with_empty_homedir", 1003, 2003,
+                      homeDirectory = "")
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    conf = \
+        format_basic_conf(ldap_conn, False, True) + \
+        unindent("""\
+            [nss]
+            fallback_homedir    = /home/B
+        """).format(**locals())
+    create_conf_fixture(request, conf)
+    create_sssd_fixture(request)
+
+
+def test_fallback_homedir(fallback_homedir):
+    """Test the effect of the "fallback_homedir" option"""
+    ent.assert_passwd(
+        ent.contains_only(
+            dict(name="user_with_homedir_A", uid=1001, dir="/home/A"),
+            dict(name="user_with_homedir_B", uid=1002, dir="/home/B"),
+            dict(name="user_with_empty_homedir", uid=1003, dir="/home/B")
+        )
+    )
+
+
+@pytest.fixture
+def override_shell(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user_with_shell_A", 1001, 2001,
+                      loginShell = "/bin/A")
+    ent_list.add_user("user_with_shell_B", 1002, 2002,
+                      loginShell = "/bin/B")
+    ent_list.add_user("user_with_empty_shell", 1003, 2003,
+                      loginShell = "")
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    conf = \
+        format_basic_conf(ldap_conn, False, True) + \
+        unindent("""\
+            [nss]
+            override_shell      = /bin/B
+        """).format(**locals())
+    create_conf_fixture(request, conf)
+    create_sssd_fixture(request)
+
+
+def test_override_shell(override_shell):
+    """Test the effect of the "override_shell" option"""
+    ent.assert_passwd(
+        ent.contains_only(
+            dict(name="user_with_shell_A", uid=1001, shell="/bin/B"),
+            dict(name="user_with_shell_B", uid=1002, shell="/bin/B"),
+            dict(name="user_with_empty_shell", uid=1003, shell="/bin/B")
+        )
+    )
+
+
+@pytest.fixture
+def shell_fallback(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user_with_sh_shell", 1001, 2001,
+                      loginShell = "/bin/sh")
+    ent_list.add_user("user_with_not_installed_shell", 1002, 2002,
+                      loginShell = "/bin/not_installed")
+    ent_list.add_user("user_with_empty_shell", 1003, 2003,
+                      loginShell = "")
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    conf = \
+        format_basic_conf(ldap_conn, False, True) + \
+        unindent("""\
+            [nss]
+            shell_fallback      = /bin/fallback
+            allowed_shells      = /bin/not_installed
+        """).format(**locals())
+    create_conf_fixture(request, conf)
+    create_sssd_fixture(request)
+
+
+def test_shell_fallback(shell_fallback):
+    """Test the effect of the "shell_fallback" option"""
+    ent.assert_passwd(
+        ent.contains_only(
+            dict(name="user_with_sh_shell", uid=1001, shell="/bin/sh"),
+            dict(name="user_with_not_installed_shell", uid=1002,
+                 shell="/bin/fallback"),
+            dict(name="user_with_empty_shell", uid=1003, shell="")
+        )
+    )
+
+
+@pytest.fixture
+def default_shell(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user_with_sh_shell", 1001, 2001,
+                      loginShell = "/bin/sh")
+    ent_list.add_user("user_with_not_installed_shell", 1002, 2002,
+                      loginShell = "/bin/not_installed")
+    ent_list.add_user("user_with_empty_shell", 1003, 2003,
+                      loginShell = "")
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    conf = \
+        format_basic_conf(ldap_conn, False, True) + \
+        unindent("""\
+            [nss]
+            default_shell       = /bin/default
+            allowed_shells      = /bin/default, /bin/not_installed
+            shell_fallback      = /bin/fallback
+        """).format(**locals())
+    create_conf_fixture(request, conf)
+    create_sssd_fixture(request)
+
+
+def test_default_shell(default_shell):
+    """Test the effect of the "default_shell" option"""
+    ent.assert_passwd(
+        ent.contains_only(
+            dict(name="user_with_sh_shell", uid=1001, shell="/bin/sh"),
+            dict(name="user_with_not_installed_shell", uid=1002,
+                 shell="/bin/fallback"),
+            dict(name="user_with_empty_shell", uid=1003,
+                 shell="/bin/default")
+        )
+    )
+
+
+@pytest.fixture
+def vetoed_shells(request, ldap_conn):
+    ent_list = ldap_ent.List(ldap_conn.ds_inst.base_dn)
+    ent_list.add_user("user_with_sh_shell", 1001, 2001,
+                      loginShell = "/bin/sh")
+    ent_list.add_user("user_with_vetoed_shell", 1002, 2002,
+                      loginShell = "/bin/vetoed")
+    ent_list.add_user("user_with_empty_shell", 1003, 2003,
+                      loginShell = "")
+    create_ldap_fixture(request, ldap_conn, ent_list)
+    conf = \
+        format_basic_conf(ldap_conn, False, True) + \
+        unindent("""\
+            [nss]
+            default_shell       = /bin/default
+            vetoed_shells       = /bin/vetoed
+            shell_fallback      = /bin/fallback
+        """).format(**locals())
+    create_conf_fixture(request, conf)
+    create_sssd_fixture(request)
+
+
+def test_vetoed_shells(vetoed_shells):
+    """Test the effect of the "vetoed_shells" option"""
+    ent.assert_passwd(
+        ent.contains_only(
+            dict(name="user_with_sh_shell", uid=1001, shell="/bin/sh"),
+            dict(name="user_with_vetoed_shell", uid=1002,
+                 shell="/bin/fallback"),
+            dict(name="user_with_empty_shell", uid=1003,
+                 shell="/bin/default")
+        )
+    )
-- 
2.5.1

____________________________________________________________________________________________________________________________________________________
 test_getpwnam_with_mc 
____________________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 297, in test_getpwnam_with_mc
    test_getpwnam(ldap_conn, sanity_rfc2307)
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 215, in test_getpwnam
    gecos='1001', shell='/bin/bash'))
  File "/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/ent.py", 
line 218, in assert_passwd_by_name
    assert False, err
AssertionError: 'getpwnam(): name not found: user1'
________________________________________________________________________________________________________________________________________________
 test_getgrnam_simple_with_mc 
_________________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 323, in test_getgrnam_simple_with_mc
    test_getgrnam_simple(ldap_conn, sanity_rfc2307)
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 301, in test_getgrnam_simple
    ent.assert_group_by_name("group1", dict(name="group1", gid=2001))
  File "/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/ent.py", 
line 378, in assert_group_by_name
    assert False, err
AssertionError: 'getgrnam(): name not found: group1'
______________________________________________________________________________________________________________________________________________
 test_getgrnam_membership_with_mc 
_______________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 373, in test_getgrnam_membership_with_mc
    test_getgrnam_membership(ldap_conn, sanity_rfc2307)
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 329, in test_getgrnam_membership
    dict(mem=ent.contains_only("user1", "user11", "user21")))
  File "/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/ent.py", 
line 378, in assert_group_by_name
    assert False, err
AssertionError: 'getgrnam(): name not found: group1'
___________________________________________________________________________________________________________________________________________________
 test_initgroups_with_mc 
___________________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 405, in test_initgroups_with_mc
    test_initgroups(ldap_conn, sanity_rfc2307)
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 389, in test_initgroups
    assert_user_gids_equal('user1', [2000, 2001])
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 377, in assert_user_gids_equal
    (res, errno, gids) = sssd_id.get_user_gids(user)
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/sssd_id.py", line 
91, in get_user_gids
    pwd_user = pwd.getpwnam(user)
KeyError: 'getpwnam(): name not found: user1'
_______________________________________________________________________________________________________________________________________________
 test_initgroups_fqname_with_mc 
________________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 411, in test_initgroups_fqname_with_mc
    assert_user_gids_equal('user1@LDAP', [2000, 2001])
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 377, in assert_user_gids_equal
    (res, errno, gids) = sssd_id.get_user_gids(user)
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/sssd_id.py", line 
91, in get_user_gids
    pwd_user = pwd.getpwnam(user)
KeyError: 'getpwnam(): name not found: user1@LDAP'
_________________________________________________________________________________________________________________________________________
 test_invalidation_of_gids_after_initgroups 
__________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 526, in test_invalidation_of_gids_after_initgroups
    gecos='1001', shell='/bin/bash'))
  File "/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/ent.py", 
line 218, in assert_passwd_by_name
    assert False, err
AssertionError: 'getpwnam(): name not found: user1'
________________________________________________________________________________________________________________________________________
 test_initgroups_without_change_in_membership 
_________________________________________________________________________________________________________________________________________
Traceback (most recent call last):
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 570, in test_initgroups_without_change_in_membership
    run_simple_test_with_initgroups()
  File 
"/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/test_memory_cache.py",
 line 489, in run_simple_test_with_initgroups
    gecos='1001', shell='/bin/bash'))
  File "/home/nkondras/projects/fedorahosted.org/sssd/src/tests/intg/ent.py", 
line 218, in assert_passwd_by_name
    assert False, err
AssertionError: 'getpwnam(): name not found: user1'
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to