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

"""This module tests the cros deploy command."""

from chromite.cli import command_unittest
from chromite.cli import deploy
from chromite.cli.cros import cros_deploy
from chromite.lib import commandline
from chromite.lib import cros_test_lib
from chromite.lib import remote_access


# pylint: disable=protected-access


class MockDeployCommand(command_unittest.MockCommand):
    """Mock out the deploy command."""

    TARGET = "chromite.cli.cros.cros_deploy.DeployCommand"
    TARGET_CLASS = cros_deploy.DeployCommand
    COMMAND = "deploy"


class CrosDeployTest(
    cros_test_lib.MockTempDirTestCase, cros_test_lib.OutputTestCase
):
    """Test calling `cros deploy` with various arguments.

    These tests just check that arguments as specified on the command
    line are properly passed through to deploy. Testing the
    actual update flow should be done in the deploy unit tests.
    """

    DEVICE = remote_access.TEST_IP
    PACKAGES = ["foo", "bar"]

    def SetupCommandMock(self, cmd_args):
        """Setup comand mock."""
        self.cmd_mock = MockDeployCommand(
            cmd_args, base_args=["--cache-dir", str(self.tempdir)]
        )
        self.StartPatcher(self.cmd_mock)

    def setUp(self):
        """Patches objects."""
        self.cmd_mock = None
        self.deploy_mock = self.PatchObject(deploy, "Deploy", autospec=True)
        self.run_inside_chroot_mock = self.PatchObject(
            commandline, "RunInsideChroot", autospec=True
        )

    def VerifyDeployParameters(self, device, packages, **kwargs):
        """Verifies the arguments passed to Deployer.Run().

        This function helps verify that command line specifications are
        parsed properly.

        Args:
            device: expected device hostname.
            packages: expected packages list.
            **kwargs: keyword arguments expected in the call to Deployer.Run().
                Arguments unspecified here are checked against their default
                value for `cros deploy`.
        """
        deploy_args, deploy_kwargs = self.deploy_mock.call_args
        self.assertEqual(device, deploy_args[0].hostname)
        self.assertListEqual(packages, deploy_args[1])
        # `cros deploy` default options. Must match AddParser().
        expected_kwargs = {
            "board": None,
            "strip": True,
            "emerge": True,
            "root": "/",
            "clean_binpkg": True,
            "emerge_args": None,
            "ssh_private_key": None,
            "ping": True,
            "dry_run": False,
            "force": False,
            "update": False,
            "deep": False,
            "deep_rev": False,
        }
        # Overwrite defaults with any variations in this test.
        expected_kwargs.update(kwargs)
        self.assertDictEqual(expected_kwargs, deploy_kwargs)

    def testDefaults(self):
        """Tests `cros deploy` default values."""
        self.SetupCommandMock([self.DEVICE] + self.PACKAGES)
        self.cmd_mock.inst.Run()
        self.assertTrue(self.run_inside_chroot_mock.called)
        self.VerifyDeployParameters(self.DEVICE, self.PACKAGES)

    def testDeployError(self):
        """Tests that DeployErrors are passed through."""
        with self.OutputCapturer():
            self.SetupCommandMock([self.DEVICE] + self.PACKAGES)
            self.deploy_mock.side_effect = deploy.DeployError
            with self.assertRaises(deploy.DeployError):
                self.cmd_mock.inst.Run()
