Index: packages/Python/lldbsuite/test/lldbplatformutil.py =================================================================== --- packages/Python/lldbsuite/test/lldbplatformutil.py +++ packages/Python/lldbsuite/test/lldbplatformutil.py @@ -137,3 +137,10 @@ return _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so') else: return None + +def hasChattyStderr(test_case): + """Some targets produce garbage on the standard error output. This utility function + determines whether the tests can be strict about the expected stderr contents.""" + if match_android_device(test_case.getArchitecture(), ['aarch64'], [22]): + return True # The dynamic linker on the device will complain about unknown DT entries + return False Index: packages/Python/lldbsuite/test/settings/TestSettings.py =================================================================== --- packages/Python/lldbsuite/test/settings/TestSettings.py +++ packages/Python/lldbsuite/test/settings/TestSettings.py @@ -312,8 +312,11 @@ with open('stderr.txt', 'r') as f: output = f.read() - self.expect(output, exe=False, - startstr = "This message should go to standard error.") + message = "This message should go to standard error." + if lldbplatformutil.hasChattyStderr(self): + self.expect(output, exe=False, substrs = [message]) + else: + self.expect(output, exe=False, startstr = message) # The 'stdout.txt' file should now exist. self.assertTrue(os.path.isfile("stdout.txt"), Index: packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteAuxvSupport.py =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteAuxvSupport.py +++ packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteAuxvSupport.py @@ -25,7 +25,7 @@ # Start the inferior... "read packet: $c#63", # ... match output.... - { "type":"output_match", "regex":r"^message:main entered\r\n$" }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"message:main entered\r\n") }, ], True) # ... then interrupt. self.add_interrupt_packets() Index: packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteRegisterState.py =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteRegisterState.py +++ packages/Python/lldbsuite/test/tools/lldb-server/TestGdbRemoteRegisterState.py @@ -26,7 +26,7 @@ # Start the inferior... "read packet: $c#63", # ... match output.... - { "type":"output_match", "regex":r"^message:main entered\r\n$" }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"message:main entered\r\n") }, ], True) # ... then interrupt. self.add_interrupt_packets() Index: packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py +++ packages/Python/lldbsuite/test/tools/lldb-server/TestLldbGdbServer.py @@ -232,7 +232,7 @@ self.add_verified_launch_packets(launch_args) self.test_sequence.add_log_lines( ["read packet: $vCont;c#a8", - {"type":"output_match", "regex":r"^hello, world\r\n$" }, + {"type":"output_match", "regex": self.maybe_strict_output_regex(r"hello, world\r\n")}, "send packet: $W00#00"], True) @@ -868,7 +868,8 @@ "read packet: $c#63", # Match output line that prints the memory address of the message buffer within the inferior. # Note we require launch-only testing so we can get inferior otuput. - { "type":"output_match", "regex":r"^data address: 0x([0-9a-fA-F]+)\r\n$", "capture":{ 1:"message_address"} }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"data address: 0x([0-9a-fA-F]+)\r\n"), + "capture":{ 1:"message_address"} }, # Now stop the inferior. "read packet: {}".format(chr(3)), # And wait for the stop notification. @@ -950,7 +951,8 @@ "read packet: $c#63", # Match output line that prints the memory address of the message buffer within the inferior. # Note we require launch-only testing so we can get inferior otuput. - { "type":"output_match", "regex":r"^code address: 0x([0-9a-fA-F]+)\r\n$", "capture":{ 1:"code_address"} }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"code address: 0x([0-9a-fA-F]+)\r\n"), + "capture":{ 1:"code_address"} }, # Now stop the inferior. "read packet: {}".format(chr(3)), # And wait for the stop notification. @@ -1011,7 +1013,8 @@ "read packet: $c#63", # Match output line that prints the memory address of the message buffer within the inferior. # Note we require launch-only testing so we can get inferior otuput. - { "type":"output_match", "regex":r"^stack address: 0x([0-9a-fA-F]+)\r\n$", "capture":{ 1:"stack_address"} }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"stack address: 0x([0-9a-fA-F]+)\r\n"), + "capture":{ 1:"stack_address"} }, # Now stop the inferior. "read packet: {}".format(chr(3)), # And wait for the stop notification. @@ -1072,7 +1075,8 @@ "read packet: $c#63", # Match output line that prints the memory address of the message buffer within the inferior. # Note we require launch-only testing so we can get inferior otuput. - { "type":"output_match", "regex":r"^heap address: 0x([0-9a-fA-F]+)\r\n$", "capture":{ 1:"heap_address"} }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"heap address: 0x([0-9a-fA-F]+)\r\n"), + "capture":{ 1:"heap_address"} }, # Now stop the inferior. "read packet: {}".format(chr(3)), # And wait for the stop notification. @@ -1135,7 +1139,8 @@ "read packet: $c#63", # Match output line that prints the memory address of the function call entry point. # Note we require launch-only testing so we can get inferior otuput. - { "type":"output_match", "regex":r"^code address: 0x([0-9a-fA-F]+)\r\n$", "capture":{ 1:"function_address"} }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"code address: 0x([0-9a-fA-F]+)\r\n"), + "capture":{ 1:"function_address"} }, # Now stop the inferior. "read packet: {}".format(chr(3)), # And wait for the stop notification. @@ -1279,7 +1284,8 @@ "read packet: $c#63", # Match output line that prints the memory address of the message buffer within the inferior. # Note we require launch-only testing so we can get inferior otuput. - { "type":"output_match", "regex":r"^data address: 0x([0-9a-fA-F]+)\r\n$", "capture":{ 1:"message_address"} }, + { "type":"output_match", "regex":self.maybe_strict_output_regex(r"data address: 0x([0-9a-fA-F]+)\r\n"), + "capture":{ 1:"message_address"} }, # Now stop the inferior. "read packet: {}".format(chr(3)), # And wait for the stop notification. Index: packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py +++ packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py @@ -1371,3 +1371,6 @@ self.assertTrue(state_reached) self.assertEqual(step_count, expected_step_count) + def maybe_strict_output_regex(self, regex): + return '.*'+regex+'.*' if lldbplatformutil.hasChattyStderr(self) else '^'+regex+'$' + Index: packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py =================================================================== --- packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py +++ packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py @@ -784,7 +784,7 @@ regex = line.get("regex", None) # Compile the regex. if regex and (type(regex) == str): - regex = re.compile(regex) + regex = re.compile(regex, re.DOTALL) regex_mode = line.get("regex_mode", "match") capture = line.get("capture", None)