199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest breakpoint hit count features.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprechtimport lldb
799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1099451b44SJordan Rupprecht
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprechtclass BreakpointHitCountTestCase(TestBase):
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    @add_test_categories(['pyapi'])
1799451b44SJordan Rupprecht    def test_breakpoint_location_hit_count(self):
1899451b44SJordan Rupprecht        """Use Python APIs to check breakpoint hit count."""
1999451b44SJordan Rupprecht        self.build()
2099451b44SJordan Rupprecht        self.do_test_breakpoint_location_hit_count()
2199451b44SJordan Rupprecht
2299451b44SJordan Rupprecht    def test_breakpoint_one_shot(self):
2399451b44SJordan Rupprecht        """Check that one-shot breakpoints trigger only once."""
2499451b44SJordan Rupprecht        self.build()
2554c26872SRaphael Isemann        target = self.createTestTarget()
2699451b44SJordan Rupprecht
2799451b44SJordan Rupprecht        self.runCmd("tb a")
2899451b44SJordan Rupprecht        process = target.LaunchSimple(
2999451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
3099451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
3199451b44SJordan Rupprecht
3299451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_stopped_thread
3399451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
3499451b44SJordan Rupprecht        self.assertTrue(
3599451b44SJordan Rupprecht            thread.IsValid(),
3699451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
3916bf8926SJonas Devlieghere        self.assertTrue(frame0.GetFunctionName() == "a(int)" or frame0.GetFunctionName() == "int a(int)");
4099451b44SJordan Rupprecht
4199451b44SJordan Rupprecht        process.Continue()
42*1b8c7352SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateExited)
4399451b44SJordan Rupprecht
4499451b44SJordan Rupprecht    def setUp(self):
4599451b44SJordan Rupprecht        # Call super's setUp().
4699451b44SJordan Rupprecht        TestBase.setUp(self)
4799451b44SJordan Rupprecht        self.a_int_body_line_no = line_number(
4899451b44SJordan Rupprecht            'main.cpp', '// Breakpoint Location 1')
4999451b44SJordan Rupprecht        self.a_float_body_line_no = line_number(
5099451b44SJordan Rupprecht            'main.cpp', '// Breakpoint Location 2')
5199451b44SJordan Rupprecht
5299451b44SJordan Rupprecht    def do_test_breakpoint_location_hit_count(self):
5399451b44SJordan Rupprecht        """Use Python APIs to check breakpoint hit count."""
5454c26872SRaphael Isemann        target = self.createTestTarget()
5599451b44SJordan Rupprecht
5699451b44SJordan Rupprecht        # Create a breakpoint in main.cpp by name 'a',
5799451b44SJordan Rupprecht        # there should be two locations.
5899451b44SJordan Rupprecht        breakpoint = target.BreakpointCreateByName('a', 'a.out')
5999451b44SJordan Rupprecht        self.assertTrue(breakpoint and
6099451b44SJordan Rupprecht                        breakpoint.GetNumLocations() == 2,
6199451b44SJordan Rupprecht                        VALID_BREAKPOINT)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        # Verify all breakpoint locations are enabled.
6499451b44SJordan Rupprecht        location1 = breakpoint.GetLocationAtIndex(0)
6599451b44SJordan Rupprecht        self.assertTrue(location1 and
6699451b44SJordan Rupprecht                        location1.IsEnabled(),
6799451b44SJordan Rupprecht                        VALID_BREAKPOINT_LOCATION)
6899451b44SJordan Rupprecht
6999451b44SJordan Rupprecht        location2 = breakpoint.GetLocationAtIndex(1)
7099451b44SJordan Rupprecht        self.assertTrue(location2 and
7199451b44SJordan Rupprecht                        location2.IsEnabled(),
7299451b44SJordan Rupprecht                        VALID_BREAKPOINT_LOCATION)
7399451b44SJordan Rupprecht
7499451b44SJordan Rupprecht        # Launch the process, and do not stop at entry point.
7599451b44SJordan Rupprecht        process = target.LaunchSimple(
7699451b44SJordan Rupprecht            None, None, self.get_process_working_directory())
7799451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
7899451b44SJordan Rupprecht
7999451b44SJordan Rupprecht        # Verify 1st breakpoint location is hit.
8099451b44SJordan Rupprecht        from lldbsuite.test.lldbutil import get_stopped_thread
8199451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
8299451b44SJordan Rupprecht        self.assertTrue(
8399451b44SJordan Rupprecht            thread.IsValid(),
8499451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
8599451b44SJordan Rupprecht
8699451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
8799451b44SJordan Rupprecht        location1 = breakpoint.FindLocationByAddress(frame0.GetPC())
880ed758b2SDave Lee        self.assertEqual(
890ed758b2SDave Lee            frame0.GetLineEntry().GetLine(), self.a_int_body_line_no,
9099451b44SJordan Rupprecht            "Stopped in int a(int)")
9199451b44SJordan Rupprecht        self.assertTrue(location1)
9299451b44SJordan Rupprecht        self.assertEqual(location1.GetHitCount(), 1)
9399451b44SJordan Rupprecht        self.assertEqual(breakpoint.GetHitCount(), 1)
9499451b44SJordan Rupprecht
9599451b44SJordan Rupprecht        process.Continue()
9699451b44SJordan Rupprecht
9799451b44SJordan Rupprecht        # Verify 2nd breakpoint location is hit.
9899451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
9999451b44SJordan Rupprecht        self.assertTrue(
10099451b44SJordan Rupprecht            thread.IsValid(),
10199451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
10299451b44SJordan Rupprecht
10399451b44SJordan Rupprecht        frame0 = thread.GetFrameAtIndex(0)
10499451b44SJordan Rupprecht        location2 = breakpoint.FindLocationByAddress(frame0.GetPC())
1050ed758b2SDave Lee        self.assertEqual(
1060ed758b2SDave Lee            frame0.GetLineEntry().GetLine(), self.a_float_body_line_no,
10799451b44SJordan Rupprecht            "Stopped in float a(float)")
10899451b44SJordan Rupprecht        self.assertTrue(location2)
10999451b44SJordan Rupprecht        self.assertEqual(location2.GetHitCount(), 1)
11099451b44SJordan Rupprecht        self.assertEqual(location1.GetHitCount(), 1)
11199451b44SJordan Rupprecht        self.assertEqual(breakpoint.GetHitCount(), 2)
11299451b44SJordan Rupprecht
11399451b44SJordan Rupprecht        process.Continue()
11499451b44SJordan Rupprecht
11599451b44SJordan Rupprecht        # Verify 2nd breakpoint location is hit again.
11699451b44SJordan Rupprecht        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
11799451b44SJordan Rupprecht        self.assertTrue(
11899451b44SJordan Rupprecht            thread.IsValid(),
11999451b44SJordan Rupprecht            "There should be a thread stopped due to breakpoint")
12099451b44SJordan Rupprecht
12199451b44SJordan Rupprecht        self.assertEqual(location2.GetHitCount(), 2)
12299451b44SJordan Rupprecht        self.assertEqual(location1.GetHitCount(), 1)
12399451b44SJordan Rupprecht        self.assertEqual(breakpoint.GetHitCount(), 3)
12499451b44SJordan Rupprecht
12599451b44SJordan Rupprecht        process.Continue()
126