2014-02-21 19:23:56 +01:00
#!/usr/bin/env python2
2013-03-27 13:40:10 +01:00
#
2014-02-21 19:25:25 +01:00
# Test case executor
2015-01-07 12:41:31 +01:00
# Copyright (c) 2013-2015, Jouni Malinen <j@w1.fi>
2013-03-27 13:40:10 +01:00
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.
import os
import re
import sys
import time
2013-09-28 17:20:32 +02:00
from datetime import datetime
2013-10-30 18:28:22 +01:00
import argparse
2013-10-30 21:05:24 +01:00
import subprocess
2014-12-24 10:53:14 +01:00
import termios
2013-03-27 13:40:10 +01:00
import logging
2013-10-31 11:46:42 +01:00
logger = logging . getLogger ( )
2013-03-27 13:40:10 +01:00
2014-11-18 23:41:45 +01:00
if os . path . exists ( ' ../../wpaspy ' ) :
sys . path . append ( ' ../../wpaspy ' )
else :
sys . path . append ( ' ../../../wpaspy ' )
2013-10-27 17:28:28 +01:00
2013-03-27 13:40:10 +01:00
from wpasupplicant import WpaSupplicant
2013-03-29 17:37:03 +01:00
from hostapd import HostapdGlobal
2013-11-04 10:00:36 +01:00
from check_kernel import check_kernel
2013-11-17 20:25:17 +01:00
from wlantest import Wlantest
2015-01-07 12:41:31 +01:00
from utils import HwsimSkip
2013-03-29 17:37:03 +01:00
2014-12-24 10:53:14 +01:00
def set_term_echo ( fd , enabled ) :
[ iflag , oflag , cflag , lflag , ispeed , ospeed , cc ] = termios . tcgetattr ( fd )
if enabled :
lflag | = termios . ECHO
else :
lflag & = ~ termios . ECHO
termios . tcsetattr ( fd , termios . TCSANOW ,
[ iflag , oflag , cflag , lflag , ispeed , ospeed , cc ] )
2013-03-31 15:16:37 +02:00
def reset_devs ( dev , apdev ) :
2013-11-05 12:21:58 +01:00
ok = True
2013-03-31 19:32:33 +02:00
for d in dev :
2013-08-24 20:16:04 +02:00
try :
d . reset ( )
except Exception , e :
logger . info ( " Failed to reset device " + d . ifname )
2013-09-28 17:20:32 +02:00
print str ( e )
2013-11-05 12:21:58 +01:00
ok = False
2013-12-30 22:08:25 +01:00
2015-01-18 16:13:55 +01:00
wpas = None
2013-12-30 22:08:25 +01:00
try :
wpas = WpaSupplicant ( global_iface = ' /tmp/wpas-wlan5 ' )
2014-10-20 11:38:43 +02:00
ifaces = wpas . global_request ( " INTERFACES " ) . splitlines ( )
for iface in ifaces :
if iface . startswith ( " wlan " ) :
wpas . interface_remove ( iface )
2013-12-30 22:08:25 +01:00
except Exception , e :
pass
2015-01-18 16:13:55 +01:00
if wpas :
wpas . close_ctrl ( )
2013-12-30 22:08:25 +01:00
2013-11-05 12:21:58 +01:00
try :
hapd = HostapdGlobal ( )
2013-11-28 14:50:47 +01:00
hapd . flush ( )
2013-11-05 12:21:58 +01:00
hapd . remove ( ' wlan3-3 ' )
hapd . remove ( ' wlan3-2 ' )
for ap in apdev :
hapd . remove ( ap [ ' ifname ' ] )
except Exception , e :
logger . info ( " Failed to remove hostapd interface " )
print str ( e )
ok = False
return ok
2013-03-27 13:40:10 +01:00
2014-01-04 15:36:10 +01:00
def add_log_file ( conn , test , run , type , path ) :
if not os . path . exists ( path ) :
return
contents = None
with open ( path , ' r ' ) as f :
contents = f . read ( )
if contents is None :
return
sql = " INSERT INTO logs(test,run,type,contents) VALUES(?, ?, ?, ?) "
params = ( test , run , type , contents )
try :
conn . execute ( sql , params )
conn . commit ( )
except Exception , e :
print " sqlite: " + str ( e )
print " sql: %r " % ( params , )
2014-11-27 19:08:15 +01:00
def report ( conn , prefill , build , commit , run , test , result , duration , logdir ,
sql_commit = True ) :
2013-10-27 00:05:45 +02:00
if conn :
if not build :
build = ' '
if not commit :
commit = ' '
2013-10-31 16:05:11 +01:00
if prefill :
conn . execute ( ' DELETE FROM results WHERE test=? AND run=? AND result=? ' , ( test , run , ' NOTRUN ' ) )
2013-10-30 18:19:07 +01:00
sql = " INSERT INTO results(test,result,run,time,duration,build,commitid) VALUES(?, ?, ?, ?, ?, ?, ?) "
2013-10-31 16:05:11 +01:00
params = ( test , result , run , time . time ( ) , duration , build , commit )
2013-10-27 00:05:45 +02:00
try :
2013-10-30 18:19:07 +01:00
conn . execute ( sql , params )
2014-11-27 19:08:15 +01:00
if sql_commit :
conn . commit ( )
2013-10-27 00:05:45 +02:00
except Exception , e :
print " sqlite: " + str ( e )
2013-10-30 18:19:07 +01:00
print " sql: %r " % ( params , )
2013-10-27 00:05:45 +02:00
2014-01-04 15:36:10 +01:00
if result == " FAIL " :
for log in [ " log " , " log0 " , " log1 " , " log2 " , " log3 " , " log5 " ,
" hostapd " , " dmesg " , " hwsim0 " , " hwsim0.pcapng " ] :
add_log_file ( conn , test , run , log ,
logdir + " / " + test + " . " + log )
2013-10-30 22:50:56 +01:00
class DataCollector ( object ) :
def __init__ ( self , logdir , testname , tracing , dmesg ) :
self . _logdir = logdir
2013-10-30 21:05:24 +01:00
self . _testname = testname
2013-10-30 22:50:56 +01:00
self . _tracing = tracing
self . _dmesg = dmesg
2013-10-30 21:05:24 +01:00
def __enter__ ( self ) :
2013-10-30 22:50:56 +01:00
if self . _tracing :
2014-03-11 16:04:33 +01:00
output = os . path . abspath ( os . path . join ( self . _logdir , ' %s .dat ' % ( self . _testname , ) ) )
2015-02-04 10:30:33 +01:00
self . _trace_cmd = subprocess . Popen ( [ ' sudo ' , ' trace-cmd ' , ' record ' , ' -o ' , output , ' -e ' , ' mac80211 ' , ' -e ' , ' cfg80211 ' , ' -e ' , ' printk ' , ' sh ' , ' -c ' , ' echo STARTED ; read l ' ] ,
2013-10-30 22:50:56 +01:00
stdin = subprocess . PIPE ,
stdout = subprocess . PIPE ,
stderr = open ( ' /dev/null ' , ' w ' ) ,
cwd = self . _logdir )
l = self . _trace_cmd . stdout . read ( 7 )
2014-02-25 22:27:03 +01:00
while self . _trace_cmd . poll ( ) is None and not ' STARTED ' in l :
2013-10-30 22:50:56 +01:00
l + = self . _trace_cmd . stdout . read ( 1 )
2014-02-25 22:27:03 +01:00
res = self . _trace_cmd . returncode
if res :
print " Failed calling trace-cmd: returned exit status %d " % res
sys . exit ( 1 )
2013-10-30 21:05:24 +01:00
def __exit__ ( self , type , value , traceback ) :
2013-10-30 22:50:56 +01:00
if self . _tracing :
self . _trace_cmd . stdin . write ( ' DONE \n ' )
self . _trace_cmd . wait ( )
if self . _dmesg :
output = os . path . join ( self . _logdir , ' %s .dmesg ' % ( self . _testname , ) )
subprocess . call ( [ ' sudo ' , ' dmesg ' , ' -c ' ] , stdout = open ( output , ' w ' ) )
2013-10-30 21:05:24 +01:00
2013-11-02 12:04:06 +01:00
def rename_log ( logdir , basename , testname , dev ) :
try :
import getpass
srcname = os . path . join ( logdir , basename )
dstname = os . path . join ( logdir , testname + ' . ' + basename )
num = 0
while os . path . exists ( dstname ) :
dstname = os . path . join ( logdir ,
testname + ' . ' + basename + ' - ' + str ( num ) )
num = num + 1
os . rename ( srcname , dstname )
2013-11-05 12:21:58 +01:00
if dev :
dev . relog ( )
subprocess . call ( [ ' sudo ' , ' chown ' , ' -f ' , getpass . getuser ( ) , srcname ] )
2013-11-02 12:04:06 +01:00
except Exception , e :
logger . info ( " Failed to rename log files " )
logger . info ( e )
2013-03-27 13:40:10 +01:00
def main ( ) :
2013-10-30 18:28:22 +01:00
tests = [ ]
test_modules = [ ]
2014-11-18 23:41:45 +01:00
if os . path . exists ( ' run-tests.py ' ) :
files = os . listdir ( " . " )
else :
files = os . listdir ( " .. " )
for t in files :
2013-10-30 18:28:22 +01:00
m = re . match ( r ' (test_.*) \ .py$ ' , t )
if m :
logger . debug ( " Import test cases from " + t )
mod = __import__ ( m . group ( 1 ) )
2013-10-31 10:47:43 +01:00
test_modules . append ( mod . __name__ . replace ( ' test_ ' , ' ' , 1 ) )
2014-12-22 19:08:11 +01:00
for key , val in mod . __dict__ . iteritems ( ) :
if key . startswith ( " test_ " ) :
tests . append ( val )
2013-10-31 10:43:45 +01:00
test_names = list ( set ( [ t . __name__ . replace ( ' test_ ' , ' ' , 1 ) for t in tests ] ) )
2013-10-30 18:28:22 +01:00
2013-10-27 00:05:45 +02:00
run = None
2013-10-30 18:28:22 +01:00
parser = argparse . ArgumentParser ( description = ' hwsim test runner ' )
2013-10-31 13:27:57 +01:00
parser . add_argument ( ' --logdir ' , metavar = ' <directory> ' ,
2013-10-30 22:37:15 +01:00
help = ' log output directory for all other options, ' +
' must be given if other log options are used ' )
2013-10-30 18:28:22 +01:00
group = parser . add_mutually_exclusive_group ( )
group . add_argument ( ' -d ' , const = logging . DEBUG , action = ' store_const ' ,
dest = ' loglevel ' , default = logging . INFO ,
help = " verbose debug output " )
group . add_argument ( ' -q ' , const = logging . WARNING , action = ' store_const ' ,
dest = ' loglevel ' , help = " be quiet " )
parser . add_argument ( ' -S ' , metavar = ' <sqlite3 db> ' , dest = ' database ' ,
help = ' database to write results to ' )
2013-10-31 16:05:11 +01:00
parser . add_argument ( ' --prefill-tests ' , action = ' store_true ' , dest = ' prefill ' ,
help = ' prefill test database with NOTRUN before all tests ' )
2013-10-30 20:01:11 +01:00
parser . add_argument ( ' --commit ' , metavar = ' <commit id> ' ,
help = ' commit ID, only for database ' )
2013-10-30 18:28:22 +01:00
parser . add_argument ( ' -b ' , metavar = ' <build> ' , dest = ' build ' , help = ' build ID ' )
parser . add_argument ( ' -L ' , action = ' store_true ' , dest = ' update_tests_db ' ,
help = ' List tests (and update descriptions in DB) ' )
2013-10-30 22:37:15 +01:00
parser . add_argument ( ' -T ' , action = ' store_true ' , dest = ' tracing ' ,
help = ' collect tracing per test case (in log directory) ' )
2013-10-30 22:50:56 +01:00
parser . add_argument ( ' -D ' , action = ' store_true ' , dest = ' dmesg ' ,
help = ' collect dmesg per test case (in log directory) ' )
2013-11-02 09:30:37 +01:00
parser . add_argument ( ' --shuffle-tests ' , action = ' store_true ' ,
dest = ' shuffle_tests ' ,
help = ' Shuffle test cases to randomize order ' )
2014-03-24 00:35:58 +01:00
parser . add_argument ( ' --split ' , help = ' split tests for parallel execution (<server number>/<total servers>) ' )
2013-11-02 19:38:40 +01:00
parser . add_argument ( ' --no-reset ' , action = ' store_true ' , dest = ' no_reset ' ,
help = ' Do not reset devices at the end of the test ' )
2014-04-06 12:11:32 +02:00
parser . add_argument ( ' --long ' , action = ' store_true ' ,
help = ' Include test cases that take long time ' )
2013-10-30 18:49:12 +01:00
parser . add_argument ( ' -f ' , dest = ' testmodules ' , metavar = ' <test module> ' ,
help = ' execute only tests from these test modules ' ,
type = str , choices = [ [ ] ] + test_modules , nargs = ' + ' )
2014-10-26 08:06:33 +01:00
parser . add_argument ( ' -l ' , metavar = ' <modules file> ' , dest = ' mfile ' ,
help = ' test modules file name ' )
2014-11-19 01:01:27 +01:00
parser . add_argument ( ' -i ' , action = ' store_true ' , dest = ' stdin_ctrl ' ,
help = ' stdin-controlled test case execution ' )
2013-10-30 18:28:22 +01:00
parser . add_argument ( ' tests ' , metavar = ' <test> ' , nargs = ' * ' , type = str ,
help = ' tests to run (only valid without -f) ' ,
choices = [ [ ] ] + test_names )
args = parser . parse_args ( )
2014-10-26 08:06:33 +01:00
if ( args . tests and args . testmodules ) or ( args . tests and args . mfile ) or ( args . testmodules and args . mfile ) :
print ' Invalid arguments - only one of (test, test modules, modules file) can be given. '
2013-10-30 18:28:22 +01:00
sys . exit ( 2 )
if args . database :
import sqlite3
conn = sqlite3 . connect ( args . database )
2013-10-31 15:36:44 +01:00
conn . execute ( ' CREATE TABLE IF NOT EXISTS results (test,result,run,time,duration,build,commitid) ' )
conn . execute ( ' CREATE TABLE IF NOT EXISTS tests (test,description) ' )
2014-01-04 15:36:10 +01:00
conn . execute ( ' CREATE TABLE IF NOT EXISTS logs (test,run,type,contents) ' )
2013-10-30 18:28:22 +01:00
else :
conn = None
2013-03-31 15:29:16 +02:00
2013-10-27 00:05:45 +02:00
if conn :
2013-10-31 09:43:02 +01:00
run = int ( time . time ( ) )
2013-10-27 00:05:45 +02:00
2014-11-18 23:34:36 +01:00
# read the modules from the modules file
if args . mfile :
args . testmodules = [ ]
with open ( args . mfile ) as f :
for line in f . readlines ( ) :
line = line . strip ( )
if not line or line . startswith ( ' # ' ) :
continue
args . testmodules . append ( line )
tests_to_run = [ ]
2014-11-27 18:48:41 +01:00
if args . tests :
for selected in args . tests :
for t in tests :
name = t . __name__ . replace ( ' test_ ' , ' ' , 1 )
if name == selected :
tests_to_run . append ( t )
else :
for t in tests :
name = t . __name__ . replace ( ' test_ ' , ' ' , 1 )
if args . testmodules :
if not t . __module__ . replace ( ' test_ ' , ' ' , 1 ) in args . testmodules :
continue
tests_to_run . append ( t )
2014-11-18 23:34:36 +01:00
2013-10-30 18:28:22 +01:00
if args . update_tests_db :
2014-11-18 23:34:36 +01:00
for t in tests_to_run :
2013-10-31 10:43:45 +01:00
name = t . __name__ . replace ( ' test_ ' , ' ' , 1 )
2014-01-05 12:10:29 +01:00
if t . __doc__ is None :
print name + " - MISSING DESCRIPTION "
else :
print name + " - " + t . __doc__
2013-10-27 11:16:36 +01:00
if conn :
2013-10-30 18:19:07 +01:00
sql = ' INSERT OR REPLACE INTO tests(test,description) VALUES (?, ?) '
2013-10-31 10:43:45 +01:00
params = ( name , t . __doc__ )
2013-10-27 11:16:36 +01:00
try :
2013-10-30 18:19:07 +01:00
conn . execute ( sql , params )
2013-10-27 11:16:36 +01:00
except Exception , e :
print " sqlite: " + str ( e )
2013-10-30 18:19:07 +01:00
print " sql: %r " % ( params , )
2013-10-27 11:16:36 +01:00
if conn :
conn . commit ( )
conn . close ( )
2013-09-29 15:11:48 +02:00
sys . exit ( 0 )
2014-11-18 23:41:45 +01:00
if not args . logdir :
if os . path . exists ( ' logs/current ' ) :
args . logdir = ' logs/current '
else :
args . logdir = ' logs '
# Write debug level log to a file and configurable verbosity to stdout
logger . setLevel ( logging . DEBUG )
stdout_handler = logging . StreamHandler ( )
stdout_handler . setLevel ( args . loglevel )
logger . addHandler ( stdout_handler )
file_name = os . path . join ( args . logdir , ' run-tests.log ' )
log_handler = logging . FileHandler ( file_name )
log_handler . setLevel ( logging . DEBUG )
fmt = " %(asctime)s %(levelname)s %(message)s "
log_formatter = logging . Formatter ( fmt )
log_handler . setFormatter ( log_formatter )
logger . addHandler ( log_handler )
2013-03-27 13:40:10 +01:00
2013-06-30 23:13:11 +02:00
dev0 = WpaSupplicant ( ' wlan0 ' , ' /tmp/wpas-wlan0 ' )
dev1 = WpaSupplicant ( ' wlan1 ' , ' /tmp/wpas-wlan1 ' )
dev2 = WpaSupplicant ( ' wlan2 ' , ' /tmp/wpas-wlan2 ' )
2013-03-31 15:19:12 +02:00
dev = [ dev0 , dev1 , dev2 ]
2013-03-31 15:16:37 +02:00
apdev = [ ]
apdev . append ( { " ifname " : ' wlan3 ' , " bssid " : " 02:00:00:00:03:00 " } )
2013-03-31 15:19:12 +02:00
apdev . append ( { " ifname " : ' wlan4 ' , " bssid " : " 02:00:00:00:04:00 " } )
2013-03-27 13:40:10 +01:00
for d in dev :
if not d . ping ( ) :
2013-08-24 18:48:04 +02:00
logger . info ( d . ifname + " : No response from wpa_supplicant " )
2013-03-27 13:40:10 +01:00
return
2013-08-24 18:48:04 +02:00
logger . info ( " DEV: " + d . ifname + " : " + d . p2p_dev_addr ( ) )
2013-03-31 15:16:37 +02:00
for ap in apdev :
2013-08-24 18:48:04 +02:00
logger . info ( " APDEV: " + ap [ ' ifname ' ] )
2013-03-27 13:40:10 +01:00
passed = [ ]
2013-09-29 15:21:42 +02:00
skipped = [ ]
2013-03-27 13:40:10 +01:00
failed = [ ]
2013-10-30 22:53:29 +01:00
# make sure nothing is left over from previous runs
# (if there were any other manual runs or we crashed)
2013-11-05 12:21:58 +01:00
if not reset_devs ( dev , apdev ) :
if conn :
conn . close ( )
conn = None
sys . exit ( 1 )
2013-10-30 22:53:29 +01:00
2013-10-30 22:50:56 +01:00
if args . dmesg :
subprocess . call ( [ ' sudo ' , ' dmesg ' , ' -c ' ] , stdout = open ( ' /dev/null ' , ' w ' ) )
2013-10-31 16:05:11 +01:00
if conn and args . prefill :
for t in tests_to_run :
name = t . __name__ . replace ( ' test_ ' , ' ' , 1 )
2014-01-04 15:36:10 +01:00
report ( conn , False , args . build , args . commit , run , name , ' NOTRUN ' , 0 ,
2014-11-27 19:08:15 +01:00
args . logdir , sql_commit = False )
conn . commit ( )
2013-10-31 16:05:11 +01:00
2014-03-24 00:35:58 +01:00
if args . split :
vals = args . split . split ( ' / ' )
split_server = int ( vals [ 0 ] )
split_total = int ( vals [ 1 ] )
logger . info ( " Parallel execution - %d / %d " % ( split_server , split_total ) )
split_server - = 1
tests_to_run . sort ( key = lambda t : t . __name__ )
tests_to_run = [ x for i , x in enumerate ( tests_to_run ) if i % split_total == split_server ]
2013-11-02 09:30:37 +01:00
if args . shuffle_tests :
from random import shuffle
shuffle ( tests_to_run )
2013-12-29 15:45:47 +01:00
count = 0
2014-11-19 01:01:27 +01:00
if args . stdin_ctrl :
print " READY "
sys . stdout . flush ( )
2014-11-19 21:02:08 +01:00
num_tests = 0
2014-11-19 01:01:27 +01:00
else :
2014-11-19 21:02:08 +01:00
num_tests = len ( tests_to_run )
2014-12-24 10:53:14 +01:00
if args . stdin_ctrl :
set_term_echo ( sys . stdin . fileno ( ) , False )
2014-11-19 01:01:27 +01:00
while True :
if args . stdin_ctrl :
test = sys . stdin . readline ( )
if not test :
break
test = test . splitlines ( ) [ 0 ]
if test == ' ' :
break
t = None
for tt in tests :
name = tt . __name__ . replace ( ' test_ ' , ' ' , 1 )
if name == test :
t = tt
break
if not t :
print " NOT-FOUND "
sys . stdout . flush ( )
continue
else :
2014-11-19 21:02:08 +01:00
if len ( tests_to_run ) == 0 :
2014-11-19 01:01:27 +01:00
break
2014-11-19 21:02:08 +01:00
t = tests_to_run . pop ( 0 )
2014-11-19 01:01:27 +01:00
2013-10-31 16:05:11 +01:00
name = t . __name__ . replace ( ' test_ ' , ' ' , 1 )
2013-10-31 11:46:42 +01:00
if log_handler :
log_handler . stream . close ( )
logger . removeHandler ( log_handler )
file_name = os . path . join ( args . logdir , name + ' .log ' )
log_handler = logging . FileHandler ( file_name )
2013-11-02 11:20:59 +01:00
log_handler . setLevel ( logging . DEBUG )
2013-10-31 11:46:42 +01:00
log_handler . setFormatter ( log_formatter )
logger . addHandler ( log_handler )
2013-11-05 12:21:58 +01:00
reset_ok = True
2013-10-31 10:43:45 +01:00
with DataCollector ( args . logdir , name , args . tracing , args . dmesg ) :
2013-12-29 15:45:47 +01:00
count = count + 1
2014-11-19 21:02:08 +01:00
msg = " START {} {} / {} " . format ( name , count , num_tests )
2013-12-29 15:45:47 +01:00
logger . info ( msg )
2013-11-02 11:20:59 +01:00
if args . loglevel == logging . WARNING :
2013-12-29 15:45:47 +01:00
print msg
2013-09-29 19:42:37 +02:00
sys . stdout . flush ( )
2013-10-30 21:05:24 +01:00
if t . __doc__ :
logger . info ( " Test: " + t . __doc__ )
start = datetime . now ( )
for d in dev :
try :
2014-04-29 13:46:09 +02:00
d . dump_monitor ( )
if not d . ping ( ) :
raise Exception ( " PING failed for {} " . format ( d . ifname ) )
if not d . global_ping ( ) :
raise Exception ( " Global PING failed for {} " . format ( d . ifname ) )
2013-10-31 10:43:45 +01:00
d . request ( " NOTE TEST-START " + name )
2013-10-30 21:05:24 +01:00
except Exception , e :
2013-10-31 10:43:45 +01:00
logger . info ( " Failed to issue TEST-START before " + name + " for " + d . ifname )
2013-10-30 21:05:24 +01:00
logger . info ( e )
2013-10-31 10:43:45 +01:00
print " FAIL " + name + " - could not start test "
2013-10-30 21:05:24 +01:00
if conn :
conn . close ( )
conn = None
2014-12-24 10:53:14 +01:00
if args . stdin_ctrl :
set_term_echo ( sys . stdin . fileno ( ) , True )
2013-10-30 21:05:24 +01:00
sys . exit ( 1 )
2013-08-24 18:41:08 +02:00
try :
2014-03-23 10:59:43 +01:00
if t . func_code . co_argcount > 2 :
params = { }
params [ ' logdir ' ] = args . logdir
2014-04-06 12:11:32 +02:00
params [ ' long ' ] = args . long
2015-01-07 13:19:30 +01:00
t ( dev , apdev , params )
2014-03-23 10:59:43 +01:00
elif t . func_code . co_argcount > 1 :
2015-01-07 13:19:30 +01:00
t ( dev , apdev )
2013-10-30 21:05:24 +01:00
else :
2015-01-07 13:19:30 +01:00
t ( dev )
result = " PASS "
2015-01-07 12:41:31 +01:00
except HwsimSkip , e :
logger . info ( " Skip test case: %s " % e )
result = " SKIP "
2013-08-24 18:41:08 +02:00
except Exception , e :
2015-01-07 12:41:31 +01:00
logger . info ( e )
if args . loglevel == logging . WARNING :
print " Exception: " + str ( e )
result = " FAIL "
2013-10-30 21:05:24 +01:00
for d in dev :
try :
2014-04-29 13:46:09 +02:00
d . dump_monitor ( )
2013-10-31 10:43:45 +01:00
d . request ( " NOTE TEST-STOP " + name )
2013-10-30 21:05:24 +01:00
except Exception , e :
2013-11-02 16:07:13 +01:00
logger . info ( " Failed to issue TEST-STOP after {} for {} " . format ( name , d . ifname ) )
2013-10-30 21:05:24 +01:00
logger . info ( e )
2013-11-05 12:21:58 +01:00
result = " FAIL "
2015-01-18 16:13:55 +01:00
wpas = None
2013-12-30 22:08:25 +01:00
try :
2015-01-18 16:13:55 +01:00
wpas = WpaSupplicant ( global_iface = " /tmp/wpas-wlan5 " )
2013-12-30 22:08:25 +01:00
rename_log ( args . logdir , ' log5 ' , name , wpas )
if not args . no_reset :
wpas . remove_ifname ( )
except Exception , e :
pass
2015-01-18 16:13:55 +01:00
if wpas :
wpas . close_ctrl ( )
2013-11-02 19:38:40 +01:00
if args . no_reset :
print " Leaving devices in current state "
else :
2013-11-05 12:21:58 +01:00
reset_ok = reset_devs ( dev , apdev )
2013-03-27 13:40:10 +01:00
2013-10-31 12:09:14 +01:00
for i in range ( 0 , 3 ) :
2013-11-02 12:04:06 +01:00
rename_log ( args . logdir , ' log ' + str ( i ) , name , dev [ i ] )
2013-11-05 12:21:58 +01:00
try :
hapd = HostapdGlobal ( )
except Exception , e :
print " Failed to connect to hostapd interface "
print str ( e )
reset_ok = False
result = " FAIL "
hapd = None
2013-11-02 12:04:06 +01:00
rename_log ( args . logdir , ' hostapd ' , name , hapd )
2013-11-02 10:53:38 +01:00
2013-11-17 20:25:17 +01:00
wt = Wlantest ( )
rename_log ( args . logdir , ' hwsim0.pcapng ' , name , wt )
rename_log ( args . logdir , ' hwsim0 ' , name , wt )
2013-10-31 15:02:50 +01:00
end = datetime . now ( )
diff = end - start
2013-11-04 10:00:36 +01:00
if result == ' PASS ' and args . dmesg :
if not check_kernel ( os . path . join ( args . logdir , name + ' .dmesg ' ) ) :
2013-12-27 10:04:38 +01:00
logger . info ( " Kernel issue found in dmesg - mark test failed " )
2013-11-04 10:00:36 +01:00
result = ' FAIL '
if result == ' PASS ' :
passed . append ( name )
elif result == ' SKIP ' :
skipped . append ( name )
else :
failed . append ( name )
2014-01-04 15:36:10 +01:00
report ( conn , args . prefill , args . build , args . commit , run , name , result ,
diff . total_seconds ( ) , args . logdir )
2013-11-02 16:07:13 +01:00
result = " {} {} {} {} " . format ( result , name , diff . total_seconds ( ) , end )
2013-10-31 15:02:50 +01:00
logger . info ( result )
2013-11-02 11:20:59 +01:00
if args . loglevel == logging . WARNING :
2013-10-31 15:02:50 +01:00
print result
sys . stdout . flush ( )
2013-11-05 12:21:58 +01:00
if not reset_ok :
print " Terminating early due to device reset failure "
break
2014-12-24 10:53:14 +01:00
if args . stdin_ctrl :
set_term_echo ( sys . stdin . fileno ( ) , True )
2013-11-05 12:21:58 +01:00
2013-10-31 11:46:42 +01:00
if log_handler :
log_handler . stream . close ( )
logger . removeHandler ( log_handler )
file_name = os . path . join ( args . logdir , ' run-tests.log ' )
log_handler = logging . FileHandler ( file_name )
2013-11-02 11:20:59 +01:00
log_handler . setLevel ( logging . DEBUG )
2013-10-31 11:46:42 +01:00
log_handler . setFormatter ( log_formatter )
logger . addHandler ( log_handler )
2013-10-27 00:05:45 +02:00
if conn :
conn . close ( )
2013-03-27 13:40:10 +01:00
if len ( failed ) :
2013-11-02 16:07:13 +01:00
logger . info ( " passed {} test case(s) " . format ( len ( passed ) ) )
logger . info ( " skipped {} test case(s) " . format ( len ( skipped ) ) )
2013-11-11 17:19:33 +01:00
logger . info ( " failed tests: " + ' ' . join ( failed ) )
2013-11-02 11:20:59 +01:00
if args . loglevel == logging . WARNING :
2013-11-11 17:19:33 +01:00
print " failed tests: " + ' ' . join ( failed )
2013-03-27 13:40:10 +01:00
sys . exit ( 1 )
2013-11-02 16:07:13 +01:00
logger . info ( " passed all {} test case(s) " . format ( len ( passed ) ) )
2013-09-29 15:21:42 +02:00
if len ( skipped ) :
2013-11-02 16:07:13 +01:00
logger . info ( " skipped {} test case(s) " . format ( len ( skipped ) ) )
2013-11-02 11:20:59 +01:00
if args . loglevel == logging . WARNING :
2013-11-02 16:07:13 +01:00
print " passed all {} test case(s) " . format ( len ( passed ) )
2013-09-29 15:21:42 +02:00
if len ( skipped ) :
2013-11-02 16:07:13 +01:00
print " skipped {} test case(s) " . format ( len ( skipped ) )
2013-03-27 13:40:10 +01:00
if __name__ == " __main__ " :
main ( )