# Copyright 2018 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import unittest
from unittest import mock

import common
from autotest_lib.server import utils
from server.hosts import cros_firmware


VERSION_OUTPUT = """
{
  "any-model": {
    "host": { "versions": { "ro": "Google_Kukui.12573.13.0", "rw": "Google_Kukui.12573.13.0" },
      "keys": { "root": "b11d74edd286c144e1135b49e7f0bc20cf041f10", "recovery": "c14bd720b70d97394257e3e826bd8f43de48d4ed" },
      "image": "images/bios-kukui.ro-12573-13-0.rw-12573-13-0.bin" },
    "ec": { "versions": { "ro": "kukui_v2.0.2352-5c2c3c7a0", "rw": "kukui_v2.0.2352-5c2c3c7a0" },
      "image": "images/ec-kukui.ro-2-0-2352.rw-2-0-2352.bin" },
    "signature_id": "kukui"
  }
}
"""

NO_VERSION_OUTPUT = """
{
}
"""

UNIBUILD_VERSION_OUTPUT = """
{
  "kukui": {
    "host": { "versions": { "ro": "Google_Kukui.12573.13.0", "rw": "Google_Kukui.12573.13.0" },
      "keys": { "root": "b11d74edd286c144e1135b49e7f0bc20cf041f10", "recovery": "c14bd720b70d97394257e3e826bd8f43de48d4ed" },
      "image": "images/bios-kukui.ro-12573-13-0.rw-12573-13-0.bin" },
    "ec": { "versions": { "ro": "kukui_v2.0.2352-5c2c3c7a0", "rw": "kukui_v2.0.2352-5c2c3c7a0" },
      "image": "images/ec-kukui.ro-2-0-2352.rw-2-0-2352.bin" },
    "signature_id": "kukui"
  },
  "kodama": {
    "host": { "versions": { "ro": "Google_Kodama.12573.14.0", "rw": "Google_Kodama.12573.15.0" },
      "keys": { "root": "b11d74edd286c144e1135b49e7f0bc20cf041f10", "recovery": "c14bd720b70d97394257e3e826bd8f43de48d4ed" },
      "image": "images/bios-kodama.ro-12573-14-0.rw-12573-15-0.bin" },
    "ec": { "versions": { "ro": "kodama_v2.0.2354-8c3c92f29", "rw": "kodama_v2.0.2354-8c3c92f29" },
      "image": "images/ec-kodama.ro-2-0-2354.rw-2-0-2354.bin" },
    "signature_id": "kodama"
  },
  "krane": {
    "host": { "versions": { "ro": "Google_Krane.12573.13.0", "rw": "Google_Krane.12573.13.0" },
      "keys": { "root": "b11d74edd286c144e1135b49e7f0bc20cf041f10", "recovery": "c14bd720b70d97394257e3e826bd8f43de48d4ed" },
      "image": "images/bios-krane.ro-12573-13-0.rw-12573-13-0.bin" },
    "ec": { "versions": { "ro": "krane_v2.0.2352-5c2c3c7a0", "rw": "krane_v2.0.2352-5c2c3c7a0" },
      "image": "images/ec-krane.ro-2-0-2352.rw-2-0-2352.bin" },
    "signature_id": "krane"
  }
}
"""


class FirmwareVersionVerifierTest(unittest.TestCase):
    """Tests for FirmwareVersionVerifier."""

    def test_get_available_firmware_on_update_with_failure(self):
        """Test _get_available_firmware when update script exit_status=1."""
        result = utils.CmdResult(exit_status=1)
        host = mock.Mock()
        host.run.return_value = result
        host.get_firmware_manifest_key.return_value = 'lumpy'

        fw = cros_firmware._get_available_firmware(host)
        self.assertIsNone(fw)

    def test_get_available_firmware_returns_version(self):
        """_get_available_firmware returns BIOS version."""
        result = utils.CmdResult(stdout=VERSION_OUTPUT, exit_status=0)
        host = mock.Mock()
        host.run.return_value = result
        host.get_firmware_manifest_key.return_value = 'kukui'

        fw = cros_firmware._get_available_firmware(host)
        self.assertEqual(fw, 'Google_Kukui.12573.13.0')

    def test_get_available_firmware_returns_none(self):
        """_get_available_firmware returns None."""
        result = utils.CmdResult(stdout=NO_VERSION_OUTPUT, exit_status=0)
        host = mock.Mock()
        host.run.return_value = result
        host.get_firmware_manifest_key.return_value = 'kukui'

        fw = cros_firmware._get_available_firmware(host)
        self.assertIsNone(fw)

    def test_get_available_firmware_unibuild(self):
        """_get_available_firmware on unibuild board with multiple models."""
        result = utils.CmdResult(stdout=UNIBUILD_VERSION_OUTPUT,
                                 exit_status=0)
        host = mock.Mock()
        host.run.return_value = result

        host.get_firmware_manifest_key.return_value = 'kukui'
        fw = cros_firmware._get_available_firmware(host)
        self.assertEqual(fw, 'Google_Kukui.12573.13.0')

        host.get_firmware_manifest_key.return_value = 'kodama'
        fw = cros_firmware._get_available_firmware(host)
        self.assertEqual(fw, 'Google_Kodama.12573.15.0')

        host.get_firmware_manifest_key.return_value = 'flapjack'
        fw = cros_firmware._get_available_firmware(host)
        self.assertIsNone(fw)


if __name__ == '__main__':
    unittest.main()
