diff --git a/src/test_pamhyr.py b/src/test_pamhyr.py index ad1c38c08e2d2657edbc0c0ba2521207c256ab63..1ce427b32c90720656aba99b25904c86d9f2e8bb 100644 --- a/src/test_pamhyr.py +++ b/src/test_pamhyr.py @@ -92,8 +92,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_simple(self): cmd = "/foo/bar a -b -c" @@ -101,8 +102,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_quoted(self): cmd = "\"/foo/bar\" -a -b -c" @@ -110,8 +112,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_quoted_with_space(self): cmd = "\"/foo/bar baz\" -a -b -c" @@ -119,8 +122,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_quoted_args(self): cmd = "/foo/bar -a -b -c=\"baz\"" @@ -128,8 +132,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_quoted_args_with_space(self): cmd = "/foo/bar -a -b -c=\"baz bazz\"" @@ -137,8 +142,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_quoted2_args_with_space(self): cmd = "\'/foo/bar baz\' -a -b -c='baz bazz'" @@ -146,8 +152,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_unix_escape_space(self): cmd = r"/foo/bar\ baz -a -b -c" @@ -155,8 +162,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_windows_prog_files(self): cmd = "\"C:\\Program Files (x86)\foo\bar\" a -b -c" @@ -164,8 +172,9 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) def test_windows_prog_files_args(self): cmd = "\"C:\\Program Files (x86)\foo\bar\" a -b=\"baz bazz\" -c" @@ -176,5 +185,41 @@ class ToolsCMDParserTestCase(unittest.TestCase): res = parse_command_line(cmd) - for i, s in enumerate(expect): - self.assertEqual(res[i], s) + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) + + # Parse must detect malformed command line... But is not :\ + + @unittest.expectedFailure + def test_wrong_format_0(self): + cmd = "'toto -a -b='baz bazz' -c" + expect = [] + + res = parse_command_line(cmd) + + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) + + @unittest.expectedFailure + def test_wrong_format_1(self): + cmd = "\"toto -a -b=\"baz bazz\" -c" + expect = [] + + res = parse_command_line(cmd) + + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) + + @unittest.expectedFailure + def test_wrong_format_2(self): + cmd = "'toto -a -b=\"baz bazz\" -c" + expect = [] + + res = parse_command_line(cmd) + + self.assertEqual(len(res), len(expect)) + for i, s in enumerate(res): + self.assertEqual(expect[i], s) diff --git a/src/tools.py b/src/tools.py index 4b60db00e8b6f71ccb04de5b18ebc46ce3551f83..3203f24d0588b2f5174518e271eef7a2f5c84fdb 100644 --- a/src/tools.py +++ b/src/tools.py @@ -367,12 +367,17 @@ def parse_command_line(cmd): words = [] rest = cmd - while True: - if len(rest) == 0: - break + try: + while True: + if len(rest) == 0: + break - word, rest = _parse_next_word(rest) - words.append(word) + word, rest = _parse_next_word(rest) + words.append(word) + except Exception as e: + logger.error(f"{parse_command_line}: Failed to parse command line '{cmd}'") + logger.error(f" exception raise {e}") + return [] return words @@ -442,9 +447,9 @@ def _parse_word_up_to_next_sep(words, sep=" "): i += len(sub_word) + 1 word += sub_word + cur - # Get next symbol + # Get next token i += 1 - if i == len(words): + if i >= len(words): cur = "" else: cur = words[i]