Index: tools/testing/test_configuration.py |
diff --git a/tools/testing/test_configuration.py b/tools/testing/test_configuration.py |
deleted file mode 100644 |
index af6de32a39df222a987dafe710acf50ea79cf174..0000000000000000000000000000000000000000 |
--- a/tools/testing/test_configuration.py |
+++ /dev/null |
@@ -1,326 +0,0 @@ |
-# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-# for details. All rights reserved. Use of this source code is governed by a |
-# BSD-style license that can be found in the LICENSE file. |
- |
-"""Common Testconfiguration subclasses used to define a class of tests.""" |
- |
-import atexit |
-import fileinput |
-import os |
-import re |
-import shutil |
- |
- |
-import test |
-from testing import test_case |
-import utils |
- |
- |
-# Patterns for matching test options in .dart files. |
-VM_OPTIONS_PATTERN = re.compile(r"// VMOptions=(.*)") |
- |
-class Error(Exception): |
- pass |
- |
- |
-class TestConfigurationError(Error): |
- pass |
- |
- |
-class StandardTestConfiguration(test.TestConfiguration): |
- """Configuration that looks for .dart files in the tests/*/src dirs.""" |
- LEGAL_KINDS = set(['compile-time error', |
- 'runtime error', |
- 'static type error', |
- 'dynamic type error']) |
- |
- def __init__(self, context, root, flags = []): |
- super(StandardTestConfiguration, self).__init__(context, root, flags) |
- |
- def _Cleanup(self, tests): |
- """Remove any temporary files created by running the test.""" |
- if self.context.keep_temporary_files: |
- return |
- |
- dirs = [] |
- for t in tests: |
- if t.run_arch: |
- temp_dir = t.run_arch.temp_dir |
- if temp_dir: |
- dirs.append(temp_dir) |
- if not dirs: |
- return |
- if not utils.Daemonize(): |
- return |
- os.execlp('rm', *(['rm', '-rf'] + dirs)) |
- |
- def CreateTestCases(self, test_path, path, filename, mode, arch, component): |
- """Given a .dart filename, create a StandardTestCase from it.""" |
- # Look for VM specified as comments in the source file. If |
- # several sets of VM options are specified create a separate |
- # test for each set. |
- source = file(filename).read() |
- vm_options_list = utils.ParseTestOptionsMultiple(VM_OPTIONS_PATTERN, |
- source, |
- test_path) |
- tags = {} |
- if filename.endswith('.dart'): |
- tags = self.SplitMultiTest(test_path, filename) |
- if component in ['dartium', 'chromium', 'frogium', 'webdriver']: |
- if tags: |
- return [] |
- else: |
- if vm_options_list: |
- tests = [] |
- for options in vm_options_list: |
- tests.append(test_case.BrowserTestCase( |
- self.context, test_path, filename, False, mode, arch, component, |
- options + self.flags)) |
- return tests |
- else: |
- return [test_case.BrowserTestCase( |
- self.context, test_path, filename, False, mode, arch, component, |
- self.flags)] |
- else: |
- tests = [] |
- if tags: |
- for tag in sorted(tags): |
- kind, test_source = tags[tag] |
- if not self.Contains(path, test_path + [tag]): |
- continue |
- if vm_options_list: |
- for options in vm_options_list: |
- tests.append(test_case.MultiTestCase(self.context, |
- test_path + [tag], |
- test_source, |
- kind, |
- mode, arch, component, |
- options + self.flags)) |
- else: |
- tests.append(test_case.MultiTestCase(self.context, |
- test_path + [tag], |
- test_source, |
- kind, |
- mode, arch, component, |
- self.flags)) |
- else: |
- if vm_options_list: |
- for options in vm_options_list: |
- tests.append(test_case.StandardTestCase(self.context, |
- test_path, filename, mode, arch, component, |
- options + self.flags)) |
- else: |
- tests.append(test_case.StandardTestCase(self.context, |
- test_path, filename, mode, arch, component, self.flags)) |
- return tests |
- |
- def ListTests(self, current_path, path, mode, arch, component): |
- """Searches for *Test.dart files and returns list of TestCases.""" |
- tests = [] |
- for root, unused_dirs, files in os.walk(os.path.join(self.root, 'src')): |
- for f in [x for x in files if self.IsTest(x)]: |
- if f.endswith('.dart'): |
- test_path = current_path + [f[:-5]] # Remove .dart suffix. |
- elif f.endswith('.app'): |
- # TODO(zundel): .app files are used only the dromaeo test |
- # and should be removed. |
- test_path = current_path + [f[:-4]] # Remove .app suffix. |
- if not self.Contains(path, test_path): |
- continue |
- tests.extend(self.CreateTestCases(test_path, path, |
- os.path.join(root, f), |
- mode, arch, component)) |
- atexit.register(lambda: self._Cleanup(tests)) |
- return tests |
- |
- def IsTest(self, name): |
- """Returns True if the file name is a test file.""" |
- return name.endswith('Test.dart') or name.endswith('Test.app') |
- |
- def GetTestStatus(self, sections, defs): |
- """Reads the .status file of the TestSuite.""" |
- basename = os.path.basename(self.root) |
- for component in ['%s.status', '%s-leg.status']: |
- status = os.path.join(self.root, component % basename) |
- if os.path.exists(status): |
- test.ReadConfigurationInto(status, sections, defs) |
- |
- def FindReferencedFiles(self, lines): |
- """Scours the lines containing source code for include directives.""" |
- referenced_files = [] |
- for line in lines: |
- m = re.match("#(source|import)\(['\"](.*)['\"]\);", line) |
- if m: |
- file_name = m.group(2) |
- if not file_name.startswith('dart:'): |
- referenced_files.append(file_name) |
- return referenced_files |
- |
- def SplitMultiTest(self, test_path, filename): |
- """Takes a file with multiple test case defined. |
- |
- Splits the file into multiple TestCase instances. |
- |
- Args: |
- test_path: temporary dir to write split test case data. |
- filename: name of the file to split. |
- |
- Returns: |
- sequence of test cases split from file. |
- |
- Raises: |
- TestConfigurationError: when a problem with the multi-test-case |
- syntax is encountered. |
- """ |
- (name, extension) = os.path.splitext(os.path.basename(filename)) |
- with open(filename, 'r') as s: |
- source = s.read() |
- lines = source.splitlines() |
- tags = {} |
- for line in lines: |
- (unused_code, sep, info) = line.partition(' /// ') |
- if sep: |
- (tag, sep, kind) = info.partition(': ') |
- if tag in tags: |
- if kind != 'continued': |
- raise TestConfigurationError('duplicated tag %s' % tag) |
- elif kind not in StandardTestConfiguration.LEGAL_KINDS: |
- raise TestConfigurationError('unrecognized kind %s' % kind) |
- else: |
- tags[tag] = kind |
- if not tags: |
- return {} |
- # Prepare directory for generated tests. |
- tests = {} |
- generated_test_dir = os.path.join(utils.GetBuildRoot(utils.GuessOS()), |
- 'generated_tests') |
- generated_test_dir = os.path.join(generated_test_dir, *test_path[:-1]) |
- if not os.path.exists(generated_test_dir): |
- os.makedirs(generated_test_dir) |
- # Copy referenced files to generated tests directory. |
- referenced_files = self.FindReferencedFiles(lines) |
- for referenced_file in referenced_files: |
- shutil.copy(os.path.join(os.path.dirname(filename), referenced_file), |
- os.path.join(generated_test_dir, referenced_file)) |
- # Generate test for each tag found in the main test file. |
- for tag in tags: |
- test_lines = [] |
- for line in lines: |
- if ' /// ' in line: |
- if ' /// %s:' % tag in line: |
- test_lines.append(line) |
- else: |
- test_lines.append('// %s' % line) |
- else: |
- test_lines.append(line) |
- test_filename = os.path.join(generated_test_dir, |
- '%s_%s%s' % (name, tag, extension)) |
- with open(test_filename, 'w') as test_file: |
- for line in test_lines: |
- print >> test_file, line |
- tests[tag] = (tags[tag], test_filename) |
- test_filename = os.path.join(generated_test_dir, |
- '%s%s' % (name, extension)) |
- with open(test_filename, 'w') as test_file: |
- for line in lines: |
- if ' /// ' not in line: |
- print >> test_file, line |
- else: |
- print >> test_file, '//', line |
- tests['none'] = ('', test_filename) |
- return tests |
- |
- |
-class BrowserTestConfiguration(StandardTestConfiguration): |
- """A configuration used to run tests inside a browser.""" |
- |
- def __init__(self, context, root, fatal_static_type_errors=False): |
- super(BrowserTestConfiguration, self).__init__(context, root) |
- self.fatal_static_type_errors = fatal_static_type_errors |
- |
- def ListTests(self, current_path, path, mode, arch, component): |
- """Searches for *Test .dart files and returns list of TestCases.""" |
- tests = [] |
- for root, unused_dirs, files in os.walk(self.root): |
- for f in [x for x in files if self.IsTest(x)]: |
- relative = os.path.relpath(root, self.root).split(os.path.sep) |
- test_path = current_path + relative + [os.path.splitext(f)[0]] |
- if not self.Contains(path, test_path): |
- continue |
- tests.append(test_case.BrowserTestCase(self.context, |
- test_path, |
- os.path.join(root, f), |
- self.fatal_static_type_errors, |
- mode, arch, component)) |
- atexit.register(lambda: self._Cleanup(tests)) |
- return tests |
- |
- def IsTest(self, name): |
- return name.endswith('_tests.dart') or name.endswith('Test.dart') |
- |
- |
-class CompilationTestConfiguration(test.TestConfiguration): |
- """Configuration that searches specific directories for apps to compile. |
- |
- Expects a status file named dartc.status |
- """ |
- |
- def __init__(self, context, root): |
- super(CompilationTestConfiguration, self).__init__(context, root) |
- |
- def ListTests(self, current_path, path, mode, arch, component): |
- """Searches for files satisfying IsTest() and returns list of TestCases.""" |
- tests = [] |
- client_path = os.path.normpath(os.path.join(self.root, '..', '..')) |
- |
- for src_dir in self.SourceDirs(): |
- for root, dirs, files in os.walk(os.path.join(client_path, src_dir)): |
- ignore_dirs = [d for d in dirs if d.startswith('.')] |
- for d in ignore_dirs: |
- dirs.remove(d) |
- for f in files: |
- filename = [os.path.basename(client_path)] |
- filename.extend(root[len(client_path) + 1:].split(os.path.sep)) |
- filename.append(f) # Remove .lib or .app suffix. |
- test_path = current_path + filename |
- test_dart_file = os.path.join(root, f) |
- if (not self.Contains(path, test_path) |
- or not self.IsTest(test_dart_file)): |
- continue |
- tests.append(test_case.CompilationTestCase(test_path, |
- self.context, |
- test_dart_file, |
- mode, |
- arch, |
- component)) |
- atexit.register(lambda: self._Cleanup(tests)) |
- return tests |
- |
- def SourceDirs(self): |
- """Returns a list of directories to scan for files to compile.""" |
- raise TestConfigurationError( |
- 'Subclasses must implement SourceDirs()') |
- |
- def IsTest(self, name): |
- """Returns True if name is a test case to be compiled.""" |
- if not name.endswith('.dart'): |
- return False |
- if os.path.exists(name): |
- # TODO(dgrove): can we end reading the input early? |
- for line in fileinput.input(name): |
- if re.match('#', line): |
- fileinput.close() |
- return True |
- fileinput.close() |
- return False |
- return False |
- |
- def GetTestStatus(self, sections, defs): |
- status = os.path.join(self.root, 'dartc.status') |
- if os.path.exists(status): |
- test.ReadConfigurationInto(status, sections, defs) |
- |
- def _Cleanup(self, tests): |
- if not utils.Daemonize(): return |
- os.execlp('rm', *(['rm', '-rf'] + [t.temp_dir for t in tests])) |
- raise |