File: TestBreakpointCaseSensitivity.py

package info (click to toggle)
llvm-toolchain-6.0 1%3A6.0.1-10
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 598,080 kB
  • sloc: cpp: 3,046,253; ansic: 595,057; asm: 271,965; python: 128,926; objc: 106,554; sh: 21,906; lisp: 10,191; pascal: 6,094; ml: 5,544; perl: 5,265; makefile: 2,227; cs: 2,027; xml: 686; php: 212; csh: 117
file content (129 lines) | stat: -rw-r--r-- 4,814 bytes parent folder | download | duplicates (2)
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())