| OLD | NEW |
| 1 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 # for details. All rights reserved. Use of this source code is governed by a | 2 # for details. All rights reserved. Use of this source code is governed by a |
| 3 # BSD-style license that can be found in the LICENSE file. | 3 # BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import atexit | 5 """Common TestCase subclasses used to define a single test.""" |
| 6 import fileinput | 6 |
| 7 import os | 7 import os |
| 8 import test | |
| 9 import platform | |
| 10 import re | |
| 11 import sys | |
| 12 import tempfile | 8 import tempfile |
| 13 | 9 |
| 14 import architecture | |
| 15 import test | 10 import test |
| 16 import utils | 11 from testing import architecture |
| 17 | 12 |
| 18 from os.path import join, exists, basename | |
| 19 | |
| 20 import utils | |
| 21 | 13 |
| 22 class Error(Exception): | 14 class Error(Exception): |
| 23 pass | 15 pass |
| 24 | 16 |
| 25 | 17 |
| 26 class StandardTestCase(test.TestCase): | 18 class StandardTestCase(test.TestCase): |
| 27 def __init__(self, context, path, filename, mode, arch, vm_options = []): | 19 """A test case defined by a *Test.dart file.""" |
| 20 |
| 21 def __init__(self, context, path, filename, mode, arch, vm_options=None): |
| 28 super(StandardTestCase, self).__init__(context, path) | 22 super(StandardTestCase, self).__init__(context, path) |
| 29 self.filename = filename | 23 self.filename = filename |
| 30 self.mode = mode | 24 self.mode = mode |
| 31 self.arch = arch | 25 self.arch = arch |
| 32 self.run_arch = architecture.GetArchitecture(self.arch, self.mode, | 26 self.run_arch = architecture.GetArchitecture(self.arch, self.mode, |
| 33 self.filename) | 27 self.filename) |
| 34 for flag in context.flags: | 28 for flag in context.flags: |
| 35 self.run_arch.vm_options.append(flag) | 29 self.run_arch.vm_options.append(flag) |
| 36 | 30 |
| 37 for flag in vm_options: | 31 if vm_options: |
| 38 self.run_arch.vm_options.append(flag) | 32 for flag in vm_options: |
| 33 self.run_arch.vm_options.append(flag) |
| 39 | 34 |
| 40 def IsNegative(self): | 35 def IsNegative(self): |
| 41 return self.GetName().endswith("NegativeTest") | 36 return self.GetName().endswith('NegativeTest') |
| 42 | 37 |
| 43 def GetLabel(self): | 38 def GetLabel(self): |
| 44 return "%s%s %s" % (self.mode, self.arch, '/'.join(self.path)) | 39 return '%s%s %s' % (self.mode, self.arch, '/'.join(self.path)) |
| 45 | 40 |
| 46 def GetCommand(self): | 41 def GetCommand(self): |
| 47 return self.run_arch.GetRunCommand(); | 42 return self.run_arch.GetRunCommand() |
| 48 | 43 |
| 49 def GetName(self): | 44 def GetName(self): |
| 50 return self.path[-1] | 45 return self.path[-1] |
| 51 | 46 |
| 52 def GetPath(self): | 47 def GetPath(self): |
| 53 return os.path.dirname(self.filename) | 48 return os.path.dirname(self.filename) |
| 54 | 49 |
| 55 def GetSource(self): | 50 def GetSource(self): |
| 56 return file(self.filename).read() | 51 return file(self.filename).read() |
| 57 | 52 |
| 58 def Cleanup(self): | 53 def Cleanup(self): |
| 59 # TODO(ngeoffray): We run out of space on the build bots for these tests if | 54 # TODO(ngeoffray): We run out of space on the build bots for these tests if |
| 60 # the temp directories are not removed right after running the test. | 55 # the temp directories are not removed right after running the test. |
| 61 if not self.context.keep_temporary_files: self.run_arch.Cleanup() | 56 if not self.context.keep_temporary_files: |
| 57 self.run_arch.Cleanup() |
| 62 | 58 |
| 63 | 59 |
| 64 class MultiTestCase(StandardTestCase): | 60 class MultiTestCase(StandardTestCase): |
| 61 """Multiple test cases defined within a single *Test.dart file.""" |
| 65 | 62 |
| 66 def __init__(self, context, path, filename, kind, mode, arch): | 63 def __init__(self, context, path, filename, kind, mode, arch): |
| 67 super(MultiTestCase, self).__init__(context, path, filename, mode, arch) | 64 super(MultiTestCase, self).__init__(context, path, filename, mode, arch) |
| 68 self.kind = kind | 65 self.kind = kind |
| 69 | 66 |
| 70 def GetCommand(self): | 67 def GetCommand(self): |
| 68 """Returns a commandline to execute to perform the test.""" |
| 71 return self.run_arch.GetRunCommand( | 69 return self.run_arch.GetRunCommand( |
| 72 fatal_static_type_errors=(self.kind == 'static type error')); | 70 fatal_static_type_errors=(self.kind == 'static type error')) |
| 73 | 71 |
| 74 def IsNegative(self): | 72 def IsNegative(self): |
| 73 """Determine if this is a negative test. by looking at @ directives. |
| 74 |
| 75 A negative test is considered to pas if its outcome is FAIL. |
| 76 |
| 77 Returns: |
| 78 True if this is a negative test. |
| 79 """ |
| 75 if self.kind == 'compile-time error': | 80 if self.kind == 'compile-time error': |
| 76 return True | 81 return True |
| 77 if self.kind == 'runtime error': | 82 if self.kind == 'runtime error': |
| 78 return False | 83 return False |
| 79 if self.kind == 'static type error': | 84 if self.kind == 'static type error': |
| 80 return self.run_arch.HasFatalTypeErrors() | 85 return self.run_arch.HasFatalTypeErrors() |
| 81 return False | 86 return False |
| 82 | 87 |
| 88 |
| 83 class BrowserTestCase(StandardTestCase): | 89 class BrowserTestCase(StandardTestCase): |
| 90 """A test case that executes inside a browser (or DumpRenderTree).""" |
| 91 |
| 84 def __init__(self, context, path, filename, | 92 def __init__(self, context, path, filename, |
| 85 fatal_static_type_errors, mode, arch): | 93 fatal_static_type_errors, mode, arch): |
| 86 super(BrowserTestCase, self).__init__(context, path, filename, mode, arch) | 94 super(BrowserTestCase, self).__init__(context, path, filename, mode, arch) |
| 87 self.fatal_static_type_errors = fatal_static_type_errors | 95 self.fatal_static_type_errors = fatal_static_type_errors |
| 88 | 96 |
| 89 | |
| 90 def Run(self): | 97 def Run(self): |
| 98 """Optionally compiles and then runs the specified test.""" |
| 91 command = self.run_arch.GetCompileCommand(self.fatal_static_type_errors) | 99 command = self.run_arch.GetCompileCommand(self.fatal_static_type_errors) |
| 92 if command != None: | 100 if command: |
| 93 # We change the directory where dartc will be launched because | 101 # We change the directory where dartc will be launched because |
| 94 # it is not predictable on the location of the compiled file. In | 102 # it is not predictable on the location of the compiled file. In |
| 95 # case the test is a web test, we make sure the app file is not | 103 # case the test is a web test, we make sure the app file is not |
| 96 # in a subdirectory. | 104 # in a subdirectory. |
| 97 cwd = None | 105 cwd = None |
| 98 if self.run_arch.is_web_test: cwd = self.run_arch.temp_dir | 106 if self.run_arch.is_web_test: cwd = self.run_arch.temp_dir |
| 99 command = command[:1] + self.context.flags + command[1:] | 107 command = command[:1] + self.context.flags + command[1:] |
| 100 test_output = self.RunCommand(command, cwd=cwd, cleanup=False) | 108 test_output = self.RunCommand(command, cwd=cwd, cleanup=False) |
| 101 | 109 |
| 102 # If errors were found, fail fast and show compile errors: | 110 # If errors were found, fail fast and show compile errors: |
| 103 if test_output.output.exit_code != 0: | 111 if test_output.output.exit_code != 0: |
| 104 return test_output | 112 return test_output |
| 105 | 113 |
| 106 command = self.run_arch.GetRunCommand(); | 114 command = self.run_arch.GetRunCommand() |
| 107 test_output = self.RunCommand(command) | 115 test_output = self.RunCommand(command) |
| 108 # The return value of DumpRenderedTree does not indicate test failing, but | 116 # The return value of DumpRenderedTree does not indicate test failing, but |
| 109 # the output does. | 117 # the output does. |
| 110 if self.run_arch.HasFailed(test_output.output.stdout): | 118 if self.run_arch.HasFailed(test_output.output.stdout): |
| 111 test_output.output.exit_code = 1 | 119 test_output.output.exit_code = 1 |
| 112 | 120 |
| 113 return test_output | 121 return test_output |
| 114 | 122 |
| 115 | 123 |
| 116 class CompilationTestCase(test.TestCase): | 124 class CompilationTestCase(test.TestCase): |
| 117 """ Run the dartc compiler on a given top level dart file """ | 125 """Run the dartc compiler on a given top level .dart file.""" |
| 126 |
| 118 def __init__(self, path, context, filename, mode, arch): | 127 def __init__(self, path, context, filename, mode, arch): |
| 119 super(CompilationTestCase, self).__init__(context, path) | 128 super(CompilationTestCase, self).__init__(context, path) |
| 120 self.filename = filename | 129 self.filename = filename |
| 121 self.mode = mode | 130 self.mode = mode |
| 122 self.arch = arch | 131 self.arch = arch |
| 123 self.run_arch = architecture.GetArchitecture(self.arch, self.mode, | 132 self.run_arch = architecture.GetArchitecture(self.arch, self.mode, |
| 124 self.filename) | 133 self.filename) |
| 125 self.temp_dir = tempfile.mkdtemp(prefix='dartc-output-') | 134 self.temp_dir = tempfile.mkdtemp(prefix='dartc-output-') |
| 126 | 135 |
| 127 def IsNegative(self): | 136 def IsNegative(self): |
| 128 return False | 137 return False |
| 129 | 138 |
| 130 def GetLabel(self): | 139 def GetLabel(self): |
| 131 return "%s/%s %s" % (self.mode, self.arch, '/'.join(self.path)) | 140 return '%s/%s %s' % (self.mode, self.arch, '/'.join(self.path)) |
| 132 | 141 |
| 133 def GetCommand(self): | 142 def GetCommand(self): |
| 134 cmd = self.context.GetDartC(self.mode, self.arch); | 143 """Returns a command line to run the test.""" |
| 144 cmd = self.context.GetDartC(self.mode, self.arch) |
| 135 cmd += self.context.flags | 145 cmd += self.context.flags |
| 136 cmd += ['-check-only', | 146 cmd += ['-check-only', |
| 137 '-fatal-type-errors', | 147 '-fatal-type-errors', |
| 138 '-Werror', | 148 '-Werror', |
| 139 '-out', self.temp_dir, | 149 '-out', self.temp_dir, |
| 140 self.filename] | 150 self.filename] |
| 141 | 151 |
| 142 return cmd | 152 return cmd |
| 143 | 153 |
| 144 def GetName(self): | 154 def GetName(self): |
| 145 return self.path[-1] | 155 return self.path[-1] |
| OLD | NEW |