| 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 |