Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(267)

Side by Side Diff: native_client_sdk/src/tests/nacl_io_test/filesystem_test.cc

Issue 547053002: [NaCl SDK] nacl_io: Remove Node::Access method. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@http_fs_root
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698