# Copyright 2017 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

from autotest_lib.client.common_lib import utils
from autotest_lib.client.common_lib.cros import dbus_send
from autotest_lib.client.common_lib.cros.cfm.usb import usb_device_collector
from autotest_lib.client.common_lib.cros.cfm.usb import cfm_usb_devices

ATRUS = cfm_usb_devices.ATRUS

def check_dbus_available(host):
    """
    Checks if Atrusd with dbus support is available.

    @param host: Host object to run a particular host.
    @returns True if dbus is supported in atrusd. False otherwise.
    """
    result = dbus_send.dbus_send(
            'org.freedesktop.DBus',
            'org.freedesktop.DBus',
            '/org/freedesktop/DBus',
            'ListNames',
            args=None,
            host=host,
            timeout_seconds=2,
            tolerate_failures=False)

    return 'org.chromium.Atrusctl' in result.response

def force_upgrade_atrus(host):
    """
    Executes a forced upgrade of the Atrus device.

    @param host: Host object to run a particular host.
    @returns True if the upgrade succeeded. False otherwise.
    """
    args = [dbus.String('/lib/firmware/google/atrus-fw-bundle-latest.bin')]
    result = dbus_send.dbus_send(
            'org.chromium.Atrusctl',
            'org.chromium.Atrusctl',
            '/org/chromium/Atrusctl',
            'ForceFirmwareUpgrade',
            args=args,
            host=host,
            timeout_seconds=90,
            tolerate_failures=True)

    return result.response

def wait_for_atrus_enumeration(host, timeout_seconds=30):
    """
    Wait for an Atrus device to enumerate.

    @param host: Host object to run a particular host.
    @param timeout_seconds: Maximum number of seconds to wait.
    """
    device_manager = usb_device_collector.UsbDeviceCollector(host)

    utils.poll_for_condition(
            lambda: len(device_manager.get_devices_by_spec(ATRUS)) >= 1,
            timeout=timeout_seconds,
            sleep_interval=1.0,
            desc='No atrus device enumerated')