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_permissions_fallback(self): 120 """Test 'platform get-permissions' fallback to fstat""" 121 122 class Responder(MockGDBServerResponder): 123 def vFile(self, packet): 124 if packet.startswith("vFile:open:"): 125 return "F5" 126 elif packet.startswith("vFile:fstat:"): 127 return "F40;" + 8 * "\0" + "\0\0\1\xA4" + 52 * "\0" 128 if packet.startswith("vFile:close:"): 129 return "F0" 130 return "" 131 132 self.server.responder = Responder() 133 134 try: 135 self.match("platform get-permissions /some/file.txt", 136 [r"File permissions of /some/file\.txt \(remote\): 0o0644"]) 137 self.assertPacketLogContains([ 138 "vFile:mode:2f736f6d652f66696c652e747874", 139 "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000", 140 "vFile:fstat:5", 141 "vFile:close:5", 142 ]) 143 finally: 144 self.dbg.GetSelectedPlatform().DisconnectRemote() 145 146 def test_file_exists(self): 147 """Test 'platform file-exists'""" 148 149 class Responder(MockGDBServerResponder): 150 def vFile(self, packet): 151 return "F,1" 152 153 self.server.responder = Responder() 154 155 self.match("platform file-exists /some/file.txt", 156 [r"File /some/file\.txt \(remote\) exists"]) 157 self.assertPacketLogContains([ 158 "vFile:exists:2f736f6d652f66696c652e747874", 159 ]) 160 161 def test_file_exists_not(self): 162 """Test 'platform file-exists' with non-existing file""" 163 164 class Responder(MockGDBServerResponder): 165 def vFile(self, packet): 166 return "F,0" 167 168 self.server.responder = Responder() 169 170 self.match("platform file-exists /some/file.txt", 171 [r"File /some/file\.txt \(remote\) does not exist"]) 172 self.assertPacketLogContains([ 173 "vFile:exists:2f736f6d652f66696c652e747874", 174 ]) 175 176 def test_file_exists_fallback(self): 177 """Test 'platform file-exists' fallback to open""" 178 179 class Responder(MockGDBServerResponder): 180 def vFile(self, packet): 181 if packet.startswith("vFile:open:"): 182 return "F5" 183 if packet.startswith("vFile:close:"): 184 return "F0" 185 return "" 186 187 self.server.responder = Responder() 188 189 self.match("platform file-exists /some/file.txt", 190 [r"File /some/file\.txt \(remote\) exists"]) 191 self.assertPacketLogContains([ 192 "vFile:exists:2f736f6d652f66696c652e747874", 193 "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000", 194 "vFile:close:5", 195 ]) 196 197 def test_file_exists_not_fallback(self): 198 """Test 'platform file-exists' fallback to open with non-existing file""" 199 200 class Responder(MockGDBServerResponder): 201 def vFile(self, packet): 202 if packet.startswith("vFile:open:"): 203 return "F-1,2" 204 return "" 205 206 self.server.responder = Responder() 207 208 self.match("platform file-exists /some/file.txt", 209 [r"File /some/file\.txt \(remote\) does not exist"]) 210 self.assertPacketLogContains([ 211 "vFile:exists:2f736f6d652f66696c652e747874", 212 "vFile:open:2f736f6d652f66696c652e747874,00000000,00000000", 213 ]) 214