#!/usr/bin/python
# Copyright (c) 2014 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 collections
import unittest

import common
from autotest_lib.site_utils import host_history_utils

class HostHistoryUtilsTests(unittest.TestCase):
    """Test functions in host_history_utils.
    """

    def testCalculateStatusTimes(self):
        """Test function calculate_status_times.
        """
        # Locks in the middle does not affect the host history.
        locked_intervals = [(2, 4), (4, 8)]
        results = host_history_utils.calculate_status_times(
                t_start=0, t_end=10, int_status='Ready', metadata={},
                locked_intervals=locked_intervals)
        expected = collections.OrderedDict(
                [((0, 4), {'status': 'Ready', 'metadata': {}}),
                 ((4, 8), {'status': 'Ready', 'metadata': {}}),
                 ((8, 10), {'status': 'Ready', 'metadata': {}})])
        self.assertEqual(results, expected)

        locked_intervals = [(0, 4), (11, 14), (16, 18)]
        results = host_history_utils.calculate_status_times(
                t_start=10, t_end=15, int_status='Ready', metadata={},
                locked_intervals=locked_intervals)
        expected = collections.OrderedDict(
                [((10, 14), {'status': 'Ready', 'metadata': {}}),
                 ((14, 15), {'status': 'Ready', 'metadata': {}})])
        self.assertEqual(results, expected)

        locked_intervals = [(2, 4), (4, 8)]
        results = host_history_utils.calculate_status_times(
                t_start=0, t_end=10, int_status='Running', metadata={},
                locked_intervals=locked_intervals)
        expected = collections.OrderedDict(
                [((0, 4), {'status': 'Running', 'metadata': {}}),
                 ((4, 8), {'status': 'Running', 'metadata': {}}),
                 ((8, 10), {'status': 'Running', 'metadata': {}})])
        self.assertEqual(results, expected)

        locked_intervals = [(1, 8)]
        results = host_history_utils.calculate_status_times(
                t_start=2, t_end=5, int_status='Running', metadata={},
                locked_intervals=locked_intervals)
        expected = collections.OrderedDict(
                [((2, 5), {'status': 'Locked', 'metadata': {}})])
        self.assertEqual(results, expected)


if __name__ == '__main__':
    unittest.main()
