#!/usr/bin/python2
#
# Copyright 2015 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.

"""Unittests for server/cros/dynamic_suite/frontend_wrappers.py"""

import mox
import unittest

import common

from autotest_lib.server.cros.dynamic_suite import frontend_wrappers


class FrontendWrappersTest(mox.MoxTestBase):
  """Unit tests for frontend_wrappers global functions."""

  def testConvertTimeoutToRetryBasic(self):
    """Test converting timeout and delay values to retry attempts."""
    backoff = 2
    timeout_min = 10
    delay_sec = 10

    max_retry = frontend_wrappers.convert_timeout_to_retry(backoff,
                                                           timeout_min,
                                                           delay_sec)

    self.assertEquals(max_retry, 6)

  def testConvertTimeoutToRetryLimit(self):
    """Test approaching a change in attempt amount."""
    backoff = 2
    delay_sec = 10
    timeout_min_lower_limit = 42.499999
    timeout_min_at_limit = 42.5
    timeout_min_upper_limit = 42.599999

    max_retry_lower_limit = frontend_wrappers.convert_timeout_to_retry(
        backoff, timeout_min_lower_limit, delay_sec)

    max_retry_at_limit = frontend_wrappers.convert_timeout_to_retry(
        backoff, timeout_min_at_limit, delay_sec)

    max_retry_upper_limit = frontend_wrappers.convert_timeout_to_retry(
        backoff, timeout_min_upper_limit, delay_sec)

    # Eight attempts with a backoff factor of two should be sufficient
    # for timeouts up to 2550 seconds (or 42.5 minutes).
    self.assertEquals(max_retry_lower_limit, 8)
    self.assertEquals(max_retry_at_limit, 8)

    # We expect to see nine attempts, as we are above the 42.5 minute
    # threshold.
    self.assertEquals(max_retry_upper_limit, 9)

  def testConvertTimeoutToRetrySmallTimeout(self):
    """Test converting to retry attempts when a small timeout is used."""
    backoff = 2
    timeout_min = 0.01
    delay_sec = 10

    max_retry = frontend_wrappers.convert_timeout_to_retry(backoff,
                                                           timeout_min,
                                                           delay_sec)

    # The number of attempts should be less than one using the formula
    # outlined in the function, but, we always round up to the nearest
    # integer.
    self.assertEquals(max_retry, 1)

  def testConvertTimeoutToRetrySmallDelay(self):
    """Test converting to retry attempts when the delay is small."""
    backoff = 2
    timeout_min = 30
    delay_sec = 0.01

    max_retry = frontend_wrappers.convert_timeout_to_retry(backoff,
                                                           timeout_min,
                                                           delay_sec)

    # The number of retries shouldn't be too large despite the small
    # delay as a result of backing off in an exponential fashion.
    self.assertEquals(max_retry, 18)


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