|  | # Copyright 2018 the V8 project authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | from . import base | 
|  | from ..local.variants import ALL_VARIANTS, ALL_VARIANT_FLAGS | 
|  | from .result import GroupedResult | 
|  |  | 
|  |  | 
|  | STANDARD_VARIANT = set(["default"]) | 
|  |  | 
|  |  | 
|  | class VariantProc(base.TestProcProducer): | 
|  | """Processor creating variants. | 
|  |  | 
|  | For each test it keeps generator that returns variant, flags and id suffix. | 
|  | It produces variants one at a time, so it's waiting for the result of one | 
|  | variant to create another variant of the same test. | 
|  | It maintains the order of the variants passed to the init. | 
|  |  | 
|  | There are some cases when particular variant of the test is not valid. To | 
|  | ignore subtests like that, StatusFileFilterProc should be placed somewhere | 
|  | after the VariantProc. | 
|  | """ | 
|  |  | 
|  | def __init__(self, variants): | 
|  | super(VariantProc, self).__init__('VariantProc') | 
|  | self._next_variant = {} | 
|  | self._variant_gens = {} | 
|  | self._variants = variants | 
|  |  | 
|  | def setup(self, requirement=base.DROP_RESULT): | 
|  | super(VariantProc, self).setup(requirement) | 
|  |  | 
|  | # VariantProc is optimized for dropping the result and it should be placed | 
|  | # in the chain where it's possible. | 
|  | assert requirement == base.DROP_RESULT | 
|  |  | 
|  | def _next_test(self, test): | 
|  | gen = self._variants_gen(test) | 
|  | self._next_variant[test.procid] = gen | 
|  | return self._try_send_new_subtest(test, gen) | 
|  |  | 
|  | def _result_for(self, test, subtest, result): | 
|  | gen = self._next_variant[test.procid] | 
|  | if not self._try_send_new_subtest(test, gen): | 
|  | self._send_result(test, None) | 
|  |  | 
|  | def _try_send_new_subtest(self, test, variants_gen): | 
|  | for variant, flags, suffix in variants_gen: | 
|  | subtest = self._create_subtest(test, '%s-%s' % (variant, suffix), | 
|  | variant=variant, flags=flags) | 
|  | if self._send_test(subtest): | 
|  | return True | 
|  |  | 
|  | del self._next_variant[test.procid] | 
|  | return False | 
|  |  | 
|  | def _variants_gen(self, test): | 
|  | """Generator producing (variant, flags, procid suffix) tuples.""" | 
|  | return self._get_variants_gen(test).gen(test) | 
|  |  | 
|  | def _get_variants_gen(self, test): | 
|  | key = test.suite.name | 
|  | variants_gen = self._variant_gens.get(key) | 
|  | if not variants_gen: | 
|  | variants_gen = test.suite.get_variants_gen(self._variants) | 
|  | self._variant_gens[key] = variants_gen | 
|  | return variants_gen |