| #!/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, unittest |
| |
| import mox |
| |
| import common |
| # This must come before the import of utils 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 utils |
| from autotest_lib.frontend.tko import models |
| from django import test |
| |
| ERROR_STATUS = models.Status(status_idx=2, word='ERROR') |
| ABORT_STATUS = models.Status(status_idx=3, word='ABORT') |
| FAIL_STATUS = models.Status(status_idx=4, word='FAIL') |
| WARN_STATUS = models.Status(status_idx=5, word='WARN') |
| GOOD_STATUS = models.Status(status_idx=6, word='GOOD') |
| ALERT_STATUS = models.Status(status_idx=7, word='ALERT') |
| |
| |
| def add_statuses(): |
| """ |
| Save the statuses to the in-memory database. |
| |
| These normally exist in the database and the code expects them. However, the |
| normal test database setup does not do this for us. |
| """ |
| ERROR_STATUS.save() |
| ABORT_STATUS.save() |
| FAIL_STATUS.save() |
| WARN_STATUS.save() |
| GOOD_STATUS.save() |
| ALERT_STATUS.save() |
| |
| |
| class GetLastPassTimesTests(mox.MoxTestBase, test.TestCase): |
| """Tests the get_last_pass_times function.""" |
| |
| def setUp(self): |
| super(GetLastPassTimesTests, self).setUp() |
| setup_test_environment.set_up() |
| add_statuses() |
| |
| |
| def tearDown(self): |
| setup_test_environment.tear_down() |
| super(GetLastPassTimesTests, self).tearDown() |
| |
| |
| def test_return_most_recent_pass(self): |
| """The last time a test passed should be returned.""" |
| # To add a test entry to the database, the test object has to |
| # be instantiated with various other model instances. We give these |
| # instances dummy id values. |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| early_pass = models.Test(job=job, status=GOOD_STATUS, |
| kernel=kernel, machine=machine, |
| test='test', |
| started_time=datetime.datetime(2012, 1, 1)) |
| early_pass.save() |
| late_pass = models.Test(job=job, status=GOOD_STATUS, |
| kernel=kernel, machine=machine, |
| test='test', |
| started_time=datetime.datetime(2012, 1, 2)) |
| late_pass.save() |
| |
| results = utils.get_last_pass_times() |
| |
| self.assertEquals(results, {'test': datetime.datetime(2012, 1, 2)}) |
| |
| |
| def test_only_return_passing_tests(self): |
| """Tests that only tests that have passed at some point are returned.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| passing_test = models.Test(job=job, status=GOOD_STATUS, |
| kernel=kernel, machine=machine, |
| test='passing_test', |
| started_time=datetime.datetime(2012, 1, 1)) |
| passing_test.save() |
| failing_test = models.Test(job=job, status=FAIL_STATUS, |
| kernel=kernel, machine=machine, |
| test='failing_test', |
| started_time=datetime.datetime(2012, 1, 1)) |
| failing_test.save() |
| |
| results = utils.get_last_pass_times() |
| |
| self.assertEquals(results, |
| {'passing_test': datetime.datetime(2012, 1, 1)}) |
| |
| |
| def test_return_all_passing_tests(self): |
| """This function returns all tests that passed at least once.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| test1 = models.Test(job=job, status=GOOD_STATUS, |
| kernel=kernel, machine=machine, |
| test='test1', |
| started_time=datetime.datetime(2012, 1, 1)) |
| test1.save() |
| test2 = models.Test(job=job, status=GOOD_STATUS, |
| kernel=kernel, machine=machine, |
| test='test2', |
| started_time=datetime.datetime(2012, 1, 2)) |
| test2.save() |
| |
| results = utils.get_last_pass_times() |
| |
| self.assertEquals(results, {'test1': datetime.datetime(2012, 1, 1), |
| 'test2': datetime.datetime(2012, 1, 2)}) |
| |
| |
| class GetLastFailTimesTests(mox.MoxTestBase, test.TestCase): |
| """Tests the get_last_fail_times function.""" |
| |
| def setUp(self): |
| super(GetLastFailTimesTests, self).setUp() |
| setup_test_environment.set_up() |
| add_statuses() |
| |
| |
| def tearDown(self): |
| setup_test_environment.tear_down() |
| super(GetLastFailTimesTests, self).tearDown() |
| |
| |
| def test_return_most_recent_fail(self): |
| """The last time a test failed should be returned.""" |
| # To add a test entry to the database, the test object has to |
| # be instantiated with various other model instances. We give these |
| # instances dummy id values. |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| early_fail = models.Test(job=job, status=FAIL_STATUS, |
| kernel=kernel, machine=machine, |
| test='test', |
| started_time=datetime.datetime(2012, 1, 1)) |
| early_fail.save() |
| late_fail = models.Test(job=job, status=FAIL_STATUS, |
| kernel=kernel, machine=machine, |
| test='test', |
| started_time=datetime.datetime(2012, 1, 2)) |
| late_fail.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, {'test': datetime.datetime(2012, 1, 2)}) |
| |
| |
| def test_does_not_return_passing_tests(self): |
| """Test that passing test entries are not included.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| passing_test = models.Test(job=job, status=GOOD_STATUS, |
| kernel=kernel, machine=machine, |
| test='passing_test', |
| started_time=datetime.datetime(2012, 1, 1)) |
| passing_test.save() |
| failing_test = models.Test(job=job, status=FAIL_STATUS, |
| kernel=kernel, machine=machine, |
| test='failing_test', |
| started_time=datetime.datetime(2012, 1, 1)) |
| failing_test.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, |
| {'failing_test': datetime.datetime(2012, 1, 1)}) |
| |
| |
| def test_return_all_failing_tests(self): |
| """This function returns all tests that failed at least once.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| test1 = models.Test(job=job, status=FAIL_STATUS, |
| kernel=kernel, machine=machine, |
| test='test1', |
| started_time=datetime.datetime(2012, 1, 1)) |
| test1.save() |
| test2 = models.Test(job=job, status=FAIL_STATUS, |
| kernel=kernel, machine=machine, |
| test='test2', |
| started_time=datetime.datetime(2012, 1, 2)) |
| test2.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, {'test1': datetime.datetime(2012, 1, 1), |
| 'test2': datetime.datetime(2012, 1, 2)}) |
| |
| |
| def test_returns_treats_error_status_as_failure(self): |
| """Error statuses should count as a failure.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| test = models.Test(job=job, status=ERROR_STATUS, |
| kernel=kernel, machine=machine, |
| test='error', |
| started_time=datetime.datetime(2012, 1, 1)) |
| test.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, {'error': datetime.datetime(2012, 1, 1)}) |
| |
| |
| def test_returns_treats_abort_status_as_failure(self): |
| """ |
| Abort statuses should count as failures. |
| |
| This should be changed once Abort only represents user caused aborts. |
| See issue crbug.com/188217. |
| """ |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| test = models.Test(job=job, status=ABORT_STATUS, |
| kernel=kernel, machine=machine, |
| test='abort', |
| started_time=datetime.datetime(2012, 1, 1)) |
| test.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, {'abort': datetime.datetime(2012, 1, 1)}) |
| |
| |
| def test_returns_treats_warn_status_as_failure(self): |
| """Warn statuses should count as failures.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| test = models.Test(job=job, status=WARN_STATUS, |
| kernel=kernel, machine=machine, |
| test='warn', |
| started_time=datetime.datetime(2012, 1, 1)) |
| test.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, {'warn': datetime.datetime(2012, 1, 1)}) |
| |
| |
| def test_returns_treats_alert_status_as_failure(self): |
| """Alert statuses should count as failures.""" |
| job = models.Job(job_idx=1) |
| kernel = models.Kernel(kernel_idx=1) |
| machine = models.Machine(machine_idx=1) |
| |
| test = models.Test(job=job, status=ALERT_STATUS, |
| kernel=kernel, machine=machine, |
| test='alert', |
| started_time=datetime.datetime(2012, 1, 1)) |
| test.save() |
| |
| results = utils.get_last_fail_times() |
| |
| self.assertEquals(results, {'alert': datetime.datetime(2012, 1, 1)}) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |