xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestNoLocalFile.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
192eaad2dSJim Inghamimport lldb
292eaad2dSJim Inghamfrom lldbsuite.test.lldbtest import *
392eaad2dSJim Inghamfrom lldbsuite.test.decorators import *
492eaad2dSJim Inghamfrom lldbsuite.test.gdbclientutils import *
592eaad2dSJim Inghamfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
692eaad2dSJim Ingham
7*2238dcc3SJonas Devlieghere
892eaad2dSJim Inghamclass TestNoLocalFile(GDBRemoteTestBase):
992eaad2dSJim Ingham    """Test the case where there is NO local copy of the file
1092eaad2dSJim Ingham    being debugged.  We shouldn't immediately error out, but
1192eaad2dSJim Ingham    rather lldb should ask debugserver if it knows about the file."""
1292eaad2dSJim Ingham
1392eaad2dSJim Ingham    @skipIfXmlSupportMissing
142a21700bSJim Ingham    def test_with_python(self):
152a21700bSJim Ingham        self.do_test(False)
16*2238dcc3SJonas Devlieghere
172a21700bSJim Ingham    @skipIfXmlSupportMissing
182a21700bSJim Ingham    def test_with_target_ceate(self):
192a21700bSJim Ingham        self.do_test(True)
202a21700bSJim Ingham
212a21700bSJim Ingham    def do_test(self, use_target_create):
22*2238dcc3SJonas Devlieghere        self.absent_file = "/nosuch_dir/nosuch_subdir/nosuch_executable"
2392eaad2dSJim Ingham        self.a_packet_file = None
24*2238dcc3SJonas Devlieghere
2592eaad2dSJim Ingham        class MyResponder(MockGDBServerResponder):
2692eaad2dSJim Ingham            def __init__(self, testcase):
2792eaad2dSJim Ingham                MockGDBServerResponder.__init__(self)
2892eaad2dSJim Ingham                self.after_launch = False
2992eaad2dSJim Ingham                self.testcase = testcase
3092eaad2dSJim Ingham                self.current_thread = 0
3192eaad2dSJim Ingham
3292eaad2dSJim Ingham            def A(self, packet):
3392eaad2dSJim Ingham                # This is the main test, we want to see that lldb DID send the
3492eaad2dSJim Ingham                # A packet to get debugserver to load the file.
3592eaad2dSJim Ingham                # Skip the length and second length:
3692eaad2dSJim Ingham                print("Got A packet: {0}".format(packet))
3792eaad2dSJim Ingham                a_arr = packet.split(",")
3892eaad2dSJim Ingham                self.testcase.a_packet_file = bytearray.fromhex(a_arr[2]).decode()
3992eaad2dSJim Ingham                return "OK"
4092eaad2dSJim Ingham
4192eaad2dSJim Ingham            def qXferRead(self, obj, annex, offset, length):
4292eaad2dSJim Ingham                if annex == "target.xml":
43*2238dcc3SJonas Devlieghere                    return (
44*2238dcc3SJonas Devlieghere                        """<?xml version="1.0"?>
4592eaad2dSJim Ingham                        <target version="1.0">
4692eaad2dSJim Ingham                          <architecture>i386:x86-64</architecture>
4792eaad2dSJim Ingham                          <feature name="org.gnu.gdb.i386.core">
4892eaad2dSJim Ingham                            <reg name="rip" bitsize="64" regnum="0" type="code_ptr" group="general"/>
4992eaad2dSJim Ingham                          </feature>
50*2238dcc3SJonas Devlieghere                        </target>""",
51*2238dcc3SJonas Devlieghere                        False,
52*2238dcc3SJonas Devlieghere                    )
5392eaad2dSJim Ingham                else:
5492eaad2dSJim Ingham                    return None, False
5592eaad2dSJim Ingham
5692eaad2dSJim Ingham            def qC(self):
5792eaad2dSJim Ingham                if not self.after_launch:
5892eaad2dSJim Ingham                    return "QC0"
5992eaad2dSJim Ingham                return "0"
6092eaad2dSJim Ingham
6192eaad2dSJim Ingham            def qfThreadInfo(self):
6292eaad2dSJim Ingham                if not self.after_launch:
6392eaad2dSJim Ingham                    return "OK"
6492eaad2dSJim Ingham                return "m0"
6592eaad2dSJim Ingham
6692eaad2dSJim Ingham            def qsThreadInfo(self):
6792eaad2dSJim Ingham                if not self.after_launch:
6892eaad2dSJim Ingham                    return "OK"
6992eaad2dSJim Ingham                return "l"
7092eaad2dSJim Ingham
7192eaad2dSJim Ingham            def qLaunchSuccess(self):
7292eaad2dSJim Ingham                return "OK"
7392eaad2dSJim Ingham
7492eaad2dSJim Ingham            def qProcessInfo(self):
7592eaad2dSJim Ingham                return "$pid:10b70;parent-pid:10b20;real-uid:1f6;real-gid:14;effective-uid:1f6;effective-gid:14;cputype:1000007;cpusubtype:8;ptrsize:8;ostype:macosx;vendor:apple;endian:little;"
7692eaad2dSJim Ingham
7792eaad2dSJim Ingham        error = lldb.SBError()
7892eaad2dSJim Ingham        self.server.responder = MyResponder(self)
792a21700bSJim Ingham        target = lldb.SBTarget()
80*2238dcc3SJonas Devlieghere        if use_target_create:
81*2238dcc3SJonas Devlieghere            create_cmd = "target create --arch x86_64-apple-macosx --platform remote-macosx --remote-file {0}".format(
82*2238dcc3SJonas Devlieghere                self.absent_file
83*2238dcc3SJonas Devlieghere            )
842a21700bSJim Ingham            self.runCmd(create_cmd)
852a21700bSJim Ingham            target = self.dbg.GetSelectedTarget()
862a21700bSJim Ingham            self.assertTrue(target.IsValid(), "Made a valid target")
872a21700bSJim Ingham        else:
88*2238dcc3SJonas Devlieghere            target = self.dbg.CreateTarget(
89*2238dcc3SJonas Devlieghere                None, "x86_64-apple-macosx", "remote-macosx", False, error
90*2238dcc3SJonas Devlieghere            )
9192eaad2dSJim Ingham            self.assertSuccess(error, "Made a valid target")
922a21700bSJim Ingham
9392eaad2dSJim Ingham        launch_info = target.GetLaunchInfo()
94*2238dcc3SJonas Devlieghere        if not use_target_create:
9592eaad2dSJim Ingham            launch_info.SetExecutableFile(lldb.SBFileSpec(self.absent_file), True)
9692eaad2dSJim Ingham        flags = launch_info.GetLaunchFlags()
9792eaad2dSJim Ingham        flags |= lldb.eLaunchFlagStopAtEntry
9892eaad2dSJim Ingham        launch_info.SetLaunchFlags(flags)
9992eaad2dSJim Ingham
10092eaad2dSJim Ingham        process = self.connect(target)
10192eaad2dSJim Ingham        self.assertTrue(process.IsValid(), "Process is valid")
10292eaad2dSJim Ingham
10392eaad2dSJim Ingham        # We need to fetch the connected event:
104*2238dcc3SJonas Devlieghere        lldbutil.expect_state_changes(
105*2238dcc3SJonas Devlieghere            self, self.dbg.GetListener(), process, [lldb.eStateConnected]
106*2238dcc3SJonas Devlieghere        )
10792eaad2dSJim Ingham
10892eaad2dSJim Ingham        self.server.responder.after_launch = True
10992eaad2dSJim Ingham
11092eaad2dSJim Ingham        process = target.Launch(launch_info, error)
11192eaad2dSJim Ingham
11292eaad2dSJim Ingham        self.assertSuccess(error, "Successfully launched.")
113*2238dcc3SJonas Devlieghere        self.assertState(
114*2238dcc3SJonas Devlieghere            process.GetState(), lldb.eStateStopped, "Should be stopped at entry"
115*2238dcc3SJonas Devlieghere        )
11692eaad2dSJim Ingham        self.assertIsNotNone(self.a_packet_file, "A packet was sent")
117*2238dcc3SJonas Devlieghere        self.assertEqual(
118*2238dcc3SJonas Devlieghere            self.absent_file, self.a_packet_file, "The A packet file was correct"
119*2238dcc3SJonas Devlieghere        )
120