forked from OSchip/llvm-project
114 lines
4.2 KiB
Python
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()
|