]>
git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/run-tests.py
4 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
13 from datetime
import datetime
17 logger
= logging
.getLogger(__name__
)
19 sys
.path
.append('../../wpaspy')
21 from wpasupplicant
import WpaSupplicant
22 from hostapd
import HostapdGlobal
24 def reset_devs(dev
, apdev
):
25 hapd
= HostapdGlobal()
30 logger
.info("Failed to reset device " + d
.ifname
)
33 hapd
.remove(ap
['ifname'])
35 def report(conn
, build
, commit
, run
, test
, result
, diff
):
41 sql
= "INSERT INTO results(test,result,run,time,duration,build,commitid) VALUES(?, ?, ?, ?, ?, ?, ?)"
42 params
= (test
.replace('test_', '', 1), result
, run
, time
.time(), diff
.total_seconds(), build
, commit
)
44 conn
.execute(sql
, params
)
47 print "sqlite: " + str(e
)
48 print "sql: %r" % (params
, )
53 for t
in os
.listdir("."):
54 m
= re
.match(r
'(test_.*)\.py$', t
)
56 logger
.debug("Import test cases from " + t
)
57 mod
= __import__(m
.group(1))
58 test_modules
.append(mod
.__name
__)
60 if s
.startswith("test_"):
61 func
= mod
.__dict
__.get(s
)
63 test_names
= list(set([t
.__name
__ for t
in tests
]))
69 parser
= argparse
.ArgumentParser(description
='hwsim test runner')
70 group
= parser
.add_mutually_exclusive_group()
71 group
.add_argument('-d', const
=logging
.DEBUG
, action
='store_const',
72 dest
='loglevel', default
=logging
.INFO
,
73 help="verbose debug output")
74 group
.add_argument('-q', const
=logging
.WARNING
, action
='store_const',
75 dest
='loglevel', help="be quiet")
76 group
.add_argument('-l', metavar
='<filename>', dest
='logfile',
77 help='debug log filename')
79 parser
.add_argument('-e', metavar
="<filename>", dest
='errorfile',
80 help='error filename')
81 parser
.add_argument('-r', metavar
="<filename>", dest
='resultsfile',
82 help='results filename')
83 parser
.add_argument('-S', metavar
='<sqlite3 db>', dest
='database',
84 help='database to write results to')
85 parser
.add_argument('-b', metavar
='<build>', dest
='build', help='build ID')
86 parser
.add_argument('-L', action
='store_true', dest
='update_tests_db',
87 help='List tests (and update descriptions in DB)')
88 parser
.add_argument('-f', dest
='testmodule', metavar
='<test module>',
89 help='execute only tests from this test module',
90 type=str, choices
=[[]] + test_modules
)
91 parser
.add_argument('tests', metavar
='<test>', nargs
='*', type=str,
92 help='tests to run (only valid without -f)',
93 choices
=[[]] + test_names
)
95 args
= parser
.parse_args()
97 if args
.tests
and args
.testmodule
:
98 print 'Invalid arguments - both test module and tests given'
102 logging
.basicConfig(filename
=args
.logfile
,
106 logging
.basicConfig(level
=args
.loglevel
)
108 if args
.loglevel
== logging
.WARNING
:
111 error_file
= args
.errorfile
112 results_file
= args
.resultsfile
116 conn
= sqlite3
.connect(args
.database
)
121 run
= str(int(time
.time()))
123 with
open("commit") as f
:
126 commit
= val
[0].rstrip()
130 if args
.update_tests_db
:
132 print t
.__name
__ + " - " + t
.__doc
__
134 sql
= 'INSERT OR REPLACE INTO tests(test,description) VALUES (?, ?)'
135 params
= (t
.__name
__.replace('test_', '', 1), t
.__doc
__)
137 conn
.execute(sql
, params
)
139 print "sqlite: " + str(e
)
140 print "sql: %r" % (params
,)
147 dev0
= WpaSupplicant('wlan0', '/tmp/wpas-wlan0')
148 dev1
= WpaSupplicant('wlan1', '/tmp/wpas-wlan1')
149 dev2
= WpaSupplicant('wlan2', '/tmp/wpas-wlan2')
150 dev
= [ dev0
, dev1
, dev2
]
152 apdev
.append({"ifname": 'wlan3', "bssid": "02:00:00:00:03:00"})
153 apdev
.append({"ifname": 'wlan4', "bssid": "02:00:00:00:04:00"})
157 logger
.info(d
.ifname
+ ": No response from wpa_supplicant")
159 logger
.info("DEV: " + d
.ifname
+ ": " + d
.p2p_dev_addr())
161 logger
.info("APDEV: " + ap
['ifname'])
169 if not t
.__name
__ in args
.tests
:
172 if not t
.__module
__ == args
.testmodule
:
174 reset_devs(dev
, apdev
)
175 logger
.info("START " + t
.__name
__)
177 print "START " + t
.__name
__
180 logger
.info("Test: " + t
.__doc
__)
181 start
= datetime
.now()
184 d
.request("NOTE TEST-START " + t
.__name
__)
186 logger
.info("Failed to issue TEST-START before " + t
.__name
__ + " for " + d
.ifname
)
188 print "FAIL " + t
.__name
__ + " - could not start test"
194 if t
.func_code
.co_argcount
> 1:
201 skipped
.append(t
.__name
__)
204 passed
.append(t
.__name
__)
206 report(conn
, args
.build
, commit
, run
, t
.__name
__, result
, diff
)
207 result
= result
+ " " + t
.__name
__ + " "
208 result
= result
+ str(diff
.total_seconds()) + " " + str(end
)
210 if log_to_file
or print_res
:
214 f
= open(results_file
, 'a')
215 f
.write(result
+ "\n")
221 failed
.append(t
.__name
__)
222 report(conn
, args
.build
, commit
, run
, t
.__name
__, "FAIL", diff
)
223 result
= "FAIL " + t
.__name
__ + " " + str(diff
.total_seconds()) + " " + str(end
)
229 f
= open(results_file
, 'a')
230 f
.write(result
+ "\n")
234 d
.request("NOTE TEST-STOP " + t
.__name
__)
236 logger
.info("Failed to issue TEST-STOP after " + t
.__name
__ + " for " + d
.ifname
)
240 reset_devs(dev
, apdev
)
246 logger
.info("passed " + str(len(passed
)) + " test case(s)")
247 logger
.info("skipped " + str(len(skipped
)) + " test case(s)")
248 logger
.info("failed tests: " + str(failed
))
250 f
= open(error_file
, 'w')
251 f
.write(str(failed
) + '\n')
254 logger
.info("passed all " + str(len(passed
)) + " test case(s)")
256 logger
.info("skipped " + str(len(skipped
)) + " test case(s)")
258 print "passed all " + str(len(passed
)) + " test case(s)"
260 print "skipped " + str(len(skipped
)) + " test case(s)"
262 if __name__
== "__main__":