# 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 logging
import time

from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros.bluetooth import bluetooth_device_xmlrpc_server
from autotest_lib.client.cros.power import power_test

class power_Idle(power_test.power_Test):
    """class for power_Idle test.

    Collects power stats when machine is idle, also compares power stats between
    when bluetooth adapter is on and off.
    """
    version = 1

    def initialize(self):
        super(power_Idle, self).initialize(seconds_period=10.)

    def run_once(self, idle_time=120, bt_warmup_time=20):
        """Collect power stats when bluetooth adapter is on or off.

        """
        bt_device = bluetooth_device_xmlrpc_server \
            .BluetoothDeviceXmlRpcDelegate()

        with chrome.Chrome():
            if not bt_device.set_powered(False):
                raise error.TestFail('Cannot turn off bluetooth adapter.')

            self.start_measurements()
            time.sleep(idle_time)
            self.checkpoint_measurements('bluetooth_adapter_off')

            # Turn on bluetooth adapter.
            # If we cannot start bluetoothd, fail gracefully and still write
            # data with bluetooth adapter off to file, as we are interested in
            # just that data too. start_bluetoothd() already logs the error so
            # not logging any error here.
            if not bt_device.start_bluetoothd():
                return
            if not bt_device.set_powered(True):
                logging.warning('Cannot turn on bluetooth adapter.')
                return
            time.sleep(bt_warmup_time)
            if not bt_device._is_powered_on():
                logging.warning('Bluetooth adapter is off.')
                return
            t1 = time.time()
            time.sleep(idle_time)
            self.checkpoint_measurements('bluetooth_adapter_on', t1)
            bt_device.set_powered(False)
            bt_device.stop_bluetoothd()
