You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
9.2 KiB
229 lines
9.2 KiB
#!/usr/bin/python2
|
|
|
|
import contextlib
|
|
import sys
|
|
import unittest
|
|
|
|
import common
|
|
from autotest_lib.site_utils.deployment import cmdparse
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def _suppress_error_output():
|
|
stderr_save = sys.stderr
|
|
try:
|
|
with open('/dev/null', 'w') as sys.stderr:
|
|
yield
|
|
finally:
|
|
sys.stderr = stderr_save
|
|
|
|
|
|
class BooleanArgumentTestCase(unittest.TestCase):
|
|
"""Tests for parsing and adding boolean arguments."""
|
|
|
|
def _make_parser(self, option, default):
|
|
parser = cmdparse._ArgumentParser()
|
|
parser.add_boolean_argument(option, default)
|
|
return parser
|
|
|
|
def test_conflicting_options_raises_error_with_false_default(self):
|
|
"""Test handling when both the true and false options are used."""
|
|
# By default, when there's a command line syntax error,
|
|
# `argparse.ArgumentParser` prints messages on sys.stderr and
|
|
# then calls `sys.exit()`. So, take the time to catch/suppress
|
|
# those behaviors.
|
|
with _suppress_error_output():
|
|
parser = self._make_parser('option', False)
|
|
with self.assertRaises(SystemExit):
|
|
parser.parse_args(['--option', '--nooption'])
|
|
with self.assertRaises(SystemExit):
|
|
parser.parse_args(['--nooption', '--option'])
|
|
|
|
def test_conflicting_options_raises_error_with_true_default(self):
|
|
"""Test handling when both the true and false options are used."""
|
|
# By default, when there's a command line syntax error,
|
|
# `argparse.ArgumentParser` prints messages on sys.stderr and
|
|
# then calls `sys.exit()`. So, take the time to catch/suppress
|
|
# those behaviors.
|
|
with _suppress_error_output():
|
|
parser = self._make_parser('option', True)
|
|
with self.assertRaises(SystemExit):
|
|
parser.parse_args(['--option', '--nooption'])
|
|
with self.assertRaises(SystemExit):
|
|
parser.parse_args(['--nooption', '--option'])
|
|
|
|
def test_no_option_wth_false_default(self):
|
|
"""Test option handling when no option is provided."""
|
|
parser = self._make_parser('option', False)
|
|
arguments = parser.parse_args([])
|
|
self.assertFalse(arguments.option)
|
|
|
|
def test_no_option_wth_true_default(self):
|
|
"""Test option handling when no option is provided."""
|
|
parser = self._make_parser('option', True)
|
|
arguments = parser.parse_args([])
|
|
self.assertTrue(arguments.option)
|
|
|
|
def test_true_option_returns_true_with_false_default(self):
|
|
"""Test option handling when only the true option is provided."""
|
|
parser = self._make_parser('option', False)
|
|
arguments = parser.parse_args(['--option'])
|
|
self.assertTrue(arguments.option)
|
|
|
|
def test_true_option_returns_true_with_true_default(self):
|
|
"""Test option handling when only the true option is provided."""
|
|
parser = self._make_parser('option', True)
|
|
arguments = parser.parse_args(['--option'])
|
|
self.assertTrue(arguments.option)
|
|
|
|
def test_false_option_returns_false_with_false_default(self):
|
|
"""Test option handling when only the false option is provided."""
|
|
parser = self._make_parser('option', False)
|
|
arguments = parser.parse_args(['--nooption'])
|
|
self.assertFalse(arguments.option)
|
|
|
|
def test_false_option_returns_false_with_true_default(self):
|
|
"""Test option handling when only the false option is provided."""
|
|
parser = self._make_parser('option', True)
|
|
arguments = parser.parse_args(['--nooption'])
|
|
self.assertFalse(arguments.option)
|
|
|
|
|
|
def _test_parse_command(argv):
|
|
return cmdparse.parse_command(['command'] + argv)
|
|
|
|
|
|
class _CommandParserTestCase(unittest.TestCase):
|
|
_ALL_SUBCOMMANDS = ['servo', 'firmware', 'test-image', 'repair']
|
|
|
|
def _check_common_defaults(self, arguments):
|
|
self.assertIsNone(arguments.web)
|
|
self.assertIsNone(arguments.logdir)
|
|
self.assertFalse(arguments.dry_run)
|
|
self.assertIsNone(arguments.board)
|
|
self.assertIsNone(arguments.build)
|
|
self.assertIsNone(arguments.hostname_file)
|
|
self.assertEquals(arguments.hostnames, [])
|
|
|
|
def test_web_option(self):
|
|
"""Test handling of `--web`, both long and short forms."""
|
|
opt_arg = 'servername'
|
|
for option in ['-w', '--web']:
|
|
argv = [option, opt_arg]
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertEquals(arguments.web, opt_arg)
|
|
|
|
def test_logdir_option(self):
|
|
"""Test handling of `--dir`, both long and short forms."""
|
|
opt_arg = 'dirname'
|
|
for option in ['-d', '--dir']:
|
|
argv = [option, opt_arg]
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertEquals(arguments.logdir, opt_arg)
|
|
|
|
def test_dry_run_option(self):
|
|
"""Test handling of `--dry-run`, both long and short forms."""
|
|
# assert False
|
|
for option in ['-n', '--dry-run']:
|
|
argv = [option]
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertTrue(arguments.dry_run)
|
|
|
|
def test_build_option(self):
|
|
"""Test handling of `--build`, both long and short forms."""
|
|
opt_arg = 'R66-10447.0.0'
|
|
for option in ['-i', '--build']:
|
|
argv = [option, opt_arg]
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertEquals(arguments.build, opt_arg)
|
|
|
|
def test_hostname_file_option(self):
|
|
"""Test handling of `--hostname_file`, both long and short forms."""
|
|
opt_arg = 'hostfiles.csv'
|
|
for option in ['-f', '--hostname_file']:
|
|
argv = [option, opt_arg]
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertEquals(arguments.hostname_file, opt_arg)
|
|
|
|
def test_upload_option(self):
|
|
"""Test handling of `--upload`, both long and short forms."""
|
|
argv = ['--upload']
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertTrue(arguments.upload)
|
|
|
|
def test_noupload_option(self):
|
|
"""Test handling of `--noupload`, both long and short forms."""
|
|
argv = ['--noupload']
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd] + argv)
|
|
self.assertFalse(arguments.upload)
|
|
|
|
def test_board_option(self):
|
|
"""Test the `--board` option for subcommands."""
|
|
opt_arg = 'board'
|
|
for option in ['-b', '--board']:
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd, option, opt_arg])
|
|
self.assertEquals(arguments.board, opt_arg)
|
|
|
|
def test_model_option(self):
|
|
"""Test the `--model` option for subcommands."""
|
|
opt_arg = 'model'
|
|
for option in ['-m', '--model']:
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd, option, opt_arg])
|
|
self.assertEquals(arguments.model, opt_arg)
|
|
|
|
def test_hostname_arguments(self):
|
|
"""Test hostname arguments for subcommands."""
|
|
argument = 'hostname'
|
|
for subcmd in self._ALL_SUBCOMMANDS:
|
|
arguments = _test_parse_command([subcmd, argument])
|
|
self.assertEquals(arguments.hostnames, [argument])
|
|
|
|
def test_servo_defaults(self):
|
|
"""Test argument defaults for `deploy servo`."""
|
|
arguments = _test_parse_command(['servo'])
|
|
self._check_common_defaults(arguments)
|
|
self.assertTrue(arguments.stageusb)
|
|
self.assertFalse(arguments.install_firmware)
|
|
self.assertFalse(arguments.install_test_image)
|
|
self.assertFalse(arguments.reinstall_test_image)
|
|
|
|
def test_firmware_defaults(self):
|
|
"""Test argument defaults for `deploy firmware`."""
|
|
arguments = _test_parse_command(['firmware'])
|
|
self._check_common_defaults(arguments)
|
|
self.assertFalse(arguments.stageusb)
|
|
self.assertFalse(arguments.reinstall_test_image)
|
|
self.assertTrue(arguments.install_firmware)
|
|
self.assertTrue(arguments.install_test_image)
|
|
|
|
def test_test_image_defaults(self):
|
|
"""Test argument defaults for `deploy test-image`."""
|
|
arguments = _test_parse_command(['test-image'])
|
|
self._check_common_defaults(arguments)
|
|
self.assertFalse(arguments.stageusb)
|
|
self.assertFalse(arguments.install_firmware)
|
|
self.assertFalse(arguments.reinstall_test_image)
|
|
self.assertTrue(arguments.install_test_image)
|
|
|
|
def test_repair_defaults(self):
|
|
"""Test argument defaults for `deploy repair`."""
|
|
arguments = _test_parse_command(['repair'])
|
|
self._check_common_defaults(arguments)
|
|
self.assertFalse(arguments.stageusb)
|
|
self.assertFalse(arguments.install_firmware)
|
|
self.assertFalse(arguments.install_test_image)
|
|
self.assertTrue(arguments.reinstall_test_image)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|