OLD | NEW |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import collections | 5 import collections |
6 import os | 6 import os |
7 import sys | 7 import sys |
8 import time | 8 import time |
9 | 9 |
10 from cStringIO import StringIO | 10 from cStringIO import StringIO |
11 | 11 |
12 from .type_definitions import DirSeen, Handler, Failure | 12 from .type_definitions import DirSeen, Handler, Failure |
13 from .serialize import GetCurrentData, DiffData, NonExistant | 13 from .serialize import GetCurrentData, DiffData, NonExistant |
14 | 14 |
15 | 15 |
16 Missing = collections.namedtuple('Missing', 'test log_lines') | 16 Missing = collections.namedtuple('Missing', 'test log_lines') |
17 Fail = collections.namedtuple('Fail', 'test diff log_lines') | 17 Fail = collections.namedtuple('Fail', 'test diff log_lines') |
18 Pass = collections.namedtuple('Pass', 'test') | 18 Pass = collections.namedtuple('Pass', 'test') |
19 | 19 |
20 | 20 |
| 21 class FailChecks(collections.namedtuple('FailChecks', 'test checks')): |
| 22 def format(self, indent): |
| 23 return (' '*indent+'\n').join([c.format(indent+2) for c in self.checks]) |
| 24 |
| 25 |
21 class TestHandler(Handler): | 26 class TestHandler(Handler): |
22 """Run the tests.""" | 27 """Run the tests.""" |
23 | 28 |
24 @classmethod | 29 @classmethod |
25 def gen_stage_loop(cls, _opts, tests, put_next_stage, put_result_stage): | 30 def gen_stage_loop(cls, _opts, tests, put_next_stage, put_result_stage): |
26 dirs_seen = set() | 31 dirs_seen = set() |
27 for test in tests: | 32 for test in tests: |
28 subtests = test.tests | 33 subtests = test.tests |
29 for subtest in subtests: | 34 for subtest in subtests: |
30 if subtest.expect_dir not in dirs_seen: | 35 if subtest.expect_dir not in dirs_seen: |
31 put_result_stage(DirSeen(subtest.expect_dir)) | 36 put_result_stage(DirSeen(subtest.expect_dir)) |
32 dirs_seen.add(subtest.expect_dir) | 37 dirs_seen.add(subtest.expect_dir) |
33 put_next_stage(test) | 38 put_next_stage(test) |
34 | 39 |
35 @classmethod | 40 @classmethod |
36 def run_stage_loop(cls, _opts, results, put_next_stage): | 41 def run_stage_loop(cls, _opts, results, put_next_stage): |
37 for test, result, log_lines in results: | 42 for test, result, log_lines in results: |
38 current, _ = GetCurrentData(test) | 43 current, _ = GetCurrentData(test) |
39 if current is NonExistant: | 44 if current is NonExistant: |
40 put_next_stage(Missing(test, log_lines)) | 45 put_next_stage(Missing(test, log_lines)) |
41 else: | 46 else: |
42 diff = DiffData(current, result.data) | 47 diff = DiffData(current, result.data) |
43 if not diff: | 48 if not diff: |
44 put_next_stage(Pass(test)) | 49 failed_checks = [check for check in result.checks if not check.passed] |
| 50 if failed_checks: |
| 51 put_next_stage(FailChecks(test, failed_checks)) |
| 52 else: |
| 53 put_next_stage(Pass(test)) |
45 else: | 54 else: |
46 put_next_stage(Fail(test, diff, log_lines)) | 55 put_next_stage(Fail(test, diff, log_lines)) |
47 | 56 |
48 class ResultStageHandler(Handler.ResultStageHandler): | 57 class ResultStageHandler(Handler.ResultStageHandler): |
49 def __init__(self, *args): | 58 def __init__(self, *args): |
50 super(TestHandler.ResultStageHandler, self).__init__(*args) | 59 super(TestHandler.ResultStageHandler, self).__init__(*args) |
51 self.dirs_seen = set() | 60 self.dirs_seen = set() |
52 self.files_expected = collections.defaultdict(set) | 61 self.files_expected = collections.defaultdict(set) |
53 self.err_out = StringIO() | 62 self.err_out = StringIO() |
54 self.start = time.time() | 63 self.start = time.time() |
(...skipping 25 matching lines...) Expand all Loading... |
80 | 89 |
81 def handle_DirSeen(self, dirseen): | 90 def handle_DirSeen(self, dirseen): |
82 self.dirs_seen.add(dirseen.dir) | 91 self.dirs_seen.add(dirseen.dir) |
83 | 92 |
84 def _handle_record(self, test): | 93 def _handle_record(self, test): |
85 self.num_tests += 1 | 94 self.num_tests += 1 |
86 if test.expect_path() is not None: | 95 if test.expect_path() is not None: |
87 head, tail = os.path.split(test.expect_path()) | 96 head, tail = os.path.split(test.expect_path()) |
88 self.files_expected[head].add(tail) | 97 self.files_expected[head].add(tail) |
89 | 98 |
| 99 def handle_FailChecks(self, fc): |
| 100 self._handle_record(fc.test) |
| 101 self._emit('C', fc.test, 'FAIL CHECK') |
| 102 self._add_result(fc.format(2), fc.test, 'FAIL CHECK', 'failed checks') |
| 103 return Failure() |
| 104 |
90 def handle_Pass(self, p): | 105 def handle_Pass(self, p): |
91 self._handle_record(p.test) | 106 self._handle_record(p.test) |
92 if not self.opts.quiet: | 107 if not self.opts.quiet: |
93 self._emit('.', p.test, 'ok') | 108 self._emit('.', p.test, 'ok') |
94 | 109 |
95 def handle_Fail(self, fail): | 110 def handle_Fail(self, fail): |
96 self._handle_record(fail.test) | 111 self._handle_record(fail.test) |
97 self._emit('F', fail.test, 'FAIL') | 112 self._emit('F', fail.test, 'FAIL') |
98 self._add_result('\n'.join(fail.diff), fail.test, 'FAIL', 'failures', | 113 self._add_result('\n'.join(fail.diff), fail.test, 'FAIL', 'failures', |
99 fail.log_lines) | 114 fail.log_lines) |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 self.num_tests, time.time() - self.start) | 159 self.num_tests, time.time() - self.start) |
145 print | 160 print |
146 if aborted: | 161 if aborted: |
147 print 'ABORTED' | 162 print 'ABORTED' |
148 elif self.errors: | 163 elif self.errors: |
149 print 'FAILED (%s)' % (', '.join('%s=%d' % i | 164 print 'FAILED (%s)' % (', '.join('%s=%d' % i |
150 for i in self.errors.iteritems())) | 165 for i in self.errors.iteritems())) |
151 elif not self.opts.quiet: | 166 elif not self.opts.quiet: |
152 print 'OK' | 167 print 'OK' |
153 | 168 |
OLD | NEW |