OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "components/filesystem/files_test_base.h" | 7 #include "components/filesystem/files_test_base.h" |
8 #include "mojo/public/cpp/bindings/interface_request.h" | 8 #include "mojo/public/cpp/bindings/interface_request.h" |
9 #include "mojo/public/cpp/bindings/type_converter.h" | 9 #include "mojo/public/cpp/bindings/type_converter.h" |
10 | 10 |
11 namespace filesystem { | 11 namespace filesystem { |
12 namespace { | 12 namespace { |
13 | 13 |
14 using FileImplTest = FilesTestBase; | 14 using FileImplTest = FilesTestBase; |
15 | 15 |
16 TEST_F(FileImplTest, CreateWriteCloseRenameOpenRead) { | 16 TEST_F(FileImplTest, CreateWriteCloseRenameOpenRead) { |
17 DirectoryPtr directory; | 17 DirectoryPtr directory; |
18 GetTemporaryRoot(&directory); | 18 GetTemporaryRoot(&directory); |
19 Error error; | 19 Error error; |
20 | 20 |
21 { | 21 { |
22 // Create my_file. | 22 // Create my_file. |
23 FilePtr file; | 23 FilePtr file; |
24 error = ERROR_INTERNAL; | 24 error = ERROR_INTERNAL; |
25 directory->OpenFile("my_file", GetProxy(&file), | 25 directory->OpenFile("my_file", GetProxy(&file), |
26 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 26 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
27 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 27 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
28 EXPECT_EQ(ERROR_OK, error); | 28 EXPECT_EQ(ERROR_OK, error); |
29 | 29 |
30 // Write to it. | 30 // Write to it. |
31 std::vector<uint8_t> bytes_to_write; | 31 std::vector<uint8_t> bytes_to_write; |
32 bytes_to_write.push_back(static_cast<uint8_t>('h')); | 32 bytes_to_write.push_back(static_cast<uint8_t>('h')); |
33 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 33 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
34 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 34 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
35 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 35 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
36 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 36 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
37 error = ERROR_INTERNAL; | 37 error = ERROR_INTERNAL; |
38 uint32_t num_bytes_written = 0; | 38 uint32_t num_bytes_written = 0; |
39 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 39 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
40 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 40 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
41 ASSERT_TRUE(file.WaitForIncomingResponse()); | 41 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
42 EXPECT_EQ(ERROR_OK, error); | 42 EXPECT_EQ(ERROR_OK, error); |
43 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 43 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
44 | 44 |
45 // Close it. | 45 // Close it. |
46 error = ERROR_INTERNAL; | 46 error = ERROR_INTERNAL; |
47 file->Close(Capture(&error)); | 47 file->Close(Capture(&error)); |
48 ASSERT_TRUE(file.WaitForIncomingResponse()); | 48 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
49 EXPECT_EQ(ERROR_OK, error); | 49 EXPECT_EQ(ERROR_OK, error); |
50 } | 50 } |
51 | 51 |
52 // Rename it. | 52 // Rename it. |
53 error = ERROR_INTERNAL; | 53 error = ERROR_INTERNAL; |
54 directory->Rename("my_file", "your_file", Capture(&error)); | 54 directory->Rename("my_file", "your_file", Capture(&error)); |
55 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 55 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
56 EXPECT_EQ(ERROR_OK, error); | 56 EXPECT_EQ(ERROR_OK, error); |
57 | 57 |
58 { | 58 { |
59 // Open my_file again. | 59 // Open my_file again. |
60 FilePtr file; | 60 FilePtr file; |
61 error = ERROR_INTERNAL; | 61 error = ERROR_INTERNAL; |
62 directory->OpenFile("your_file", GetProxy(&file), kOpenFlagRead, | 62 directory->OpenFile("your_file", GetProxy(&file), kOpenFlagRead, |
63 Capture(&error)); | 63 Capture(&error)); |
64 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 64 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
65 EXPECT_EQ(ERROR_OK, error); | 65 EXPECT_EQ(ERROR_OK, error); |
66 | 66 |
67 // Read from it. | 67 // Read from it. |
68 mojo::Array<uint8_t> bytes_read; | 68 mojo::Array<uint8_t> bytes_read; |
69 error = ERROR_INTERNAL; | 69 error = ERROR_INTERNAL; |
70 file->Read(3, 1, WHENCE_FROM_START, Capture(&error, &bytes_read)); | 70 file->Read(3, 1, WHENCE_FROM_START, Capture(&error, &bytes_read)); |
71 ASSERT_TRUE(file.WaitForIncomingResponse()); | 71 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
72 EXPECT_EQ(ERROR_OK, error); | 72 EXPECT_EQ(ERROR_OK, error); |
73 ASSERT_EQ(3u, bytes_read.size()); | 73 ASSERT_EQ(3u, bytes_read.size()); |
74 EXPECT_EQ(static_cast<uint8_t>('e'), bytes_read[0]); | 74 EXPECT_EQ(static_cast<uint8_t>('e'), bytes_read[0]); |
75 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[1]); | 75 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[1]); |
76 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[2]); | 76 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[2]); |
77 } | 77 } |
78 | 78 |
79 // TODO(vtl): Test read/write offset options. | 79 // TODO(vtl): Test read/write offset options. |
80 } | 80 } |
81 | 81 |
82 TEST_F(FileImplTest, CantWriteInReadMode) { | 82 TEST_F(FileImplTest, CantWriteInReadMode) { |
83 DirectoryPtr directory; | 83 DirectoryPtr directory; |
84 GetTemporaryRoot(&directory); | 84 GetTemporaryRoot(&directory); |
85 Error error; | 85 Error error; |
86 | 86 |
87 std::vector<uint8_t> bytes_to_write; | 87 std::vector<uint8_t> bytes_to_write; |
88 bytes_to_write.push_back(static_cast<uint8_t>('h')); | 88 bytes_to_write.push_back(static_cast<uint8_t>('h')); |
89 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 89 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
90 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 90 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
91 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 91 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
92 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 92 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
93 | 93 |
94 { | 94 { |
95 // Create my_file. | 95 // Create my_file. |
96 FilePtr file; | 96 FilePtr file; |
97 error = ERROR_INTERNAL; | 97 error = ERROR_INTERNAL; |
98 directory->OpenFile("my_file", GetProxy(&file), | 98 directory->OpenFile("my_file", GetProxy(&file), |
99 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 99 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
100 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 100 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
101 EXPECT_EQ(ERROR_OK, error); | 101 EXPECT_EQ(ERROR_OK, error); |
102 | 102 |
103 // Write to it. | 103 // Write to it. |
104 error = ERROR_INTERNAL; | 104 error = ERROR_INTERNAL; |
105 uint32_t num_bytes_written = 0; | 105 uint32_t num_bytes_written = 0; |
106 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 106 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
107 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 107 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
108 ASSERT_TRUE(file.WaitForIncomingResponse()); | 108 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
109 EXPECT_EQ(ERROR_OK, error); | 109 EXPECT_EQ(ERROR_OK, error); |
110 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 110 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
111 | 111 |
112 // Close it. | 112 // Close it. |
113 error = ERROR_INTERNAL; | 113 error = ERROR_INTERNAL; |
114 file->Close(Capture(&error)); | 114 file->Close(Capture(&error)); |
115 ASSERT_TRUE(file.WaitForIncomingResponse()); | 115 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
116 EXPECT_EQ(ERROR_OK, error); | 116 EXPECT_EQ(ERROR_OK, error); |
117 } | 117 } |
118 | 118 |
119 { | 119 { |
120 // Open my_file again, this time with read only mode. | 120 // Open my_file again, this time with read only mode. |
121 FilePtr file; | 121 FilePtr file; |
122 error = ERROR_INTERNAL; | 122 error = ERROR_INTERNAL; |
123 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead, | 123 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead, |
124 Capture(&error)); | 124 Capture(&error)); |
125 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 125 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
126 EXPECT_EQ(ERROR_OK, error); | 126 EXPECT_EQ(ERROR_OK, error); |
127 | 127 |
128 // Try to write in read mode; it should fail. | 128 // Try to write in read mode; it should fail. |
129 error = ERROR_INTERNAL; | 129 error = ERROR_INTERNAL; |
130 uint32_t num_bytes_written = 0; | 130 uint32_t num_bytes_written = 0; |
131 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 131 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
132 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 132 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
133 ASSERT_TRUE(file.WaitForIncomingResponse()); | 133 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
134 EXPECT_EQ(ERROR_UNKNOWN, error); | 134 EXPECT_EQ(ERROR_UNKNOWN, error); |
135 EXPECT_EQ(0u, num_bytes_written); | 135 EXPECT_EQ(0u, num_bytes_written); |
136 | 136 |
137 // Close it. | 137 // Close it. |
138 error = ERROR_INTERNAL; | 138 error = ERROR_INTERNAL; |
139 file->Close(Capture(&error)); | 139 file->Close(Capture(&error)); |
140 ASSERT_TRUE(file.WaitForIncomingResponse()); | 140 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
141 EXPECT_EQ(ERROR_OK, error); | 141 EXPECT_EQ(ERROR_OK, error); |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 TEST_F(FileImplTest, OpenExclusive) { | 145 TEST_F(FileImplTest, OpenExclusive) { |
146 DirectoryPtr directory; | 146 DirectoryPtr directory; |
147 GetTemporaryRoot(&directory); | 147 GetTemporaryRoot(&directory); |
148 Error error; | 148 Error error; |
149 | 149 |
150 { | 150 { |
151 // Create my_file. | 151 // Create my_file. |
152 FilePtr file; | 152 FilePtr file; |
153 error = ERROR_INTERNAL; | 153 error = ERROR_INTERNAL; |
154 directory->OpenFile("temp_file", GetProxy(&file), | 154 directory->OpenFile("temp_file", GetProxy(&file), |
155 kOpenFlagWrite | kOpenFlagCreate |kOpenFlagExclusive, | 155 kOpenFlagWrite | kOpenFlagCreate |kOpenFlagExclusive, |
156 Capture(&error)); | 156 Capture(&error)); |
157 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 157 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
158 EXPECT_EQ(ERROR_OK, error); | 158 EXPECT_EQ(ERROR_OK, error); |
159 | 159 |
160 // Close it. | 160 // Close it. |
161 error = ERROR_INTERNAL; | 161 error = ERROR_INTERNAL; |
162 file->Close(Capture(&error)); | 162 file->Close(Capture(&error)); |
163 ASSERT_TRUE(file.WaitForIncomingResponse()); | 163 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
164 EXPECT_EQ(ERROR_OK, error); | 164 EXPECT_EQ(ERROR_OK, error); |
165 } | 165 } |
166 | 166 |
167 { | 167 { |
168 // Try to open my_file again in exclusive mode; it should fail. | 168 // Try to open my_file again in exclusive mode; it should fail. |
169 FilePtr file; | 169 FilePtr file; |
170 error = ERROR_INTERNAL; | 170 error = ERROR_INTERNAL; |
171 directory->OpenFile("temp_file", GetProxy(&file), | 171 directory->OpenFile("temp_file", GetProxy(&file), |
172 kOpenFlagWrite | kOpenFlagCreate | kOpenFlagExclusive, | 172 kOpenFlagWrite | kOpenFlagCreate | kOpenFlagExclusive, |
173 Capture(&error)); | 173 Capture(&error)); |
174 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 174 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
175 EXPECT_EQ(ERROR_UNKNOWN, error); | 175 EXPECT_EQ(ERROR_UNKNOWN, error); |
176 } | 176 } |
177 } | 177 } |
178 | 178 |
179 TEST_F(FileImplTest, OpenInAppendMode) { | 179 TEST_F(FileImplTest, OpenInAppendMode) { |
180 DirectoryPtr directory; | 180 DirectoryPtr directory; |
181 GetTemporaryRoot(&directory); | 181 GetTemporaryRoot(&directory); |
182 Error error; | 182 Error error; |
183 | 183 |
184 { | 184 { |
185 // Create my_file. | 185 // Create my_file. |
186 FilePtr file; | 186 FilePtr file; |
187 error = ERROR_INTERNAL; | 187 error = ERROR_INTERNAL; |
188 directory->OpenFile("my_file", GetProxy(&file), | 188 directory->OpenFile("my_file", GetProxy(&file), |
189 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 189 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
190 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 190 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
191 EXPECT_EQ(ERROR_OK, error); | 191 EXPECT_EQ(ERROR_OK, error); |
192 | 192 |
193 // Write to it. | 193 // Write to it. |
194 std::vector<uint8_t> bytes_to_write; | 194 std::vector<uint8_t> bytes_to_write; |
195 bytes_to_write.push_back(static_cast<uint8_t>('h')); | 195 bytes_to_write.push_back(static_cast<uint8_t>('h')); |
196 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 196 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
197 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 197 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
198 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 198 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
199 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 199 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
200 error = ERROR_INTERNAL; | 200 error = ERROR_INTERNAL; |
201 uint32_t num_bytes_written = 0; | 201 uint32_t num_bytes_written = 0; |
202 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 202 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
203 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 203 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
204 ASSERT_TRUE(file.WaitForIncomingResponse()); | 204 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
205 EXPECT_EQ(ERROR_OK, error); | 205 EXPECT_EQ(ERROR_OK, error); |
206 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 206 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
207 | 207 |
208 // Close it. | 208 // Close it. |
209 error = ERROR_INTERNAL; | 209 error = ERROR_INTERNAL; |
210 file->Close(Capture(&error)); | 210 file->Close(Capture(&error)); |
211 ASSERT_TRUE(file.WaitForIncomingResponse()); | 211 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
212 EXPECT_EQ(ERROR_OK, error); | 212 EXPECT_EQ(ERROR_OK, error); |
213 } | 213 } |
214 | 214 |
215 { | 215 { |
216 // Append to my_file. | 216 // Append to my_file. |
217 FilePtr file; | 217 FilePtr file; |
218 error = ERROR_INTERNAL; | 218 error = ERROR_INTERNAL; |
219 directory->OpenFile("my_file", GetProxy(&file), | 219 directory->OpenFile("my_file", GetProxy(&file), |
220 kOpenFlagWrite | kOpenFlagAppend, Capture(&error)); | 220 kOpenFlagWrite | kOpenFlagAppend, Capture(&error)); |
221 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 221 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
222 EXPECT_EQ(ERROR_OK, error); | 222 EXPECT_EQ(ERROR_OK, error); |
223 | 223 |
224 // Write to it. | 224 // Write to it. |
225 std::vector<uint8_t> bytes_to_write; | 225 std::vector<uint8_t> bytes_to_write; |
226 bytes_to_write.push_back(static_cast<uint8_t>('g')); | 226 bytes_to_write.push_back(static_cast<uint8_t>('g')); |
227 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 227 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
228 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 228 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
229 bytes_to_write.push_back(static_cast<uint8_t>('d')); | 229 bytes_to_write.push_back(static_cast<uint8_t>('d')); |
230 bytes_to_write.push_back(static_cast<uint8_t>('b')); | 230 bytes_to_write.push_back(static_cast<uint8_t>('b')); |
231 bytes_to_write.push_back(static_cast<uint8_t>('y')); | 231 bytes_to_write.push_back(static_cast<uint8_t>('y')); |
232 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 232 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
233 error = ERROR_INTERNAL; | 233 error = ERROR_INTERNAL; |
234 uint32_t num_bytes_written = 0; | 234 uint32_t num_bytes_written = 0; |
235 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 235 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
236 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 236 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
237 ASSERT_TRUE(file.WaitForIncomingResponse()); | 237 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
238 EXPECT_EQ(ERROR_OK, error); | 238 EXPECT_EQ(ERROR_OK, error); |
239 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 239 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
240 | 240 |
241 // Close it. | 241 // Close it. |
242 error = ERROR_INTERNAL; | 242 error = ERROR_INTERNAL; |
243 file->Close(Capture(&error)); | 243 file->Close(Capture(&error)); |
244 ASSERT_TRUE(file.WaitForIncomingResponse()); | 244 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
245 EXPECT_EQ(ERROR_OK, error); | 245 EXPECT_EQ(ERROR_OK, error); |
246 } | 246 } |
247 | 247 |
248 { | 248 { |
249 // Open my_file again. | 249 // Open my_file again. |
250 FilePtr file; | 250 FilePtr file; |
251 error = ERROR_INTERNAL; | 251 error = ERROR_INTERNAL; |
252 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead, | 252 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead, |
253 Capture(&error)); | 253 Capture(&error)); |
254 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 254 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
255 EXPECT_EQ(ERROR_OK, error); | 255 EXPECT_EQ(ERROR_OK, error); |
256 | 256 |
257 // Read from it. | 257 // Read from it. |
258 mojo::Array<uint8_t> bytes_read; | 258 mojo::Array<uint8_t> bytes_read; |
259 error = ERROR_INTERNAL; | 259 error = ERROR_INTERNAL; |
260 file->Read(12, 0, WHENCE_FROM_START, Capture(&error, &bytes_read)); | 260 file->Read(12, 0, WHENCE_FROM_START, Capture(&error, &bytes_read)); |
261 ASSERT_TRUE(file.WaitForIncomingResponse()); | 261 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
262 EXPECT_EQ(ERROR_OK, error); | 262 EXPECT_EQ(ERROR_OK, error); |
263 ASSERT_EQ(12u, bytes_read.size()); | 263 ASSERT_EQ(12u, bytes_read.size()); |
264 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[3]); | 264 EXPECT_EQ(static_cast<uint8_t>('l'), bytes_read[3]); |
265 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[4]); | 265 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[4]); |
266 EXPECT_EQ(static_cast<uint8_t>('g'), bytes_read[5]); | 266 EXPECT_EQ(static_cast<uint8_t>('g'), bytes_read[5]); |
267 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[6]); | 267 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[6]); |
268 } | 268 } |
269 } | 269 } |
270 | 270 |
271 TEST_F(FileImplTest, OpenInTruncateMode) { | 271 TEST_F(FileImplTest, OpenInTruncateMode) { |
272 DirectoryPtr directory; | 272 DirectoryPtr directory; |
273 GetTemporaryRoot(&directory); | 273 GetTemporaryRoot(&directory); |
274 Error error; | 274 Error error; |
275 | 275 |
276 { | 276 { |
277 // Create my_file. | 277 // Create my_file. |
278 FilePtr file; | 278 FilePtr file; |
279 error = ERROR_INTERNAL; | 279 error = ERROR_INTERNAL; |
280 directory->OpenFile("my_file", GetProxy(&file), | 280 directory->OpenFile("my_file", GetProxy(&file), |
281 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 281 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
282 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 282 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
283 EXPECT_EQ(ERROR_OK, error); | 283 EXPECT_EQ(ERROR_OK, error); |
284 | 284 |
285 // Write to it. | 285 // Write to it. |
286 std::vector<uint8_t> bytes_to_write; | 286 std::vector<uint8_t> bytes_to_write; |
287 bytes_to_write.push_back(static_cast<uint8_t>('h')); | 287 bytes_to_write.push_back(static_cast<uint8_t>('h')); |
288 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 288 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
289 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 289 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
290 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 290 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
291 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 291 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
292 error = ERROR_INTERNAL; | 292 error = ERROR_INTERNAL; |
293 uint32_t num_bytes_written = 0; | 293 uint32_t num_bytes_written = 0; |
294 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 294 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
295 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 295 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
296 ASSERT_TRUE(file.WaitForIncomingResponse()); | 296 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
297 EXPECT_EQ(ERROR_OK, error); | 297 EXPECT_EQ(ERROR_OK, error); |
298 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 298 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
299 | 299 |
300 // Close it. | 300 // Close it. |
301 error = ERROR_INTERNAL; | 301 error = ERROR_INTERNAL; |
302 file->Close(Capture(&error)); | 302 file->Close(Capture(&error)); |
303 ASSERT_TRUE(file.WaitForIncomingResponse()); | 303 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
304 EXPECT_EQ(ERROR_OK, error); | 304 EXPECT_EQ(ERROR_OK, error); |
305 } | 305 } |
306 | 306 |
307 { | 307 { |
308 // Append to my_file. | 308 // Append to my_file. |
309 FilePtr file; | 309 FilePtr file; |
310 error = ERROR_INTERNAL; | 310 error = ERROR_INTERNAL; |
311 directory->OpenFile("my_file", GetProxy(&file), | 311 directory->OpenFile("my_file", GetProxy(&file), |
312 kOpenFlagWrite | kOpenFlagTruncate, Capture(&error)); | 312 kOpenFlagWrite | kOpenFlagTruncate, Capture(&error)); |
313 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 313 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
314 EXPECT_EQ(ERROR_OK, error); | 314 EXPECT_EQ(ERROR_OK, error); |
315 | 315 |
316 // Write to it. | 316 // Write to it. |
317 std::vector<uint8_t> bytes_to_write; | 317 std::vector<uint8_t> bytes_to_write; |
318 bytes_to_write.push_back(static_cast<uint8_t>('g')); | 318 bytes_to_write.push_back(static_cast<uint8_t>('g')); |
319 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 319 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
320 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 320 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
321 bytes_to_write.push_back(static_cast<uint8_t>('d')); | 321 bytes_to_write.push_back(static_cast<uint8_t>('d')); |
322 bytes_to_write.push_back(static_cast<uint8_t>('b')); | 322 bytes_to_write.push_back(static_cast<uint8_t>('b')); |
323 bytes_to_write.push_back(static_cast<uint8_t>('y')); | 323 bytes_to_write.push_back(static_cast<uint8_t>('y')); |
324 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 324 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
325 error = ERROR_INTERNAL; | 325 error = ERROR_INTERNAL; |
326 uint32_t num_bytes_written = 0; | 326 uint32_t num_bytes_written = 0; |
327 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 327 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
328 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 328 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
329 ASSERT_TRUE(file.WaitForIncomingResponse()); | 329 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
330 EXPECT_EQ(ERROR_OK, error); | 330 EXPECT_EQ(ERROR_OK, error); |
331 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 331 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
332 | 332 |
333 // Close it. | 333 // Close it. |
334 error = ERROR_INTERNAL; | 334 error = ERROR_INTERNAL; |
335 file->Close(Capture(&error)); | 335 file->Close(Capture(&error)); |
336 ASSERT_TRUE(file.WaitForIncomingResponse()); | 336 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
337 EXPECT_EQ(ERROR_OK, error); | 337 EXPECT_EQ(ERROR_OK, error); |
338 } | 338 } |
339 | 339 |
340 { | 340 { |
341 // Open my_file again. | 341 // Open my_file again. |
342 FilePtr file; | 342 FilePtr file; |
343 error = ERROR_INTERNAL; | 343 error = ERROR_INTERNAL; |
344 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead, | 344 directory->OpenFile("my_file", GetProxy(&file), kOpenFlagRead, |
345 Capture(&error)); | 345 Capture(&error)); |
346 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 346 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
347 EXPECT_EQ(ERROR_OK, error); | 347 EXPECT_EQ(ERROR_OK, error); |
348 | 348 |
349 // Read from it. | 349 // Read from it. |
350 mojo::Array<uint8_t> bytes_read; | 350 mojo::Array<uint8_t> bytes_read; |
351 error = ERROR_INTERNAL; | 351 error = ERROR_INTERNAL; |
352 file->Read(7, 0, WHENCE_FROM_START, Capture(&error, &bytes_read)); | 352 file->Read(7, 0, WHENCE_FROM_START, Capture(&error, &bytes_read)); |
353 ASSERT_TRUE(file.WaitForIncomingResponse()); | 353 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
354 EXPECT_EQ(ERROR_OK, error); | 354 EXPECT_EQ(ERROR_OK, error); |
355 ASSERT_EQ(7u, bytes_read.size()); | 355 ASSERT_EQ(7u, bytes_read.size()); |
356 EXPECT_EQ(static_cast<uint8_t>('g'), bytes_read[0]); | 356 EXPECT_EQ(static_cast<uint8_t>('g'), bytes_read[0]); |
357 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[1]); | 357 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[1]); |
358 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[2]); | 358 EXPECT_EQ(static_cast<uint8_t>('o'), bytes_read[2]); |
359 EXPECT_EQ(static_cast<uint8_t>('d'), bytes_read[3]); | 359 EXPECT_EQ(static_cast<uint8_t>('d'), bytes_read[3]); |
360 } | 360 } |
361 } | 361 } |
362 | 362 |
363 // Note: Ignore nanoseconds, since it may not always be supported. We expect at | 363 // Note: Ignore nanoseconds, since it may not always be supported. We expect at |
364 // least second-resolution support though. | 364 // least second-resolution support though. |
365 TEST_F(FileImplTest, StatTouch) { | 365 TEST_F(FileImplTest, StatTouch) { |
366 DirectoryPtr directory; | 366 DirectoryPtr directory; |
367 GetTemporaryRoot(&directory); | 367 GetTemporaryRoot(&directory); |
368 Error error; | 368 Error error; |
369 | 369 |
370 // Create my_file. | 370 // Create my_file. |
371 FilePtr file; | 371 FilePtr file; |
372 error = ERROR_INTERNAL; | 372 error = ERROR_INTERNAL; |
373 directory->OpenFile("my_file", GetProxy(&file), | 373 directory->OpenFile("my_file", GetProxy(&file), |
374 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 374 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
375 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 375 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
376 EXPECT_EQ(ERROR_OK, error); | 376 EXPECT_EQ(ERROR_OK, error); |
377 | 377 |
378 // Stat it. | 378 // Stat it. |
379 error = ERROR_INTERNAL; | 379 error = ERROR_INTERNAL; |
380 FileInformationPtr file_info; | 380 FileInformationPtr file_info; |
381 file->Stat(Capture(&error, &file_info)); | 381 file->Stat(Capture(&error, &file_info)); |
382 ASSERT_TRUE(file.WaitForIncomingResponse()); | 382 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
383 EXPECT_EQ(ERROR_OK, error); | 383 EXPECT_EQ(ERROR_OK, error); |
384 ASSERT_FALSE(file_info.is_null()); | 384 ASSERT_FALSE(file_info.is_null()); |
385 EXPECT_EQ(FILE_TYPE_REGULAR_FILE, file_info->type); | 385 EXPECT_EQ(FILE_TYPE_REGULAR_FILE, file_info->type); |
386 EXPECT_EQ(0, file_info->size); | 386 EXPECT_EQ(0, file_info->size); |
387 ASSERT_FALSE(file_info->atime.is_null()); | 387 ASSERT_FALSE(file_info->atime.is_null()); |
388 EXPECT_GT(file_info->atime->seconds, 0); // Expect that it's not 1970-01-01. | 388 EXPECT_GT(file_info->atime->seconds, 0); // Expect that it's not 1970-01-01. |
389 ASSERT_FALSE(file_info->mtime.is_null()); | 389 ASSERT_FALSE(file_info->mtime.is_null()); |
390 EXPECT_GT(file_info->mtime->seconds, 0); | 390 EXPECT_GT(file_info->mtime->seconds, 0); |
391 int64_t first_mtime = file_info->mtime->seconds; | 391 int64_t first_mtime = file_info->mtime->seconds; |
392 | 392 |
393 // Touch only the atime. | 393 // Touch only the atime. |
394 error = ERROR_INTERNAL; | 394 error = ERROR_INTERNAL; |
395 TimespecOrNowPtr t(TimespecOrNow::New()); | 395 TimespecOrNowPtr t(TimespecOrNow::New()); |
396 t->now = false; | 396 t->now = false; |
397 t->timespec = Timespec::New(); | 397 t->timespec = Timespec::New(); |
398 const int64_t kPartyTime1 = 1234567890; // Party like it's 2009-02-13. | 398 const int64_t kPartyTime1 = 1234567890; // Party like it's 2009-02-13. |
399 t->timespec->seconds = kPartyTime1; | 399 t->timespec->seconds = kPartyTime1; |
400 file->Touch(t.Pass(), nullptr, Capture(&error)); | 400 file->Touch(t.Pass(), nullptr, Capture(&error)); |
401 ASSERT_TRUE(file.WaitForIncomingResponse()); | 401 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
402 EXPECT_EQ(ERROR_OK, error); | 402 EXPECT_EQ(ERROR_OK, error); |
403 | 403 |
404 // Stat again. | 404 // Stat again. |
405 error = ERROR_INTERNAL; | 405 error = ERROR_INTERNAL; |
406 file_info.reset(); | 406 file_info.reset(); |
407 file->Stat(Capture(&error, &file_info)); | 407 file->Stat(Capture(&error, &file_info)); |
408 ASSERT_TRUE(file.WaitForIncomingResponse()); | 408 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
409 EXPECT_EQ(ERROR_OK, error); | 409 EXPECT_EQ(ERROR_OK, error); |
410 ASSERT_FALSE(file_info.is_null()); | 410 ASSERT_FALSE(file_info.is_null()); |
411 ASSERT_FALSE(file_info->atime.is_null()); | 411 ASSERT_FALSE(file_info->atime.is_null()); |
412 EXPECT_EQ(kPartyTime1, file_info->atime->seconds); | 412 EXPECT_EQ(kPartyTime1, file_info->atime->seconds); |
413 ASSERT_FALSE(file_info->mtime.is_null()); | 413 ASSERT_FALSE(file_info->mtime.is_null()); |
414 EXPECT_EQ(first_mtime, file_info->mtime->seconds); | 414 EXPECT_EQ(first_mtime, file_info->mtime->seconds); |
415 | 415 |
416 // Touch only the mtime. | 416 // Touch only the mtime. |
417 t = TimespecOrNow::New(); | 417 t = TimespecOrNow::New(); |
418 t->now = false; | 418 t->now = false; |
419 t->timespec = Timespec::New(); | 419 t->timespec = Timespec::New(); |
420 const int64_t kPartyTime2 = 1425059525; // No time like the present. | 420 const int64_t kPartyTime2 = 1425059525; // No time like the present. |
421 t->timespec->seconds = kPartyTime2; | 421 t->timespec->seconds = kPartyTime2; |
422 file->Touch(nullptr, t.Pass(), Capture(&error)); | 422 file->Touch(nullptr, t.Pass(), Capture(&error)); |
423 ASSERT_TRUE(file.WaitForIncomingResponse()); | 423 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
424 EXPECT_EQ(ERROR_OK, error); | 424 EXPECT_EQ(ERROR_OK, error); |
425 | 425 |
426 // Stat again. | 426 // Stat again. |
427 error = ERROR_INTERNAL; | 427 error = ERROR_INTERNAL; |
428 file_info.reset(); | 428 file_info.reset(); |
429 file->Stat(Capture(&error, &file_info)); | 429 file->Stat(Capture(&error, &file_info)); |
430 ASSERT_TRUE(file.WaitForIncomingResponse()); | 430 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
431 EXPECT_EQ(ERROR_OK, error); | 431 EXPECT_EQ(ERROR_OK, error); |
432 ASSERT_FALSE(file_info.is_null()); | 432 ASSERT_FALSE(file_info.is_null()); |
433 ASSERT_FALSE(file_info->atime.is_null()); | 433 ASSERT_FALSE(file_info->atime.is_null()); |
434 EXPECT_EQ(kPartyTime1, file_info->atime->seconds); | 434 EXPECT_EQ(kPartyTime1, file_info->atime->seconds); |
435 ASSERT_FALSE(file_info->mtime.is_null()); | 435 ASSERT_FALSE(file_info->mtime.is_null()); |
436 EXPECT_EQ(kPartyTime2, file_info->mtime->seconds); | 436 EXPECT_EQ(kPartyTime2, file_info->mtime->seconds); |
437 | 437 |
438 // TODO(vtl): Also test non-zero file size. | 438 // TODO(vtl): Also test non-zero file size. |
439 // TODO(vtl): Also test Touch() "now" options. | 439 // TODO(vtl): Also test Touch() "now" options. |
440 // TODO(vtl): Also test touching both atime and mtime. | 440 // TODO(vtl): Also test touching both atime and mtime. |
441 } | 441 } |
442 | 442 |
443 TEST_F(FileImplTest, TellSeek) { | 443 TEST_F(FileImplTest, TellSeek) { |
444 DirectoryPtr directory; | 444 DirectoryPtr directory; |
445 GetTemporaryRoot(&directory); | 445 GetTemporaryRoot(&directory); |
446 Error error; | 446 Error error; |
447 | 447 |
448 // Create my_file. | 448 // Create my_file. |
449 FilePtr file; | 449 FilePtr file; |
450 error = ERROR_INTERNAL; | 450 error = ERROR_INTERNAL; |
451 directory->OpenFile("my_file", GetProxy(&file), | 451 directory->OpenFile("my_file", GetProxy(&file), |
452 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 452 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
453 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 453 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
454 EXPECT_EQ(ERROR_OK, error); | 454 EXPECT_EQ(ERROR_OK, error); |
455 | 455 |
456 // Write to it. | 456 // Write to it. |
457 std::vector<uint8_t> bytes_to_write(1000, '!'); | 457 std::vector<uint8_t> bytes_to_write(1000, '!'); |
458 error = ERROR_INTERNAL; | 458 error = ERROR_INTERNAL; |
459 uint32_t num_bytes_written = 0; | 459 uint32_t num_bytes_written = 0; |
460 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 460 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
461 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 461 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
462 ASSERT_TRUE(file.WaitForIncomingResponse()); | 462 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
463 EXPECT_EQ(ERROR_OK, error); | 463 EXPECT_EQ(ERROR_OK, error); |
464 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 464 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
465 const int size = static_cast<int>(num_bytes_written); | 465 const int size = static_cast<int>(num_bytes_written); |
466 | 466 |
467 // Tell. | 467 // Tell. |
468 error = ERROR_INTERNAL; | 468 error = ERROR_INTERNAL; |
469 int64_t position = -1; | 469 int64_t position = -1; |
470 file->Tell(Capture(&error, &position)); | 470 file->Tell(Capture(&error, &position)); |
471 ASSERT_TRUE(file.WaitForIncomingResponse()); | 471 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
472 // Should be at the end. | 472 // Should be at the end. |
473 EXPECT_EQ(ERROR_OK, error); | 473 EXPECT_EQ(ERROR_OK, error); |
474 EXPECT_EQ(size, position); | 474 EXPECT_EQ(size, position); |
475 | 475 |
476 // Seek back 100. | 476 // Seek back 100. |
477 error = ERROR_INTERNAL; | 477 error = ERROR_INTERNAL; |
478 position = -1; | 478 position = -1; |
479 file->Seek(-100, WHENCE_FROM_CURRENT, Capture(&error, &position)); | 479 file->Seek(-100, WHENCE_FROM_CURRENT, Capture(&error, &position)); |
480 ASSERT_TRUE(file.WaitForIncomingResponse()); | 480 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
481 EXPECT_EQ(ERROR_OK, error); | 481 EXPECT_EQ(ERROR_OK, error); |
482 EXPECT_EQ(size - 100, position); | 482 EXPECT_EQ(size - 100, position); |
483 | 483 |
484 // Tell. | 484 // Tell. |
485 error = ERROR_INTERNAL; | 485 error = ERROR_INTERNAL; |
486 position = -1; | 486 position = -1; |
487 file->Tell(Capture(&error, &position)); | 487 file->Tell(Capture(&error, &position)); |
488 ASSERT_TRUE(file.WaitForIncomingResponse()); | 488 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
489 EXPECT_EQ(ERROR_OK, error); | 489 EXPECT_EQ(ERROR_OK, error); |
490 EXPECT_EQ(size - 100, position); | 490 EXPECT_EQ(size - 100, position); |
491 | 491 |
492 // Seek to 123 from start. | 492 // Seek to 123 from start. |
493 error = ERROR_INTERNAL; | 493 error = ERROR_INTERNAL; |
494 position = -1; | 494 position = -1; |
495 file->Seek(123, WHENCE_FROM_START, Capture(&error, &position)); | 495 file->Seek(123, WHENCE_FROM_START, Capture(&error, &position)); |
496 ASSERT_TRUE(file.WaitForIncomingResponse()); | 496 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
497 EXPECT_EQ(ERROR_OK, error); | 497 EXPECT_EQ(ERROR_OK, error); |
498 EXPECT_EQ(123, position); | 498 EXPECT_EQ(123, position); |
499 | 499 |
500 // Tell. | 500 // Tell. |
501 error = ERROR_INTERNAL; | 501 error = ERROR_INTERNAL; |
502 position = -1; | 502 position = -1; |
503 file->Tell(Capture(&error, &position)); | 503 file->Tell(Capture(&error, &position)); |
504 ASSERT_TRUE(file.WaitForIncomingResponse()); | 504 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
505 EXPECT_EQ(ERROR_OK, error); | 505 EXPECT_EQ(ERROR_OK, error); |
506 EXPECT_EQ(123, position); | 506 EXPECT_EQ(123, position); |
507 | 507 |
508 // Seek to 123 back from end. | 508 // Seek to 123 back from end. |
509 error = ERROR_INTERNAL; | 509 error = ERROR_INTERNAL; |
510 position = -1; | 510 position = -1; |
511 file->Seek(-123, WHENCE_FROM_END, Capture(&error, &position)); | 511 file->Seek(-123, WHENCE_FROM_END, Capture(&error, &position)); |
512 ASSERT_TRUE(file.WaitForIncomingResponse()); | 512 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
513 EXPECT_EQ(ERROR_OK, error); | 513 EXPECT_EQ(ERROR_OK, error); |
514 EXPECT_EQ(size - 123, position); | 514 EXPECT_EQ(size - 123, position); |
515 | 515 |
516 // Tell. | 516 // Tell. |
517 error = ERROR_INTERNAL; | 517 error = ERROR_INTERNAL; |
518 position = -1; | 518 position = -1; |
519 file->Tell(Capture(&error, &position)); | 519 file->Tell(Capture(&error, &position)); |
520 ASSERT_TRUE(file.WaitForIncomingResponse()); | 520 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
521 EXPECT_EQ(ERROR_OK, error); | 521 EXPECT_EQ(ERROR_OK, error); |
522 EXPECT_EQ(size - 123, position); | 522 EXPECT_EQ(size - 123, position); |
523 | 523 |
524 // TODO(vtl): Check that seeking actually affects reading/writing. | 524 // TODO(vtl): Check that seeking actually affects reading/writing. |
525 // TODO(vtl): Check that seeking can extend the file? | 525 // TODO(vtl): Check that seeking can extend the file? |
526 } | 526 } |
527 | 527 |
528 TEST_F(FileImplTest, Dup) { | 528 TEST_F(FileImplTest, Dup) { |
529 DirectoryPtr directory; | 529 DirectoryPtr directory; |
530 GetTemporaryRoot(&directory); | 530 GetTemporaryRoot(&directory); |
531 Error error; | 531 Error error; |
532 | 532 |
533 // Create my_file. | 533 // Create my_file. |
534 FilePtr file1; | 534 FilePtr file1; |
535 error = ERROR_INTERNAL; | 535 error = ERROR_INTERNAL; |
536 directory->OpenFile("my_file", GetProxy(&file1), | 536 directory->OpenFile("my_file", GetProxy(&file1), |
537 kOpenFlagRead | kOpenFlagWrite | kOpenFlagCreate, | 537 kOpenFlagRead | kOpenFlagWrite | kOpenFlagCreate, |
538 Capture(&error)); | 538 Capture(&error)); |
539 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 539 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
540 EXPECT_EQ(ERROR_OK, error); | 540 EXPECT_EQ(ERROR_OK, error); |
541 | 541 |
542 // Write to it. | 542 // Write to it. |
543 std::vector<uint8_t> bytes_to_write; | 543 std::vector<uint8_t> bytes_to_write; |
544 bytes_to_write.push_back(static_cast<uint8_t>('h')); | 544 bytes_to_write.push_back(static_cast<uint8_t>('h')); |
545 bytes_to_write.push_back(static_cast<uint8_t>('e')); | 545 bytes_to_write.push_back(static_cast<uint8_t>('e')); |
546 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 546 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
547 bytes_to_write.push_back(static_cast<uint8_t>('l')); | 547 bytes_to_write.push_back(static_cast<uint8_t>('l')); |
548 bytes_to_write.push_back(static_cast<uint8_t>('o')); | 548 bytes_to_write.push_back(static_cast<uint8_t>('o')); |
549 error = ERROR_INTERNAL; | 549 error = ERROR_INTERNAL; |
550 uint32_t num_bytes_written = 0; | 550 uint32_t num_bytes_written = 0; |
551 file1->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 551 file1->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
552 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 552 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
553 ASSERT_TRUE(file1.WaitForIncomingResponse()); | 553 ASSERT_TRUE(file1.WaitForIncomingMethodCall()); |
554 EXPECT_EQ(ERROR_OK, error); | 554 EXPECT_EQ(ERROR_OK, error); |
555 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); | 555 EXPECT_EQ(bytes_to_write.size(), num_bytes_written); |
556 const int end_hello_pos = static_cast<int>(num_bytes_written); | 556 const int end_hello_pos = static_cast<int>(num_bytes_written); |
557 | 557 |
558 // Dup it. | 558 // Dup it. |
559 FilePtr file2; | 559 FilePtr file2; |
560 error = ERROR_INTERNAL; | 560 error = ERROR_INTERNAL; |
561 file1->Dup(GetProxy(&file2), Capture(&error)); | 561 file1->Dup(GetProxy(&file2), Capture(&error)); |
562 ASSERT_TRUE(file1.WaitForIncomingResponse()); | 562 ASSERT_TRUE(file1.WaitForIncomingMethodCall()); |
563 EXPECT_EQ(ERROR_OK, error); | 563 EXPECT_EQ(ERROR_OK, error); |
564 | 564 |
565 // |file2| should have the same position. | 565 // |file2| should have the same position. |
566 error = ERROR_INTERNAL; | 566 error = ERROR_INTERNAL; |
567 int64_t position = -1; | 567 int64_t position = -1; |
568 file2->Tell(Capture(&error, &position)); | 568 file2->Tell(Capture(&error, &position)); |
569 ASSERT_TRUE(file2.WaitForIncomingResponse()); | 569 ASSERT_TRUE(file2.WaitForIncomingMethodCall()); |
570 EXPECT_EQ(ERROR_OK, error); | 570 EXPECT_EQ(ERROR_OK, error); |
571 EXPECT_EQ(end_hello_pos, position); | 571 EXPECT_EQ(end_hello_pos, position); |
572 | 572 |
573 // Write using |file2|. | 573 // Write using |file2|. |
574 std::vector<uint8_t> more_bytes_to_write; | 574 std::vector<uint8_t> more_bytes_to_write; |
575 more_bytes_to_write.push_back(static_cast<uint8_t>('w')); | 575 more_bytes_to_write.push_back(static_cast<uint8_t>('w')); |
576 more_bytes_to_write.push_back(static_cast<uint8_t>('o')); | 576 more_bytes_to_write.push_back(static_cast<uint8_t>('o')); |
577 more_bytes_to_write.push_back(static_cast<uint8_t>('r')); | 577 more_bytes_to_write.push_back(static_cast<uint8_t>('r')); |
578 more_bytes_to_write.push_back(static_cast<uint8_t>('l')); | 578 more_bytes_to_write.push_back(static_cast<uint8_t>('l')); |
579 more_bytes_to_write.push_back(static_cast<uint8_t>('d')); | 579 more_bytes_to_write.push_back(static_cast<uint8_t>('d')); |
580 error = ERROR_INTERNAL; | 580 error = ERROR_INTERNAL; |
581 num_bytes_written = 0; | 581 num_bytes_written = 0; |
582 file2->Write(mojo::Array<uint8_t>::From(more_bytes_to_write), 0, | 582 file2->Write(mojo::Array<uint8_t>::From(more_bytes_to_write), 0, |
583 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 583 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
584 ASSERT_TRUE(file2.WaitForIncomingResponse()); | 584 ASSERT_TRUE(file2.WaitForIncomingMethodCall()); |
585 EXPECT_EQ(ERROR_OK, error); | 585 EXPECT_EQ(ERROR_OK, error); |
586 EXPECT_EQ(more_bytes_to_write.size(), num_bytes_written); | 586 EXPECT_EQ(more_bytes_to_write.size(), num_bytes_written); |
587 const int end_world_pos = end_hello_pos + static_cast<int>(num_bytes_written); | 587 const int end_world_pos = end_hello_pos + static_cast<int>(num_bytes_written); |
588 | 588 |
589 // |file1| should have the same position. | 589 // |file1| should have the same position. |
590 error = ERROR_INTERNAL; | 590 error = ERROR_INTERNAL; |
591 position = -1; | 591 position = -1; |
592 file1->Tell(Capture(&error, &position)); | 592 file1->Tell(Capture(&error, &position)); |
593 ASSERT_TRUE(file1.WaitForIncomingResponse()); | 593 ASSERT_TRUE(file1.WaitForIncomingMethodCall()); |
594 EXPECT_EQ(ERROR_OK, error); | 594 EXPECT_EQ(ERROR_OK, error); |
595 EXPECT_EQ(end_world_pos, position); | 595 EXPECT_EQ(end_world_pos, position); |
596 | 596 |
597 // Close |file1|. | 597 // Close |file1|. |
598 error = ERROR_INTERNAL; | 598 error = ERROR_INTERNAL; |
599 file1->Close(Capture(&error)); | 599 file1->Close(Capture(&error)); |
600 ASSERT_TRUE(file1.WaitForIncomingResponse()); | 600 ASSERT_TRUE(file1.WaitForIncomingMethodCall()); |
601 EXPECT_EQ(ERROR_OK, error); | 601 EXPECT_EQ(ERROR_OK, error); |
602 | 602 |
603 // Read everything using |file2|. | 603 // Read everything using |file2|. |
604 mojo::Array<uint8_t> bytes_read; | 604 mojo::Array<uint8_t> bytes_read; |
605 error = ERROR_INTERNAL; | 605 error = ERROR_INTERNAL; |
606 file2->Read(1000, 0, WHENCE_FROM_START, Capture(&error, &bytes_read)); | 606 file2->Read(1000, 0, WHENCE_FROM_START, Capture(&error, &bytes_read)); |
607 ASSERT_TRUE(file2.WaitForIncomingResponse()); | 607 ASSERT_TRUE(file2.WaitForIncomingMethodCall()); |
608 EXPECT_EQ(ERROR_OK, error); | 608 EXPECT_EQ(ERROR_OK, error); |
609 ASSERT_EQ(static_cast<size_t>(end_world_pos), bytes_read.size()); | 609 ASSERT_EQ(static_cast<size_t>(end_world_pos), bytes_read.size()); |
610 // Just check the first and last bytes. | 610 // Just check the first and last bytes. |
611 EXPECT_EQ(static_cast<uint8_t>('h'), bytes_read[0]); | 611 EXPECT_EQ(static_cast<uint8_t>('h'), bytes_read[0]); |
612 EXPECT_EQ(static_cast<uint8_t>('d'), bytes_read[end_world_pos - 1]); | 612 EXPECT_EQ(static_cast<uint8_t>('d'), bytes_read[end_world_pos - 1]); |
613 | 613 |
614 // TODO(vtl): Test that |file2| has the same open options as |file1|. | 614 // TODO(vtl): Test that |file2| has the same open options as |file1|. |
615 } | 615 } |
616 | 616 |
617 TEST_F(FileImplTest, Truncate) { | 617 TEST_F(FileImplTest, Truncate) { |
618 const uint32_t kInitialSize = 1000; | 618 const uint32_t kInitialSize = 1000; |
619 const uint32_t kTruncatedSize = 654; | 619 const uint32_t kTruncatedSize = 654; |
620 | 620 |
621 DirectoryPtr directory; | 621 DirectoryPtr directory; |
622 GetTemporaryRoot(&directory); | 622 GetTemporaryRoot(&directory); |
623 Error error; | 623 Error error; |
624 | 624 |
625 // Create my_file. | 625 // Create my_file. |
626 FilePtr file; | 626 FilePtr file; |
627 error = ERROR_INTERNAL; | 627 error = ERROR_INTERNAL; |
628 directory->OpenFile("my_file", GetProxy(&file), | 628 directory->OpenFile("my_file", GetProxy(&file), |
629 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); | 629 kOpenFlagWrite | kOpenFlagCreate, Capture(&error)); |
630 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 630 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
631 EXPECT_EQ(ERROR_OK, error); | 631 EXPECT_EQ(ERROR_OK, error); |
632 | 632 |
633 // Write to it. | 633 // Write to it. |
634 std::vector<uint8_t> bytes_to_write(kInitialSize, '!'); | 634 std::vector<uint8_t> bytes_to_write(kInitialSize, '!'); |
635 error = ERROR_INTERNAL; | 635 error = ERROR_INTERNAL; |
636 uint32_t num_bytes_written = 0; | 636 uint32_t num_bytes_written = 0; |
637 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, | 637 file->Write(mojo::Array<uint8_t>::From(bytes_to_write), 0, |
638 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); | 638 WHENCE_FROM_CURRENT, Capture(&error, &num_bytes_written)); |
639 ASSERT_TRUE(file.WaitForIncomingResponse()); | 639 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
640 EXPECT_EQ(ERROR_OK, error); | 640 EXPECT_EQ(ERROR_OK, error); |
641 EXPECT_EQ(kInitialSize, num_bytes_written); | 641 EXPECT_EQ(kInitialSize, num_bytes_written); |
642 | 642 |
643 // Stat it. | 643 // Stat it. |
644 error = ERROR_INTERNAL; | 644 error = ERROR_INTERNAL; |
645 FileInformationPtr file_info; | 645 FileInformationPtr file_info; |
646 file->Stat(Capture(&error, &file_info)); | 646 file->Stat(Capture(&error, &file_info)); |
647 ASSERT_TRUE(file.WaitForIncomingResponse()); | 647 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
648 EXPECT_EQ(ERROR_OK, error); | 648 EXPECT_EQ(ERROR_OK, error); |
649 ASSERT_FALSE(file_info.is_null()); | 649 ASSERT_FALSE(file_info.is_null()); |
650 EXPECT_EQ(kInitialSize, file_info->size); | 650 EXPECT_EQ(kInitialSize, file_info->size); |
651 | 651 |
652 // Truncate it. | 652 // Truncate it. |
653 error = ERROR_INTERNAL; | 653 error = ERROR_INTERNAL; |
654 file->Truncate(kTruncatedSize, Capture(&error)); | 654 file->Truncate(kTruncatedSize, Capture(&error)); |
655 ASSERT_TRUE(file.WaitForIncomingResponse()); | 655 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
656 EXPECT_EQ(ERROR_OK, error); | 656 EXPECT_EQ(ERROR_OK, error); |
657 | 657 |
658 // Stat again. | 658 // Stat again. |
659 error = ERROR_INTERNAL; | 659 error = ERROR_INTERNAL; |
660 file_info.reset(); | 660 file_info.reset(); |
661 file->Stat(Capture(&error, &file_info)); | 661 file->Stat(Capture(&error, &file_info)); |
662 ASSERT_TRUE(file.WaitForIncomingResponse()); | 662 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
663 EXPECT_EQ(ERROR_OK, error); | 663 EXPECT_EQ(ERROR_OK, error); |
664 ASSERT_FALSE(file_info.is_null()); | 664 ASSERT_FALSE(file_info.is_null()); |
665 EXPECT_EQ(kTruncatedSize, file_info->size); | 665 EXPECT_EQ(kTruncatedSize, file_info->size); |
666 } | 666 } |
667 | 667 |
668 TEST_F(FileImplTest, Ioctl) { | 668 TEST_F(FileImplTest, Ioctl) { |
669 DirectoryPtr directory; | 669 DirectoryPtr directory; |
670 GetTemporaryRoot(&directory); | 670 GetTemporaryRoot(&directory); |
671 Error error; | 671 Error error; |
672 | 672 |
673 // Create my_file. | 673 // Create my_file. |
674 FilePtr file; | 674 FilePtr file; |
675 error = ERROR_INTERNAL; | 675 error = ERROR_INTERNAL; |
676 directory->OpenFile("my_file", GetProxy(&file), | 676 directory->OpenFile("my_file", GetProxy(&file), |
677 kOpenFlagRead | kOpenFlagWrite | kOpenFlagCreate, | 677 kOpenFlagRead | kOpenFlagWrite | kOpenFlagCreate, |
678 Capture(&error)); | 678 Capture(&error)); |
679 ASSERT_TRUE(directory.WaitForIncomingResponse()); | 679 ASSERT_TRUE(directory.WaitForIncomingMethodCall()); |
680 EXPECT_EQ(ERROR_OK, error); | 680 EXPECT_EQ(ERROR_OK, error); |
681 | 681 |
682 // Normal files don't support any ioctls. | 682 // Normal files don't support any ioctls. |
683 mojo::Array<uint32_t> out_values; | 683 mojo::Array<uint32_t> out_values; |
684 file->Ioctl(0, mojo::Array<uint32_t>(), Capture(&error, &out_values)); | 684 file->Ioctl(0, mojo::Array<uint32_t>(), Capture(&error, &out_values)); |
685 ASSERT_TRUE(file.WaitForIncomingResponse()); | 685 ASSERT_TRUE(file.WaitForIncomingMethodCall()); |
686 EXPECT_EQ(ERROR_UNAVAILABLE, error); | 686 EXPECT_EQ(ERROR_UNAVAILABLE, error); |
687 EXPECT_TRUE(out_values.is_null()); | 687 EXPECT_TRUE(out_values.is_null()); |
688 } | 688 } |
689 | 689 |
690 } // namespace | 690 } // namespace |
691 } // namespace filesystem | 691 } // namespace filesystem |
OLD | NEW |