krb5 commit: Add kpropd -t iprop-mode tests
Greg Hudson
ghudson at mit.edu
Mon Apr 13 17:59:53 EDT 2015
https://github.com/krb5/krb5/commit/fa76eebe09c09063b64715da4b7bcb7a969848da
commit fa76eebe09c09063b64715da4b7bcb7a969848da
Author: Greg Hudson <ghudson at mit.edu>
Date: Wed Apr 8 18:12:31 2015 -0400
Add kpropd -t iprop-mode tests
Add a run_kpropd_once() method to K5Realm(), and add tests to
t_iprop.py for the cases where no updates are needed, where
incremental updates are needed, and where a full resync is needed
followed by a poll for updates.
ticket: 8161
src/tests/t_iprop.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++
src/util/k5test.py | 19 ++++++++++++++-----
2 files changed, 60 insertions(+), 5 deletions(-)
diff --git a/src/tests/t_iprop.py b/src/tests/t_iprop.py
index 78938fc..1ed8dbd 100755
--- a/src/tests/t_iprop.py
+++ b/src/tests/t_iprop.py
@@ -352,4 +352,50 @@ kpropd2.send_signal(signal.SIGUSR1)
wait_for_prop(kpropd2, True, 2, 0)
check_ulog(0, 0, 0, [], slave2)
+# Stop the kprop daemons so we can test kpropd -t.
+stop_daemon(kpropd1)
+stop_daemon(kpropd2)
+
+# Test the case where no updates are needed.
+out = realm.run_kpropd_once(slave1, ['-d'])
+if 'KDC is synchronized' not in out:
+ fail('Expected synchronized from kpropd -t')
+check_ulog(0, 0, 0, [], slave1)
+
+# Make a change on the master; this will cause a full resync since the
+# master was recently reinitialized.
+realm.run([kadminl, 'modprinc', '-maxlife', '5 minutes', pr1])
+check_ulog(1, 1, 1, [pr1])
+out = realm.run_kpropd_once(slave1, ['-d'])
+if ('Full propagation transfer finished' not in out or
+ 'KDC is synchronized' not in out):
+ fail('Expected full dump and synchronized from kpropd -t')
+check_ulog(0, 0, 1, [], slave1)
+out = realm.run([kadminl, 'getprinc', pr1], env=slave1)
+if 'Maximum ticket life: 0 days 00:05:00' not in out:
+ fail('slave1 does not have modification from master after kpropd -t')
+
+# Make another change and get it via incremental update.
+realm.run([kadminl, 'modprinc', '-maxlife', '15 minutes', pr1])
+check_ulog(2, 1, 2, [pr1, pr1])
+out = realm.run_kpropd_once(slave1, ['-d'])
+if 'Got incremental updates (sno=2 ' not in out:
+ fail('Expected incremental updates from kpropd -t')
+check_ulog(1, 2, 2, [pr1], slave1)
+out = realm.run([kadminl, 'getprinc', pr1], env=slave1)
+if 'Maximum ticket life: 0 days 00:15:00' not in out:
+ fail('slave1 does not have modification from master after kpropd -t')
+
+# Propagate a policy change via full resync.
+realm.run([kadminl, 'addpol', '-minclasses', '3', 'testpol'])
+check_ulog(0, 0, 0, [])
+out = realm.run_kpropd_once(slave1, ['-d'])
+if ('Full propagation transfer finished' not in out or
+ 'KDC is synchronized' not in out):
+ fail('Expected full dump and synchronized from kpropd -t')
+check_ulog(0, 0, 0, [], slave1)
+out = realm.run([kadminl, 'getpol', 'testpol'], env=slave1)
+if 'Minimum number of password character classes: 3' not in out:
+ fail('slave1 does not have policy from master after kpropd -t')
+
success('iprop tests')
diff --git a/src/util/k5test.py b/src/util/k5test.py
index 935ec55..5aedff8 100644
--- a/src/util/k5test.py
+++ b/src/util/k5test.py
@@ -309,6 +309,11 @@ Scripts may use the following realm methods and attributes:
is given, it contains a list of additional kpropd arguments.
Returns a handle to the kpropd process.
+* realm.run_kpropd_once(env, args=[]): Run kpropd once, using the -t
+ flag. Pass an environment created with realm.special_env() for the
+ slave. If args is given, it contains a list of additional kpropd
+ arguments. Returns the kpropd output.
+
* realm.realm: The realm's name.
* realm.testdir: The realm's storage directory (absolute path).
@@ -925,16 +930,20 @@ class K5Realm(object):
stop_daemon(self._kadmind_proc)
self._kadmind_proc = None
- def start_kpropd(self, env, args=[]):
- global krb5kdc
+ def _kpropd_args(self):
slavedump_path = os.path.join(self.testdir, 'incoming-slave-datatrans')
kpropdacl_path = os.path.join(self.testdir, 'kpropd-acl')
- proc = _start_daemon([kpropd, '-D', '-P', str(self.kprop_port()),
- '-f', slavedump_path, '-p', kdb5_util,
- '-a', kpropdacl_path] + args, env, 'ready')
+ return [kpropd, '-D', '-P', str(self.kprop_port()),
+ '-f', slavedump_path, '-p', kdb5_util, '-a', kpropdacl_path]
+
+ def start_kpropd(self, env, args=[]):
+ proc = _start_daemon(self._kpropd_args() + args, env, 'ready')
self._kpropd_procs.append(proc)
return proc
+ def run_kpropd_once(self, env, args=[]):
+ return self.run(self._kpropd_args() + ['-t'] + args, env=env)
+
def stop(self):
if self._kdc_proc:
self.stop_kdc()
More information about the cvs-krb5
mailing list