# 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.find_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.')
