OLD | NEW |
| (Empty) |
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 | |
3 # BSD-style license that can be found in the LICENSE file. | |
4 | |
5 import os | |
6 import re | |
7 import shutil | |
8 import sys | |
9 import tempfile | |
10 | |
11 import test | |
12 from testing import test_case,test_configuration | |
13 import utils | |
14 | |
15 from os.path import join, exists, isdir | |
16 | |
17 def GeneratedName(src): | |
18 return re.sub('\.dart$', '-generatedTest.dart', src) | |
19 | |
20 class DartStubTestCase(test_case.StandardTestCase): | |
21 def __init__(self, context, path, filename, mode, arch, component): | |
22 super(DartStubTestCase, self).__init__(context, path, filename, mode, arch, | |
23 component) | |
24 self.filename = filename | |
25 self.mode = mode | |
26 self.arch = arch | |
27 self.component = component | |
28 | |
29 def IsBatchable(self): | |
30 return False | |
31 | |
32 def GetStubs(self): | |
33 source = self.GetSource() | |
34 stub_classes = utils.ParseTestOptions(test.ISOLATE_STUB_PATTERN, source, | |
35 self.context.workspace) | |
36 if stub_classes is None: | |
37 return (None, None, None) | |
38 (interface, _, classes) = stub_classes[0].partition(':') | |
39 (interface, _, implementation) = interface.partition('+') | |
40 return (interface, classes, implementation) | |
41 | |
42 def IsFailureOutput(self, output): | |
43 return output.exit_code != 0 or not '##DONE##' in output.stdout | |
44 | |
45 def BeforeRun(self): | |
46 if not self.context.generate: | |
47 return | |
48 (interface, classes, _) = self.GetStubs() | |
49 if interface is None: | |
50 return | |
51 d = join(self.GetPath(), 'generated') | |
52 if not isdir(d): | |
53 os.mkdir(d) | |
54 tmpdir = tempfile.mkdtemp() | |
55 src = join(self.GetPath(), interface) | |
56 dest = join(self.GetPath(), GeneratedName(interface)) | |
57 (_, tmp) = tempfile.mkstemp() | |
58 command = self.context.GetDartC(self.mode, self.arch) | |
59 self.RunCommand(command + [ src, | |
60 # dartc generates output even if it has no | |
61 # output to generate. | |
62 '-noincremental', | |
63 '-out', tmpdir, | |
64 '-isolate-stub-out', tmp, | |
65 '-generate-isolate-stubs', classes ]) | |
66 shutil.rmtree(tmpdir) | |
67 | |
68 # Copy comments and # commands from the beginning of the source to | |
69 # the beginning of the generated file, then copy the remaining | |
70 # source to the end. | |
71 d = open(dest, 'w') | |
72 s = open(src, 'r') | |
73 t = open(tmp, 'r') | |
74 while True: | |
75 line = s.readline() | |
76 if not (re.match('^\s+$', line) or line.startswith('//') | |
77 or line.startswith('#')): | |
78 break | |
79 d.write(line) | |
80 d.write(t.read()) | |
81 os.remove(tmp) | |
82 d.write(line) | |
83 d.write(s.read()) | |
84 | |
85 def GetCommand(self): | |
86 # Parse the options by reading the .dart source file. | |
87 source = self.GetSource() | |
88 vm_options = utils.ParseTestOptions(test.VM_OPTIONS_PATTERN, source, | |
89 self.context.workspace) | |
90 dart_options = utils.ParseTestOptions(test.DART_OPTIONS_PATTERN, source, | |
91 self.context.workspace) | |
92 (interface, _, implementation) = self.GetStubs() | |
93 | |
94 # Combine everything into a command array and return it. | |
95 command = self.context.GetDart(self.mode, self.arch, self.component) | |
96 if interface is None: | |
97 f = self.filename | |
98 else: | |
99 f = GeneratedName(interface) | |
100 files = [ join(self.GetPath(), f) ] | |
101 if vm_options: command += vm_options | |
102 if dart_options: command += dart_options | |
103 else: command += files | |
104 return command | |
105 | |
106 | |
107 class DartStubTestConfiguration(test_configuration.StandardTestConfiguration): | |
108 def __init__(self, context, root): | |
109 super(DartStubTestConfiguration, self).__init__(context, root) | |
110 | |
111 def ListTests(self, current_path, path, mode, arch, component): | |
112 dartc = self.context.GetDartC(mode, arch) | |
113 self.context.generate = os.access(dartc[0], os.X_OK) | |
114 tests = [] | |
115 for root, dirs, files in os.walk(join(self.root, 'src')): | |
116 # Skip remnants from the subdirectory that used to be used for | |
117 # generated code. | |
118 if root.endswith('generated'): | |
119 continue | |
120 for f in [x for x in files if self.IsTest(x)]: | |
121 # If we can generate code, do not use the checked-in generated | |
122 # code. Conversely, if we cannot, then only use the | |
123 # checked-in generated code. | |
124 if self.context.generate == f.endswith('-generatedTest.dart'): | |
125 continue | |
126 test_path = current_path + [ f[:-5] ] # Remove .dart suffix. | |
127 if not self.Contains(path, test_path): | |
128 continue | |
129 tests.append(DartStubTestCase(self.context, | |
130 test_path, | |
131 join(root, f), | |
132 mode, | |
133 arch, | |
134 component)) | |
135 return tests | |
136 | |
137 | |
138 def GetConfiguration(context, root): | |
139 return DartStubTestConfiguration(context, root) | |
OLD | NEW |