diff --git a/subcmds/init.py b/subcmds/init.py index eb82e2e4..41578076 100644 --- a/subcmds/init.py +++ b/subcmds/init.py @@ -488,6 +488,9 @@ to update the working directory files. if opt.archive and opt.mirror: self.OptionParser.error('--mirror and --archive cannot be used together.') + if args: + self.OptionParser.error('init takes no arguments') + def Execute(self, opt, args): git_require(MIN_GIT_VERSION_HARD, fail=True) if not git_require(MIN_GIT_VERSION_SOFT): diff --git a/tests/test_subcmds.py b/tests/test_subcmds.py new file mode 100644 index 00000000..2234e646 --- /dev/null +++ b/tests/test_subcmds.py @@ -0,0 +1,43 @@ +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unittests for the subcmds module (mostly __init__.py than subcommands).""" + +import unittest + +import subcmds + + +class AllCommands(unittest.TestCase): + """Check registered all_commands.""" + + def test_required_basic(self): + """Basic checking of registered commands.""" + # NB: We don't test all subcommands as we want to avoid "change detection" + # tests, so we just look for the most common/important ones here that are + # unlikely to ever change. + for cmd in {'cherry-pick', 'help', 'init', 'start', 'sync', 'upload'}: + self.assertIn(cmd, subcmds.all_commands) + + def test_naming(self): + """Verify we don't add things that we shouldn't.""" + for cmd in subcmds.all_commands: + # Reject filename suffixes like "help.py". + self.assertNotIn('.', cmd) + + # Make sure all '_' were converted to '-'. + self.assertNotIn('_', cmd) + + # Reject internal python paths like "__init__". + self.assertFalse(cmd.startswith('__')) diff --git a/tests/test_subcmds_init.py b/tests/test_subcmds_init.py new file mode 100644 index 00000000..3a5ca3c2 --- /dev/null +++ b/tests/test_subcmds_init.py @@ -0,0 +1,49 @@ +# Copyright (C) 2020 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unittests for the subcmds/init.py module.""" + +import unittest + +from subcmds import init + + +class InitCommand(unittest.TestCase): + """Check registered all_commands.""" + + def setUp(self): + self.cmd = init.Init() + + def test_cli_parser_good(self): + """Check valid command line options.""" + ARGV = ( + [], + ) + for argv in ARGV: + opts, args = self.cmd.OptionParser.parse_args(argv) + self.cmd.ValidateOptions(opts, args) + + def test_cli_parser_bad(self): + """Check invalid command line options.""" + ARGV = ( + # Too many arguments. + ['asdf'], + + # Conflicting options. + ['--mirror', '--archive'], + ) + for argv in ARGV: + opts, args = self.cmd.OptionParser.parse_args(argv) + with self.assertRaises(SystemExit): + self.cmd.ValidateOptions(opts, args)