diff options
Diffstat (limited to 'lldb/test/warnings/uuid/TestUUIDMismatchWanring.py')
-rw-r--r-- | lldb/test/warnings/uuid/TestUUIDMismatchWanring.py | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/lldb/test/warnings/uuid/TestUUIDMismatchWanring.py b/lldb/test/warnings/uuid/TestUUIDMismatchWanring.py new file mode 100644 index 00000000000..b22e7703463 --- /dev/null +++ b/lldb/test/warnings/uuid/TestUUIDMismatchWanring.py @@ -0,0 +1,113 @@ +"""Test that the 'warning: UUID mismatch detected ...' message is emitted.""" + +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.""" + system(["/bin/sh", "-c", "rm -f child_send.txt"]) + system(["/bin/sh", "-c", "rm -f 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 str_input completes to our patterns. + # If each pattern matches from_child, the completion mechanism works! + 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() |