xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestGDBRemotePlatformFile.py (revision 501eaf88770d15de92fa0eb7435f0470a3b93b0a)
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