| Index: tools/test.py
|
| ===================================================================
|
| --- tools/test.py (revision 5302)
|
| +++ tools/test.py (working copy)
|
| @@ -331,10 +331,11 @@
|
|
|
| class TestCase(object):
|
|
|
| - def __init__(self, context, path):
|
| + def __init__(self, context, path, mode):
|
| self.path = path
|
| self.context = context
|
| self.duration = None
|
| + self.mode = mode
|
|
|
| def IsNegative(self):
|
| return False
|
| @@ -355,14 +356,19 @@
|
|
|
| def RunCommand(self, command):
|
| full_command = self.context.processor(command)
|
| - output = Execute(full_command, self.context, self.context.timeout)
|
| + output = Execute(full_command,
|
| + self.context,
|
| + self.context.GetTimeout(self.mode))
|
| self.Cleanup()
|
| - return TestOutput(self, full_command, output)
|
| + return TestOutput(self,
|
| + full_command,
|
| + output,
|
| + self.context.store_unexpected_output)
|
|
|
| def BeforeRun(self):
|
| pass
|
|
|
| - def AfterRun(self):
|
| + def AfterRun(self, result):
|
| pass
|
|
|
| def Run(self):
|
| @@ -370,7 +376,7 @@
|
| try:
|
| result = self.RunCommand(self.GetCommand())
|
| finally:
|
| - self.AfterRun()
|
| + self.AfterRun(result)
|
| return result
|
|
|
| def Cleanup(self):
|
| @@ -379,10 +385,11 @@
|
|
|
| class TestOutput(object):
|
|
|
| - def __init__(self, test, command, output):
|
| + def __init__(self, test, command, output, store_unexpected_output):
|
| self.test = test
|
| self.command = command
|
| self.output = output
|
| + self.store_unexpected_output = store_unexpected_output
|
|
|
| def UnexpectedOutput(self):
|
| if self.HasCrashed():
|
| @@ -395,6 +402,9 @@
|
| outcome = PASS
|
| return not outcome in self.test.outcomes
|
|
|
| + def HasPreciousOutput(self):
|
| + return self.UnexpectedOutput() and self.store_unexpected_output
|
| +
|
| def HasCrashed(self):
|
| if utils.IsWindows():
|
| return 0x80000000 & self.output.exit_code and not (0x3FFFFF00 & self.output.exit_code)
|
| @@ -557,6 +567,11 @@
|
| return self.name
|
|
|
|
|
| +# Use this to run several variants of the tests, e.g.:
|
| +# VARIANT_FLAGS = [[], ['--always_compact', '--noflush_code']]
|
| +VARIANT_FLAGS = [[]]
|
| +
|
| +
|
| class TestRepository(TestSuite):
|
|
|
| def __init__(self, path):
|
| @@ -583,9 +598,13 @@
|
| def GetBuildRequirements(self, path, context):
|
| return self.GetConfiguration(context).GetBuildRequirements()
|
|
|
| - def ListTests(self, current_path, path, context, mode):
|
| - return self.GetConfiguration(context).ListTests(current_path, path, mode)
|
| + def AddTestsToList(self, result, current_path, path, context, mode):
|
| + for v in VARIANT_FLAGS:
|
| + tests = self.GetConfiguration(context).ListTests(current_path, path, mode)
|
| + for t in tests: t.variant_flags = v
|
| + result += tests
|
|
|
| +
|
| def GetTestStatus(self, context, sections, defs):
|
| self.GetConfiguration(context).GetTestStatus(sections, defs)
|
|
|
| @@ -611,7 +630,7 @@
|
| test_name = test.GetName()
|
| if not name or name.match(test_name):
|
| full_path = current_path + [test_name]
|
| - result += test.ListTests(full_path, path, context, mode)
|
| + test.AddTestsToList(result, full_path, path, context, mode)
|
| return result
|
|
|
| def GetTestStatus(self, context, sections, defs):
|
| @@ -619,12 +638,20 @@
|
| test.GetTestStatus(context, sections, defs)
|
|
|
|
|
| -SUFFIX = {'debug': '_g', 'release': ''}
|
| +SUFFIX = {
|
| + 'debug' : '_g',
|
| + 'release' : '' }
|
| +FLAGS = {
|
| + 'debug' : ['--enable-slow-asserts', '--debug-code', '--verify-heap'],
|
| + 'release' : []}
|
| +TIMEOUT_SCALEFACTOR = {
|
| + 'debug' : 4,
|
| + 'release' : 1 }
|
|
|
|
|
| class Context(object):
|
|
|
| - def __init__(self, workspace, buildspace, verbose, vm, timeout, processor, suppress_dialogs):
|
| + def __init__(self, workspace, buildspace, verbose, vm, timeout, processor, suppress_dialogs, store_unexpected_output):
|
| self.workspace = workspace
|
| self.buildspace = buildspace
|
| self.verbose = verbose
|
| @@ -632,6 +659,7 @@
|
| self.timeout = timeout
|
| self.processor = processor
|
| self.suppress_dialogs = suppress_dialogs
|
| + self.store_unexpected_output = store_unexpected_output
|
|
|
| def GetVm(self, mode):
|
| name = self.vm_root + SUFFIX[mode]
|
| @@ -639,6 +667,15 @@
|
| name = name + '.exe'
|
| return name
|
|
|
| + def GetVmCommand(self, testcase, mode):
|
| + return [self.GetVm(mode)] + self.GetVmFlags(testcase, mode)
|
| +
|
| + def GetVmFlags(self, testcase, mode):
|
| + return testcase.variant_flags + FLAGS[mode]
|
| +
|
| + def GetTimeout(self, mode):
|
| + return self.timeout * TIMEOUT_SCALEFACTOR[mode]
|
| +
|
| def RunTestCases(cases_to_run, progress, tasks):
|
| progress = PROGRESS_INDICATORS[progress](cases_to_run)
|
| return progress.Run(tasks)
|
| @@ -1121,7 +1158,13 @@
|
| dest="suppress_dialogs", default=True, action="store_true")
|
| result.add_option("--no-suppress-dialogs", help="Display Windows dialogs for crashing tests",
|
| dest="suppress_dialogs", action="store_false")
|
| - result.add_option("--shell", help="Path to V8 shell", default="shell");
|
| + result.add_option("--shell", help="Path to V8 shell", default="shell")
|
| + result.add_option("--store-unexpected-output",
|
| + help="Store the temporary JS files from tests that fails",
|
| + dest="store_unexpected_output", default=True, action="store_true")
|
| + result.add_option("--no-store-unexpected-output",
|
| + help="Deletes the temporary JS files from tests that fails",
|
| + dest="store_unexpected_output", action="store_false")
|
| return result
|
|
|
|
|
| @@ -1258,11 +1301,13 @@
|
|
|
| shell = abspath(options.shell)
|
| buildspace = dirname(shell)
|
| +
|
| context = Context(workspace, buildspace, VERBOSE,
|
| shell,
|
| options.timeout,
|
| GetSpecialCommandProcessor(options.special_command),
|
| - options.suppress_dialogs)
|
| + options.suppress_dialogs,
|
| + options.store_unexpected_output)
|
| # First build the required targets
|
| if not options.no_build:
|
| reqs = [ ]
|
| @@ -1278,7 +1323,7 @@
|
| # Just return if we are only building the targets for running the tests.
|
| if options.build_only:
|
| return 0
|
| -
|
| +
|
| # Get status for tests
|
| sections = [ ]
|
| defs = { }
|
|
|