blob: 8c9e2875aec5ca0a60125c94c1305482d2d7bfd8 [file] [log] [blame]
"""
Test DarwinLog log message formatting options provided by the
StructuredDataDarwinLog plugin.
These tests are currently only supported when running against Darwin
targets.
"""
from __future__ import print_function
import lldb
import re
from lldbsuite.test import decorators
from lldbsuite.test import lldbtest
from lldbsuite.test import darwin_log
class TestDarwinLogMessageFormat(darwin_log.DarwinLogTestBase):
mydir = lldbtest.TestBase.compute_mydir(__file__)
def setUp(self):
# Call super's setUp().
super(TestDarwinLogMessageFormat, self).setUp()
# Source filename.
self.source = 'main.c'
# Output filename.
self.exe_name = self.getBuildArtifact("a.out")
self.d = {'C_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(TestDarwinLogMessageFormat, self).tearDown()
# ==========================================================================
# Test settings around log message formatting
# ==========================================================================
REGEXES = [
re.compile(r"\[([^]]+)\] This is the log message."), # Match log
# with header.
re.compile(r"This is the log message."), # Match no-header content.
re.compile(r"exited with status") # Fallback if no log emitted.
]
@decorators.skipUnlessDarwin
def test_display_without_header_works(self):
"""Test that turning off log message headers works as advertised."""
self.do_test([], expect_regexes=self.REGEXES)
# We should not match the first pattern as we shouldn't have header
# content.
self.assertIsNotNone(self.child.match)
self.assertFalse((len(self.child.match.groups()) > 0) and
(self.child.match.group(1) != ""),
"we should not have seen a header")
@decorators.skipUnlessDarwin
def test_display_with_header_works(self):
"""Test that displaying any header works."""
self.do_test(
["--timestamp-relative", "--subsystem", "--category",
"--activity-chain"],
expect_regexes=self.REGEXES,
settings_commands=[
"display-header true"
])
# We should match the first pattern as we should have header
# content.
self.assertIsNotNone(self.child.match)
self.assertTrue((len(self.child.match.groups()) > 0) and
(self.child.match.group(1) != ""),
"we should have printed a header")
def assert_header_contains_timestamp(self, header):
fields = header.split(',')
self.assertGreater(len(fields), 0,
"there should have been header content present")
self.assertRegexpMatches(fields[0],
r"^\d+:\d{2}:\d{2}.\d{9}$",
"time field should match expected format")
@decorators.skipUnlessDarwin
def test_header_timefield_only_works(self):
"""Test that displaying a header with only the timestamp works."""
self.do_test(["--timestamp-relative"], expect_regexes=self.REGEXES)
# We should match the first pattern as we should have header
# content.
self.assertIsNotNone(self.child.match)
self.assertTrue((len(self.child.match.groups()) > 0) and
(self.child.match.group(1) != ""),
"we should have printed a header")
header = self.child.match.group(1)
self.assertEqual(len(header.split(',')), 1,
"there should only be one header field")
self.assert_header_contains_timestamp(header)
@decorators.skipUnlessDarwin
def test_header_subsystem_only_works(self):
"""Test that displaying a header with only the subsystem works."""
self.do_test(["--subsystem"], expect_regexes=self.REGEXES)
# We should match the first pattern as we should have header
# content.
self.assertIsNotNone(self.child.match)
self.assertTrue((len(self.child.match.groups()) > 0) and
(self.child.match.group(1) != ""),
"we should have printed a header")
header = self.child.match.group(1)
self.assertEqual(len(header.split(',')), 1,
"there should only be one header field")
self.assertEquals(header,
"subsystem=org.llvm.lldb.test.sub1")
@decorators.skipUnlessDarwin
def test_header_category_only_works(self):
"""Test that displaying a header with only the category works."""
self.do_test(["--category"], expect_regexes=self.REGEXES)
# We should match the first pattern as we should have header
# content.
self.assertIsNotNone(self.child.match)
self.assertTrue((len(self.child.match.groups()) > 0) and
(self.child.match.group(1) != ""),
"we should have printed a header")
header = self.child.match.group(1)
self.assertEqual(len(header.split(',')), 1,
"there should only be one header field")
self.assertEquals(header,
"category=cat1")
@decorators.skipUnlessDarwin
def test_header_activity_chain_only_works(self):
"""Test that displaying a header with only the activity chain works."""
self.do_test(["--activity-chain"], expect_regexes=self.REGEXES)
# We should match the first pattern as we should have header
# content.
self.assertIsNotNone(self.child.match)
self.assertTrue((len(self.child.match.groups()) > 0) and
(self.child.match.group(1) != ""),
"we should have printed a header")
header = self.child.match.group(1)
self.assertEqual(len(header.split(',')), 1,
"there should only be one header field")
self.assertEquals(header,
"activity-chain=parent-activity:child-activity")
# @decorators.skipUnlessDarwin
# def test_header_activity_no_chain_only_works(self):
# """Test that displaying a header with only the activity works."""
# self.do_test(
# [],
# expect_regexes=self.REGEXES,
# settings_commands=[
# "display-header true",
# "format-include-timestamp false",
# "format-include-activity true",
# "format-include-category false",
# "format-include-subsystem false",
# "display-activity-chain false"
# ])
# # We should match the first pattern as we should have header
# # content.
# self.assertIsNotNone(self.child.match)
# self.assertTrue((len(self.child.match.groups()) > 0) and
# (self.child.match.group(1) != ""),
# "we should have printed a header")
# header = self.child.match.group(1)
# self.assertEqual(len(header.split(',')), 1,
# "there should only be one header field")
# self.assertEquals(header,
# "activity=child-activity")