xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestGDBRemotePlatformFile.py (revision 1fae1314f1ff58f3601640c0a2c48cee3a322e5d)
133c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import *
29a4379c3SMichał Górnyfrom lldbsuite.test.decorators import *
333c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBPlatformClientTestBase
49a4379c3SMichał Górny
58bbef4f9SMichał Górny
62238dcc3SJonas Devlieghereclass TestGDBRemotePlatformFile(GDBPlatformClientTestBase):
79929cfbcSMichał Górny    def test_file(self):
89929cfbcSMichał Górny        """Test mock operations on a remote file"""
98bbef4f9SMichał Górny
108bbef4f9SMichał Górny        class Responder(MockGDBServerResponder):
118bbef4f9SMichał Górny            def vFile(self, packet):
129929cfbcSMichał Górny                if packet.startswith("vFile:open:"):
138bbef4f9SMichał Górny                    return "F10"
149929cfbcSMichał Górny                elif packet.startswith("vFile:pread:"):
159929cfbcSMichał Górny                    return "Fd;frobnicator"
169929cfbcSMichał Górny                elif packet.startswith("vFile:pwrite:"):
179929cfbcSMichał Górny                    return "Fa"
189929cfbcSMichał Górny                elif packet.startswith("vFile:close:"):
199929cfbcSMichał Górny                    return "F0"
203d3017d3SMichał Górny                return "F-1,58"
218bbef4f9SMichał Górny
228bbef4f9SMichał Górny        self.server.responder = Responder()
238bbef4f9SMichał Górny
242238dcc3SJonas Devlieghere        self.match(
252238dcc3SJonas Devlieghere            "platform file open /some/file.txt -v 0755", [r"File Descriptor = 16"]
262238dcc3SJonas Devlieghere        )
272238dcc3SJonas Devlieghere        self.match(
282238dcc3SJonas Devlieghere            "platform file read 16 -o 11 -c 13",
292238dcc3SJonas Devlieghere            [r"Return = 11\nData = \"frobnicator\""],
302238dcc3SJonas Devlieghere        )
312238dcc3SJonas Devlieghere        self.match("platform file write 16 -o 11 -d teststring", [r"Return = 10"])
322238dcc3SJonas Devlieghere        self.match("platform file close 16", [r"file 16 closed."])
332238dcc3SJonas Devlieghere        self.assertPacketLogContains(
342238dcc3SJonas Devlieghere            [
352c6d90d7SMichał Górny                "vFile:open:2f736f6d652f66696c652e747874,00000202,000001ed",
369929cfbcSMichał Górny                "vFile:pread:10,d,b",
379929cfbcSMichał Górny                "vFile:pwrite:10,b,teststring",
389929cfbcSMichał Górny                "vFile:close:10",
392238dcc3SJonas Devlieghere            ]
402238dcc3SJonas Devlieghere        )
419929cfbcSMichał Górny
429929cfbcSMichał Górny    def test_file_fail(self):
439929cfbcSMichał Górny        """Test mocked failures of remote operations"""
449929cfbcSMichał Górny
459929cfbcSMichał Górny        class Responder(MockGDBServerResponder):
469929cfbcSMichał Górny            def vFile(self, packet):
473d3017d3SMichał Górny                # use ENOSYS as this constant differs between GDB Remote
483d3017d3SMichał Górny                # Protocol and Linux, so we can test the translation
493d3017d3SMichał Górny                return "F-1,58"
509929cfbcSMichał Górny
519929cfbcSMichał Górny        self.server.responder = Responder()
52*1fae1314SAdrian Prantl        enosys_regex = r"error: (Function not implemented|function not supported)"
532238dcc3SJonas Devlieghere        self.match(
542238dcc3SJonas Devlieghere            "platform file open /some/file.txt -v 0755",
55*1fae1314SAdrian Prantl            [enosys_regex],
562238dcc3SJonas Devlieghere            error=True,
572238dcc3SJonas Devlieghere        )
582238dcc3SJonas Devlieghere        self.match(
592238dcc3SJonas Devlieghere            "platform file read 16 -o 11 -c 13",
60*1fae1314SAdrian Prantl            [enosys_regex],
612238dcc3SJonas Devlieghere            error=True,
622238dcc3SJonas Devlieghere        )
632238dcc3SJonas Devlieghere        self.match(
642238dcc3SJonas Devlieghere            "platform file write 16 -o 11 -d teststring",
65*1fae1314SAdrian Prantl            [enosys_regex],
662238dcc3SJonas Devlieghere            error=True,
672238dcc3SJonas Devlieghere        )
68*1fae1314SAdrian Prantl        self.match("platform file close 16", [enosys_regex], error=True)
692238dcc3SJonas Devlieghere        self.assertPacketLogContains(
702238dcc3SJonas Devlieghere            [
712c6d90d7SMichał Górny                "vFile:open:2f736f6d652f66696c652e747874,00000202,000001ed",
729929cfbcSMichał Górny                "vFile:pread:10,d,b",
739929cfbcSMichał Górny                "vFile:pwrite:10,b,teststring",
749929cfbcSMichał Górny                "vFile:close:10",
752238dcc3SJonas Devlieghere            ]
762238dcc3SJonas Devlieghere        )
7721e2d7ceSMichał Górny
7821e2d7ceSMichał Górny    def test_file_size(self):
7921e2d7ceSMichał Górny        """Test 'platform get-size'"""
8021e2d7ceSMichał Górny
8121e2d7ceSMichał Górny        class Responder(MockGDBServerResponder):
8221e2d7ceSMichał Górny            def vFile(self, packet):
8321e2d7ceSMichał Górny                return "F1000"
8421e2d7ceSMichał Górny
8521e2d7ceSMichał Górny        self.server.responder = Responder()
8621e2d7ceSMichał Górny
872238dcc3SJonas Devlieghere        self.match(
882238dcc3SJonas Devlieghere            "platform get-size /some/file.txt",
892238dcc3SJonas Devlieghere            [r"File size of /some/file\.txt \(remote\): 4096"],
902238dcc3SJonas Devlieghere        )
912238dcc3SJonas Devlieghere        self.assertPacketLogContains(
922238dcc3SJonas Devlieghere            [
9321e2d7ceSMichał Górny                "vFile:size:2f736f6d652f66696c652e747874",
942238dcc3SJonas Devlieghere            ]
952238dcc3SJonas Devlieghere        )
9621e2d7ceSMichał Górny
9721e2d7ceSMichał Górny    def test_file_size_fallback(self):
9821e2d7ceSMichał Górny        """Test 'platform get-size fallback to vFile:fstat'"""
9921e2d7ceSMichał Górny
10021e2d7ceSMichał Górny        class Responder(MockGDBServerResponder):
10121e2d7ceSMichał Górny            def vFile(self, packet):
10221e2d7ceSMichał Górny                if packet.startswith("vFile:open:"):
10321e2d7ceSMichał Górny                    return "F5"
10421e2d7ceSMichał Górny                elif packet.startswith("vFile:fstat:"):
10521e2d7ceSMichał Górny                    return "F40;" + 28 * "\0" + "\0\0\0\0\0\1\2\3" + 28 * "\0"
10621e2d7ceSMichał Górny                if packet.startswith("vFile:close:"):
10721e2d7ceSMichał Górny                    return "F0"
10821e2d7ceSMichał Górny                return ""
10921e2d7ceSMichał Górny
11021e2d7ceSMichał Górny        self.server.responder = Responder()
11121e2d7ceSMichał Górny
1122238dcc3SJonas Devlieghere        self.match(
1132238dcc3SJonas Devlieghere            "platform get-size /some/file.txt",
1142238dcc3SJonas Devlieghere            [r"File size of /some/file\.txt \(remote\): 66051"],
1152238dcc3SJonas Devlieghere        )
1162238dcc3SJonas Devlieghere        self.assertPacketLogContains(
1172238dcc3SJonas Devlieghere            [
11821e2d7ceSMichał Górny                "vFile:size:2f736f6d652f66696c652e747874",
11921e2d7ceSMichał Górny                "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000",
12021e2d7ceSMichał Górny                "vFile:fstat:5",
12121e2d7ceSMichał Górny                "vFile:close:5",
1222238dcc3SJonas Devlieghere            ]
1232238dcc3SJonas Devlieghere        )
124dbb0c14dSMichał Górny
1258ccfcab3SPavel Labath        self.runCmd("platform disconnect")
1268ccfcab3SPavel Labath
1278ccfcab3SPavel Labath        # For a new onnection, we should attempt vFile:size once again.
1288ccfcab3SPavel Labath        server2 = MockGDBServer(self.server_socket_class())
1298ccfcab3SPavel Labath        server2.responder = Responder()
1308ccfcab3SPavel Labath        server2.start()
1318ccfcab3SPavel Labath        self.addTearDownHook(lambda: server2.stop())
1328ccfcab3SPavel Labath        self.runCmd("platform connect " + server2.get_connect_url())
1332238dcc3SJonas Devlieghere        self.match(
1342238dcc3SJonas Devlieghere            "platform get-size /other/file.txt",
1352238dcc3SJonas Devlieghere            [r"File size of /other/file\.txt \(remote\): 66051"],
1362238dcc3SJonas Devlieghere        )
1378ccfcab3SPavel Labath
1382238dcc3SJonas Devlieghere        self.assertPacketLogContains(
1392238dcc3SJonas Devlieghere            [
1408ccfcab3SPavel Labath                "vFile:size:2f6f746865722f66696c652e747874",
1418ccfcab3SPavel Labath                "vFile:open:2f6f746865722f66696c652e747874,00000000,00000000",
1428ccfcab3SPavel Labath                "vFile:fstat:5",
1438ccfcab3SPavel Labath                "vFile:close:5",
1448ccfcab3SPavel Labath            ],
1452238dcc3SJonas Devlieghere            log=server2.responder.packetLog,
1462238dcc3SJonas Devlieghere        )
1478ccfcab3SPavel Labath
148fc1df55bSDmitry Vasilyev    @expectedFailureAll(
149fc1df55bSDmitry Vasilyev        hostoslist=["windows"], bugnumber="github.com/llvm/llvm-project/issues/92255"
150fc1df55bSDmitry Vasilyev    )
151dbb0c14dSMichał Górny    def test_file_permissions(self):
152dbb0c14dSMichał Górny        """Test 'platform get-permissions'"""
153dbb0c14dSMichał Górny
154dbb0c14dSMichał Górny        class Responder(MockGDBServerResponder):
155dbb0c14dSMichał Górny            def vFile(self, packet):
156dbb0c14dSMichał Górny                return "F1a4"
157dbb0c14dSMichał Górny
158dbb0c14dSMichał Górny        self.server.responder = Responder()
159dbb0c14dSMichał Górny
1602238dcc3SJonas Devlieghere        self.match(
1612238dcc3SJonas Devlieghere            "platform get-permissions /some/file.txt",
1622238dcc3SJonas Devlieghere            [r"File permissions of /some/file\.txt \(remote\): 0o0644"],
1632238dcc3SJonas Devlieghere        )
1642238dcc3SJonas Devlieghere        self.assertPacketLogContains(
1652238dcc3SJonas Devlieghere            [
166dbb0c14dSMichał Górny                "vFile:mode:2f736f6d652f66696c652e747874",
1672238dcc3SJonas Devlieghere            ]
1682238dcc3SJonas Devlieghere        )
169dbb0c14dSMichał Górny
170fc1df55bSDmitry Vasilyev    @expectedFailureAll(
171fc1df55bSDmitry Vasilyev        hostoslist=["windows"], bugnumber="github.com/llvm/llvm-project/issues/92255"
172fc1df55bSDmitry Vasilyev    )
173501eaf88SMichał Górny    def test_file_permissions_fallback(self):
174501eaf88SMichał Górny        """Test 'platform get-permissions' fallback to fstat"""
175501eaf88SMichał Górny
176501eaf88SMichał Górny        class Responder(MockGDBServerResponder):
177501eaf88SMichał Górny            def vFile(self, packet):
178501eaf88SMichał Górny                if packet.startswith("vFile:open:"):
179501eaf88SMichał Górny                    return "F5"
180501eaf88SMichał Górny                elif packet.startswith("vFile:fstat:"):
181501eaf88SMichał Górny                    return "F40;" + 8 * "\0" + "\0\0\1\xA4" + 52 * "\0"
182501eaf88SMichał Górny                if packet.startswith("vFile:close:"):
183501eaf88SMichał Górny                    return "F0"
184501eaf88SMichał Górny                return ""
185501eaf88SMichał Górny
186501eaf88SMichał Górny        self.server.responder = Responder()
187501eaf88SMichał Górny
188501eaf88SMichał Górny        try:
1892238dcc3SJonas Devlieghere            self.match(
1902238dcc3SJonas Devlieghere                "platform get-permissions /some/file.txt",
1912238dcc3SJonas Devlieghere                [r"File permissions of /some/file\.txt \(remote\): 0o0644"],
1922238dcc3SJonas Devlieghere            )
1932238dcc3SJonas Devlieghere            self.assertPacketLogContains(
1942238dcc3SJonas Devlieghere                [
195501eaf88SMichał Górny                    "vFile:mode:2f736f6d652f66696c652e747874",
196501eaf88SMichał Górny                    "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000",
197501eaf88SMichał Górny                    "vFile:fstat:5",
198501eaf88SMichał Górny                    "vFile:close:5",
1992238dcc3SJonas Devlieghere                ]
2002238dcc3SJonas Devlieghere            )
201501eaf88SMichał Górny        finally:
202501eaf88SMichał Górny            self.dbg.GetSelectedPlatform().DisconnectRemote()
203501eaf88SMichał Górny
204dbb0c14dSMichał Górny    def test_file_exists(self):
205dbb0c14dSMichał Górny        """Test 'platform file-exists'"""
206dbb0c14dSMichał Górny
207dbb0c14dSMichał Górny        class Responder(MockGDBServerResponder):
208dbb0c14dSMichał Górny            def vFile(self, packet):
209dbb0c14dSMichał Górny                return "F,1"
210dbb0c14dSMichał Górny
211dbb0c14dSMichał Górny        self.server.responder = Responder()
212dbb0c14dSMichał Górny
2132238dcc3SJonas Devlieghere        self.match(
2142238dcc3SJonas Devlieghere            "platform file-exists /some/file.txt",
2152238dcc3SJonas Devlieghere            [r"File /some/file\.txt \(remote\) exists"],
2162238dcc3SJonas Devlieghere        )
2172238dcc3SJonas Devlieghere        self.assertPacketLogContains(
2182238dcc3SJonas Devlieghere            [
219dbb0c14dSMichał Górny                "vFile:exists:2f736f6d652f66696c652e747874",
2202238dcc3SJonas Devlieghere            ]
2212238dcc3SJonas Devlieghere        )
222dbb0c14dSMichał Górny
223dbb0c14dSMichał Górny    def test_file_exists_not(self):
224dbb0c14dSMichał Górny        """Test 'platform file-exists' with non-existing file"""
225dbb0c14dSMichał Górny
226dbb0c14dSMichał Górny        class Responder(MockGDBServerResponder):
227dbb0c14dSMichał Górny            def vFile(self, packet):
228dbb0c14dSMichał Górny                return "F,0"
229dbb0c14dSMichał Górny
230dbb0c14dSMichał Górny        self.server.responder = Responder()
231dbb0c14dSMichał Górny
2322238dcc3SJonas Devlieghere        self.match(
2332238dcc3SJonas Devlieghere            "platform file-exists /some/file.txt",
2342238dcc3SJonas Devlieghere            [r"File /some/file\.txt \(remote\) does not exist"],
2352238dcc3SJonas Devlieghere        )
2362238dcc3SJonas Devlieghere        self.assertPacketLogContains(
2372238dcc3SJonas Devlieghere            [
238dbb0c14dSMichał Górny                "vFile:exists:2f736f6d652f66696c652e747874",
2392238dcc3SJonas Devlieghere            ]
2402238dcc3SJonas Devlieghere        )
241501eaf88SMichał Górny
242501eaf88SMichał Górny    def test_file_exists_fallback(self):
243501eaf88SMichał Górny        """Test 'platform file-exists' fallback to open"""
244501eaf88SMichał Górny
245501eaf88SMichał Górny        class Responder(MockGDBServerResponder):
246501eaf88SMichał Górny            def vFile(self, packet):
247501eaf88SMichał Górny                if packet.startswith("vFile:open:"):
248501eaf88SMichał Górny                    return "F5"
249501eaf88SMichał Górny                if packet.startswith("vFile:close:"):
250501eaf88SMichał Górny                    return "F0"
251501eaf88SMichał Górny                return ""
252501eaf88SMichał Górny
253501eaf88SMichał Górny        self.server.responder = Responder()
254501eaf88SMichał Górny
2552238dcc3SJonas Devlieghere        self.match(
2562238dcc3SJonas Devlieghere            "platform file-exists /some/file.txt",
2572238dcc3SJonas Devlieghere            [r"File /some/file\.txt \(remote\) exists"],
2582238dcc3SJonas Devlieghere        )
2592238dcc3SJonas Devlieghere        self.assertPacketLogContains(
2602238dcc3SJonas Devlieghere            [
261501eaf88SMichał Górny                "vFile:exists:2f736f6d652f66696c652e747874",
262501eaf88SMichał Górny                "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000",
263501eaf88SMichał Górny                "vFile:close:5",
2642238dcc3SJonas Devlieghere            ]
2652238dcc3SJonas Devlieghere        )
266501eaf88SMichał Górny
267501eaf88SMichał Górny    def test_file_exists_not_fallback(self):
268501eaf88SMichał Górny        """Test 'platform file-exists' fallback to open with non-existing file"""
269501eaf88SMichał Górny
270501eaf88SMichał Górny        class Responder(MockGDBServerResponder):
271501eaf88SMichał Górny            def vFile(self, packet):
272501eaf88SMichał Górny                if packet.startswith("vFile:open:"):
273501eaf88SMichał Górny                    return "F-1,2"
274501eaf88SMichał Górny                return ""
275501eaf88SMichał Górny
276501eaf88SMichał Górny        self.server.responder = Responder()
277501eaf88SMichał Górny
2782238dcc3SJonas Devlieghere        self.match(
2792238dcc3SJonas Devlieghere            "platform file-exists /some/file.txt",
2802238dcc3SJonas Devlieghere            [r"File /some/file\.txt \(remote\) does not exist"],
2812238dcc3SJonas Devlieghere        )
2822238dcc3SJonas Devlieghere        self.assertPacketLogContains(
2832238dcc3SJonas Devlieghere            [
284501eaf88SMichał Górny                "vFile:exists:2f736f6d652f66696c652e747874",
285501eaf88SMichał Górny                "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000",
2862238dcc3SJonas Devlieghere            ]
2872238dcc3SJonas Devlieghere        )
288