tests: Use logger.info() instead of print to get one stream
[mech_eap.git] / tests / hwsim / run-tests.py
1 #!/usr/bin/python
2 #
3 # AP tests
4 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
5 #
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
8
9 import os
10 import re
11 import sys
12 import time
13
14 import logging
15 logger = logging.getLogger(__name__)
16
17 from wpasupplicant import WpaSupplicant
18 from hostapd import HostapdGlobal
19
20 def reset_devs(dev, apdev):
21     hapd = HostapdGlobal()
22     for d in dev:
23         d.reset()
24     for ap in apdev:
25         hapd.remove(ap['ifname'])
26
27 def main():
28     test_file = None
29     error_file = None
30     idx = 1
31     if len(sys.argv) > 1 and sys.argv[1] == '-d':
32         logging.basicConfig(level=logging.DEBUG)
33         idx = idx + 1
34     elif len(sys.argv) > 1 and sys.argv[1] == '-q':
35         logging.basicConfig(level=logging.WARNING)
36         idx = idx + 1
37     else:
38         logging.basicConfig(level=logging.INFO)
39
40     if len(sys.argv) > idx + 1 and sys.argv[idx] == '-e':
41         error_file = sys.argv[idx + 1]
42         idx = idx + 2
43
44     if len(sys.argv) > idx + 1 and sys.argv[idx] == '-f':
45         test_file = sys.argv[idx + 1]
46         idx = idx + 2
47
48     if len(sys.argv) > idx:
49         test_filter = sys.argv[idx]
50     else:
51         test_filter = None
52
53     dev0 = WpaSupplicant('wlan0', '/tmp/wpas-wlan0')
54     dev1 = WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
55     dev2 = WpaSupplicant('wlan2', '/tmp/wpas-wlan2')
56     dev = [ dev0, dev1, dev2 ]
57     apdev = [ ]
58     apdev.append({"ifname": 'wlan3', "bssid": "02:00:00:00:03:00"})
59     apdev.append({"ifname": 'wlan4', "bssid": "02:00:00:00:04:00"})
60
61     for d in dev:
62         if not d.ping():
63             logger.info(d.ifname + ": No response from wpa_supplicant")
64             return
65         logger.info("DEV: " + d.ifname + ": " + d.p2p_dev_addr())
66     for ap in apdev:
67         logger.info("APDEV: " + ap['ifname'])
68
69     tests = []
70     for t in os.listdir("."):
71         m = re.match(r'(test_.*)\.py$', t)
72         if m:
73             if test_file and test_file not in t:
74                 continue
75             logger.info("Import test cases from " + t)
76             mod = __import__(m.group(1))
77             for s in dir(mod):
78                 if s.startswith("test_"):
79                     func = mod.__dict__.get(s)
80                     tests.append(func)
81
82     passed = []
83     failed = []
84
85     for t in tests:
86         if test_filter:
87             if test_filter != t.__name__:
88                 continue
89         reset_devs(dev, apdev)
90         logger.info("START " + t.__name__)
91         if t.__doc__:
92             logger.info("Test: " + t.__doc__)
93         for d in dev:
94             try:
95                 d.request("NOTE TEST-START " + t.__name__)
96             except Exception, e:
97                 logger.info("Failed to issue TEST-START before " + t.__name__ + " for " + d.ifname)
98                 logger.info(e)
99         try:
100             if t.func_code.co_argcount > 1:
101                 t(dev, apdev)
102             else:
103                 t(dev)
104             passed.append(t.__name__)
105             logger.info("PASS " + t.__name__)
106         except Exception, e:
107             logger.info(e)
108             failed.append(t.__name__)
109             logger.info("FAIL " + t.__name__)
110         for d in dev:
111             try:
112                 d.request("NOTE TEST-STOP " + t.__name__)
113             except Exception, e:
114                 logger.info("Failed to issue TEST-STOP after " + t.__name__ + " for " + d.ifname)
115                 logger.info(e)
116
117     if not test_filter:
118         reset_devs(dev, apdev)
119
120     if len(failed):
121         logger.info("passed " + str(len(passed)) + " test case(s)")
122         logger.info("failed tests: " + str(failed))
123         if error_file:
124             f = open(error_file, 'w')
125             f.write(str(failed) + '\n')
126             f.close()
127         sys.exit(1)
128     logger.info("passed all " + str(len(passed)) + " test case(s)")
129
130 if __name__ == "__main__":
131     main()