199451b44SJordan Rupprechtfrom __future__ import print_function
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprechtimport unittest2
599451b44SJordan Rupprechtimport lldb
699451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
799451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
899451b44SJordan Rupprecht
999451b44SJordan Rupprecht
1099451b44SJordan Rupprechtclass TestMoveNearest(TestBase):
1199451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht    def setUp(self):
1499451b44SJordan Rupprecht        # Call super's setUp().
1599451b44SJordan Rupprecht        TestBase.setUp(self)
1699451b44SJordan Rupprecht        # Find the line number to break inside main().
1799451b44SJordan Rupprecht        self.line1 = line_number('foo.h', '// !BR1')
1899451b44SJordan Rupprecht        self.line2 = line_number('foo.h', '// !BR2')
1999451b44SJordan Rupprecht        self.line_between = line_number('main.cpp', "// BR_Between")
2099451b44SJordan Rupprecht        print("BR_Between found at", self.line_between)
2199451b44SJordan Rupprecht        self.line_main = line_number('main.cpp', '// !BR_main')
2299451b44SJordan Rupprecht
2399451b44SJordan Rupprecht    def test(self):
2499451b44SJordan Rupprecht        """Test target.move-to-nearest logic"""
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht        self.build()
2799451b44SJordan Rupprecht        target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
2899451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
2999451b44SJordan Rupprecht
3099451b44SJordan Rupprecht        lldbutil.run_break_set_by_symbol(self, 'main', sym_exact=True)
3199451b44SJordan Rupprecht        environment = self.registerSharedLibrariesWithTarget(target, ["foo"])
3299451b44SJordan Rupprecht        process = target.LaunchSimple(None, environment, self.get_process_working_directory())
33*ce825e46SJonas Devlieghere        self.assertState(process.GetState(), lldb.eStateStopped)
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Regardless of the -m value the breakpoint should have exactly one
3699451b44SJordan Rupprecht        # location on the foo functions
3799451b44SJordan Rupprecht        self.runCmd("settings set target.move-to-nearest-code true")
3899451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'foo.h', self.line1,
3999451b44SJordan Rupprecht                loc_exact=True, extra_options="-m 1")
4099451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'foo.h', self.line2,
4199451b44SJordan Rupprecht                loc_exact=True, extra_options="-m 1")
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        self.runCmd("settings set target.move-to-nearest-code false")
4499451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'foo.h', self.line1,
4599451b44SJordan Rupprecht                loc_exact=True, extra_options="-m 0")
4699451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'foo.h', self.line2,
4799451b44SJordan Rupprecht                loc_exact=True, extra_options="-m 0")
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht
5099451b44SJordan Rupprecht        # Make sure we set a breakpoint in main with -m 1 for various lines in
5199451b44SJordan Rupprecht        # the function declaration
5299451b44SJordan Rupprecht        # "int"
5399451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
5499451b44SJordan Rupprecht                self.line_main-1, extra_options="-m 1")
5599451b44SJordan Rupprecht        # "main()"
5699451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
5799451b44SJordan Rupprecht                self.line_main, extra_options="-m 1")
5899451b44SJordan Rupprecht        # "{"
5999451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
6099451b44SJordan Rupprecht                self.line_main+1, extra_options="-m 1")
6199451b44SJordan Rupprecht        # "return .."
6299451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
6399451b44SJordan Rupprecht                self.line_main+2, extra_options="-m 1")
6499451b44SJordan Rupprecht
6599451b44SJordan Rupprecht        # Make sure we don't put move the breakpoint if it is set between two functions:
6699451b44SJordan Rupprecht        lldbutil.run_break_set_by_file_and_line(self, 'main.cpp',
6799451b44SJordan Rupprecht                self.line_between, extra_options="-m 1", num_expected_locations=0)
68