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 104 def test_file_permissions(self): 105 """Test 'platform get-permissions'""" 106 107 class Responder(MockGDBServerResponder): 108 def vFile(self, packet): 109 return "F1a4" 110 111 self.server.responder = Responder() 112 113 self.match("platform get-permissions /some/file.txt", 114 [r"File permissions of /some/file\.txt \(remote\): 0o0644"]) 115 self.assertPacketLogContains([ 116 "vFile:mode:2f736f6d652f66696c652e747874", 117 ]) 118 119 def test_file_exists(self): 120 """Test 'platform file-exists'""" 121 122 class Responder(MockGDBServerResponder): 123 def vFile(self, packet): 124 return "F,1" 125 126 self.server.responder = Responder() 127 128 self.match("platform file-exists /some/file.txt", 129 [r"File /some/file\.txt \(remote\) exists"]) 130 self.assertPacketLogContains([ 131 "vFile:exists:2f736f6d652f66696c652e747874", 132 ]) 133 134 def test_file_exists_not(self): 135 """Test 'platform file-exists' with non-existing file""" 136 137 class Responder(MockGDBServerResponder): 138 def vFile(self, packet): 139 return "F,0" 140 141 self.server.responder = Responder() 142 143 self.match("platform file-exists /some/file.txt", 144 [r"File /some/file\.txt \(remote\) does not exist"]) 145 self.assertPacketLogContains([ 146 "vFile:exists:2f736f6d652f66696c652e747874", 147 ]) 148