# Copyright 2019 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.
"""
Test which updates chameleond on the Bluetooth Peer device

This is not a test per se. This 'test' checks if the chameleond commit on the
Bluetooth peer device and updates it if it below the expected value.

The expected commit and the installation bundle is downloaded from google cloud
storage.
"""

from autotest_lib.client.common_lib import error
from autotest_lib.server import test
from autotest_lib.server.cros.bluetooth import bluetooth_peer_update

class bluetooth_PeerUpdate(test.test):
    """
    This test updates chameleond on Bluetooth peer devices

    """

    version = 1

    def run_once(self, host):
        """ Update Bluetooth peer device

        @param host: the DUT, usually a chromebook
        """
        try:
            self.host = host
            commit = None
            (_, commit) = bluetooth_peer_update.get_latest_commit()
            if commit is None:
                raise error.TestFail('Unable to get current commit')
            if not bluetooth_peer_update.download_installation_files(self.host,
                                                                     commit):
                raise error.TestFail('Unable to download installation files ')
            bluetooth_peer_update.update_peers(self.host, commit)
        finally:
            if not bluetooth_peer_update.cleanup(host, commit):
                raise error.TestFail('Cleanup failed')
