| 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 import atexit |
| 6 import fileinput | 6 import fileinput |
| 7 import os | 7 import os |
| 8 import test | 8 import test |
| 9 import platform | 9 import platform |
| 10 import re | 10 import re |
| 11 import shutil | 11 import shutil |
| 12 import sys | 12 import sys |
| 13 import tempfile | 13 import tempfile |
| 14 | 14 |
| 15 from testing import test_case | 15 from testing import test_case |
| 16 import test | 16 import test |
| 17 import utils | 17 import utils |
| 18 | 18 |
| 19 from os.path import join, exists, basename | 19 from os.path import join, exists, basename |
| 20 | 20 |
| 21 import utils | 21 import utils |
| 22 | 22 |
| 23 # Patterns for matching test options in .dart files. |
| 24 VM_OPTIONS_PATTERN = re.compile(r"// VMOptions=(.*)") |
| 25 |
| 23 class Error(Exception): | 26 class Error(Exception): |
| 24 pass | 27 pass |
| 25 | 28 |
| 26 class TestConfigurationError(Error): | 29 class TestConfigurationError(Error): |
| 27 pass | 30 pass |
| 28 | 31 |
| 29 class StandardTestConfiguration(test.TestConfiguration): | 32 class StandardTestConfiguration(test.TestConfiguration): |
| 30 LEGAL_KINDS = set(['compile-time error', | 33 LEGAL_KINDS = set(['compile-time error', |
| 31 'runtime error', | 34 'runtime error', |
| 32 'static type error', | 35 'static type error', |
| (...skipping 30 matching lines...) Expand all Loading... |
| 63 else: | 66 else: |
| 64 tests = [] | 67 tests = [] |
| 65 if tags: | 68 if tags: |
| 66 for tag in sorted(tags): | 69 for tag in sorted(tags): |
| 67 kind, test_source = tags[tag] | 70 kind, test_source = tags[tag] |
| 68 if not self.Contains(path, test_path + [tag]): | 71 if not self.Contains(path, test_path + [tag]): |
| 69 continue | 72 continue |
| 70 tests.append(test_case.MultiTestCase(self.context, | 73 tests.append(test_case.MultiTestCase(self.context, |
| 71 test_path + [tag], test_source, kind, mode, arch)) | 74 test_path + [tag], test_source, kind, mode, arch)) |
| 72 else: | 75 else: |
| 73 tests.append(test_case.StandardTestCase(self.context, | 76 # Look for VM specified as comments in the source file. If |
| 74 test_path, filename, mode, arch)) | 77 # several sets of VM options are specified create a separate |
| 78 # test for each set. |
| 79 source = file(filename).read() |
| 80 vm_options_list = utils.ParseTestOptionsMultiple(VM_OPTIONS_PATTERN, |
| 81 source, |
| 82 test_path) |
| 83 if vm_options_list: |
| 84 for options in vm_options_list: |
| 85 tests.append(test_case.StandardTestCase(self.context, |
| 86 test_path, filename, mode, arch, options)) |
| 87 else: |
| 88 tests.append(test_case.StandardTestCase(self.context, |
| 89 test_path, filename, mode, arch)) |
| 75 return tests | 90 return tests |
| 76 | 91 |
| 77 def ListTests(self, current_path, path, mode, arch): | 92 def ListTests(self, current_path, path, mode, arch): |
| 78 tests = [] | 93 tests = [] |
| 79 for root, dirs, files in os.walk(join(self.root, 'src')): | 94 for root, dirs, files in os.walk(join(self.root, 'src')): |
| 80 for f in [x for x in files if self.IsTest(x)]: | 95 for f in [x for x in files if self.IsTest(x)]: |
| 81 if f.endswith(".dart"): | 96 if f.endswith(".dart"): |
| 82 test_path = current_path + [ f[:-5] ] # Remove .dart suffix. | 97 test_path = current_path + [ f[:-5] ] # Remove .dart suffix. |
| 83 elif f.endswith(".app"): | 98 elif f.endswith(".app"): |
| 84 test_path = current_path + [ f[:-4] ] # Remove .app suffix. | 99 test_path = current_path + [ f[:-4] ] # Remove .app suffix. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 return tests | 177 return tests |
| 163 | 178 |
| 164 class BrowserTestCase(test_case.StandardTestCase): | 179 class BrowserTestCase(test_case.StandardTestCase): |
| 165 def __init__(self, context, path, filename, | 180 def __init__(self, context, path, filename, |
| 166 fatal_static_type_errors, mode, arch): | 181 fatal_static_type_errors, mode, arch): |
| 167 super(test_case.BrowserTestCase, self).__init__(context, path, filename, mod
e, arch) | 182 super(test_case.BrowserTestCase, self).__init__(context, path, filename, mod
e, arch) |
| 168 self.fatal_static_type_errors = fatal_static_type_errors | 183 self.fatal_static_type_errors = fatal_static_type_errors |
| 169 | 184 |
| 170 def IsBatchable(self): | 185 def IsBatchable(self): |
| 171 return True | 186 return True |
| 172 | 187 |
| 173 def Run(self): | 188 def Run(self): |
| 174 command = self.run_arch.GetCompileCommand(self.fatal_static_type_errors) | 189 command = self.run_arch.GetCompileCommand(self.fatal_static_type_errors) |
| 175 if command != None: | 190 if command != None: |
| 176 # We change the directory where dartc will be launched because | 191 # We change the directory where dartc will be launched because |
| 177 # it is not predictable on the location of the compiled file. In | 192 # it is not predictable on the location of the compiled file. In |
| 178 # case the test is a web test, we make sure the app file is not | 193 # case the test is a web test, we make sure the app file is not |
| 179 # in a subdirectory. | 194 # in a subdirectory. |
| 180 cwd = None | 195 cwd = None |
| 181 if self.run_arch.is_web_test: cwd = self.run_arch.temp_dir | 196 if self.run_arch.is_web_test: cwd = self.run_arch.temp_dir |
| 182 command = command[:1] + self.context.flags + command[1:] | 197 command = command[:1] + self.context.flags + command[1:] |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 for root, dirs, files in os.walk(os.path.join(client_path, src_dir)): | 257 for root, dirs, files in os.walk(os.path.join(client_path, src_dir)): |
| 243 ignore_dirs = [d for d in dirs if d.startswith('.')] | 258 ignore_dirs = [d for d in dirs if d.startswith('.')] |
| 244 for d in ignore_dirs: | 259 for d in ignore_dirs: |
| 245 dirs.remove(d) | 260 dirs.remove(d) |
| 246 for f in files: | 261 for f in files: |
| 247 filename = [os.path.basename(client_path)] | 262 filename = [os.path.basename(client_path)] |
| 248 filename.extend(root[len(client_path) + 1:].split(os.path.sep)) | 263 filename.extend(root[len(client_path) + 1:].split(os.path.sep)) |
| 249 filename.append(f) # Remove .lib or .app suffix. | 264 filename.append(f) # Remove .lib or .app suffix. |
| 250 test_path = current_path + filename | 265 test_path = current_path + filename |
| 251 test_dart_file = os.path.join(root, f) | 266 test_dart_file = os.path.join(root, f) |
| 252 if ((not self.Contains(path, test_path)) | 267 if ((not self.Contains(path, test_path)) |
| 253 or (not self.IsTest(test_dart_file))): | 268 or (not self.IsTest(test_dart_file))): |
| 254 continue | 269 continue |
| 255 tests.append(test_case.CompilationTestCase(test_path, | 270 tests.append(test_case.CompilationTestCase(test_path, |
| 256 self.context, | 271 self.context, |
| 257 test_dart_file, | 272 test_dart_file, |
| 258 mode, | 273 mode, |
| 259 arch)) | 274 arch)) |
| 260 atexit.register(lambda: self._cleanup(tests)) | 275 atexit.register(lambda: self._cleanup(tests)) |
| 261 return tests | 276 return tests |
| 262 | 277 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 280 | 295 |
| 281 def GetTestStatus(self, sections, defs): | 296 def GetTestStatus(self, sections, defs): |
| 282 status = os.path.join(self.root, 'dartc.status') | 297 status = os.path.join(self.root, 'dartc.status') |
| 283 if os.path.exists(status): | 298 if os.path.exists(status): |
| 284 test.ReadConfigurationInto(status, sections, defs) | 299 test.ReadConfigurationInto(status, sections, defs) |
| 285 | 300 |
| 286 def _cleanup(self, tests): | 301 def _cleanup(self, tests): |
| 287 if not utils.Daemonize(): return | 302 if not utils.Daemonize(): return |
| 288 os.execlp('rm', *(['rm', '-rf'] + [t.temp_dir for t in tests])) | 303 os.execlp('rm', *(['rm', '-rf'] + [t.temp_dir for t in tests])) |
| 289 raise | 304 raise |
| OLD | NEW |