cf36f14383883d34ac640209934c13c263d5661f
[openbsd] /
1 """
2 Test that we handle breakpoints on consecutive instructions correctly.
3 """
4
5
6
7 import unittest2
8 import lldb
9 from lldbsuite.test.decorators import *
10 from lldbsuite.test.lldbtest import *
11 from lldbsuite.test import lldbutil
12
13
14 class ConsecutiveBreakpointsTestCase(TestBase):
15
16     mydir = TestBase.compute_mydir(__file__)
17
18     def prepare_test(self):
19         self.build()
20
21         (self.target, self.process, self.thread, bkpt) = lldbutil.run_to_source_breakpoint(
22                 self, "Set breakpoint here", lldb.SBFileSpec("main.cpp"))
23
24         # Set breakpoint to the next instruction
25         frame = self.thread.GetFrameAtIndex(0)
26
27         address = frame.GetPCAddress()
28         instructions = self.target.ReadInstructions(address, 2)
29         self.assertTrue(len(instructions) == 2)
30         self.bkpt_address = instructions[1].GetAddress()
31         self.breakpoint2 = self.target.BreakpointCreateByAddress(
32             self.bkpt_address.GetLoadAddress(self.target))
33         self.assertTrue(
34             self.breakpoint2 and self.breakpoint2.GetNumLocations() == 1,
35             VALID_BREAKPOINT)
36
37     def finish_test(self):
38         # Run the process until termination
39         self.process.Continue()
40         self.assertEquals(self.process.GetState(), lldb.eStateExited)
41
42     @no_debug_info_test
43     def test_continue(self):
44         """Test that continue stops at the second breakpoint."""
45         self.prepare_test()
46
47         self.process.Continue()
48         self.assertEquals(self.process.GetState(), lldb.eStateStopped)
49         # We should be stopped at the second breakpoint
50         self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(
51             self.process, self.breakpoint2)
52         self.assertIsNotNone(
53             self.thread,
54             "Expected one thread to be stopped at breakpoint 2")
55
56         self.finish_test()
57
58     @no_debug_info_test
59     def test_single_step(self):
60         """Test that single step stops at the second breakpoint."""
61         self.prepare_test()
62
63         step_over = False
64         self.thread.StepInstruction(step_over)
65
66         self.assertEquals(self.process.GetState(), lldb.eStateStopped)
67         self.assertEquals(
68             self.thread.GetFrameAtIndex(0).GetPCAddress().GetLoadAddress(
69                 self.target), self.bkpt_address.GetLoadAddress(
70                 self.target))
71         self.thread = lldbutil.get_one_thread_stopped_at_breakpoint(
72             self.process, self.breakpoint2)
73         self.assertIsNotNone(
74             self.thread,
75             "Expected one thread to be stopped at breakpoint 2")
76
77         self.finish_test()
78
79     @no_debug_info_test
80     def test_single_step_thread_specific(self):
81         """Test that single step stops, even though the second breakpoint is not valid."""
82         self.prepare_test()
83
84         # Choose a thread other than the current one. A non-existing thread is
85         # fine.
86         thread_index = self.process.GetNumThreads() + 1
87         self.assertFalse(self.process.GetThreadAtIndex(thread_index).IsValid())
88         self.breakpoint2.SetThreadIndex(thread_index)
89
90         step_over = False
91         self.thread.StepInstruction(step_over)
92
93         self.assertEquals(self.process.GetState(), lldb.eStateStopped)
94         self.assertEquals(
95             self.thread.GetFrameAtIndex(0).GetPCAddress().GetLoadAddress(
96                 self.target), self.bkpt_address.GetLoadAddress(
97                 self.target))
98         self.assertEquals(
99             self.thread.GetStopReason(),
100             lldb.eStopReasonPlanComplete,
101             "Stop reason should be 'plan complete'")
102
103         self.finish_test()