| #!/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() |