""" Test the format of API test suite assert failure messages """ import lldb import lldbsuite.test.lldbutil as lldbutil from lldbsuite.test.lldbtest import * from textwrap import dedent class AssertMessagesTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) NO_DEBUG_INFO_TESTCASE = True def assert_expect_fails_with(self, cmd, expect_args, expected_msg): try: # This expect should fail self.expect(cmd, **expect_args) except AssertionError as e: # Then check message from previous expect self.expect(str(e), exe=False, substrs=[dedent(expected_msg)]) else: self.fail("Initial expect should have raised AssertionError!") def test_expect(self): """Test format of messages produced by expect(...)""" # When an expect passes the messages are sent to the trace # file which we can't access here. So really, these only # check what failures look like, but it *should* be the same # content for the trace log too. # Will stop at startstr fail self.assert_expect_fails_with("settings list prompt", dict(startstr="dog", endstr="cat"), """\ Ran command: "settings list prompt" Got output: prompt -- The debugger command line prompt displayed for the user. Expecting start string: "dog" (was not found)""") # startstr passes, endstr fails # We see both reported self.assert_expect_fails_with("settings list prompt", dict(startstr=" prompt -- ", endstr="foo"), """\ Ran command: "settings list prompt" Got output: prompt -- The debugger command line prompt displayed for the user. Expecting start string: " prompt -- " (was found) Expecting end string: "foo" (was not found)""") # Same thing for substrs, regex patterns ignored because of substr failure # Any substr after the first missing is also ignored self.assert_expect_fails_with("abcdefg", dict(substrs=["abc", "ijk", "xyz"], patterns=["foo", "bar"], exe=False), """\ Checking string: "abcdefg" Expecting sub string: "abc" (was found) Expecting sub string: "ijk" (was not found)""") # Regex patterns also stop at first failure, subsequent patterns ignored # They are last in the chain so no other check gets skipped # Including the rest of the conditions here to prove they are run and shown self.assert_expect_fails_with("0123456789", dict(startstr="012", endstr="789", substrs=["345", "678"], patterns=["[0-9]+", "[a-f]+", "a|b|c"], exe=False), """\ Checking string: "0123456789" Expecting start string: "012" (was found) Expecting end string: "789" (was found) Expecting sub string: "345" (was found) Expecting sub string: "678" (was found) Expecting regex pattern: "[0-9]+" (was found, matched "0123456789") Expecting regex pattern: "[a-f]+" (was not found)""") # This time we dont' want matches but we do get them self.assert_expect_fails_with("the quick brown fox", # Note that the second pattern *will* match dict(patterns=["[0-9]+", "fox"], exe=False, matching=False, startstr="cat", endstr="rabbit", substrs=["abc", "def"]), """\ Checking string: "the quick brown fox" Not expecting start string: "cat" (was not found) Not expecting end string: "rabbit" (was not found) Not expecting sub string: "abc" (was not found) Not expecting sub string: "def" (was not found) Not expecting regex pattern: "[0-9]+" (was not found) Not expecting regex pattern: "fox" (was found, matched "fox")""") # Extra assert messages are only printed when we get a failure # So I can't test that from here, just how it looks when it's printed self.assert_expect_fails_with("mouse", dict(startstr="cat", exe=False, msg="Reason for check goes here!"), """\ Checking string: "mouse" Expecting start string: "cat" (was not found) Reason for check goes here!""") # Verify expect() preconditions. # Both `patterns` and `substrs` cannot be of type string. self.assert_expect_fails_with("any command", dict(patterns="some substring"), "patterns must be a collection of strings") self.assert_expect_fails_with("any command", dict(substrs="some substring"), "substrs must be a collection of strings") # Prevent `self.expect("cmd", "substr")` self.assert_expect_fails_with("any command", dict(msg="some substring"), "expect() missing a matcher argument") # Prevent `self.expect("cmd", "msg", "substr")` self.assert_expect_fails_with("any command", dict(msg="a message", patterns="some substring"), "must be a collection of strings")