X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=tests%2Fhwsim%2Frun-tests.py;h=499263f2dc23c9988438632e2fa700801afe39fb;hb=78a37200f8336f3e509d7165e89caf132ced2d90;hp=538b9ac5e6199eef0e20bcada9f92d8daa62614a;hpb=9363f5e065960056582367b715d3e19f4b7c4a65;p=mech_eap.git diff --git a/tests/hwsim/run-tests.py b/tests/hwsim/run-tests.py index 538b9ac..499263f 100755 --- a/tests/hwsim/run-tests.py +++ b/tests/hwsim/run-tests.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2 # # Test case executor -# Copyright (c) 2013-2014, Jouni Malinen +# Copyright (c) 2013-2015, Jouni Malinen # # This software may be distributed under the terms of the BSD license. # See README for more details. @@ -13,19 +13,34 @@ import time from datetime import datetime import argparse import subprocess +import termios import logging logger = logging.getLogger() -if os.path.exists('../../wpaspy'): - sys.path.append('../../wpaspy') -else: - sys.path.append('../../../wpaspy') +try: + import sqlite3 + sqlite3_imported = True +except ImportError: + sqlite3_imported = False + +scriptsdir = os.path.dirname(os.path.realpath(sys.modules[__name__].__file__)) +sys.path.append(os.path.join(scriptsdir, '..', '..', 'wpaspy')) from wpasupplicant import WpaSupplicant from hostapd import HostapdGlobal from check_kernel import check_kernel from wlantest import Wlantest +from utils import HwsimSkip + +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]) def reset_devs(dev, apdev): ok = True @@ -37,6 +52,7 @@ def reset_devs(dev, apdev): print str(e) ok = False + wpas = None try: wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') ifaces = wpas.global_request("INTERFACES").splitlines() @@ -45,6 +61,8 @@ def reset_devs(dev, apdev): wpas.interface_remove(iface) except Exception, e: pass + if wpas: + wpas.close_ctrl() try: hapd = HostapdGlobal() @@ -68,7 +86,7 @@ def add_log_file(conn, test, run, type, path): if contents is None: return sql = "INSERT INTO logs(test,run,type,contents) VALUES(?, ?, ?, ?)" - params = (test, run, type, contents) + params = (test, run, type, sqlite3.Binary(contents)) try: conn.execute(sql, params) conn.commit() @@ -110,7 +128,7 @@ class DataCollector(object): def __enter__(self): if self._tracing: output = os.path.abspath(os.path.join(self._logdir, '%s.dat' % (self._testname, ))) - self._trace_cmd = subprocess.Popen(['sudo', 'trace-cmd', 'record', '-o', output, '-e', 'mac80211', '-e', 'cfg80211', 'sh', '-c', 'echo STARTED ; read l'], + self._trace_cmd = subprocess.Popen(['trace-cmd', 'record', '-o', output, '-e', 'mac80211', '-e', 'cfg80211', '-e', 'printk', 'sh', '-c', 'echo STARTED ; read l'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=open('/dev/null', 'w'), @@ -128,7 +146,11 @@ class DataCollector(object): 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')) + num = 0 + while os.path.exists(output): + output = os.path.join(self._logdir, '%s.dmesg-%d' % (self._testname, num)) + num += 1 + subprocess.call(['dmesg', '-c'], stdout=open(output, 'w')) def rename_log(logdir, basename, testname, dev): try: @@ -143,7 +165,7 @@ def rename_log(logdir, basename, testname, dev): os.rename(srcname, dstname) if dev: dev.relog() - subprocess.call(['sudo', 'chown', '-f', getpass.getuser(), srcname]) + subprocess.call(['chown', '-f', getpass.getuser(), srcname]) except Exception, e: logger.info("Failed to rename log files") logger.info(e) @@ -151,20 +173,16 @@ def rename_log(logdir, basename, testname, dev): def main(): tests = [] test_modules = [] - if os.path.exists('run-tests.py'): - files = os.listdir(".") - else: - files = os.listdir("..") + files = os.listdir(scriptsdir) for t in files: m = re.match(r'(test_.*)\.py$', t) if m: logger.debug("Import test cases from " + t) mod = __import__(m.group(1)) test_modules.append(mod.__name__.replace('test_', '', 1)) - for s in dir(mod): - if s.startswith("test_"): - func = mod.__dict__.get(s) - tests.append(func) + for key,val in mod.__dict__.iteritems(): + if key.startswith("test_"): + tests.append(val) test_names = list(set([t.__name__.replace('test_', '', 1) for t in tests])) run = None @@ -219,7 +237,9 @@ def main(): sys.exit(2) if args.database: - import sqlite3 + if not sqlite3_imported: + print "No sqlite3 module found" + sys.exit(2) conn = sqlite3.connect(args.database) 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)') @@ -232,13 +252,13 @@ def main(): # 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) + 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 = [] if args.tests: @@ -325,7 +345,7 @@ def main(): sys.exit(1) if args.dmesg: - subprocess.call(['sudo', 'dmesg', '-c'], stdout=open('/dev/null', 'w')) + subprocess.call(['dmesg', '-c'], stdout=open('/dev/null', 'w')) if conn and args.prefill: for t in tests_to_run: @@ -354,6 +374,8 @@ def main(): num_tests = 0 else: num_tests = len(tests_to_run) + if args.stdin_ctrl: + set_term_echo(sys.stdin.fileno(), False) while True: if args.stdin_ctrl: test = sys.stdin.readline() @@ -378,6 +400,7 @@ def main(): t = tests_to_run.pop(0) name = t.__name__.replace('test_', '', 1) + open('/dev/kmsg', 'w').write('running hwsim test case %s\n' % name) if log_handler: log_handler.stream.close() logger.removeHandler(log_handler) @@ -413,23 +436,32 @@ def main(): if conn: conn.close() conn = None + if args.stdin_ctrl: + set_term_echo(sys.stdin.fileno(), True) sys.exit(1) try: if t.func_code.co_argcount > 2: params = {} params['logdir'] = args.logdir params['long'] = args.long - res = t(dev, apdev, params) + t(dev, apdev, params) elif t.func_code.co_argcount > 1: - res = t(dev, apdev) - else: - res = t(dev) - if res == "skip": - result = "SKIP" + t(dev, apdev) else: - result = "PASS" + t(dev) + result = "PASS" + except HwsimSkip, e: + logger.info("Skip test case: %s" % e) + result = "SKIP" + except NameError, e: + import traceback + logger.info(e) + traceback.print_exc() + result = "FAIL" except Exception, e: + import traceback logger.info(e) + traceback.print_exc() if args.loglevel == logging.WARNING: print "Exception: " + str(e) result = "FAIL" @@ -441,18 +473,20 @@ def main(): logger.info("Failed to issue TEST-STOP after {} for {}".format(name, d.ifname)) logger.info(e) result = "FAIL" + if args.no_reset: + print "Leaving devices in current state" + else: + reset_ok = reset_devs(dev, apdev) + wpas = None try: - wpas = WpaSupplicant("/tmp/wpas-wlan5") - d.dump_monitor() + wpas = WpaSupplicant(global_iface="/tmp/wpas-wlan5") rename_log(args.logdir, 'log5', name, wpas) if not args.no_reset: wpas.remove_ifname() except Exception, e: pass - if args.no_reset: - print "Leaving devices in current state" - else: - reset_ok = reset_devs(dev, apdev) + if wpas: + wpas.close_ctrl() for i in range(0, 3): rename_log(args.logdir, 'log' + str(i), name, dev[i]) @@ -465,10 +499,20 @@ def main(): result = "FAIL" hapd = None rename_log(args.logdir, 'hostapd', name, hapd) + if hapd: + del hapd + hapd = None + # Use None here since this instance of Wlantest() will never be + # used for remote host hwsim tests on real hardware. + Wlantest.setup(None) wt = Wlantest() rename_log(args.logdir, 'hwsim0.pcapng', name, wt) rename_log(args.logdir, 'hwsim0', name, wt) + if os.path.exists(os.path.join(args.logdir, 'fst-wpa_supplicant')): + rename_log(args.logdir, 'fst-wpa_supplicant', name, None) + if os.path.exists(os.path.join(args.logdir, 'fst-hostapd')): + rename_log(args.logdir, 'fst-hostapd', name, None) end = datetime.now() diff = end - start @@ -496,6 +540,8 @@ def main(): if not reset_ok: print "Terminating early due to device reset failure" break + if args.stdin_ctrl: + set_term_echo(sys.stdin.fileno(), True) if log_handler: log_handler.stream.close()