blob: 458c972c74ec04c525c84c3c3c44029001049148 [file] [log] [blame]
#!/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()