d852ae6f2b
Procs return the result by increasing recursion through result_for. This CL eliminates that mechanism from the Processor interface and uses boolen return values for sending tests to signal success or the failure to load the test into the execution queue. R=machenbach@chromium.org CC=yangguo@chromium.org,sergiyb@chromium.org Bug: v8:8174,v8:8731 Change-Id: I073a86ca84bcf88da11132b90013d4c8455bc61e Reviewed-on: https://chromium-review.googlesource.com/c/1439239 Commit-Queue: Tamer Tas <tmrts@chromium.org> Reviewed-by: Michael Achenbach <machenbach@chromium.org> Reviewed-by: Sergiy Belozorov <sergiyb@chromium.org> Cr-Commit-Position: refs/heads/master@{#59201}
173 lines
4.6 KiB
Python
Executable File
173 lines
4.6 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Copyright 2019 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.
|
|
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
|
|
# Needed because the test runner contains relative imports.
|
|
TOOLS_PATH = os.path.dirname(os.path.dirname(os.path.dirname(
|
|
os.path.abspath(__file__))))
|
|
sys.path.append(TOOLS_PATH)
|
|
|
|
from testrunner.testproc import base
|
|
from testrunner.testproc.variant import VariantProc
|
|
|
|
|
|
class FakeResultObserver(base.TestProcObserver):
|
|
def __init__(self):
|
|
super(FakeResultObserver, self).__init__()
|
|
|
|
self.results = set()
|
|
|
|
def result_for(self, test, result):
|
|
self.results.add((test, result))
|
|
|
|
|
|
class FakeFilter(base.TestProcFilter):
|
|
def __init__(self, filter_predicate):
|
|
super(FakeFilter, self).__init__()
|
|
|
|
self._filter_predicate = filter_predicate
|
|
|
|
self.loaded = set()
|
|
self.call_counter = 0
|
|
|
|
def next_test(self, test):
|
|
self.call_counter += 1
|
|
|
|
if self._filter_predicate(test):
|
|
return False
|
|
|
|
self.loaded.add(test)
|
|
return True
|
|
|
|
|
|
class FakeSuite(object):
|
|
def __init__(self, name):
|
|
self.name = name
|
|
|
|
|
|
class FakeTest(object):
|
|
def __init__(self, procid):
|
|
self.suite = FakeSuite("fake_suite")
|
|
self.procid = procid
|
|
|
|
self.keep_output = False
|
|
|
|
def create_subtest(self, proc, subtest_id, **kwargs):
|
|
variant = kwargs['variant']
|
|
|
|
variant.origin = self
|
|
return variant
|
|
|
|
|
|
class FakeVariantGen(object):
|
|
def __init__(self, variants):
|
|
self._variants = variants
|
|
|
|
def gen(self, test):
|
|
for variant in self._variants:
|
|
yield variant, [], "fake_suffix"
|
|
|
|
|
|
class TestVariantProcLoading(unittest.TestCase):
|
|
def setUp(self):
|
|
self.test = FakeTest("test")
|
|
|
|
def _simulate_proc(self, variants):
|
|
"""Expects the list of instantiated test variants to load into the
|
|
VariantProc."""
|
|
variants_mapping = {self.test: variants}
|
|
|
|
# Creates a Variant processor containing the possible types of test
|
|
# variants.
|
|
self.variant_proc = VariantProc(variants=["to_filter", "to_load"])
|
|
self.variant_proc._variant_gens = {
|
|
"fake_suite": FakeVariantGen(variants)}
|
|
|
|
# FakeFilter only lets tests passing the predicate to be loaded.
|
|
self.fake_filter = FakeFilter(
|
|
filter_predicate=(lambda t: t.procid == "to_filter"))
|
|
|
|
# FakeResultObserver to verify that VariantProc calls result_for correctly.
|
|
self.fake_result_observer = FakeResultObserver()
|
|
|
|
# Links up processors together to form a test processing pipeline.
|
|
self.variant_proc._prev_proc = self.fake_result_observer
|
|
self.fake_filter._prev_proc = self.variant_proc
|
|
self.variant_proc._next_proc = self.fake_filter
|
|
|
|
# Injects the test into the VariantProc
|
|
is_loaded = self.variant_proc.next_test(self.test)
|
|
|
|
# Verifies the behavioral consistency by using the instrumentation in
|
|
# FakeFilter
|
|
loaded_variants = list(self.fake_filter.loaded)
|
|
self.assertEqual(is_loaded, any(loaded_variants))
|
|
return self.fake_filter.loaded, self.fake_filter.call_counter
|
|
|
|
def test_filters_first_two_variants(self):
|
|
variants = [
|
|
FakeTest('to_filter'),
|
|
FakeTest('to_filter'),
|
|
FakeTest('to_load'),
|
|
FakeTest('to_load'),
|
|
]
|
|
expected_load_results = {variants[2]}
|
|
|
|
load_results, call_count = self._simulate_proc(variants)
|
|
|
|
self.assertSetEqual(expected_load_results, load_results)
|
|
self.assertEqual(call_count, 3)
|
|
|
|
def test_stops_loading_after_first_successful_load(self):
|
|
variants = [
|
|
FakeTest('to_load'),
|
|
FakeTest('to_load'),
|
|
FakeTest('to_filter'),
|
|
]
|
|
expected_load_results = {variants[0]}
|
|
|
|
loaded_tests, call_count = self._simulate_proc(variants)
|
|
|
|
self.assertSetEqual(expected_load_results, loaded_tests)
|
|
self.assertEqual(call_count, 1)
|
|
|
|
def test_return_result_when_out_of_variants(self):
|
|
variants = [
|
|
FakeTest('to_filter'),
|
|
FakeTest('to_load'),
|
|
]
|
|
|
|
self._simulate_proc(variants)
|
|
|
|
self.variant_proc.result_for(variants[1], None)
|
|
|
|
expected_results = {(self.test, None)}
|
|
|
|
self.assertSetEqual(expected_results, self.fake_result_observer.results)
|
|
|
|
def test_return_result_after_running_variants(self):
|
|
variants = [
|
|
FakeTest('to_filter'),
|
|
FakeTest('to_load'),
|
|
FakeTest('to_load'),
|
|
]
|
|
|
|
self._simulate_proc(variants)
|
|
self.variant_proc.result_for(variants[1], None)
|
|
|
|
self.assertSetEqual(set(variants[1:]), self.fake_filter.loaded)
|
|
|
|
self.variant_proc.result_for(variants[2], None)
|
|
|
|
expected_results = {(self.test, None)}
|
|
self.assertSetEqual(expected_results, self.fake_result_observer.results)
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|