Files
clang-p2996/lldb/test/API/tools/lldb-vscode/breakpoint/TestVSCode_logpoints.py
2022-07-10 18:56:06 -07:00

142 lines
4.9 KiB
Python

"""
Test lldb-vscode logpoints feature.
"""
import unittest2
import vscode
import shutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
import lldbvscode_testcase
import os
class TestVSCode_logpoints(lldbvscode_testcase.VSCodeTestCaseBase):
def setUp(self):
lldbvscode_testcase.VSCodeTestCaseBase.setUp(self)
self.main_basename = 'main-copy.cpp'
self.main_path = os.path.realpath(self.getBuildArtifact(self.main_basename))
@skipIfWindows
@skipIfRemote
def test_logmessage_basic(self):
'''Tests breakpoint logmessage basic functionality.'''
before_loop_line = line_number('main.cpp', '// before loop')
loop_line = line_number('main.cpp', '// break loop')
after_loop_line = line_number('main.cpp', '// after loop')
program = self.getBuildArtifact("a.out")
self.build_and_launch(program)
# Set a breakpoint at a line before loop
before_loop_breakpoint_ids = self.set_source_breakpoints(
self.main_path,
[before_loop_line])
self.assertEquals(len(before_loop_breakpoint_ids), 1, "expect one breakpoint")
self.vscode.request_continue()
# Verify we hit the breakpoint before loop line
self.verify_breakpoint_hit(before_loop_breakpoint_ids)
# Swallow old console output
self.get_console()
# Set two breakpoints:
# 1. First at the loop line with logMessage
# 2. Second guard breakpoint at a line after loop
logMessage_prefix = "This is log message for { -- "
# Trailing newline is needed for splitlines()
logMessage = logMessage_prefix + "{i + 3}\n"
[loop_breakpoint_id, post_loop_breakpoint_id] = self.set_source_breakpoints(
self.main_path,
[loop_line, after_loop_line],
[{'logMessage': logMessage}, {}]
)
# Continue to trigger the breakpoint with log messages
self.vscode.request_continue()
# Verify we hit the breakpoint after loop line
self.verify_breakpoint_hit([post_loop_breakpoint_id])
output = self.get_console()
lines = output.splitlines()
logMessage_output = []
for line in lines:
if line.startswith(logMessage_prefix):
logMessage_output.append(line)
# Verify logMessage count
loop_count = 10
self.assertEqual(len(logMessage_output), loop_count)
# Verify log message match
for idx, logMessage_line in enumerate(logMessage_output):
result = idx + 3
self.assertEqual(logMessage_line, logMessage_prefix + str(result))
@skipIfWindows
@skipIfRemote
def test_logmessage_advanced(self):
'''Tests breakpoint logmessage functionality for complex expression.'''
before_loop_line = line_number('main.cpp', '// before loop')
loop_line = line_number('main.cpp', '// break loop')
after_loop_line = line_number('main.cpp', '// after loop')
program = self.getBuildArtifact("a.out")
self.build_and_launch(program)
# Set a breakpoint at a line before loop
before_loop_breakpoint_ids = self.set_source_breakpoints(
self.main_path,
[before_loop_line])
self.assertEquals(len(before_loop_breakpoint_ids), 1, "expect one breakpoint")
self.vscode.request_continue()
# Verify we hit the breakpoint before loop line
self.verify_breakpoint_hit(before_loop_breakpoint_ids)
# Swallow old console output
self.get_console()
# Set two breakpoints:
# 1. First at the loop line with logMessage
# 2. Second guard breakpoint at a line after loop
logMessage_prefix = "This is log message for { -- "
# Trailing newline is needed for splitlines()
logMessage = logMessage_prefix + "{int y = 0; if (i % 3 == 0) { y = i + 3;} else {y = i * 3;} y}\n"
[loop_breakpoint_id, post_loop_breakpoint_id] = self.set_source_breakpoints(
self.main_path,
[loop_line, after_loop_line],
[{'logMessage': logMessage}, {}]
)
# Continue to trigger the breakpoint with log messages
self.vscode.request_continue()
# Verify we hit the breakpoint after loop line
self.verify_breakpoint_hit([post_loop_breakpoint_id])
output = self.get_console()
lines = output.splitlines()
logMessage_output = []
for line in lines:
if line.startswith(logMessage_prefix):
logMessage_output.append(line)
# Verify logMessage count
loop_count = 10
self.assertEqual(len(logMessage_output), loop_count)
# Verify log message match
for idx, logMessage_line in enumerate(logMessage_output):
result = idx + 3 if idx % 3 == 0 else idx * 3
self.assertEqual(logMessage_line, logMessage_prefix + str(result))