llvm-project/lldb/test/warnings/uuid/TestUUIDMismatchWanring.py

114 lines
4.2 KiB
Python

"""Test that the 'warning: UUID mismatch detected ...' message is emitted if a
dsym in vicinity of the executable does not match its UUID."""
import os, time
import unittest2
import lldb
import pexpect
from lldbtest import *
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
class UUIDMismatchWarningCase(TestBase):
mydir = os.path.join("warnings", "uuid")
@classmethod
def classCleanup(cls):
"""Cleanup the test byproducts."""
cls.RemoveTempFile("child_send.txt")
cls.RemoveTempFile("child_read.txt")
def setUp(self):
TestBase.setUp(self)
self.template = 'main.cpp.template'
self.source = 'main.cpp'
self.teardown_hook_added = False
def test_uuid_mismatch_warning(self):
"""Test that the 'warning: UUID mismatch detected ...' message is emitted."""
# Call the program generator to produce main.cpp, version 1.
self.generate_main_cpp(version=1)
self.line_to_break = line_number(self.source, '// Set breakpoint here.')
self.buildDsym(clean=True)
# Insert some delay and then call the program generator to produce main.cpp, version 2.
time.sleep(5)
self.generate_main_cpp(version=101)
# Now call make again, but this time don't generate the dSYM.
self.buildDwarf(clean=False)
self.exe_name = 'a.out'
self.check_executable_and_dsym(self.exe_name)
def generate_main_cpp(self, version=0):
"""Generate main.cpp from main.cpp.template."""
temp = os.path.join(os.getcwd(), self.template)
with open(temp, 'r') as f:
content = f.read()
new_content = content.replace('%ADD_EXTRA_CODE%',
'printf("This is version %d\\n");' % version)
src = os.path.join(os.getcwd(), self.source)
with open(src, 'w') as f:
f.write(new_content)
# The main.cpp has been generated, add a teardown hook to remove it.
if not self.teardown_hook_added:
self.addTearDownHook(lambda: os.remove(src))
self.teardown_hook_added = True
def check_executable_and_dsym(self, exe_name):
"""Sanity check executable compiled from the auto-generated program."""
# The default lldb prompt.
prompt = "(lldb) "
# So that the child gets torn down after the test.
self.child = pexpect.spawn('%s %s' % (self.lldbHere, self.lldbOption))
child = self.child
# Turn on logging for input/output to/from the child.
with open('child_send.txt', 'w') as f_send:
with open('child_read.txt', 'w') as f_read:
child.logfile_send = f_send
child.logfile_read = f_read
child.expect_exact(prompt)
child.setecho(True)
# Execute the file command, followed by a breakpoint set, the
# UUID mismatch warning should be generated by then.
child.sendline("file %s" % exe_name)
child.expect_exact(prompt)
child.sendline("breakpoint set -f %s -l %d" % (self.source, self.line_to_break))
child.expect_exact(prompt)
child.sendline("run")
child.expect_exact(prompt)
# Now that the necessary logging is done, restore logfile to None to
# stop further logging.
child.logfile_send = None
child.logfile_read = None
with open('child_send.txt', 'r') as fs:
if self.TraceOn():
print "\n\nContents of child_send.txt:"
print fs.read()
with open('child_read.txt', 'r') as fr:
from_child = fr.read()
if self.TraceOn():
print "\n\nContents of child_read.txt:"
print from_child
# Test that lldb emits the "UUID mismatch detected" message.
self.expect(from_child, msg="UUID mismatch expected!", exe=False,
substrs = ['warning: UUID mismatch detected'])
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()