# Copyright (c) 2014 The Chromium 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 contextlib
import datetime
import os
import time
import unittest

import common

from autotest_lib.client.common_lib import time_utils


@contextlib.contextmanager
def set_time_zone(tz):
    """Temporarily set the timezone to the specified value.

    This is needed because the unittest can be run in a server not in PST.

    @param tz: Name of the timezone for test, e.g., US/Pacific
    """
    old_environ = os.environ.copy()
    try:
        os.environ['TZ'] = tz
        time.tzset()
        yield
    finally:
        os.environ.clear()
        os.environ.update(old_environ)
        time.tzset()


class time_utils_unittest(unittest.TestCase):
    """Unittest for time_utils function."""

    TIME_STRING = "2014-08-20 14:23:56"
    TIME_SECONDS = 1408569836
    TIME_OBJ = datetime.datetime(year=2014, month=8, day=20, hour=14,
                                 minute=23, second=56)

    def test_date_string_to_epoch_time(self):
        """Test date parsing in date_string_to_epoch_time()."""
        with set_time_zone('US/Pacific'):
            parsed_seconds = time_utils.date_string_to_epoch_time(
                    self.TIME_STRING)
            self.assertEqual(self.TIME_SECONDS, parsed_seconds)


    def test_epoch_time_to_date_string(self):
        """Test function epoch_time_to_date_string."""
        with set_time_zone('US/Pacific'):
            time_string = time_utils.epoch_time_to_date_string(
                    self.TIME_SECONDS)
            self.assertEqual(self.TIME_STRING, time_string)


    def test_to_epoch_time_success(self):
        """Test function to_epoch_time."""
        with set_time_zone('US/Pacific'):
            self.assertEqual(self.TIME_SECONDS,
                             time_utils.to_epoch_time(self.TIME_STRING))

            self.assertEqual(self.TIME_SECONDS,
                             time_utils.to_epoch_time(self.TIME_OBJ))


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