# Copyright 2021 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.

"""Unittests for build_minios.py"""

import os
import tempfile
from unittest import mock

from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import minios
from chromite.scripts import build_minios


class BuildMiniosTest(cros_test_lib.RunCommandTempDirTestCase):
  """Unit tests for build_minios."""

  def setUp(self):
    self.create_minios_mock_return = '/some/kernel/path'
    self.create_minios_mock = self.PatchObject(
        minios, 'CreateMiniOsKernelImage',
        return_value=self.create_minios_mock_return)

    self.insert_minios_mock = self.PatchObject(
        minios, 'InsertMiniOsKernelImage')

    # Patch to assert against the tempdir that's created under the anchored
    # tempdir created by cros_test_lib.
    self._tempdir = os.path.join(self.tempdir, 'test-dir')
    self.PatchObject(tempfile, 'mkdtemp', return_value=self._tempdir)

  def testDefaultArguments(self):
    """Test that default arguments of build_minios are formatted correct."""
    test_board = 'test-board'
    test_version = '0.0.0.0'
    test_image = '/some/image/path'
    build_minios.main([
        # --board is a required argument.
        '--board', test_board,
        # --version is a required argument.
        '--version', test_version,
        # --image is a required argument.
        '--image', test_image,
    ])

    self.assertEqual(self.create_minios_mock.mock_calls, [mock.call(
        test_board,
        test_version,
        self._tempdir,
        constants.VBOOT_DEVKEYS_DIR,
        constants.RECOVERY_PUBLIC_KEY,
        constants.MINIOS_DATA_PRIVATE_KEY,
        constants.MINIOS_KEYBLOCK,
        None,
        True,
        False,
    )])

    self.assertEqual(self.insert_minios_mock.mock_calls, [mock.call(
        test_image, self.create_minios_mock_return,
    )])

  def testOverridenArguments(self):
    """Test that overridden arguments of build_minios are formatted correct."""
    test_board = 'test-board'
    test_version = '1.0.0.0'
    test_image = '/some/image/path'
    test_keys_dir = '/some/path/test-keys-dir'
    test_public_key = 'test-public-key'
    test_private_key = 'test-private-key'
    test_keyblock = 'test-keyblock'
    test_serial = 'test-serial'
    build_minios.main([
        # --board is a required argument.
        '--board', test_board,
        # --version is a required argument.
        '--version', test_version,
        # --image is a required argument.
        '--image', test_image,
        '--keys-dir', test_keys_dir,
        '--public-key', test_public_key,
        '--private-key', test_private_key,
        '--keyblock', test_keyblock,
        '--serial', test_serial,
        '--force-build',
    ])

    self.assertEqual(self.create_minios_mock.mock_calls, [mock.call(
        test_board,
        test_version,
        self._tempdir,
        test_keys_dir,
        test_public_key,
        test_private_key,
        test_keyblock,
        test_serial,
        True,
        False,
    )])

    self.assertEqual(self.insert_minios_mock.mock_calls, [mock.call(
        test_image, self.create_minios_mock_return,
    )])

  def testModForDev(self):
    """Test that default arguments of build_minios are formatted correct."""
    test_board = 'test-board'
    test_version = '0.0.0.0'
    test_image = '/some/image/path'
    build_minios.main([
        # --board is a required argument.
        '--board', test_board,
        # --version is a required argument.
        '--version', test_version,
        # --image is a required argument.
        '--image', test_image,
        '--mod-for-dev',
    ])

    self.assertEqual(self.create_minios_mock.mock_calls, [mock.call(
        test_board,
        test_version,
        self._tempdir,
        constants.VBOOT_DEVKEYS_DIR,
        constants.RECOVERY_PUBLIC_KEY,
        constants.MINIOS_DATA_PRIVATE_KEY,
        constants.MINIOS_KEYBLOCK,
        None,
        False,
        True,
    )])

    self.assertEqual(self.insert_minios_mock.mock_calls, [mock.call(
        test_image, self.create_minios_mock_return,
    )])

  def testModForDevWithForceBuild(self):
    """Test that default arguments of build_minios are formatted correct."""
    test_board = 'test-board'
    test_version = '0.0.0.0'
    test_image = '/some/image/path'
    build_minios.main([
        # --board is a required argument.
        '--board', test_board,
        # --version is a required argument.
        '--version', test_version,
        # --image is a required argument.
        '--image', test_image,
        '--mod-for-dev',
        '--force-build',
    ])

    self.assertEqual(self.create_minios_mock.mock_calls, [mock.call(
        test_board,
        test_version,
        self._tempdir,
        constants.VBOOT_DEVKEYS_DIR,
        constants.RECOVERY_PUBLIC_KEY,
        constants.MINIOS_DATA_PRIVATE_KEY,
        constants.MINIOS_KEYBLOCK,
        None,
        True,
        True,
    )])

    self.assertEqual(self.insert_minios_mock.mock_calls, [mock.call(
        test_image, self.create_minios_mock_return,
    )])
