pam: use a pam object method instead of pam module function
[cascardo/ipsilon.git] / tests / tests.py
1 #!/usr/bin/python
2 #
3 # Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
4
5 import argparse
6 import inspect
7 from ipsilon.util import plugin
8 import os
9 import sys
10 import subprocess
11 import time
12 import traceback
13 from helpers.common import WRAP_HOSTNAME  # pylint: disable=relative-import
14
15
16 logger = None
17
18
19 class Tests(object):
20
21     def __init__(self):
22         p = plugin.Plugins()
23         (pathname, dummy) = os.path.split(inspect.getfile(Tests))
24         self.plugins = p.get_plugins(pathname, 'IpsilonTest')
25
26
27 def parse_args():
28     parser = argparse.ArgumentParser(description='Ipsilon Tests Environment')
29     parser.add_argument('--path', default='%s/testdir' % os.getcwd(),
30                         help="Directory in which tests are run")
31     parser.add_argument('--test', default='test1',
32                         help="The test to run")
33     parser.add_argument('--wrappers', default='auto',
34                         choices=['yes', 'no', 'auto'],
35                         help="Run the tests with socket wrappers")
36
37     return vars(parser.parse_args())
38
39
40 def try_wrappers(base, wrappers):
41     if wrappers == 'no':
42         return {}
43
44     pkgcfg = subprocess.Popen(['pkg-config', '--exists', 'socket_wrapper'])
45     pkgcfg.wait()
46     if pkgcfg.returncode != 0:
47         if wrappers == 'auto':
48             return {}
49         else:
50             raise ValueError('Socket Wrappers not available')
51
52     pkgcfg = subprocess.Popen(['pkg-config', '--exists', 'nss_wrapper'])
53     pkgcfg.wait()
54     if pkgcfg.returncode != 0:
55         if wrappers == 'auto':
56             return {}
57         else:
58             raise ValueError('Nss Wrappers not available')
59
60     wrapdir = os.path.join(base, 'wrapdir')
61     os.mkdir(wrapdir)
62
63     hosts_file = os.path.join(base, 'hosts')
64     with open(hosts_file, 'w+') as f:
65         f.write('127.0.0.9 %s\n' % WRAP_HOSTNAME)
66
67     wenv = {'LD_PRELOAD': 'libsocket_wrapper.so libnss_wrapper.so',
68             'SOCKET_WRAPPER_DIR': wrapdir,
69             'SOCKET_WRAPPER_DEFAULT_IFACE': '9',
70             'SOCKET_WRAPPER_DEBUGLEVEL': '1',
71             'NSS_WRAPPER_HOSTNAME': WRAP_HOSTNAME,
72             'NSS_WRAPPER_HOSTS': hosts_file}
73
74     return wenv
75
76
77 if __name__ == '__main__':
78
79     args = parse_args()
80
81     tests = Tests()
82     if args['test'] not in tests.plugins:
83         print >> sys.stderr, "Unknown test [%s]" % args['test']
84         sys.exit(1)
85     test = tests.plugins[args['test']]
86
87     if not os.path.exists(args['path']):
88         os.makedirs(args['path'])
89
90     test.setup_base(args['path'], test)
91
92     env = try_wrappers(test.testdir, args['wrappers'])
93     env['PYTHONPATH'] = test.rootdir
94     env['TESTDIR'] = test.testdir
95
96     try:
97         test.setup_servers(env)
98
99         code = test.run(env)
100         if code:
101             sys.exit(code)
102     except Exception, e:  # pylint: disable=broad-except
103         print >> sys.stderr, "Error: %s" % repr(e)
104         traceback.print_exc(None, sys.stderr)
105         sys.exit(1)
106     finally:
107         test.wait()
108
109     # Wait until all of the sockets are closed by the OS
110     time.sleep(0.5)
111     print "FINISHED"