# Copyright 2016 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.

"""Sync the clock of DUT with the clock of station.

Description
-----------
This test set DUT clock to station clock time, and then check if the difference
between DUT clock time and station clock time exceeds a given threshold. If
exceeds, this test will fail.

Test Procedure
--------------
This is an automatic test that doesn't need any user interaction.

1. Firstly, this test will create a DUT link.
2. If the link is not a local link, DUT clock will be set to station clock time.
3. This test will check the difference between DUT clock time and station clock
   time, and fail if it exceeds the given tolerance. Otherwise, the test will
   pass.

Dependency
----------
- DUT link must be ready before running this test.

Examples
--------
To sync the clock of DUT with the clock of station with default tolerance::

  FactoryTest(pytest_name='sync_time')

To sync with tolerance time set to 3 seconds::

  FactoryTest(pytest_name='sync_time', dargs=dict(tolerance=3.0))
"""

import datetime
import unittest

import factory_common  # pylint: disable=unused-import
from cros.factory.device import device_utils
from cros.factory.test import factory
from cros.factory.test.utils import time_utils as test_time_utils
from cros.factory.utils.arg_utils import Arg
from cros.factory.utils import time_utils


class SyncTime(unittest.TestCase):

  ARGS = [
      Arg('tolerance', float,
          'Max absolute time difference between DUT and station after sync.',
          default=5.0, optional=True)]

  def setUp(self):
    self.dut = device_utils.CreateDUTInterface()

  def runTest(self):
    factory.console.info('DUT time was: %s',
                         self.dut.CallOutput(['date', '-u'], log=True))

    test_time_utils.SyncDate(self.dut)

    dut_now = float(self.dut.CallOutput(['date', '-u', '+%s'], log=True))
    goofy_now = (datetime.datetime.utcnow() -
                 time_utils.EPOCH_ZERO).total_seconds()

    self.assertAlmostEqual(goofy_now, dut_now, delta=self.args.tolerance)
