diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:50:09 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:50:09 +0000 | 
| commit | f3fbd1c0586ff6ec7895991e6c28f61a503c36a8 (patch) | |
| tree | 48d008fd3df8c0e73271a4b18474e0aac6dbfe33 /packages/Python/lldbsuite/test/macosx/nslog | |
| parent | 2fc5d2d1dfaf623ce4e24cd8590565902f8c557c (diff) | |
Notes
Diffstat (limited to 'packages/Python/lldbsuite/test/macosx/nslog')
3 files changed, 172 insertions, 0 deletions
| diff --git a/packages/Python/lldbsuite/test/macosx/nslog/Makefile b/packages/Python/lldbsuite/test/macosx/nslog/Makefile new file mode 100644 index 000000000000..de2b618b3d70 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/nslog/Makefile @@ -0,0 +1,6 @@ +LEVEL = ../../make + +OBJC_SOURCES := main.m +LD_EXTRAS = -framework Foundation + +include $(LEVEL)/Makefile.rules diff --git a/packages/Python/lldbsuite/test/macosx/nslog/TestDarwinNSLogOutput.py b/packages/Python/lldbsuite/test/macosx/nslog/TestDarwinNSLogOutput.py new file mode 100644 index 000000000000..15d25bb713a5 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/nslog/TestDarwinNSLogOutput.py @@ -0,0 +1,148 @@ +""" +Test DarwinLog "source include debug-level" functionality provided by the +StructuredDataDarwinLog plugin. + +These tests are currently only supported when running against Darwin +targets. +""" + +from __future__ import print_function + +import lldb +import os +import platform +import re +import sys + +from lldbsuite.test import decorators +from lldbsuite.test import lldbtest +from lldbsuite.test import lldbtest_config + +@decorators.skipUnlessDarwin +class DarwinNSLogOutputTestCase(lldbtest.TestBase): +    NO_DEBUG_INFO_TESTCASE = True + +    mydir = lldbtest.TestBase.compute_mydir(__file__) + +    def setUp(self): +        # Call super's setUp(). +        super(DarwinNSLogOutputTestCase, self).setUp() +        self.child = None +        self.child_prompt = '(lldb) ' +        self.strict_sources = False + +        # Source filename. +        self.source = 'main.m' + +        # Output filename. +        self.exe_name = 'a.out' +        self.d = {'OBJC_SOURCES': self.source, 'EXE': self.exe_name} + +        # Locate breakpoint. +        self.line = lldbtest.line_number(self.source, '// break here') + +    def tearDown(self): +        # Shut down the process if it's still running. +        if self.child: +            self.runCmd('process kill') +            self.expect_prompt() +            self.runCmd('quit') + +        # Let parent clean up +        super(DarwinNSLogOutputTestCase, self).tearDown() + +    def run_lldb_to_breakpoint(self, exe, source_file, line, +                               settings_commands=None): +        # Set self.child_prompt, which is "(lldb) ". +        prompt = self.child_prompt + +        # So that the child gets torn down after the test. +        import pexpect +        self.child = pexpect.spawn('%s %s %s' % (lldbtest_config.lldbExec, +                                                 self.lldbOption, exe)) +        child = self.child + +        # Turn on logging for what the child sends back. +        if self.TraceOn(): +            child.logfile_read = sys.stdout + +        # Disable showing of source lines at our breakpoint. +        # This is necessary for the logging tests, because the very +        # text we want to match for output from the running inferior +        # will show up in the source as well.  We don't want the source +        # output to erroneously make a match with our expected output. +        self.runCmd("settings set stop-line-count-before 0") +        self.expect_prompt() +        self.runCmd("settings set stop-line-count-after 0") +        self.expect_prompt() + +        # Run any test-specific settings commands now. +        if settings_commands is not None: +            for setting_command in settings_commands: +                self.runCmd(setting_command) +                self.expect_prompt() + +        # Set the breakpoint, and run to it. +        child.sendline('breakpoint set -f %s -l %d' % (source_file, line)) +        child.expect_exact(prompt) +        child.sendline('run') +        child.expect_exact(prompt) + +        # Ensure we stopped at a breakpoint. +        self.runCmd("thread list") +        self.expect(re.compile(r"stop reason = breakpoint")) + +    def runCmd(self, cmd): +        self.child.sendline(cmd) + +    def expect_prompt(self, exactly=True): +        self.expect(self.child_prompt, exactly=exactly) + +    def expect(self, pattern, exactly=False, *args, **kwargs): +        if exactly: +            return self.child.expect_exact(pattern, *args, **kwargs) +        return self.child.expect(pattern, *args, **kwargs) + +    def do_test(self, expect_regexes=None, settings_commands=None): +        """ Run a test. """ +        self.build(dictionary=self.d) +        self.setTearDownCleanup(dictionary=self.d) + +        exe = os.path.join(os.getcwd(), self.exe_name) +        self.run_lldb_to_breakpoint(exe, self.source, self.line, +                                    settings_commands=settings_commands) +        self.expect_prompt() + +        # Now go. +        self.runCmd("process continue") +        self.expect(expect_regexes) + +    def test_nslog_output_is_displayed(self): +        """Test that NSLog() output shows up in the command-line debugger.""" +        self.do_test(expect_regexes=[ +            re.compile(r"(This is a message from NSLog)"), +            re.compile(r"Process \d+ exited with status") +        ]) +        self.assertIsNotNone(self.child.match) +        self.assertGreater(len(self.child.match.groups()), 0) +        self.assertEqual("This is a message from NSLog", self.child.match.group(1)) + +    def test_nslog_output_is_suppressed_with_env_var(self): +        """Test that NSLog() output does not show up with the ignore env var.""" +        # This test will only work properly on macOS 10.12+.  Skip it on earlier versions. +        # This will require some tweaking on iOS. +        match = re.match(r"^\d+\.(\d+)", platform.mac_ver()[0]) +        if match is None or int(match.group(1)) < 12: +            self.skipTest("requires macOS 10.12 or higher") + +        self.do_test( +            expect_regexes=[ +                re.compile(r"(This is a message from NSLog)"), +                re.compile(r"Process \d+ exited with status") +            ], +            settings_commands=[ +                "settings set target.env-vars " +                "\"IDE_DISABLED_OS_ACTIVITY_DT_MODE=1\"" +            ]) +        self.assertIsNotNone(self.child.match) +        self.assertEqual(len(self.child.match.groups()), 0) diff --git a/packages/Python/lldbsuite/test/macosx/nslog/main.m b/packages/Python/lldbsuite/test/macosx/nslog/main.m new file mode 100644 index 000000000000..dab4089e9273 --- /dev/null +++ b/packages/Python/lldbsuite/test/macosx/nslog/main.m @@ -0,0 +1,18 @@ +//===-- main.m --------------------------------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include <Foundation/Foundation.h> + +int main(int argc, char** argv) +{ +    printf("About to log\n"); // break here +    NSLog(@"This is a message from NSLog"); + +    return 0; +} | 
