#!/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()