From 2f84b59a4cf92a0ce1b985e7f44e17483efa33c0 Mon Sep 17 00:00:00 2001 From: Raphael Isemann Date: Thu, 5 Nov 2020 13:41:26 +0100 Subject: [PATCH] [lldb] Also Catch invalid calls to TestPExpectTest's expect() This is a follow up to D88792 which found an issue in a call to PExpectTest's expect function that allows passing a string to the `substrs` parameter. However this issue was found by just grepping and TestPExpect's expect function is still accepting a single string as a value to `substrs`. This patch adds the same sanity check that D88792 added to the PExpectTest's implementation of `expect` and also adds a small test for it. Reviewed By: kastiglione, JDevlieghere Differential Revision: https://reviews.llvm.org/D89302 --- lldb/packages/Python/lldbsuite/test/lldbpexpect.py | 4 +++ lldb/test/API/test_utils/TestPExpectTest.py | 29 ++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 lldb/test/API/test_utils/TestPExpectTest.py diff --git a/lldb/packages/Python/lldbsuite/test/lldbpexpect.py b/lldb/packages/Python/lldbsuite/test/lldbpexpect.py index 12ac4d3..1a6c320 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbpexpect.py +++ b/lldb/packages/Python/lldbsuite/test/lldbpexpect.py @@ -54,6 +54,10 @@ class PExpectTest(TestBase): def expect(self, cmd, substrs=None): self.assertNotIn('\n', cmd) self.child.sendline(cmd) + # If 'substrs' is a string then this code would just check that every + # character of the string is in the output. + assert not isinstance(substrs, six.string_types), \ + "substrs must be a collection of strings" if substrs is not None: for s in substrs: self.child.expect_exact(s) diff --git a/lldb/test/API/test_utils/TestPExpectTest.py b/lldb/test/API/test_utils/TestPExpectTest.py new file mode 100644 index 0000000..c754f1f --- /dev/null +++ b/lldb/test/API/test_utils/TestPExpectTest.py @@ -0,0 +1,29 @@ +""" +Test the PExpectTest test functions. +""" + + +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * +from textwrap import dedent + + +class TestPExpectTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + NO_DEBUG_INFO_TESTCASE = True + + def assert_expect_fails_with(self, cmd, expect_args, expected_msg): + try: + self.expect(cmd, **expect_args) + except AssertionError as e: + self.assertIn(expected_msg, str(e)) + else: + self.fail("expect should have raised AssertionError!") + + def test_expect(self): + # Test that passing a string to the 'substrs' argument is rejected. + self.assert_expect_fails_with("settings list prompt", + dict(substrs="some substring"), + "substrs must be a collection of strings") -- 2.7.4