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