1from gdbclientutils import * 2 3class TestGDBRemotePlatformFile(GDBPlatformClientTestBase): 4 5 def test_file(self): 6 """Test mock operations on a remote file""" 7 8 class Responder(MockGDBServerResponder): 9 def vFile(self, packet): 10 if packet.startswith("vFile:open:"): 11 return "F10" 12 elif packet.startswith("vFile:pread:"): 13 return "Fd;frobnicator" 14 elif packet.startswith("vFile:pwrite:"): 15 return "Fa" 16 elif packet.startswith("vFile:close:"): 17 return "F0" 18 return "F-1,16" 19 20 self.server.responder = Responder() 21 22 self.match("platform file open /some/file.txt -v 0755", 23 [r"File Descriptor = 16"]) 24 self.match("platform file read 16 -o 11 -c 13", 25 [r"Return = 11\nData = \"frobnicator\""]) 26 self.match("platform file write 16 -o 11 -d teststring", 27 [r"Return = 10"]) 28 self.match("platform file close 16", 29 [r"file 16 closed."]) 30 self.assertPacketLogContains([ 31 "vFile:open:2f736f6d652f66696c652e747874,00000202,000001ed", 32 "vFile:pread:10,d,b", 33 "vFile:pwrite:10,b,teststring", 34 "vFile:close:10", 35 ]) 36 37 def test_file_fail(self): 38 """Test mocked failures of remote operations""" 39 40 class Responder(MockGDBServerResponder): 41 def vFile(self, packet): 42 return "F-1,16" 43 44 self.server.responder = Responder() 45 46 self.match("platform file open /some/file.txt -v 0755", 47 [r"error: Invalid argument"], 48 error=True) 49 self.match("platform file read 16 -o 11 -c 13", 50 [r"error: Invalid argument"], 51 error=True) 52 self.match("platform file write 16 -o 11 -d teststring", 53 [r"error: Invalid argument"], 54 error=True) 55 self.match("platform file close 16", 56 [r"error: Invalid argument"], 57 error=True) 58 self.assertPacketLogContains([ 59 "vFile:open:2f736f6d652f66696c652e747874,00000202,000001ed", 60 "vFile:pread:10,d,b", 61 "vFile:pwrite:10,b,teststring", 62 "vFile:close:10", 63 ]) 64 65 def test_file_size(self): 66 """Test 'platform get-size'""" 67 68 class Responder(MockGDBServerResponder): 69 def vFile(self, packet): 70 return "F1000" 71 72 self.server.responder = Responder() 73 74 self.match("platform get-size /some/file.txt", 75 [r"File size of /some/file\.txt \(remote\): 4096"]) 76 self.assertPacketLogContains([ 77 "vFile:size:2f736f6d652f66696c652e747874", 78 ]) 79 80 def test_file_size_fallback(self): 81 """Test 'platform get-size fallback to vFile:fstat'""" 82 83 class Responder(MockGDBServerResponder): 84 def vFile(self, packet): 85 if packet.startswith("vFile:open:"): 86 return "F5" 87 elif packet.startswith("vFile:fstat:"): 88 return "F40;" + 28 * "\0" + "\0\0\0\0\0\1\2\3" + 28 * "\0" 89 if packet.startswith("vFile:close:"): 90 return "F0" 91 return "" 92 93 self.server.responder = Responder() 94 95 self.match("platform get-size /some/file.txt", 96 [r"File size of /some/file\.txt \(remote\): 66051"]) 97 self.assertPacketLogContains([ 98 "vFile:size:2f736f6d652f66696c652e747874", 99 "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000", 100 "vFile:fstat:5", 101 "vFile:close:5", 102 ]) 103