1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
"""
Test case sensitivity of paths on Windows / POSIX
llvm.org/pr22667
"""
import os
import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
from lldbsuite.test import lldbplatform, lldbplatformutil
class BreakpointCaseSensitivityTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
BREAKPOINT_TEXT = 'Set a breakpoint here'
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
self.line = line_number('main.c', self.BREAKPOINT_TEXT)
@skipIf(hostoslist=no_match(['windows'])) # Skip for non-windows platforms
def test_breakpoint_matches_file_with_different_case(self):
"""Set breakpoint on file, should match files with different case on Windows"""
self.build()
self.case_sensitivity_breakpoint(True)
@skipIf(hostoslist=['windows']) # Skip for windows platforms
def test_breakpoint_doesnt_match_file_with_different_case(self):
"""Set breakpoint on file, shouldn't match files with different case on POSIX systems"""
self.build()
self.case_sensitivity_breakpoint(False)
def case_sensitivity_breakpoint(self, case_insensitive):
"""Set breakpoint on file, should match files with different case if case_insensitive is True"""
# use different case to check CreateTarget
exe = 'a.out'
if case_insensitive:
exe = exe.upper()
exe = os.path.join(os.getcwd(), exe)
# Create a target by the debugger.
self.target = self.dbg.CreateTarget(exe)
self.assertTrue(self.target, VALID_TARGET)
cwd = os.getcwd()
# try both BreakpointCreateByLocation and BreakpointCreateBySourceRegex
for regex in [False, True]:
# should always hit
self.check_breakpoint('main.c', regex, True)
# should always hit
self.check_breakpoint(os.path.join(cwd, 'main.c'), regex, True)
# different case for directory
self.check_breakpoint(os.path.join(cwd.upper(), 'main.c'),
regex,
case_insensitive)
# different case for file
self.check_breakpoint('Main.c',
regex,
case_insensitive)
# different case for both
self.check_breakpoint(os.path.join(cwd.upper(), 'Main.c'),
regex,
case_insensitive)
def check_breakpoint(self, file, source_regex, should_hit):
"""
Check breakpoint hit at given file set by given method
file:
File where insert the breakpoint
source_regex:
True for testing using BreakpointCreateBySourceRegex,
False for BreakpointCreateByLocation
should_hit:
True if the breakpoint should hit, False otherwise
"""
desc = ' file %s set by %s' % (
file, 'regex' if source_regex else 'location')
if source_regex:
breakpoint = self.target.BreakpointCreateBySourceRegex(
self.BREAKPOINT_TEXT, lldb.SBFileSpec(file))
else:
breakpoint = self.target.BreakpointCreateByLocation(
file, self.line)
self.assertEqual(breakpoint and breakpoint.GetNumLocations() == 1,
should_hit,
VALID_BREAKPOINT + desc)
# Get the breakpoint location from breakpoint after we verified that,
# indeed, it has one location.
location = breakpoint.GetLocationAtIndex(0)
self.assertEqual(location.IsValid(),
should_hit,
VALID_BREAKPOINT_LOCATION + desc)
process = self.target.LaunchSimple(
None, None, self.get_process_working_directory())
self.assertTrue(process, PROCESS_IS_VALID + desc)
if should_hit:
# Did we hit our breakpoint?
from lldbsuite.test.lldbutil import get_threads_stopped_at_breakpoint
threads = get_threads_stopped_at_breakpoint(process, breakpoint)
self.assertEqual(
len(threads),
1,
"There should be a thread stopped at breakpoint" +
desc)
# The hit count for the breakpoint should be 1.
self.assertEqual(breakpoint.GetHitCount(), 1)
else:
# check the breakpoint was not hit
self.assertEqual(lldb.eStateExited, process.GetState())
self.assertEqual(breakpoint.GetHitCount(), 0)
# let process finish
process.Continue()
# cleanup
self.target.BreakpointDelete(breakpoint.GetID())
|