| OLD | NEW |
| 1 # Copyright 2012 the V8 project authors. All rights reserved. | 1 # Copyright 2012 the V8 project authors. All rights reserved. |
| 2 # Redistribution and use in source and binary forms, with or without | 2 # Redistribution and use in source and binary forms, with or without |
| 3 # modification, are permitted provided that the following conditions are | 3 # modification, are permitted provided that the following conditions are |
| 4 # met: | 4 # met: |
| 5 # | 5 # |
| 6 # * Redistributions of source code must retain the above copyright | 6 # * Redistributions of source code must retain the above copyright |
| 7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
| 8 # * Redistributions in binary form must reproduce the above | 8 # * Redistributions in binary form must reproduce the above |
| 9 # copyright notice, this list of conditions and the following | 9 # copyright notice, this list of conditions and the following |
| 10 # disclaimer in the documentation and/or other materials provided | 10 # disclaimer in the documentation and/or other materials provided |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 27 | 27 |
| 28 | 28 |
| 29 import imp | 29 import imp |
| 30 import os | 30 import os |
| 31 | 31 |
| 32 from . import commands | 32 from . import commands |
| 33 from . import statusfile | 33 from . import statusfile |
| 34 from . import utils | 34 from . import utils |
| 35 from ..objects import testcase | 35 from ..objects import testcase |
| 36 from variants import ALL_VARIANTS, ALL_VARIANT_FLAGS, FAST_VARIANT_FLAGS |
| 36 | 37 |
| 37 # Use this to run several variants of the tests. | |
| 38 ALL_VARIANT_FLAGS = { | |
| 39 "default": [[]], | |
| 40 "stress": [["--stress-opt", "--always-opt"]], | |
| 41 "turbofan": [["--turbo"]], | |
| 42 "turbofan_opt": [["--turbo", "--always-opt"]], | |
| 43 "nocrankshaft": [["--nocrankshaft"]], | |
| 44 "ignition": [["--ignition"]], | |
| 45 "ignition_turbofan": [["--ignition-staging", "--turbo"]], | |
| 46 "preparser": [["--min-preparse-length=0"]], | |
| 47 } | |
| 48 | 38 |
| 49 # FAST_VARIANTS implies no --always-opt. | |
| 50 FAST_VARIANT_FLAGS = { | |
| 51 "default": [[]], | |
| 52 "stress": [["--stress-opt"]], | |
| 53 "turbofan": [["--turbo"]], | |
| 54 "nocrankshaft": [["--nocrankshaft"]], | |
| 55 "ignition": [["--ignition"]], | |
| 56 "ignition_turbofan": [["--ignition-staging", "--turbo"]], | |
| 57 "preparser": [["--min-preparse-length=0"]], | |
| 58 } | |
| 59 | |
| 60 ALL_VARIANTS = set(["default", "stress", "turbofan", "turbofan_opt", | |
| 61 "nocrankshaft", "ignition", "ignition_turbofan", | |
| 62 "preparser"]) | |
| 63 FAST_VARIANTS = set(["default", "turbofan"]) | 39 FAST_VARIANTS = set(["default", "turbofan"]) |
| 64 STANDARD_VARIANT = set(["default"]) | 40 STANDARD_VARIANT = set(["default"]) |
| 65 IGNITION_VARIANT = set(["ignition"]) | 41 IGNITION_VARIANT = set(["ignition"]) |
| 66 | 42 |
| 67 | 43 |
| 68 class VariantGenerator(object): | 44 class VariantGenerator(object): |
| 69 def __init__(self, suite, variants): | 45 def __init__(self, suite, variants): |
| 70 self.suite = suite | 46 self.suite = suite |
| 71 self.all_variants = ALL_VARIANTS & variants | 47 self.all_variants = ALL_VARIANTS & variants |
| 72 self.fast_variants = FAST_VARIANTS & variants | 48 self.fast_variants = FAST_VARIANTS & variants |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 variants: List of variant names to be run as specified by the test | 122 variants: List of variant names to be run as specified by the test |
| 147 runner. | 123 runner. |
| 148 Returns: An object of type VariantGenerator. | 124 Returns: An object of type VariantGenerator. |
| 149 """ | 125 """ |
| 150 return self._VariantGeneratorFactory()(self, set(variants)) | 126 return self._VariantGeneratorFactory()(self, set(variants)) |
| 151 | 127 |
| 152 def DownloadData(self): | 128 def DownloadData(self): |
| 153 pass | 129 pass |
| 154 | 130 |
| 155 def ReadStatusFile(self, variables): | 131 def ReadStatusFile(self, variables): |
| 156 (self.rules, self.wildcards) = \ | 132 with open(self.status_file()) as f: |
| 157 statusfile.ReadStatusFile(self.status_file(), variables) | 133 self.rules, self.wildcards = ( |
| 134 statusfile.ReadStatusFile(f.read(), variables)) |
| 158 | 135 |
| 159 def ReadTestCases(self, context): | 136 def ReadTestCases(self, context): |
| 160 self.tests = self.ListTests(context) | 137 self.tests = self.ListTests(context) |
| 161 | 138 |
| 162 @staticmethod | 139 @staticmethod |
| 163 def _FilterSlow(slow, mode): | 140 def _FilterSlow(slow, mode): |
| 164 return (mode == "run" and not slow) or (mode == "skip" and slow) | 141 return (mode == "run" and not slow) or (mode == "skip" and slow) |
| 165 | 142 |
| 166 @staticmethod | 143 @staticmethod |
| 167 def _FilterPassFail(pass_fail, mode): | 144 def _FilterPassFail(pass_fail, mode): |
| 168 return (mode == "run" and not pass_fail) or (mode == "skip" and pass_fail) | 145 return (mode == "run" and not pass_fail) or (mode == "skip" and pass_fail) |
| 169 | 146 |
| 170 def FilterTestCasesByStatus(self, warn_unused_rules, | 147 def FilterTestCasesByStatus(self, warn_unused_rules, |
| 171 slow_tests="dontcare", | 148 slow_tests="dontcare", |
| 172 pass_fail_tests="dontcare"): | 149 pass_fail_tests="dontcare", |
| 150 variants=False): |
| 151 |
| 152 # Use only variants-dependent rules and wildcards when filtering |
| 153 # respective test cases and generic rules when filtering generic test |
| 154 # cases. |
| 155 if not variants: |
| 156 rules = self.rules[""] |
| 157 wildcards = self.wildcards[""] |
| 158 else: |
| 159 # We set rules and wildcards to a variant-specific version for each test |
| 160 # below. |
| 161 rules = {} |
| 162 wildcards = {} |
| 163 |
| 173 filtered = [] | 164 filtered = [] |
| 165 |
| 166 # Remember used rules as tuples of (rule, variant), where variant is "" for |
| 167 # variant-independent rules. |
| 174 used_rules = set() | 168 used_rules = set() |
| 169 |
| 175 for t in self.tests: | 170 for t in self.tests: |
| 176 slow = False | 171 slow = False |
| 177 pass_fail = False | 172 pass_fail = False |
| 178 testname = self.CommonTestName(t) | 173 testname = self.CommonTestName(t) |
| 179 if testname in self.rules: | 174 variant = t.variant or "" |
| 180 used_rules.add(testname) | 175 if variants: |
| 176 rules = self.rules[variant] |
| 177 wildcards = self.wildcards[variant] |
| 178 if testname in rules: |
| 179 used_rules.add((testname, variant)) |
| 181 # Even for skipped tests, as the TestCase object stays around and | 180 # Even for skipped tests, as the TestCase object stays around and |
| 182 # PrintReport() uses it. | 181 # PrintReport() uses it. |
| 183 t.outcomes = self.rules[testname] | 182 t.outcomes |= rules[testname] |
| 184 if statusfile.DoSkip(t.outcomes): | 183 if statusfile.DoSkip(t.outcomes): |
| 185 continue # Don't add skipped tests to |filtered|. | 184 continue # Don't add skipped tests to |filtered|. |
| 186 for outcome in t.outcomes: | 185 for outcome in t.outcomes: |
| 187 if outcome.startswith('Flags: '): | 186 if outcome.startswith('Flags: '): |
| 188 t.flags += outcome[7:].split() | 187 t.flags += outcome[7:].split() |
| 189 slow = statusfile.IsSlow(t.outcomes) | 188 slow = statusfile.IsSlow(t.outcomes) |
| 190 pass_fail = statusfile.IsPassOrFail(t.outcomes) | 189 pass_fail = statusfile.IsPassOrFail(t.outcomes) |
| 191 skip = False | 190 skip = False |
| 192 for rule in self.wildcards: | 191 for rule in wildcards: |
| 193 assert rule[-1] == '*' | 192 assert rule[-1] == '*' |
| 194 if testname.startswith(rule[:-1]): | 193 if testname.startswith(rule[:-1]): |
| 195 used_rules.add(rule) | 194 used_rules.add((rule, variant)) |
| 196 t.outcomes |= self.wildcards[rule] | 195 t.outcomes |= wildcards[rule] |
| 197 if statusfile.DoSkip(t.outcomes): | 196 if statusfile.DoSkip(t.outcomes): |
| 198 skip = True | 197 skip = True |
| 199 break # "for rule in self.wildcards" | 198 break # "for rule in wildcards" |
| 200 slow = slow or statusfile.IsSlow(t.outcomes) | 199 slow = slow or statusfile.IsSlow(t.outcomes) |
| 201 pass_fail = pass_fail or statusfile.IsPassOrFail(t.outcomes) | 200 pass_fail = pass_fail or statusfile.IsPassOrFail(t.outcomes) |
| 202 if (skip | 201 if (skip |
| 203 or self._FilterSlow(slow, slow_tests) | 202 or self._FilterSlow(slow, slow_tests) |
| 204 or self._FilterPassFail(pass_fail, pass_fail_tests)): | 203 or self._FilterPassFail(pass_fail, pass_fail_tests)): |
| 205 continue # "for t in self.tests" | 204 continue # "for t in self.tests" |
| 206 filtered.append(t) | 205 filtered.append(t) |
| 207 self.tests = filtered | 206 self.tests = filtered |
| 208 | 207 |
| 209 if not warn_unused_rules: | 208 if not warn_unused_rules: |
| 210 return | 209 return |
| 211 | 210 |
| 212 for rule in self.rules: | 211 if not variants: |
| 213 if rule not in used_rules: | 212 for rule in self.rules[""]: |
| 214 print("Unused rule: %s -> %s" % (rule, self.rules[rule])) | 213 if (rule, "") not in used_rules: |
| 215 for rule in self.wildcards: | 214 print("Unused rule: %s -> %s (variant independent)" % ( |
| 216 if rule not in used_rules: | 215 rule, self.rules[""][rule])) |
| 217 print("Unused rule: %s -> %s" % (rule, self.wildcards[rule])) | 216 for rule in self.wildcards[""]: |
| 217 if (rule, "") not in used_rules: |
| 218 print("Unused rule: %s -> %s (variant independent)" % ( |
| 219 rule, self.wildcards[""][rule])) |
| 220 else: |
| 221 for variant in ALL_VARIANTS: |
| 222 for rule in self.rules[variant]: |
| 223 if (rule, variant) not in used_rules: |
| 224 print("Unused rule: %s -> %s (variant: %s)" % ( |
| 225 rule, self.rules[variant][rule], variant)) |
| 226 for rule in self.wildcards[variant]: |
| 227 if (rule, variant) not in used_rules: |
| 228 print("Unused rule: %s -> %s (variant: %s)" % ( |
| 229 rule, self.wildcards[variant][rule], variant)) |
| 230 |
| 218 | 231 |
| 219 def FilterTestCasesByArgs(self, args): | 232 def FilterTestCasesByArgs(self, args): |
| 220 """Filter test cases based on command-line arguments. | 233 """Filter test cases based on command-line arguments. |
| 221 | 234 |
| 222 An argument with an asterisk in the end will match all test cases | 235 An argument with an asterisk in the end will match all test cases |
| 223 that have the argument as a prefix. Without asterisk, only exact matches | 236 that have the argument as a prefix. Without asterisk, only exact matches |
| 224 will be used with the exeption of the test-suite name as argument. | 237 will be used with the exeption of the test-suite name as argument. |
| 225 """ | 238 """ |
| 226 filtered = [] | 239 filtered = [] |
| 227 globs = [] | 240 globs = [] |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 return (testcase.flags + ["--gtest_filter=" + testcase.path] + | 343 return (testcase.flags + ["--gtest_filter=" + testcase.path] + |
| 331 ["--gtest_random_seed=%s" % context.random_seed] + | 344 ["--gtest_random_seed=%s" % context.random_seed] + |
| 332 ["--gtest_print_time=0"] + | 345 ["--gtest_print_time=0"] + |
| 333 context.mode_flags) | 346 context.mode_flags) |
| 334 | 347 |
| 335 def _VariantGeneratorFactory(self): | 348 def _VariantGeneratorFactory(self): |
| 336 return StandardVariantGenerator | 349 return StandardVariantGenerator |
| 337 | 350 |
| 338 def shell(self): | 351 def shell(self): |
| 339 return self.name | 352 return self.name |
| OLD | NEW |