OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 <errno.h> | 5 #include <errno.h> |
6 #include <fcntl.h> | 6 #include <fcntl.h> |
7 #include <string.h> | 7 #include <string.h> |
8 #include <sys/stat.h> | 8 #include <sys/stat.h> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 namespace { | 22 namespace { |
23 | 23 |
24 class MemFsForTesting : public MemFs { | 24 class MemFsForTesting : public MemFs { |
25 public: | 25 public: |
26 MemFsForTesting() { | 26 MemFsForTesting() { |
27 FsInitArgs args(1); | 27 FsInitArgs args(1); |
28 EXPECT_EQ(0, Init(args)); | 28 EXPECT_EQ(0, Init(args)); |
29 } | 29 } |
30 | 30 |
| 31 bool Exists(const char* filename) { |
| 32 ScopedNode node; |
| 33 if (Open(Path(filename), O_RDONLY, &node)) |
| 34 return false; |
| 35 |
| 36 struct stat buf; |
| 37 return node->GetStat(&buf) == 0; |
| 38 } |
| 39 |
31 int num_nodes() { return (int)inode_pool_.size(); } | 40 int num_nodes() { return (int)inode_pool_.size(); } |
32 }; | 41 }; |
33 | 42 |
34 } // namespace | 43 } // namespace |
35 | 44 |
36 TEST(FilesystemTest, Sanity) { | 45 TEST(FilesystemTest, Sanity) { |
37 MemFsForTesting fs; | 46 MemFsForTesting fs; |
38 | 47 |
39 ScopedNode file; | 48 ScopedNode file; |
40 ScopedNode root; | 49 ScopedNode root; |
41 ScopedNode result_node; | 50 ScopedNode result_node; |
42 | 51 |
43 off_t result_size = 0; | 52 off_t result_size = 0; |
44 int result_bytes = 0; | 53 int result_bytes = 0; |
| 54 struct stat buf; |
45 char buf1[1024]; | 55 char buf1[1024]; |
46 | 56 |
47 // A memory filesystem starts with one directory node: the root. | 57 // A memory filesystem starts with one directory node: the root. |
48 EXPECT_EQ(1, fs.num_nodes()); | 58 EXPECT_EQ(1, fs.num_nodes()); |
49 | 59 |
50 // Fail to open non existent file | 60 // Fail to open non existent file |
51 EXPECT_EQ(ENOENT, fs.Access(Path("/foo"), R_OK | W_OK)); | |
52 EXPECT_EQ(ENOENT, fs.Open(Path("/foo"), O_RDWR, &result_node)); | 61 EXPECT_EQ(ENOENT, fs.Open(Path("/foo"), O_RDWR, &result_node)); |
53 EXPECT_EQ(NULL, result_node.get()); | 62 EXPECT_EQ(NULL, result_node.get()); |
54 EXPECT_EQ(1, fs.num_nodes()); | 63 EXPECT_EQ(1, fs.num_nodes()); |
55 | 64 |
56 // Create a file | 65 // Create a file |
57 EXPECT_EQ(0, fs.Open(Path("/foo"), O_RDWR | O_CREAT, &file)); | 66 EXPECT_EQ(0, fs.Open(Path("/foo"), O_RDWR | O_CREAT, &file)); |
58 ASSERT_NE(NULL_NODE, file.get()); | 67 ASSERT_NE(NULL_NODE, file.get()); |
59 | 68 |
60 // We now have a directory and a file. The file has a two references | 69 // We now have a directory and a file. The file has a two references |
61 // one returned to the test, one for the name->inode map. | 70 // one returned to the test, one for the name->inode map. |
62 EXPECT_EQ(2, fs.num_nodes()); | 71 ASSERT_EQ(2, fs.num_nodes()); |
63 EXPECT_EQ(2, file->RefCount()); | 72 ASSERT_EQ(2, file->RefCount()); |
64 EXPECT_EQ(0, fs.Access(Path("/foo"), R_OK | W_OK)); | 73 ASSERT_EQ(0, file->GetStat(&buf)); |
65 EXPECT_EQ(EACCES, fs.Access(Path("/foo"), X_OK)); | 74 ASSERT_EQ(0, buf.st_mode & S_IXUSR); |
66 | 75 |
67 // All access should be allowed on the root directory. | 76 // All access should be allowed on the root directory. |
68 EXPECT_EQ(0, fs.Access(Path("/"), R_OK | W_OK | X_OK)); | 77 EXPECT_EQ(0, fs.Open(Path("/"), O_RDONLY, &root)); |
69 // Open the root directory for write should fail. | 78 ASSERT_EQ(0, root->GetStat(&buf)); |
| 79 ASSERT_EQ(S_IRWXU, buf.st_mode & S_IRWXU); |
| 80 // Opening a directory for write should fail. |
70 EXPECT_EQ(EISDIR, fs.Open(Path("/"), O_RDWR, &root)); | 81 EXPECT_EQ(EISDIR, fs.Open(Path("/"), O_RDWR, &root)); |
71 EXPECT_EQ(2, fs.num_nodes()); | 82 EXPECT_EQ(2, fs.num_nodes()); |
72 | 83 |
73 // Open the root directory, should not create a new file | 84 // Open the root directory, should not create a new file |
74 EXPECT_EQ(0, fs.Open(Path("/"), O_RDONLY, &root)); | 85 EXPECT_EQ(0, fs.Open(Path("/"), O_RDONLY, &root)); |
75 EXPECT_EQ(2, fs.num_nodes()); | 86 EXPECT_EQ(2, fs.num_nodes()); |
76 ASSERT_NE(NULL_NODE, root.get()); | 87 ASSERT_NE(NULL_NODE, root.get()); |
77 struct dirent dirs[4]; | 88 struct dirent dirs[4]; |
78 int len; | 89 int len; |
79 EXPECT_EQ(0, root->GetDents(0, dirs, sizeof(dirs), &len)); | 90 EXPECT_EQ(0, root->GetDents(0, dirs, sizeof(dirs), &len)); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 161 |
151 // Deref the file, to make it go away | 162 // Deref the file, to make it go away |
152 file.reset(); | 163 file.reset(); |
153 EXPECT_EQ(2, fs.num_nodes()); | 164 EXPECT_EQ(2, fs.num_nodes()); |
154 | 165 |
155 // Deref the directory | 166 // Deref the directory |
156 EXPECT_EQ(0, fs.Rmdir(Path("/foo"))); | 167 EXPECT_EQ(0, fs.Rmdir(Path("/foo"))); |
157 EXPECT_EQ(1, fs.num_nodes()); | 168 EXPECT_EQ(1, fs.num_nodes()); |
158 | 169 |
159 // Verify the directory is gone | 170 // Verify the directory is gone |
160 EXPECT_EQ(ENOENT, fs.Access(Path("/foo"), F_OK)); | 171 EXPECT_EQ(ENOENT, fs.Open(Path("/foo"), O_RDONLY, &file)); |
161 EXPECT_EQ(ENOENT, fs.Open(Path("/foo"), O_RDWR, &file)); | |
162 EXPECT_EQ(NULL_NODE, file.get()); | 172 EXPECT_EQ(NULL_NODE, file.get()); |
163 } | 173 } |
164 | 174 |
165 TEST(FilesystemTest, OpenMode_TRUNC) { | 175 TEST(FilesystemTest, OpenMode_TRUNC) { |
166 MemFsForTesting fs; | 176 MemFsForTesting fs; |
167 ScopedNode file; | 177 ScopedNode file; |
168 ScopedNode root; | 178 ScopedNode root; |
169 ScopedNode result_node; | 179 ScopedNode result_node; |
170 HandleAttr attrs; | 180 HandleAttr attrs; |
171 int result_bytes; | 181 int result_bytes; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 } | 216 } |
207 | 217 |
208 TEST(FilesystemTest, MemFsRename) { | 218 TEST(FilesystemTest, MemFsRename) { |
209 MemFsForTesting fs; | 219 MemFsForTesting fs; |
210 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); | 220 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); |
211 ASSERT_EQ(0, fs.Mkdir(Path("/dir2"), O_RDWR)); | 221 ASSERT_EQ(0, fs.Mkdir(Path("/dir2"), O_RDWR)); |
212 ASSERT_EQ(3, fs.num_nodes()); | 222 ASSERT_EQ(3, fs.num_nodes()); |
213 | 223 |
214 ScopedNode file; | 224 ScopedNode file; |
215 ASSERT_EQ(0, fs.Open(Path("/dir1/file"), O_RDWR | O_CREAT | O_EXCL, &file)); | 225 ASSERT_EQ(0, fs.Open(Path("/dir1/file"), O_RDWR | O_CREAT | O_EXCL, &file)); |
216 ASSERT_EQ(0, fs.Access(Path("/dir1/file"), R_OK)); | 226 ASSERT_TRUE(fs.Exists("/dir1/file")); |
217 ASSERT_EQ(4, fs.num_nodes()); | 227 ASSERT_EQ(4, fs.num_nodes()); |
218 | 228 |
219 // Move from one directory to another should ok | 229 // Move from one directory to another should ok |
220 ASSERT_EQ(0, fs.Rename(Path("/dir1/file"), Path("/dir2/new_file"))); | 230 ASSERT_EQ(0, fs.Rename(Path("/dir1/file"), Path("/dir2/new_file"))); |
221 ASSERT_NE(0, fs.Access(Path("/dir1/file"), R_OK)); | 231 ASSERT_FALSE(fs.Exists("/dir1/file")); |
222 ASSERT_EQ(0, fs.Access(Path("/dir2/new_file"), R_OK)); | 232 ASSERT_TRUE(fs.Exists("/dir2/new_file")); |
223 ASSERT_EQ(4, fs.num_nodes()); | 233 ASSERT_EQ(4, fs.num_nodes()); |
224 | 234 |
225 // Move within the same directory | 235 // Move within the same directory |
226 ASSERT_EQ(0, fs.Rename(Path("/dir2/new_file"), Path("/dir2/new_file2"))); | 236 ASSERT_EQ(0, fs.Rename(Path("/dir2/new_file"), Path("/dir2/new_file2"))); |
227 ASSERT_NE(0, fs.Access(Path("/dir2/new_file"), R_OK)); | 237 ASSERT_FALSE(fs.Exists("/dir2/new_file")); |
228 ASSERT_EQ(0, fs.Access(Path("/dir2/new_file2"), R_OK)); | 238 ASSERT_TRUE(fs.Exists("/dir2/new_file2")); |
229 ASSERT_EQ(4, fs.num_nodes()); | 239 ASSERT_EQ(4, fs.num_nodes()); |
230 | 240 |
231 // Move to another directory but without a filename | 241 // Move to another directory but without a filename |
232 ASSERT_EQ(0, fs.Rename(Path("/dir2/new_file2"), Path("/dir1"))); | 242 ASSERT_EQ(0, fs.Rename(Path("/dir2/new_file2"), Path("/dir1"))); |
233 ASSERT_NE(0, fs.Access(Path("/dir2/new_file2"), R_OK)); | 243 ASSERT_FALSE(fs.Exists("/dir2/new_file2")); |
234 ASSERT_EQ(0, fs.Access(Path("/dir1/new_file2"), R_OK)); | 244 ASSERT_TRUE(fs.Exists("/dir1/new_file2")); |
235 ASSERT_EQ(4, fs.num_nodes()); | 245 ASSERT_EQ(4, fs.num_nodes()); |
236 } | 246 } |
237 | 247 |
238 TEST(FilesystemTest, MemFsRenameDir) { | 248 TEST(FilesystemTest, MemFsRenameDir) { |
239 MemFsForTesting fs; | 249 MemFsForTesting fs; |
240 | 250 |
241 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); | 251 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); |
242 ASSERT_EQ(0, fs.Mkdir(Path("/dir2"), O_RDWR)); | 252 ASSERT_EQ(0, fs.Mkdir(Path("/dir2"), O_RDWR)); |
243 EXPECT_EQ(3, fs.num_nodes()); | 253 EXPECT_EQ(3, fs.num_nodes()); |
244 | 254 |
245 // Renaming one directory to another should work | 255 // Renaming one directory to another should work |
246 ASSERT_EQ(0, fs.Rename(Path("/dir1"), Path("/dir2"))); | 256 ASSERT_EQ(0, fs.Rename(Path("/dir1"), Path("/dir2"))); |
247 ASSERT_NE(0, fs.Access(Path("/dir1"), R_OK)); | 257 ASSERT_FALSE(fs.Exists("/dir1")); |
248 ASSERT_EQ(0, fs.Access(Path("/dir2"), R_OK)); | 258 ASSERT_TRUE(fs.Exists("/dir2")); |
249 EXPECT_EQ(2, fs.num_nodes()); | 259 EXPECT_EQ(2, fs.num_nodes()); |
250 | 260 |
251 // Reset to initial state | 261 // Reset to initial state |
252 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); | 262 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); |
253 EXPECT_EQ(3, fs.num_nodes()); | 263 EXPECT_EQ(3, fs.num_nodes()); |
254 | 264 |
255 // Renaming a directory to a new name within another | 265 // Renaming a directory to a new name within another |
256 ASSERT_EQ(0, fs.Rename(Path("/dir1"), Path("/dir2/foo"))); | 266 ASSERT_EQ(0, fs.Rename(Path("/dir1"), Path("/dir2/foo"))); |
257 ASSERT_EQ(0, fs.Access(Path("/dir2"), R_OK)); | 267 ASSERT_TRUE(fs.Exists("/dir2")); |
258 ASSERT_EQ(0, fs.Access(Path("/dir2/foo"), R_OK)); | 268 ASSERT_TRUE(fs.Exists("/dir2/foo")); |
259 EXPECT_EQ(3, fs.num_nodes()); | 269 EXPECT_EQ(3, fs.num_nodes()); |
260 | 270 |
261 // Reset to initial state | 271 // Reset to initial state |
262 ASSERT_EQ(0, fs.Rmdir(Path("/dir2/foo"))); | 272 ASSERT_EQ(0, fs.Rmdir(Path("/dir2/foo"))); |
263 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); | 273 ASSERT_EQ(0, fs.Mkdir(Path("/dir1"), O_RDWR)); |
264 EXPECT_EQ(3, fs.num_nodes()); | 274 EXPECT_EQ(3, fs.num_nodes()); |
265 | 275 |
266 // Renaming one directory to another should fail if the target is non-empty | 276 // Renaming one directory to another should fail if the target is non-empty |
267 ASSERT_EQ(0, fs.Mkdir(Path("/dir2/dir3"), O_RDWR)); | 277 ASSERT_EQ(0, fs.Mkdir(Path("/dir2/dir3"), O_RDWR)); |
268 ASSERT_EQ(ENOTEMPTY, fs.Rename(Path("/dir1"), Path("/dir2"))); | 278 ASSERT_EQ(ENOTEMPTY, fs.Rename(Path("/dir1"), Path("/dir2"))); |
269 } | 279 } |
270 | 280 |
271 TEST(FilesystemTest, DevAccess) { | 281 TEST(FilesystemTest, DevAccess) { |
272 // Should not be able to open non-existent file. | 282 // Should not be able to open non-existent file. |
273 FakePepperInterface pepper; | 283 FakePepperInterface pepper; |
274 DevFsForTesting fs(&pepper); | 284 DevFsForTesting fs(&pepper); |
275 ScopedNode invalid_node, valid_node; | 285 ScopedNode invalid_node, valid_node; |
276 ASSERT_EQ(ENOENT, fs.Access(Path("/foo"), F_OK)); | 286 ASSERT_FALSE(fs.Exists("/foo")); |
277 // Creating non-existent file should return EACCES | 287 // Creating non-existent file should return EACCES |
278 ASSERT_EQ(EACCES, fs.Open(Path("/foo"), O_CREAT | O_RDWR, &invalid_node)); | 288 ASSERT_EQ(EACCES, fs.Open(Path("/foo"), O_CREAT | O_RDWR, &invalid_node)); |
279 | 289 |
280 // We should be able to open all existing nodes with O_CREAT and O_RDWR. | 290 // We should be able to open all existing nodes with O_CREAT and O_RDWR. |
281 ASSERT_EQ(0, fs.Open(Path("/null"), O_CREAT | O_RDWR, &valid_node)); | 291 ASSERT_EQ(0, fs.Open(Path("/null"), O_CREAT | O_RDWR, &valid_node)); |
282 ASSERT_EQ(0, fs.Open(Path("/zero"), O_CREAT | O_RDWR, &valid_node)); | 292 ASSERT_EQ(0, fs.Open(Path("/zero"), O_CREAT | O_RDWR, &valid_node)); |
283 ASSERT_EQ(0, fs.Open(Path("/urandom"), O_CREAT | O_RDWR, &valid_node)); | 293 ASSERT_EQ(0, fs.Open(Path("/urandom"), O_CREAT | O_RDWR, &valid_node)); |
284 ASSERT_EQ(0, fs.Open(Path("/console0"), O_CREAT | O_RDWR, &valid_node)); | 294 ASSERT_EQ(0, fs.Open(Path("/console0"), O_CREAT | O_RDWR, &valid_node)); |
285 ASSERT_EQ(0, fs.Open(Path("/console1"), O_CREAT | O_RDWR, &valid_node)); | 295 ASSERT_EQ(0, fs.Open(Path("/console1"), O_CREAT | O_RDWR, &valid_node)); |
286 ASSERT_EQ(0, fs.Open(Path("/console3"), O_CREAT | O_RDWR, &valid_node)); | 296 ASSERT_EQ(0, fs.Open(Path("/console3"), O_CREAT | O_RDWR, &valid_node)); |
287 ASSERT_EQ(0, fs.Open(Path("/tty"), O_CREAT | O_RDWR, &valid_node)); | 297 ASSERT_EQ(0, fs.Open(Path("/tty"), O_CREAT | O_RDWR, &valid_node)); |
288 ASSERT_EQ(0, fs.Open(Path("/stdin"), O_CREAT | O_RDWR, &valid_node)); | 298 ASSERT_EQ(0, fs.Open(Path("/stdin"), O_CREAT | O_RDWR, &valid_node)); |
289 ASSERT_EQ(0, fs.Open(Path("/stdout"), O_CREAT | O_RDWR, &valid_node)); | 299 ASSERT_EQ(0, fs.Open(Path("/stdout"), O_CREAT | O_RDWR, &valid_node)); |
290 ASSERT_EQ(0, fs.Open(Path("/stderr"), O_CREAT | O_RDWR, &valid_node)); | 300 ASSERT_EQ(0, fs.Open(Path("/stderr"), O_CREAT | O_RDWR, &valid_node)); |
291 } | 301 } |
292 | 302 |
293 TEST(FilesystemTest, DevNull) { | 303 TEST(FilesystemTest, DevNull) { |
294 FakePepperInterface pepper; | 304 FakePepperInterface pepper; |
295 DevFsForTesting fs(&pepper); | 305 DevFsForTesting fs(&pepper); |
296 ScopedNode dev_null; | 306 ScopedNode dev_null; |
297 int result_bytes = 0; | 307 int result_bytes = 0; |
| 308 struct stat buf; |
298 | 309 |
299 ASSERT_EQ(0, fs.Access(Path("/null"), R_OK | W_OK)); | |
300 ASSERT_EQ(EACCES, fs.Access(Path("/null"), X_OK)); | |
301 ASSERT_EQ(0, fs.Open(Path("/null"), O_RDWR, &dev_null)); | 310 ASSERT_EQ(0, fs.Open(Path("/null"), O_RDWR, &dev_null)); |
302 ASSERT_NE(NULL_NODE, dev_null.get()); | 311 ASSERT_NE(NULL_NODE, dev_null.get()); |
| 312 ASSERT_EQ(0, dev_null->GetStat(&buf)); |
| 313 ASSERT_EQ(S_IRUSR | S_IWUSR, buf.st_mode & S_IRWXU); |
303 | 314 |
304 // Writing to /dev/null should write everything. | 315 // Writing to /dev/null should write everything. |
305 const char msg[] = "Dummy test message."; | 316 const char msg[] = "Dummy test message."; |
306 HandleAttr attrs; | 317 HandleAttr attrs; |
307 EXPECT_EQ(0, dev_null->Write(attrs, &msg[0], strlen(msg), &result_bytes)); | 318 EXPECT_EQ(0, dev_null->Write(attrs, &msg[0], strlen(msg), &result_bytes)); |
308 EXPECT_EQ(strlen(msg), result_bytes); | 319 EXPECT_EQ(strlen(msg), result_bytes); |
309 | 320 |
310 // Reading from /dev/null should read nothing. | 321 // Reading from /dev/null should read nothing. |
311 const int kBufferLength = 100; | 322 const int kBufferLength = 100; |
312 char buffer[kBufferLength]; | 323 char buffer[kBufferLength]; |
313 EXPECT_EQ(0, dev_null->Read(attrs, &buffer[0], kBufferLength, &result_bytes)); | 324 EXPECT_EQ(0, dev_null->Read(attrs, &buffer[0], kBufferLength, &result_bytes)); |
314 EXPECT_EQ(0, result_bytes); | 325 EXPECT_EQ(0, result_bytes); |
315 } | 326 } |
316 | 327 |
317 TEST(FilesystemTest, DevZero) { | 328 TEST(FilesystemTest, DevZero) { |
318 FakePepperInterface pepper; | 329 FakePepperInterface pepper; |
319 DevFsForTesting fs(&pepper); | 330 DevFsForTesting fs(&pepper); |
320 ScopedNode dev_zero; | 331 ScopedNode dev_zero; |
321 int result_bytes = 0; | 332 int result_bytes = 0; |
| 333 struct stat buf; |
322 | 334 |
323 ASSERT_EQ(0, fs.Access(Path("/zero"), R_OK | W_OK)); | |
324 ASSERT_EQ(EACCES, fs.Access(Path("/zero"), X_OK)); | |
325 ASSERT_EQ(0, fs.Open(Path("/zero"), O_RDWR, &dev_zero)); | 335 ASSERT_EQ(0, fs.Open(Path("/zero"), O_RDWR, &dev_zero)); |
326 ASSERT_NE(NULL_NODE, dev_zero.get()); | 336 ASSERT_NE(NULL_NODE, dev_zero.get()); |
| 337 ASSERT_EQ(0, dev_zero->GetStat(&buf)); |
| 338 ASSERT_EQ(S_IRUSR | S_IWUSR, buf.st_mode & S_IRWXU); |
327 | 339 |
328 // Writing to /dev/zero should write everything. | 340 // Writing to /dev/zero should write everything. |
329 HandleAttr attrs; | 341 HandleAttr attrs; |
330 const char msg[] = "Dummy test message."; | 342 const char msg[] = "Dummy test message."; |
331 EXPECT_EQ(0, dev_zero->Write(attrs, &msg[0], strlen(msg), &result_bytes)); | 343 EXPECT_EQ(0, dev_zero->Write(attrs, &msg[0], strlen(msg), &result_bytes)); |
332 EXPECT_EQ(strlen(msg), result_bytes); | 344 EXPECT_EQ(strlen(msg), result_bytes); |
333 | 345 |
334 // Reading from /dev/zero should read all zeroes. | 346 // Reading from /dev/zero should read all zeroes. |
335 const int kBufferLength = 100; | 347 const int kBufferLength = 100; |
336 char buffer[kBufferLength]; | 348 char buffer[kBufferLength]; |
337 // First fill with all 1s. | 349 // First fill with all 1s. |
338 memset(&buffer[0], 0x1, kBufferLength); | 350 memset(&buffer[0], 0x1, kBufferLength); |
339 EXPECT_EQ(0, dev_zero->Read(attrs, &buffer[0], kBufferLength, &result_bytes)); | 351 EXPECT_EQ(0, dev_zero->Read(attrs, &buffer[0], kBufferLength, &result_bytes)); |
340 EXPECT_EQ(kBufferLength, result_bytes); | 352 EXPECT_EQ(kBufferLength, result_bytes); |
341 | 353 |
342 char zero_buffer[kBufferLength]; | 354 char zero_buffer[kBufferLength]; |
343 memset(&zero_buffer[0], 0, kBufferLength); | 355 memset(&zero_buffer[0], 0, kBufferLength); |
344 EXPECT_EQ(0, memcmp(&buffer[0], &zero_buffer[0], kBufferLength)); | 356 EXPECT_EQ(0, memcmp(&buffer[0], &zero_buffer[0], kBufferLength)); |
345 } | 357 } |
346 | 358 |
347 // Disabled due to intermittent failures on linux: http://crbug.com/257257 | 359 // Disabled due to intermittent failures on linux: http://crbug.com/257257 |
348 TEST(FilesystemTest, DISABLED_DevUrandom) { | 360 TEST(FilesystemTest, DISABLED_DevUrandom) { |
349 FakePepperInterface pepper; | 361 FakePepperInterface pepper; |
350 DevFsForTesting fs(&pepper); | 362 DevFsForTesting fs(&pepper); |
351 ScopedNode dev_urandom; | 363 ScopedNode dev_urandom; |
352 int result_bytes = 0; | 364 int result_bytes = 0; |
| 365 struct stat buf; |
353 | 366 |
354 ASSERT_EQ(0, fs.Access(Path("/urandom"), R_OK | W_OK)); | |
355 ASSERT_EQ(EACCES, fs.Access(Path("/urandom"), X_OK)); | |
356 ASSERT_EQ(0, fs.Open(Path("/urandom"), O_RDWR, &dev_urandom)); | 367 ASSERT_EQ(0, fs.Open(Path("/urandom"), O_RDWR, &dev_urandom)); |
357 ASSERT_NE(NULL_NODE, dev_urandom.get()); | 368 ASSERT_NE(NULL_NODE, dev_urandom.get()); |
| 369 ASSERT_EQ(0, dev_urandom->GetStat(&buf)); |
| 370 ASSERT_EQ(S_IRUSR | S_IWUSR, buf.st_mode & S_IRWXU); |
358 | 371 |
359 // Writing to /dev/urandom should write everything. | 372 // Writing to /dev/urandom should write everything. |
360 const char msg[] = "Dummy test message."; | 373 const char msg[] = "Dummy test message."; |
361 HandleAttr attrs; | 374 HandleAttr attrs; |
362 EXPECT_EQ(0, dev_urandom->Write(attrs, &msg[0], strlen(msg), &result_bytes)); | 375 EXPECT_EQ(0, dev_urandom->Write(attrs, &msg[0], strlen(msg), &result_bytes)); |
363 EXPECT_EQ(strlen(msg), result_bytes); | 376 EXPECT_EQ(strlen(msg), result_bytes); |
364 | 377 |
365 // Reading from /dev/urandom should read random bytes. | 378 // Reading from /dev/urandom should read random bytes. |
366 const int kSampleBatches = 1000; | 379 const int kSampleBatches = 1000; |
367 const int kSampleBatchSize = 1000; | 380 const int kSampleBatchSize = 1000; |
(...skipping 16 matching lines...) Expand all Loading... |
384 double expected_count = kTotalSamples / 256.; | 397 double expected_count = kTotalSamples / 256.; |
385 double chi_squared = 0; | 398 double chi_squared = 0; |
386 for (int i = 0; i < 256; ++i) { | 399 for (int i = 0; i < 256; ++i) { |
387 double difference = byte_count[i] - expected_count; | 400 double difference = byte_count[i] - expected_count; |
388 chi_squared += difference * difference / expected_count; | 401 chi_squared += difference * difference / expected_count; |
389 } | 402 } |
390 | 403 |
391 // Approximate chi-squared value for p-value 0.05, 255 degrees-of-freedom. | 404 // Approximate chi-squared value for p-value 0.05, 255 degrees-of-freedom. |
392 EXPECT_LE(chi_squared, 293.24); | 405 EXPECT_LE(chi_squared, 293.24); |
393 } | 406 } |
OLD | NEW |