1# Copyright (c) 2009 Google Inc. All rights reserved.
2#
3# Redistribution and use in source and binary forms, with or without
4# modification, are permitted provided that the following conditions are
5# met:
6#
7#     * Redistributions of source code must retain the above copyright
8# notice, this list of conditions and the following disclaimer.
9#     * Redistributions in binary form must reproduce the above
10# copyright notice, this list of conditions and the following disclaimer
11# in the documentation and/or other materials provided with the
12# distribution.
13#     * Neither the name of Google Inc. nor the names of its
14# contributors may be used to endorse or promote products derived from
15# this software without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29import unittest
30
31from webkitpy.tool.bot.expectedfailures import ExpectedFailures
32
33
34class MockResults(object):
35    def __init__(self, failing_tests=[], failure_limit=10):
36        self._failing_tests = failing_tests
37        self._failure_limit_count = failure_limit
38
39    def failure_limit_count(self):
40        return self._failure_limit_count
41
42    def failing_tests(self):
43        return self._failing_tests
44
45
46class ExpectedFailuresTest(unittest.TestCase):
47    def _assert_can_trust(self, results, can_trust):
48        self.assertEquals(ExpectedFailures()._can_trust_results(results), can_trust)
49
50    def test_can_trust_results(self):
51        self._assert_can_trust(None, False)
52        self._assert_can_trust(MockResults(failing_tests=[], failure_limit=None), False)
53        self._assert_can_trust(MockResults(failing_tests=[], failure_limit=10), False)
54        self._assert_can_trust(MockResults(failing_tests=[1], failure_limit=None), False)
55        self._assert_can_trust(MockResults(failing_tests=[1], failure_limit=2), True)
56        self._assert_can_trust(MockResults(failing_tests=[1], failure_limit=1), False)
57
58    def _assert_expected(self, expected_failures, failures, expected):
59        self.assertEqual(expected_failures.failures_were_expected(MockResults(failures)), expected)
60
61    def test_failures_were_expected(self):
62        failures = ExpectedFailures()
63        failures.grow_expected_failures(MockResults(['foo.html']))
64        self._assert_expected(failures, ['foo.html'], True)
65        self._assert_expected(failures, ['bar.html'], False)
66        failures.shrink_expected_failures(MockResults(['baz.html']), False)
67        self._assert_expected(failures, ['foo.html'], False)
68        self._assert_expected(failures, ['baz.html'], False)
69
70        failures.grow_expected_failures(MockResults(['baz.html']))
71        self._assert_expected(failures, ['baz.html'], True)
72        failures.shrink_expected_failures(MockResults(), True)
73        self._assert_expected(failures, ['baz.html'], False)
74