# Copyright (c) 2012 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 dbus
import logging
import time

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.networking import shill_context
from autotest_lib.client.cros.networking import shill_proxy


class cellular_StressEnable(test.test):
    """
    Stress-tests enabling and disabling a technology at short intervals.

    """
    version = 1

    okerrors = [
        shill_proxy.ShillProxy.ERROR_IN_PROGRESS
    ]

    def _enable_device(self, enable):
        try:
            timeout = shill_proxy.ShillProxy.DEVICE_ENABLE_DISABLE_TIMEOUT
            if enable:
                self.device.Enable(timeout=timeout)
            else:
                self.device.Disable(timeout=timeout)
        except dbus.exceptions.DBusException, err:
            if err.get_dbus_name() in cellular_StressEnable.okerrors:
                return
            raise error.TestFail(err)


    def _test(self, settle):
        self._enable_device(False)
        time.sleep(settle)
        self._enable_device(True)
        time.sleep(settle)


    def run_once(self, test_env, cycles=3, min=15, max=25):
        with test_env, shill_context.ServiceAutoConnectContext(
                test_env.shill.wait_for_cellular_service_object, False):
            self.device = test_env.shill.find_cellular_device_object()
            for t in xrange(max, min, -1):
                for n in xrange(cycles):
                    # deciseconds are an awesome unit.
                    logging.info('Cycle %d: %f seconds delay.', n, t / 10.0)
                    self._test(t / 10.0)
            logging.info('Done.')
