1 #!/usr/bin/python 2 # 3 # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 import datetime, subprocess, unittest 8 9 import mox 10 11 import common 12 # This must come before the import of complete_failures in order to use the 13 # in-memory database. 14 from autotest_lib.frontend import setup_django_readonly_environment 15 from autotest_lib.frontend import setup_test_environment 16 from autotest_lib.frontend.health import passing_experimental 17 from autotest_lib.frontend.afe import models as afe_models 18 from autotest_lib.frontend.tko import models as tko_models 19 from autotest_lib.server.cros.dynamic_suite import reporting 20 from django import test 21 22 23 GOOD_STATUS_IDX = 6 24 FAIL_STATUS_IDX = 4 25 26 # During the tests there is a point where Django does a type check on 27 # datetime.datetime. Unfortunately this means when datetime is mocked out, 28 # horrible failures happen when Django tries to do this check. The solution 29 # chosen is to create a pure Python class that inheirits from datetime.datetime 30 # so that the today class method can be directly mocked out. It is necesarry 31 # to mock out datetime.datetime completely as it a C class and so cannot have 32 # parts of itself mocked out. 33 class MockDatetime(datetime.datetime): 34 """Used to mock out parts of datetime.datetime.""" 35 pass 36 37 38 class PassingExperimentalFunctionalTests(mox.MoxTestBase, test.TestCase): 39 """ 40 Does a functional test of the passing_experimental.py script. 41 42 It uses an in-memory database, mocks out the saving and loading of the 43 storage object and mocks out the sending of the bugs. Everything else 44 is a full run. 45 46 """ 47 48 def setUp(self): 49 super(PassingExperimentalFunctionalTests, self).setUp() 50 setup_test_environment.set_up() 51 # All of our tests will involve mocking out the datetime.today() class 52 # method. 53 self.mox.StubOutWithMock(MockDatetime, 'today') 54 self.datetime = datetime.datetime 55 datetime.datetime = MockDatetime 56 # We really do not want a script that modifies the DB to run during 57 # testing. So we will mock this out even though we will mock out the 58 # function that calls it in case of refactoring. 59 self.mox.StubOutWithMock(subprocess, 'call') 60 # We need to mock out this function so bugs are not filed. 61 self.mox.StubOutClassWithMocks(reporting, 'Bug') 62 self.mox.StubOutClassWithMocks(reporting, 'Reporter') 63 self._orig_since_failure = passing_experimental._MIN_DAYS_SINCE_FAILURE 64 self._orig_since_pass = passing_experimental._MAX_DAYS_SINCE_LAST_PASS 65 66 67 def tearDown(self): 68 passing_experimental._MAX_DAYS_SINCE_LAST_PASS = self._orig_since_pass 69 passing_experimental._MIN_DAYS_SINCE_FAILURE = self._orig_since_failure 70 datetime.datetime = self.datetime 71 setup_test_environment.tear_down() 72 super(PassingExperimentalFunctionalTests, self).tearDown() 73 74 75 def test(self): 76 """Does a basic test of as much of the system as possible.""" 77 afe_models.Test(name='test1', test_type=0, path='test1', 78 experimental=True).save() 79 afe_models.Test(name='test2', test_type=0, path='test2', 80 experimental=True).save() 81 82 tko_models.Status(status_idx=6, word='GOOD').save() 83 84 job = tko_models.Job(job_idx=1) 85 kernel = tko_models.Kernel(kernel_idx=1) 86 machine = tko_models.Machine(machine_idx=1) 87 success_status = tko_models.Status(status_idx=GOOD_STATUS_IDX) 88 fail_status = tko_models.Status(status_idx=FAIL_STATUS_IDX) 89 90 tko_test1 = tko_models.Test(job=job, status=success_status, 91 kernel=kernel, machine=machine, 92 test='test1', 93 started_time=self.datetime(2012, 1, 20)) 94 tko_test1.save() 95 tko_test2 = tko_models.Test(job=job, status=success_status, 96 kernel=kernel, machine=machine, 97 test='test2', 98 started_time=self.datetime(2012, 1, 20)) 99 tko_test2.save() 100 101 passing_experimental._MAX_DAYS_SINCE_LAST_PASS = 10 102 passing_experimental._MIN_DAYS_SINCE_FAILURE = 10 103 104 MockDatetime.today().AndReturn(self.datetime(2012, 1, 21)) 105 MockDatetime.today().AndReturn(self.datetime(2012, 1, 21)) 106 reporter1 = reporting.Reporter() 107 bug1 = reporting.Bug( 108 title=u'test1 should be promoted to non-experimental.', 109 summary=mox.IgnoreArg(), 110 search_marker=u'PassingExperimental(test1)') 111 reporter1.report(bug1).AndReturn((11, 1)) 112 reporter2 = reporting.Reporter() 113 bug2 = reporting.Bug( 114 title=u'test2 should be promoted to non-experimental.', 115 summary=mox.IgnoreArg(), 116 search_marker=u'PassingExperimental(test2)') 117 reporter2.report(bug2).AndReturn((11, 1)) 118 119 self.mox.ReplayAll() 120 passing_experimental.main() 121 122 123 if __name__ == '__main__': 124 unittest.main() 125