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

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

Issue 565763002: Plumbing though mode parameter to open, since fusefs can make use of it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixes 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 <fcntl.h> 5 #include <fcntl.h>
6 6
7 #include <gtest/gtest.h> 7 #include <gtest/gtest.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 18 matching lines...) Expand all
29 }; 29 };
30 30
31 // Implementation of a simple flat memory filesystem. 31 // Implementation of a simple flat memory filesystem.
32 struct File { 32 struct File {
33 std::string name; 33 std::string name;
34 std::vector<uint8_t> data; 34 std::vector<uint8_t> data;
35 }; 35 };
36 36
37 typedef std::vector<File> Files; 37 typedef std::vector<File> Files;
38 Files g_files; 38 Files g_files;
39 mode_t last_create_mode = 0666;
39 40
40 bool IsValidPath(const char* path) { 41 bool IsValidPath(const char* path) {
41 if (path == NULL) 42 if (path == NULL)
42 return false; 43 return false;
43 44
44 if (strlen(path) <= 1) 45 if (strlen(path) <= 1)
45 return false; 46 return false;
46 47
47 if (path[0] != '/') 48 if (path[0] != '/')
48 return false; 49 return false;
(...skipping 18 matching lines...) Expand all
67 68
68 if (strcmp(path, "/") == 0) { 69 if (strcmp(path, "/") == 0) {
69 stbuf->st_mode = S_IFDIR | 0755; 70 stbuf->st_mode = S_IFDIR | 0755;
70 return 0; 71 return 0;
71 } 72 }
72 73
73 File* file = FindFile(path); 74 File* file = FindFile(path);
74 if (file == NULL) 75 if (file == NULL)
75 return -ENOENT; 76 return -ENOENT;
76 77
77 stbuf->st_mode = S_IFREG | 0666; 78 stbuf->st_mode = S_IFREG | last_create_mode;
78 stbuf->st_size = file->data.size(); 79 stbuf->st_size = file->data.size();
79 return 0; 80 return 0;
80 } 81 }
81 82
82 int testfs_readdir(const char* path, 83 int testfs_readdir(const char* path,
83 void* buf, 84 void* buf,
84 fuse_fill_dir_t filler, 85 fuse_fill_dir_t filler,
85 off_t offset, 86 off_t offset,
86 struct fuse_file_info*) { 87 struct fuse_file_info*) {
87 if (strcmp(path, "/") != 0) 88 if (strcmp(path, "/") != 0)
88 return -ENOENT; 89 return -ENOENT;
89 90
90 filler(buf, ".", NULL, 0); 91 filler(buf, ".", NULL, 0);
91 filler(buf, "..", NULL, 0); 92 filler(buf, "..", NULL, 0);
92 for (Files::iterator iter = g_files.begin(); iter != g_files.end(); ++iter) { 93 for (Files::iterator iter = g_files.begin(); iter != g_files.end(); ++iter) {
93 filler(buf, iter->name.c_str(), NULL, 0); 94 filler(buf, iter->name.c_str(), NULL, 0);
94 } 95 }
95 return 0; 96 return 0;
96 } 97 }
97 98
98 int testfs_create(const char* path, mode_t, struct fuse_file_info* fi) { 99 int testfs_create(const char* path, mode_t mode, struct fuse_file_info* fi) {
99 if (!IsValidPath(path)) 100 if (!IsValidPath(path))
100 return -ENOENT; 101 return -ENOENT;
101 102
102 File* file = FindFile(path); 103 File* file = FindFile(path);
103 if (file != NULL) { 104 if (file != NULL) {
104 if (fi->flags & O_EXCL) 105 if (fi->flags & O_EXCL)
105 return -EEXIST; 106 return -EEXIST;
106 } else { 107 } else {
107 g_files.push_back(File()); 108 g_files.push_back(File());
108 file = &g_files.back(); 109 file = &g_files.back();
109 file->name = &path[1]; // Skip initial / 110 file->name = &path[1]; // Skip initial /
110 } 111 }
112 last_create_mode = mode;
111 113
112 return 0; 114 return 0;
113 } 115 }
114 116
115 int testfs_open(const char* path, struct fuse_file_info*) { 117 int testfs_open(const char* path, struct fuse_file_info*) {
116 // open is only called to open an existing file, otherwise create is 118 // open is only called to open an existing file, otherwise create is
117 // called. We don't need to do any additional work here, the path will be 119 // called. We don't need to do any additional work here, the path will be
118 // passed to any other operations. 120 // passed to any other operations.
119 return FindFile(path) != NULL; 121 return FindFile(path) != NULL;
120 } 122 }
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 ASSERT_EQ(strlen(hello_world), bytes_read); 227 ASSERT_EQ(strlen(hello_world), bytes_read);
226 ASSERT_STREQ(hello_world, buffer); 228 ASSERT_STREQ(hello_world, buffer);
227 229
228 // Try to read past the end of the file. 230 // Try to read past the end of the file.
229 attr.offs = strlen(hello_world) - 7; 231 attr.offs = strlen(hello_world) - 7;
230 ASSERT_EQ(0, node->Read(attr, &buffer[0], sizeof(buffer), &bytes_read)); 232 ASSERT_EQ(0, node->Read(attr, &buffer[0], sizeof(buffer), &bytes_read));
231 ASSERT_EQ(7, bytes_read); 233 ASSERT_EQ(7, bytes_read);
232 ASSERT_STREQ("World!\n", buffer); 234 ASSERT_STREQ("World!\n", buffer);
233 } 235 }
234 236
237 TEST_F(FuseFsTest, CreateWithMode) {
238 ScopedNode node;
239 struct stat statbuf;
240
241 ASSERT_EQ(0, fs_.OpenWithMode(Path("/hello"),
242 O_RDWR | O_CREAT, 0723, &node));
243 EXPECT_EQ(0, node->GetStat(&statbuf));
244 EXPECT_EQ(S_IFREG, statbuf.st_mode & S_IFMT);
245 EXPECT_EQ(0723, statbuf.st_mode & ~S_IFMT);
246 }
247
235 TEST_F(FuseFsTest, CreateAndWrite) { 248 TEST_F(FuseFsTest, CreateAndWrite) {
236 ScopedNode node; 249 ScopedNode node;
237 ASSERT_EQ(0, fs_.Open(Path("/foobar"), O_RDWR | O_CREAT, &node)); 250 ASSERT_EQ(0, fs_.Open(Path("/foobar"), O_RDWR | O_CREAT, &node));
238 251
239 HandleAttr attr; 252 HandleAttr attr;
240 const char message[] = "Something interesting"; 253 const char message[] = "Something interesting";
241 int bytes_written; 254 int bytes_written;
242 ASSERT_EQ(0, node->Write(attr, &message[0], strlen(message), &bytes_written)); 255 ASSERT_EQ(0, node->Write(attr, &message[0], strlen(message), &bytes_written));
243 ASSERT_EQ(bytes_written, strlen(message)); 256 ASSERT_EQ(bytes_written, strlen(message));
244 257
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 347
335 void KernelProxyFuseTest::TearDown() { 348 void KernelProxyFuseTest::TearDown() {
336 nacl_io_unregister_fs_type("flatfs"); 349 nacl_io_unregister_fs_type("flatfs");
337 ki_uninit(); 350 ki_uninit();
338 } 351 }
339 352
340 } // namespace 353 } // namespace
341 354
342 TEST_F(KernelProxyFuseTest, Basic) { 355 TEST_F(KernelProxyFuseTest, Basic) {
343 // Write a file. 356 // Write a file.
344 int fd = ki_open("/hello", O_WRONLY | O_CREAT); 357 int fd = ki_open("/hello", O_WRONLY | O_CREAT, 0777);
345 ASSERT_GT(fd, -1); 358 ASSERT_GT(fd, -1);
346 ASSERT_EQ(sizeof(hello_world), 359 ASSERT_EQ(sizeof(hello_world),
347 ki_write(fd, hello_world, sizeof(hello_world))); 360 ki_write(fd, hello_world, sizeof(hello_world)));
348 EXPECT_EQ(0, ki_close(fd)); 361 EXPECT_EQ(0, ki_close(fd));
349 362
350 // Then read it back in. 363 // Then read it back in.
351 fd = ki_open("/hello", O_RDONLY); 364 fd = ki_open("/hello", O_RDONLY, 0);
352 ASSERT_GT(fd, -1); 365 ASSERT_GT(fd, -1);
353 366
354 char buffer[30]; 367 char buffer[30];
355 memset(buffer, 0, sizeof(buffer)); 368 memset(buffer, 0, sizeof(buffer));
356 ASSERT_EQ(sizeof(hello_world), ki_read(fd, buffer, sizeof(buffer))); 369 ASSERT_EQ(sizeof(hello_world), ki_read(fd, buffer, sizeof(buffer)));
357 EXPECT_STREQ(hello_world, buffer); 370 EXPECT_STREQ(hello_world, buffer);
358 EXPECT_EQ(0, ki_close(fd)); 371 EXPECT_EQ(0, ki_close(fd));
359 } 372 }
OLDNEW
« no previous file with comments | « native_client_sdk/src/tests/nacl_io_test/event_test.cc ('k') | native_client_sdk/src/tests/nacl_io_test/jspipe_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698