-def header(title):
- dashes = '-' * (36 - len(title))
- before = dashes[:len(dashes)/2]
- after = dashes[len(dashes)/2:]
- print "%s[ %s ]%s" % (before, title, after)
-
-class GdbTest(object):
- compiled = {}
-
- def __init__(self, target):
- self.target = target
- self.server = None
- self.binary = None
- self.gdb = None
-
- def setUp(self):
- pass
-
- def run(self):
- """
- If compile_args is set, compile a program and set self.binary.
-
- Call setUp().
-
- Then call test() and return the result, displaying relevant information
- if an exception is raised.
- """
- self.server = self.target.server()
-
- print "Running", type(self).__name__, "...",
- sys.stdout.flush()
-
- start = time.time()
-
- compile_args = getattr(self, 'compile_args', None)
- if compile_args:
- if compile_args not in GdbTest.compiled:
- try:
- # pylint: disable=star-args
- GdbTest.compiled[compile_args] = \
- self.target.compile(*compile_args)
- except Exception: # pylint: disable=broad-except
- print "exception while compiling in %.2fs" % (
- time.time() - start)
- print "=" * 40
- header("Traceback")
- traceback.print_exc(file=sys.stdout)
- print "/" * 40
- return "exception"
- self.binary = GdbTest.compiled.get(compile_args)
-
- self.gdb = gdb(self.target, self.server.port, self.binary)
-
- try:
- self.setUp()
- result = self.test() # pylint: disable=no-member
- except Exception as e: # pylint: disable=broad-except
- if isinstance(e, TestFailed):
- result = "fail"
- else:
- result = "exception"
- print "%s in %.2fs" % (result, time.time() - start)
- print "=" * 40
- if isinstance(e, TestFailed):
- header("Message")
- print e.message
- header("Traceback")
- traceback.print_exc(file=sys.stdout)
- header("gdb.log")
- print open("gdb.log", "r").read()
- header(self.server.logname)
- print open(self.server.logname, "r").read()
- print "/" * 40
- return result
-
- finally:
- del self.server
- del self.gdb
-
- if not result:
- result = 'pass'
- print "%s in %.2fs" % (result, time.time() - start)
- return result
-
-class TestFailed(Exception):
- def __init__(self, message):
- Exception.__init__(self)
- self.message = message
-
-def run_all_tests(target, tests, fail_fast):
- good_results = set(('pass', 'not_applicable'))
-
- results = {}
- module = sys.modules[__name__]
- for name in dir(module):
- definition = getattr(module, name)
- if type(definition) == type and hasattr(definition, 'test') and \
- (not tests or any(test in name for test in tests)):
- instance = definition(target)
- result = instance.run()
- results.setdefault(result, []).append(name)
- if result not in good_results and fail_fast:
- break
-
- print ":" * 40
-
- result = 0
- for key, value in results.iteritems():
- print "%d tests returned %s" % (len(value), key)
- if key not in good_results:
- result = 1
- for test in value:
- print " ", test
-
- return result
-
-def assertEqual(a, b):
- if a != b:
- raise TestFailed("%r != %r" % (a, b))
-
-def assertNotEqual(a, b):
- if a == b:
- raise TestFailed("%r == %r" % (a, b))
-
-def assertIn(a, b):
- if a not in b:
- raise TestFailed("%r not in %r" % (a, b))
-
-def assertNotIn(a, b):
- if a in b:
- raise TestFailed("%r in %r" % (a, b))
-
-def assertGreater(a, b):
- if not a > b:
- raise TestFailed("%r not greater than %r" % (a, b))
-
-def assertTrue(a):
- if not a:
- raise TestFailed("%r is not True" % a)
-
-def assertRegexpMatches(text, regexp):
- if not re.search(regexp, text):
- raise TestFailed("can't find %r in %r" % (regexp, text))
-