287 lines
10 KiB
Python
Executable file
287 lines
10 KiB
Python
Executable file
#!/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()
|