diff --git a/tests/SConscript b/tests/SConscript index 9bf9e3aeb..bfdc9a566 100644 --- a/tests/SConscript +++ b/tests/SConscript @@ -150,6 +150,9 @@ def run_test(target, source, env): # Hand the return status to scons and let scons decide what # to do about it (typically terminate unless run with -k). return status + elif status == 2: + # The test was skipped + pass else: print 'M5 exited with non-zero status', status # complete but failed execution (call to exit() with non-zero @@ -159,6 +162,8 @@ def run_test(target, source, env): # Generate status file contents based on exit status of m5 or diff-out if status == 0: status_str = "passed." + elif status == 2: + status_str = "skipped." else: status_str = "FAILED!" f = file(str(target[0]), 'w') @@ -188,6 +193,8 @@ def print_test(target, source, env): status = termcap.Red + status[:-1] + termcap.Normal + status[-1] elif status == "passed.": status = termcap.Green + status[:-1] + termcap.Normal + status[-1] + elif status == "skipped.": + status = termcap.Yellow + status[:-1] + termcap.Normal + status[-1] # put it back in the list and join with space words[-1] = status diff --git a/tests/quick/se/20.eio-short/test.py b/tests/quick/se/20.eio-short/test.py index 210f21b14..67d8a582c 100644 --- a/tests/quick/se/20.eio-short/test.py +++ b/tests/quick/se/20.eio-short/test.py @@ -26,6 +26,8 @@ # # Authors: Steve Reinhardt +require_sim_object("EioProcess") + root.system.cpu.workload = EioProcess(file = binpath('anagram', 'anagram-vshort.eio.gz')) root.system.cpu.max_insts_any_thread = 500000 diff --git a/tests/quick/se/30.eio-mp/test.py b/tests/quick/se/30.eio-mp/test.py index 3dbb7614a..dcf6fb007 100644 --- a/tests/quick/se/30.eio-mp/test.py +++ b/tests/quick/se/30.eio-mp/test.py @@ -26,6 +26,8 @@ # # Authors: Lisa Hsu +require_sim_object("EioProcess") + process = EioProcess(file = binpath('anagram', 'anagram-vshort.eio.gz')) for i in xrange(nb_cores): diff --git a/tests/run.py b/tests/run.py index 1671d1714..e4474ac5c 100644 --- a/tests/run.py +++ b/tests/run.py @@ -1,3 +1,15 @@ +# Copyright (c) 2012 ARM Limited +# All rights reserved +# +# The license below extends only to copyright in the software and shall +# not be construed as granting a license to any other intellectual +# property including but not limited to intellectual property relating +# to a hardware implementation of the functionality of the software +# licensed hereunder. You may use the software subject to the license +# terms below provided that you ensure that this notice is replicated +# unmodified and in its entirety in all distributions of the software, +# modified or unmodified, in source code or in binary form. +# # Copyright (c) 2006-2007 The Regents of The University of Michigan # All rights reserved. # @@ -35,6 +47,52 @@ from os.path import join as joinpath import m5 +def skip_test(reason=""): + """Signal that a test should be skipped and optionally print why. + + Keyword arguments: + reason -- Reason why the test failed. Output is omitted if empty. + """ + + if reason: + print "Skipping test: %s" % reason + sys.exit(2) + +def has_sim_object(name): + """Test if a SimObject exists in the simulator. + + Arguments: + name -- Name of SimObject (string) + + Returns: True if the object exists, False otherwise. + """ + + try: + cls = getattr(m5.objects, name) + return issubclass(cls, m5.objects.SimObject) + except AttributeError: + return False + +def require_sim_object(name, fatal=False): + """Test if a SimObject exists and abort/skip test if not. + + Arguments: + name -- Name of SimObject (string) + + Keyword arguments: + fatal -- Set to True to indicate that the test should fail + instead of being skipped. + """ + + if has_sim_object(name): + return + else: + msg = "Test requires the '%s' SimObject." % name + if fatal: + m5.fatal(msg) + else: + skip_test(msg) + # Since we're in batch mode, dont allow tcp socket connections m5.disableAllListeners()