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
792eaad2dSJim Inghamclass TestNoLocalFile(GDBRemoteTestBase):
892eaad2dSJim Ingham    """ Test the case where there is NO local copy of the file
992eaad2dSJim Ingham        being debugged.  We shouldn't immediately error out, but
1092eaad2dSJim Ingham        rather lldb should ask debugserver if it knows about the file. """
1192eaad2dSJim Ingham
1292eaad2dSJim Ingham    @skipIfXmlSupportMissing
132a21700bSJim Ingham    def test_with_python(self):
142a21700bSJim Ingham        self.do_test(False)
152a21700bSJim Ingham    @skipIfXmlSupportMissing
162a21700bSJim Ingham    def test_with_target_ceate(self):
172a21700bSJim Ingham        self.do_test(True)
182a21700bSJim Ingham
192a21700bSJim Ingham    def do_test(self, use_target_create):
2092eaad2dSJim Ingham        self.absent_file = '/nosuch_dir/nosuch_subdir/nosuch_executable'
2192eaad2dSJim Ingham        self.a_packet_file = None
2292eaad2dSJim Ingham        class MyResponder(MockGDBServerResponder):
2392eaad2dSJim Ingham            def __init__(self, testcase):
2492eaad2dSJim Ingham                MockGDBServerResponder.__init__(self)
2592eaad2dSJim Ingham                self.after_launch = False
2692eaad2dSJim Ingham                self.testcase = testcase
2792eaad2dSJim Ingham                self.current_thread = 0
2892eaad2dSJim Ingham
2992eaad2dSJim Ingham            def A(self, packet):
3092eaad2dSJim Ingham                # This is the main test, we want to see that lldb DID send the
3192eaad2dSJim Ingham                # A packet to get debugserver to load the file.
3292eaad2dSJim Ingham                # Skip the length and second length:
3392eaad2dSJim Ingham                print("Got A packet: {0}".format(packet))
3492eaad2dSJim Ingham                a_arr = packet.split(",")
3592eaad2dSJim Ingham                self.testcase.a_packet_file = bytearray.fromhex(a_arr[2]).decode()
3692eaad2dSJim Ingham                return "OK"
3792eaad2dSJim Ingham
3892eaad2dSJim Ingham            def qXferRead(self, obj, annex, offset, length):
3992eaad2dSJim Ingham                if annex == "target.xml":
4092eaad2dSJim Ingham                    return """<?xml version="1.0"?>
4192eaad2dSJim Ingham                        <target version="1.0">
4292eaad2dSJim Ingham                          <architecture>i386:x86-64</architecture>
4392eaad2dSJim Ingham                          <feature name="org.gnu.gdb.i386.core">
4492eaad2dSJim Ingham                            <reg name="rip" bitsize="64" regnum="0" type="code_ptr" group="general"/>
4592eaad2dSJim Ingham                          </feature>
4692eaad2dSJim Ingham                        </target>""", False
4792eaad2dSJim Ingham                else:
4892eaad2dSJim Ingham                    return None, False
4992eaad2dSJim Ingham
5092eaad2dSJim Ingham            def qC(self):
5192eaad2dSJim Ingham                if not self.after_launch:
5292eaad2dSJim Ingham                    return "QC0"
5392eaad2dSJim Ingham                return "0"
5492eaad2dSJim Ingham
5592eaad2dSJim Ingham            def qfThreadInfo(self):
5692eaad2dSJim Ingham                if not self.after_launch:
5792eaad2dSJim Ingham                    return "OK"
5892eaad2dSJim Ingham                return "m0"
5992eaad2dSJim Ingham
6092eaad2dSJim Ingham            def qsThreadInfo(self):
6192eaad2dSJim Ingham                if not self.after_launch:
6292eaad2dSJim Ingham                    return "OK"
6392eaad2dSJim Ingham                return "l"
6492eaad2dSJim Ingham
6592eaad2dSJim Ingham            def qLaunchSuccess(self):
6692eaad2dSJim Ingham                return "OK"
6792eaad2dSJim Ingham
6892eaad2dSJim Ingham            def qProcessInfo(self):
6992eaad2dSJim 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;"
7092eaad2dSJim Ingham
7192eaad2dSJim Ingham
7292eaad2dSJim Ingham        error = lldb.SBError()
7392eaad2dSJim Ingham        self.server.responder = MyResponder(self)
742a21700bSJim Ingham        target = lldb.SBTarget()
752a21700bSJim Ingham        if (use_target_create):
762a21700bSJim Ingham            create_cmd = "target create --arch x86_64-apple-macosx --platform remote-macosx --remote-file {0}".format(self.absent_file)
772a21700bSJim Ingham            self.runCmd(create_cmd)
782a21700bSJim Ingham            target = self.dbg.GetSelectedTarget()
792a21700bSJim Ingham            self.assertTrue(target.IsValid(), "Made a valid target")
802a21700bSJim Ingham        else:
8192eaad2dSJim Ingham            target = self.dbg.CreateTarget(None, "x86_64-apple-macosx", "remote-macosx", False, error)
8292eaad2dSJim Ingham            self.assertSuccess(error, "Made a valid target")
832a21700bSJim Ingham
8492eaad2dSJim Ingham        launch_info = target.GetLaunchInfo()
852a21700bSJim Ingham        if (not use_target_create):
8692eaad2dSJim Ingham            launch_info.SetExecutableFile(lldb.SBFileSpec(self.absent_file), True)
8792eaad2dSJim Ingham        flags = launch_info.GetLaunchFlags()
8892eaad2dSJim Ingham        flags |= lldb.eLaunchFlagStopAtEntry
8992eaad2dSJim Ingham        launch_info.SetLaunchFlags(flags)
9092eaad2dSJim Ingham
9192eaad2dSJim Ingham        process = self.connect(target)
9292eaad2dSJim Ingham        self.assertTrue(process.IsValid(), "Process is valid")
9392eaad2dSJim Ingham
9492eaad2dSJim Ingham        # We need to fetch the connected event:
9592eaad2dSJim Ingham        lldbutil.expect_state_changes(self, self.dbg.GetListener(), process, [lldb.eStateConnected])
9692eaad2dSJim Ingham
9792eaad2dSJim Ingham        self.server.responder.after_launch = True
9892eaad2dSJim Ingham
9992eaad2dSJim Ingham        process = target.Launch(launch_info, error)
10092eaad2dSJim Ingham
10192eaad2dSJim Ingham        self.assertSuccess(error, "Successfully launched.")
102*47c4c6a7SDave Lee        self.assertState(process.GetState(), lldb.eStateStopped, "Should be stopped at entry")
10392eaad2dSJim Ingham        self.assertIsNotNone(self.a_packet_file, "A packet was sent")
10492eaad2dSJim Ingham        self.assertEqual(self.absent_file, self.a_packet_file, "The A packet file was correct")
105