#!/usr/bin/env python
# Copyright 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 time
import unittest

import common

from autotest_lib.client.common_lib import time_utils
from autotest_lib.site_utils import dut_status


class TimeOptionTests(unittest.TestCase):
    """Test the --since, --until, and --destination options.

    The options are allowed in these seven combinations:
      * No options - use the default end time and duration.
      * --since - use the given start time and the default end time.
      * --until - use the given end time and the default duration.
      * --duration - use the given duration and the default end time.
      * --since --until - use the given start and end times.
      * --since --duration - use the given start time and duration.
      * --until --duration - use the given end time and duration.

    It's an error to use all three options together.

    """

    def _try_parse(self, options):
        arguments = dut_status._parse_command(
                ['mumble.py'] + options + ['hostname'])
        dut_status._validate_time_range(arguments)
        return arguments


    def _check_duration(self, arguments, duration):
        start_time = (arguments.until - duration * 3600)
        assert arguments.since == start_time


    def _check_default_end(self, arguments, end_time):
        max_end = int(time.time())
        assert arguments.until <= end_time
        assert arguments.until <= max_end


    def test_default_time_bounds(self):
        """Test time bounds when no options are supplied."""
        end_time = int(time.time())
        arguments = self._try_parse([])
        self._check_default_end(arguments, end_time)
        self._check_duration(arguments, dut_status._DEFAULT_DURATION)


    def test_start_only(self):
        """Test time bounds with --since only.

        Also tests that --since and -s are equivalent.

        """
        end_time = int(time.time())
        start_time = end_time - 3600
        start_time_string = time_utils.epoch_time_to_date_string(start_time)
        for option in ['--since', '-s']:
            arguments = self._try_parse([option, start_time_string])
            self._check_default_end(arguments, end_time)
            assert arguments.since == start_time


    def test_end_only(self):
        """Test time bounds with --until only.

        Also tests that --until and -u are equivalent.

        """
        end_time = int(time.time()) - 3600
        end_time_string = time_utils.epoch_time_to_date_string(end_time)
        for option in ['--until', '-u']:
            arguments = self._try_parse([option, end_time_string])
            assert arguments.until == end_time
            self._check_duration(arguments, dut_status._DEFAULT_DURATION)


    def test_duration_only(self):
        """Test time bounds with --duration only.

        Also tests that --duration and -d are equivalent.

        """
        for option in ['--duration', '-d']:
            duration = 4
            duration_string = '%d' % duration
            end_time = int(time.time())
            arguments = self._try_parse([option, duration_string])
            self._check_default_end(arguments, end_time)
            self._check_duration(arguments, duration)


    def test_start_and_end(self):
        """Test time bounds with --since and --until."""
        start_time = int(time.time()) - 5 * 3600
        start_time_string = time_utils.epoch_time_to_date_string(start_time)
        end_time = start_time + 4 * 3600
        end_time_string = time_utils.epoch_time_to_date_string(end_time)
        arguments = self._try_parse(['--s', start_time_string,
                                     '--u', end_time_string])
        assert arguments.since == start_time
        assert arguments.until == end_time


    def test_start_and_duration(self):
        """Test time bounds with --since and --duration."""
        start_time = int(time.time()) - 5 * 3600
        start_time_string = time_utils.epoch_time_to_date_string(start_time)
        duration = 4
        duration_string = '%d' % duration
        arguments = self._try_parse(['-s', start_time_string,
                                     '-d', duration_string])
        assert arguments.since == start_time
        self._check_duration(arguments, duration)


    def test_end_and_duration(self):
        """Test time bounds with --until and --duration."""
        end_time = int(time.time()) - 5 * 3600
        end_time_string = time_utils.epoch_time_to_date_string(end_time)
        duration = 4
        duration_string = '%d' % duration
        arguments = self._try_parse(['-u', end_time_string,
                                     '-d', duration_string])
        assert arguments.until == end_time
        self._check_duration(arguments, duration)


    def test_all_options(self):
        """Test that all three options are a fatal error."""
        start_time = int(time.time()) - 5 * 3600
        start_time_string = time_utils.epoch_time_to_date_string(start_time)
        duration = 4
        duration_string = '%d' % duration
        end_time = start_time + duration * 3600
        end_time_string = time_utils.epoch_time_to_date_string(end_time)
        with self.assertRaises(SystemExit):
            self._try_parse(['-s', start_time_string,
                             '-u', end_time_string,
                             '-d', duration_string])


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