| #!/usr/bin/python |
| # |
| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import datetime, subprocess, unittest |
| |
| import mox |
| |
| import common |
| # This must come before the import of complete_failures in order to use the |
| # in-memory database. |
| from autotest_lib.frontend import setup_django_readonly_environment |
| from autotest_lib.frontend import setup_test_environment |
| from autotest_lib.frontend.health import passing_experimental |
| from autotest_lib.frontend.afe import models as afe_models |
| from autotest_lib.frontend.tko import models as tko_models |
| from autotest_lib.server.cros.dynamic_suite import reporting |
| from django import test |
| |
| |
| GOOD_STATUS_IDX = 6 |
| FAIL_STATUS_IDX = 4 |
| |
| # During the tests there is a point where Django does a type check on |
| # datetime.datetime. Unfortunately this means when datetime is mocked out, |
| # horrible failures happen when Django tries to do this check. The solution |
| # chosen is to create a pure Python class that inheirits from datetime.datetime |
| # so that the today class method can be directly mocked out. It is necesarry |
| # to mock out datetime.datetime completely as it a C class and so cannot have |
| # parts of itself mocked out. |
| class MockDatetime(datetime.datetime): |
| """Used to mock out parts of datetime.datetime.""" |
| pass |
| |
| |
| class PassingExperimentalFunctionalTests(mox.MoxTestBase, test.TestCase): |
| """ |
| Does a functional test of the passing_experimental.py script. |
| |
| It uses an in-memory database, mocks out the saving and loading of the |
| storage object and mocks out the sending of the bugs. Everything else |
| is a full run. |
| |
| """ |
| |
| def setUp(self): |
| super(PassingExperimentalFunctionalTests, self).setUp() |
| setup_test_environment.set_up() |
| # All of our tests will involve mocking out the datetime.today() class |
| # method. |
| self.mox.StubOutWithMock(MockDatetime, 'today') |
| self.datetime = datetime.datetime |
| datetime.datetime = MockDatetime |
| # We really do not want a script that modifies the DB to run during |
| # testing. So we will mock this out even though we will mock out the |
| # function that calls it in case of refactoring. |
| self.mox.StubOutWithMock(subprocess, 'call') |
| # We need to mock out this function so bugs are not filed. |
| self.mox.StubOutClassWithMocks(reporting, 'Bug') |
| self.mox.StubOutClassWithMocks(reporting, 'Reporter') |
| self._orig_since_failure = passing_experimental._MIN_DAYS_SINCE_FAILURE |
| self._orig_since_pass = passing_experimental._MAX_DAYS_SINCE_LAST_PASS |
| |
| |
| def tearDown(self): |
| passing_experimental._MAX_DAYS_SINCE_LAST_PASS = self._orig_since_pass |
| passing_experimental._MIN_DAYS_SINCE_FAILURE = self._orig_since_failure |
| datetime.datetime = self.datetime |
| setup_test_environment.tear_down() |
| super(PassingExperimentalFunctionalTests, self).tearDown() |
| |
| |
| def test(self): |
| """Does a basic test of as much of the system as possible.""" |
| afe_models.Test(name='test1', test_type=0, path='test1', |
| experimental=True).save() |
| afe_models.Test(name='test2', test_type=0, path='test2', |
| experimental=True).save() |
| |
| tko_models.Status(status_idx=6, word='GOOD').save() |
| |
| job = tko_models.Job(job_idx=1) |
| kernel = tko_models.Kernel(kernel_idx=1) |
| machine = tko_models.Machine(machine_idx=1) |
| success_status = tko_models.Status(status_idx=GOOD_STATUS_IDX) |
| fail_status = tko_models.Status(status_idx=FAIL_STATUS_IDX) |
| |
| tko_test1 = tko_models.Test(job=job, status=success_status, |
| kernel=kernel, machine=machine, |
| test='test1', |
| started_time=self.datetime(2012, 1, 20)) |
| tko_test1.save() |
| tko_test2 = tko_models.Test(job=job, status=success_status, |
| kernel=kernel, machine=machine, |
| test='test2', |
| started_time=self.datetime(2012, 1, 20)) |
| tko_test2.save() |
| |
| passing_experimental._MAX_DAYS_SINCE_LAST_PASS = 10 |
| passing_experimental._MIN_DAYS_SINCE_FAILURE = 10 |
| |
| MockDatetime.today().AndReturn(self.datetime(2012, 1, 21)) |
| MockDatetime.today().AndReturn(self.datetime(2012, 1, 21)) |
| reporter1 = reporting.Reporter() |
| bug1 = reporting.Bug( |
| title=u'test1 should be promoted to non-experimental.', |
| summary=mox.IgnoreArg(), |
| search_marker=u'PassingExperimental(test1)') |
| reporter1.report(bug1).AndReturn((11, 1)) |
| reporter2 = reporting.Reporter() |
| bug2 = reporting.Bug( |
| title=u'test2 should be promoted to non-experimental.', |
| summary=mox.IgnoreArg(), |
| search_marker=u'PassingExperimental(test2)') |
| reporter2.report(bug2).AndReturn((11, 1)) |
| |
| self.mox.ReplayAll() |
| passing_experimental.main() |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |