# Copyright 2015 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. """Tests the `cros chroot` command.""" from __future__ import print_function from chromite.cli import command_unittest from chromite.cli.cros import cros_chroot from chromite.lib import cros_build_lib from chromite.lib import cros_test_lib class MockChrootCommand(command_unittest.MockCommand): """Mock out the `cros chroot` command.""" TARGET = 'chromite.cli.cros.cros_chroot.ChrootCommand' TARGET_CLASS = cros_chroot.ChrootCommand COMMAND = 'chroot' def __init__(self, *args, **kwargs): command_unittest.MockCommand.__init__(self, *args, **kwargs) def Run(self, inst): return command_unittest.MockCommand.Run(self, inst) class ChrootTest(cros_test_lib.MockTestCase): """Test the ChrootCommand.""" def SetupCommandMock(self, cmd_args): """Sets up the `cros chroot` command mock.""" self.cmd_mock = MockChrootCommand(cmd_args) self.StartPatcher(self.cmd_mock) def setUp(self): """Patches objects.""" self.cmd_mock = None # Pretend we are inside the chroot, so the command doesn't really enter. self.mock_inside = self.PatchObject(cros_build_lib, 'IsInsideChroot', return_value=True) def testInteractive(self): """Tests flow for an interactive session.""" self.SetupCommandMock([]) self.cmd_mock.inst.Run() # Ensure we exec'd bash. self.cmd_mock.rc_mock.assertCommandContains(['bash'], mute_output=False) def testExplicitCmdNoArgs(self): """Tests a non-interactive command as a single argument.""" self.SetupCommandMock(['ls']) self.cmd_mock.inst.Run() # Ensure we exec'd ls with arguments. self.cmd_mock.rc_mock.assertCommandContains(['ls']) def testLoggingLevelNotice(self): """Tests that logging level is passed to cros_sdk script.""" self.SetupCommandMock(['ls']) self.cmd_mock.inst.options.log_level = 'notice' # Pretend that we are outside the chroot so the logging level gets passed as # an argument to cros_sdk. self.mock_inside.return_value = False self.cmd_mock.inst.Run() #Ensure that we exec'd with logging level notice. self.cmd_mock.rc_mock.assertCommandContains( ['ls'], chroot_args=['--log-level', 'notice'], enter_chroot=True) def testExplicitCmd(self): """Tests a non-interactive command as a single argument.""" self.SetupCommandMock(['ls', '/tmp']) self.cmd_mock.inst.Run() # Ensure we exec'd ls with arguments. self.cmd_mock.rc_mock.assertCommandContains(['ls', '/tmp']) def testOverlappingArguments(self): """Tests a non-interactive command as a single argument.""" self.SetupCommandMock(['ls', '--help']) self.cmd_mock.inst.Run() # Ensure we pass along "--help" instead of processing it directly. self.cmd_mock.rc_mock.assertCommandContains(['ls', '--help']) def testDashDashShell(self): """Tests an interactive specified with '--'.""" self.SetupCommandMock(['--']) self.cmd_mock.inst.Run() # Only -- implies we run bash. self.cmd_mock.rc_mock.assertCommandContains(['bash']) def testDashDashArgCommand(self): """Tests a command name that matches a valid argument, after '--'.""" # Technically, this should try to run the command "--help". self.SetupCommandMock(['--', '--help']) self.cmd_mock.inst.Run() # Ensure we pass along "--help" instead of processing it directly. self.cmd_mock.rc_mock.assertCommandContains(['--help'])