11a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood#!/usr/bin/python
21a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood#
31a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
41a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood# Use of this source code is governed by a BSD-style license that can be
51a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood# found in the LICENSE file.
61a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
7708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hoodimport datetime, unittest
81a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
91a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hoodimport mox
101a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
11788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodimport common
12788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood# This must come before the import of complete_failures in order to use the
13788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood# in memory database.
14788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodfrom autotest_lib.frontend import setup_django_readonly_environment
15788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodfrom autotest_lib.frontend import setup_test_environment
16788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodimport complete_failures
171a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hoodfrom autotest_lib.client.common_lib import mail
18788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodfrom autotest_lib.frontend.tko import models
19788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodfrom django import test
201a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
211a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
22788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar HoodGOOD_STATUS_IDX = 6
23788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
24e7b118479a372b12619abc97124396240be191a1Keyar Hood# See complte_failurs_functional_tests.py for why we need this.
25e7b118479a372b12619abc97124396240be191a1Keyar Hoodclass MockDatetime(datetime.datetime):
26e7b118479a372b12619abc97124396240be191a1Keyar Hood    """Used to mock out parts of datetime.datetime."""
27e7b118479a372b12619abc97124396240be191a1Keyar Hood    pass
28e7b118479a372b12619abc97124396240be191a1Keyar Hood
29e7b118479a372b12619abc97124396240be191a1Keyar Hood
303d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hoodclass EmailAboutTestFailureTests(mox.MoxTestBase):
313d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood    """
323d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood    Tests that emails are sent about failed tests.
333d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood    """
343d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood    def setUp(self):
353d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        super(EmailAboutTestFailureTests, self).setUp()
363d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
373d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        # We need to mock out the send function in all tests or else the
383d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        # emails will be sent out during tests.
393d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        self.mox.StubOutWithMock(mail, 'send')
403d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
413d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        self._orig_too_long = complete_failures._DAYS_TO_BE_FAILING_TOO_LONG
423d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
433d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
443d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood    def tearDown(self):
453d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = self._orig_too_long
463d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        super(EmailAboutTestFailureTests, self).tearDown()
473d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
483d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
49708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood    def test_email_sent_about_all_failed_tests(self):
50708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        """Test that the email report mentions all the failed_tests."""
513d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = 60
523d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
534d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood        mail.send(
544d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood                'chromeos-test-health@google.com',
554d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood                ['chromeos-lab-infrastructure@google.com'],
564d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood                [],
574d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood                'Long Failing Tests',
58a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                '1/1 tests have been failing for at least %d days.\n'
59a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'They are the following:\n\ntest'
604d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood                    % complete_failures._DAYS_TO_BE_FAILING_TOO_LONG)
614d5f9d1ed2fe6ddc31f30ceede342d525f2e2616Keyar Hood
62708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        failures = ['test']
63708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        all_tests = set(failures)
643d8076899b7ae59c6099934b2c797e34553f45bbKeyar Hood
651a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood        self.mox.ReplayAll()
66708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        complete_failures.email_about_test_failure(failures, all_tests)
67a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
68a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
69a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood    def test_email_has_test_names_sorted_alphabetically(self):
70a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        """Test that the email report has entries sorted alphabetically."""
71a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = 60
72a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
73a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        mail.send(
74a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'chromeos-test-health@google.com',
75a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                ['chromeos-lab-infrastructure@google.com'],
76a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                [],
77a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'Long Failing Tests',
78a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                '2/2 tests have been failing for at least %d days.\n'
79a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'They are the following:\n\ntest1\ntest2'
80a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                    % complete_failures._DAYS_TO_BE_FAILING_TOO_LONG)
81a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
82a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        # We use an OrderedDict to gurantee that the elements would be out of
83a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        # order if we did a simple traversal.
84708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        failures = ['test2', 'test1']
85708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        all_tests = set(failures)
86a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
87a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        self.mox.ReplayAll()
88708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        complete_failures.email_about_test_failure(failures, all_tests)
89a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
90a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
91a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood    def test_email_count_of_total_number_of_tests(self):
92a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        """Test that the email report displays total number of tests."""
93a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = 60
94a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
95a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        mail.send(
96a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'chromeos-test-health@google.com',
97a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                ['chromeos-lab-infrastructure@google.com'],
98a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                [],
99a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'Long Failing Tests',
100a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                '1/2 tests have been failing for at least %d days.\n'
101a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                'They are the following:\n\ntest'
102a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                    % complete_failures._DAYS_TO_BE_FAILING_TOO_LONG)
103a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
104708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        failures = ['test']
105708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        all_tests = set(failures) | {'not_failure'}
106a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
107a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        self.mox.ReplayAll()
108708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        complete_failures.email_about_test_failure(failures, all_tests)
109788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
110788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
111005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hoodclass IsValidTestNameTests(test.TestCase):
112005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood    """Tests the is_valid_test_name function."""
113005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
114005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood    def test_returns_true_for_valid_test_name(self):
115005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        """Test that a valid test name returns True."""
116005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        name = 'TestName.TestName'
117005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        self.assertTrue(complete_failures.is_valid_test_name(name))
118005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
119005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
120005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood    def test_returns_false_if_name_has_slash_in_it(self):
121005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        """Test that a name with a slash in it returns False."""
122005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        name = 'path/to/test'
123005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        self.assertFalse(complete_failures.is_valid_test_name(name))
124005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
125005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
126005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood    def test_returns_false_for_try_new_image_entries(self):
127005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        """Test that a name that starts with try_new_image returns False."""
128005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        name = 'try_new_image-blah'
129005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        self.assertFalse(complete_failures.is_valid_test_name(name))
130005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
131005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
1320f26dbaff69d0135c527ed87c1af1fd5fb56ad33Keyar Hoodclass PrepareLastPassesTests(test.TestCase):
1330f26dbaff69d0135c527ed87c1af1fd5fb56ad33Keyar Hood    """Tests the prepare_last_passes function."""
134788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
135788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    def setUp(self):
1360f26dbaff69d0135c527ed87c1af1fd5fb56ad33Keyar Hood        super(PrepareLastPassesTests, self).setUp()
137788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
138788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    def tearDown(self):
1390f26dbaff69d0135c527ed87c1af1fd5fb56ad33Keyar Hood        super(PrepareLastPassesTests, self).tearDown()
140788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
141005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood    def test_does_not_return_invalid_test_names(self):
142005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        """Tests that tests with invalid test names are not returned."""
1430f26dbaff69d0135c527ed87c1af1fd5fb56ad33Keyar Hood        results = complete_failures.prepare_last_passes(['invalid_test/name'])
144005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
1450f26dbaff69d0135c527ed87c1af1fd5fb56ad33Keyar Hood        self.assertEqual(results, {})
146005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
147005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
148e7b118479a372b12619abc97124396240be191a1Keyar Hoodclass GetRecentlyRanTestNamesTests(mox.MoxTestBase, test.TestCase):
149e7b118479a372b12619abc97124396240be191a1Keyar Hood    """Tests the get_recently_ran_test_names function."""
150788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
151788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    def setUp(self):
152e7b118479a372b12619abc97124396240be191a1Keyar Hood        super(GetRecentlyRanTestNamesTests, self).setUp()
153e7b118479a372b12619abc97124396240be191a1Keyar Hood        self.mox.StubOutWithMock(MockDatetime, 'today')
154e7b118479a372b12619abc97124396240be191a1Keyar Hood        self.datetime = datetime.datetime
155e7b118479a372b12619abc97124396240be191a1Keyar Hood        datetime.datetime = MockDatetime
156788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        setup_test_environment.set_up()
157e7b118479a372b12619abc97124396240be191a1Keyar Hood        self._orig_cutoff = complete_failures._DAYS_NOT_RUNNING_CUTOFF
158788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
159788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
160788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    def tearDown(self):
161e7b118479a372b12619abc97124396240be191a1Keyar Hood        datetime.datetime = self.datetime
162e7b118479a372b12619abc97124396240be191a1Keyar Hood        complete_failures._DAYS_NOT_RUNNING_CUTOFF = self._orig_cutoff
163788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        setup_test_environment.tear_down()
164e7b118479a372b12619abc97124396240be191a1Keyar Hood        super(GetRecentlyRanTestNamesTests, self).tearDown()
165788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
166788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
167e7b118479a372b12619abc97124396240be191a1Keyar Hood    def test_return_all_recently_ran_tests(self):
168788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        """Test that the function does as it says it does."""
169005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        job = models.Job(job_idx=1)
170005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        kernel = models.Kernel(kernel_idx=1)
171005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        machine = models.Machine(machine_idx=1)
172005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        success_status = models.Status(status_idx=GOOD_STATUS_IDX)
173005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
174e7b118479a372b12619abc97124396240be191a1Keyar Hood        recent = models.Test(job=job, status=success_status,
175e7b118479a372b12619abc97124396240be191a1Keyar Hood                             kernel=kernel, machine=machine,
176e7b118479a372b12619abc97124396240be191a1Keyar Hood                             test='recent',
177e7b118479a372b12619abc97124396240be191a1Keyar Hood                             started_time=self.datetime(2012, 1, 1))
178e7b118479a372b12619abc97124396240be191a1Keyar Hood        recent.save()
179e7b118479a372b12619abc97124396240be191a1Keyar Hood        old = models.Test(job=job, status=success_status,
180e7b118479a372b12619abc97124396240be191a1Keyar Hood                          kernel=kernel, machine=machine,
181e7b118479a372b12619abc97124396240be191a1Keyar Hood                          test='old',
182e7b118479a372b12619abc97124396240be191a1Keyar Hood                          started_time=self.datetime(2011, 1, 2))
183e7b118479a372b12619abc97124396240be191a1Keyar Hood        old.save()
184788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
185e7b118479a372b12619abc97124396240be191a1Keyar Hood        datetime.datetime.today().AndReturn(self.datetime(2012, 1, 4))
186e7b118479a372b12619abc97124396240be191a1Keyar Hood        complete_failures._DAYS_NOT_RUNNING_CUTOFF = 60
187788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
188e7b118479a372b12619abc97124396240be191a1Keyar Hood        self.mox.ReplayAll()
189e7b118479a372b12619abc97124396240be191a1Keyar Hood        results = complete_failures.get_recently_ran_test_names()
190e7b118479a372b12619abc97124396240be191a1Keyar Hood
191e7b118479a372b12619abc97124396240be191a1Keyar Hood        self.assertEqual(set(results), set(['recent']))
192788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
193788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
194788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    def test_returns_no_duplicate_names(self):
195788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        """Test that each test name appears only once."""
196005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        job = models.Job(job_idx=1)
197005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        kernel = models.Kernel(kernel_idx=1)
198005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        machine = models.Machine(machine_idx=1)
199005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        success_status = models.Status(status_idx=GOOD_STATUS_IDX)
200005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood
201005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        test = models.Test(job=job, status=success_status,
202005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood                           kernel=kernel, machine=machine,
203005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood                           test='test',
204e7b118479a372b12619abc97124396240be191a1Keyar Hood                           started_time=self.datetime(2012, 1, 1))
205788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        test.save()
206005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood        duplicate = models.Test(job=job, status=success_status,
207005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood                                kernel=kernel, machine=machine,
208005539dbc39ccba6b8c97771cda2dba0d8a163f3Keyar Hood                                test='test',
209e7b118479a372b12619abc97124396240be191a1Keyar Hood                                started_time=self.datetime(2012, 1, 2))
210788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        duplicate.save()
211788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
212e7b118479a372b12619abc97124396240be191a1Keyar Hood        datetime.datetime.today().AndReturn(self.datetime(2012, 1, 3))
213e7b118479a372b12619abc97124396240be191a1Keyar Hood        complete_failures._DAYS_NOT_RUNNING_CUTOFF = 60
214e7b118479a372b12619abc97124396240be191a1Keyar Hood
215e7b118479a372b12619abc97124396240be191a1Keyar Hood        self.mox.ReplayAll()
216e7b118479a372b12619abc97124396240be191a1Keyar Hood        results = complete_failures.get_recently_ran_test_names()
217788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
218788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        self.assertEqual(len(results), 1)
219788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
220788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
221788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hoodclass GetTestsToAnalyzeTests(mox.MoxTestBase):
222788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    """Tests the get_tests_to_analyze function."""
223788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
224e7b118479a372b12619abc97124396240be191a1Keyar Hood    def test_returns_recent_test_names(self):
225788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        """Test should return all the test names in the database."""
226a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
227a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        recent_tests = {'passing_test', 'failing_test'}
228a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        last_passes = {'passing_test': datetime.datetime(2012, 1 ,1),
229a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                       'old_passing_test': datetime.datetime(2011, 1, 1)}
230a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood
231a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        results = complete_failures.get_tests_to_analyze(recent_tests,
232a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                                                         last_passes)
233788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
234e7b118479a372b12619abc97124396240be191a1Keyar Hood        self.assertEqual(results,
235e7b118479a372b12619abc97124396240be191a1Keyar Hood                         {'passing_test': datetime.datetime(2012, 1, 1),
236e7b118479a372b12619abc97124396240be191a1Keyar Hood                          'failing_test': datetime.datetime.min})
237788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
238788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
239788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood    def test_returns_failing_tests_with_min_datetime(self):
240788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        """Test that never-passed tests are paired with datetime.min."""
241788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
242a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        recent_tests = {'test'}
243a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        last_passes = {}
244788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
245788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        self.mox.ReplayAll()
246a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood        results = complete_failures.get_tests_to_analyze(recent_tests,
247a35647145cb53dc2b8b55ae2a0a62c01744831a1Keyar Hood                                                         last_passes)
248788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood
249788e498ae7b6735857c83d88de7f5fffabbc7f8fKeyar Hood        self.assertEqual(results, {'test': datetime.datetime.min})
2501a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
2511a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood
252708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hoodclass FilterOutGoodTestsTests(mox.MoxTestBase):
253708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood    """Tests the filter_our_good_tests function."""
254708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
255708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood    def setUp(self):
256708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        super(FilterOutGoodTestsTests, self).setUp()
257708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self.mox.StubOutWithMock(MockDatetime, 'today')
258708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self.datetime = datetime.datetime
259708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        datetime.datetime = MockDatetime
260708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self._orig_too_long = complete_failures._DAYS_TO_BE_FAILING_TOO_LONG
261708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
262708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
263708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood    def tearDown(self):
264708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        datetime.datetime = self.datetime
265708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = self._orig_too_long
266708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        super(FilterOutGoodTestsTests, self).tearDown()
267708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
268708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
269708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood    def test_remove_all_tests_that_have_passed_recently_enough(self):
270708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        """Test that all recently passing tests are not returned."""
271708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
272708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = 10
273708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        datetime.datetime.today().AndReturn(self.datetime(2012, 1, 21))
274708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
275708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self.mox.ReplayAll()
276708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        result = complete_failures.filter_out_good_tests(
277708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood                {'test': self.datetime(2012, 1, 20)})
278708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
279708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self.assertEqual(result, [])
280708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
281708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
282708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood    def test_keep_all_tests_that_have_not_passed_recently_enough(self):
283708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        """Test that the tests that have not recently passed are returned."""
284708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
285708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        complete_failures._DAYS_TO_BE_FAILING_TOO_LONG = 10
286708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        datetime.datetime.today().AndReturn(self.datetime(2012, 1, 21))
287708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
288708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self.mox.ReplayAll()
289708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        result = complete_failures.filter_out_good_tests(
290708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood                {'test': self.datetime(2012, 1, 10)})
291708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
292708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood        self.assertEqual(result, ['test'])
293708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
294708f1fbedbf992f18d6be7da9c310d800f0cd847Keyar Hood
2951a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hoodif __name__ == '__main__':
2961a3c8dd59f71086eb2f5d08b0f13df95428e60faKeyar Hood    unittest.main()
297