From 3c81b90d4d0c4f39906ff9e918fa21d0d1fbd644 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Tue, 23 May 2017 13:55:01 +0200 Subject: TESTS: Add a test for parallel execution of klist Integration test for: https://pagure.io/SSSD/sssd/issue/3372 With https://pagure.io/SSSD/sssd/issue/3372 still broken, the unit test wold fail because one of the concurrent klist commands would trigger a race condition in the KCM queue code, crashing the KCM responder. --- src/tests/intg/krb5utils.py | 6 +++++- src/tests/intg/test_kcm.py | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/tests/intg/krb5utils.py b/src/tests/intg/krb5utils.py index 775cffd0b..0349ff382 100644 --- a/src/tests/intg/krb5utils.py +++ b/src/tests/intg/krb5utils.py @@ -36,7 +36,7 @@ class Krb5Utils(object): def __init__(self, krb5_conf_path): self.krb5_conf_path = krb5_conf_path - def _run_in_env(self, args, stdin=None, extra_env=None): + def spawn_in_env(self, args, stdin=None, extra_env=None): my_env = os.environ my_env['KRB5_CONFIG'] = self.krb5_conf_path @@ -50,6 +50,10 @@ class Krb5Utils(object): stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return cmd + + def _run_in_env(self, args, stdin=None, extra_env=None): + cmd = self.spawn_in_env(args, stdin, extra_env) out, err = cmd.communicate(stdin) return cmd.returncode, out.decode('utf-8'), err.decode('utf-8') diff --git a/src/tests/intg/test_kcm.py b/src/tests/intg/test_kcm.py index 11f80a180..1ab2a1837 100644 --- a/src/tests/intg/test_kcm.py +++ b/src/tests/intg/test_kcm.py @@ -445,3 +445,25 @@ def test_kcm_sec_kdestroy_nocache(setup_for_kcm_sec, setup_secrets): testenv = setup_for_kcm_sec exercise_subsidiaries(testenv) + +def test_kcm_sec_parallel_klist(setup_for_kcm_sec, + setup_secrets): + """ + Test that parallel operations from a single UID are handled well. + Regression test for https://pagure.io/SSSD/sssd/issue/3372 + """ + testenv = setup_for_kcm_sec + + testenv.k5kdc.add_principal("alice", "alicepw") + out, _, _ = testenv.k5util.kinit("alice", "alicepw") + assert out == 0 + + + processes = [] + for i in range(0,10): + p = testenv.k5util.spawn_in_env(['klist', '-A']) + processes.append(p) + + for p in processes: + rc = p.wait() + assert rc == 0 -- cgit