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