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

Side by Side Diff: native_client_sdk/src/libraries/nacl_io_test/mount_test.cc

Issue 15800004: [NaCl SDK] nacl_io: Added support for access() syscall. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase to HEAD. Created 7 years, 6 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
« no previous file with comments | « native_client_sdk/src/libraries/nacl_io_test/mount_http_test.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 /* Copyright (c) 2012 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 5
6 #include <errno.h> 6 #include <errno.h>
7 #include <fcntl.h> 7 #include <fcntl.h>
8 #include <string.h> 8 #include <string.h>
9 #include <string> 9 #include <string>
10 #include <sys/stat.h> 10 #include <sys/stat.h>
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 MountNode* result_node; 48 MountNode* result_node;
49 size_t result_size = 0; 49 size_t result_size = 0;
50 int result_bytes = 0; 50 int result_bytes = 0;
51 51
52 char buf1[1024]; 52 char buf1[1024];
53 53
54 // A memory mount starts with one directory node: the root. 54 // A memory mount starts with one directory node: the root.
55 EXPECT_EQ(1, mnt->num_nodes()); 55 EXPECT_EQ(1, mnt->num_nodes());
56 56
57 // Fail to open non existent file 57 // Fail to open non existent file
58 EXPECT_EQ(ENOENT, mnt->Access(Path("/foo"), R_OK | W_OK));
58 EXPECT_EQ(ENOENT, mnt->Open(Path("/foo"), O_RDWR, &result_node)); 59 EXPECT_EQ(ENOENT, mnt->Open(Path("/foo"), O_RDWR, &result_node));
59 EXPECT_EQ(NULL, result_node); 60 EXPECT_EQ(NULL, result_node);
60 61
61 // Create a file 62 // Create a file
62 EXPECT_EQ(0, mnt->Open(Path("/foo"), O_RDWR | O_CREAT, &file)); 63 EXPECT_EQ(0, mnt->Open(Path("/foo"), O_RDWR | O_CREAT, &file));
63 EXPECT_NE(NULL_NODE, file); 64 EXPECT_NE(NULL_NODE, file);
64 if (file == NULL) 65 if (file == NULL)
65 return; 66 return;
66 EXPECT_EQ(2, file->RefCount()); 67 EXPECT_EQ(2, file->RefCount());
67 EXPECT_EQ(2, mnt->num_nodes()); 68 EXPECT_EQ(2, mnt->num_nodes());
69 EXPECT_EQ(0, mnt->Access(Path("/foo"), R_OK | W_OK));
70 EXPECT_EQ(EACCES, mnt->Access(Path("/foo"), X_OK));
68 71
72 // Write access should be allowed on the root directory.
73 EXPECT_EQ(0, mnt->Access(Path("/"), R_OK | W_OK));
74 EXPECT_EQ(EACCES, mnt->Access(Path("/"), X_OK));
69 // Open the root directory for write should fail. 75 // Open the root directory for write should fail.
70 EXPECT_EQ(EISDIR, mnt->Open(Path("/"), O_RDWR, &root)); 76 EXPECT_EQ(EISDIR, mnt->Open(Path("/"), O_RDWR, &root));
71 77
72 // Open the root directory 78 // Open the root directory
73 EXPECT_EQ(0, mnt->Open(Path("/"), O_RDONLY, &root)); 79 EXPECT_EQ(0, mnt->Open(Path("/"), O_RDONLY, &root));
74 EXPECT_NE(NULL_NODE, root); 80 EXPECT_NE(NULL_NODE, root);
75 if (NULL != root) { 81 if (NULL != root) {
76 struct dirent dirs[2]; 82 struct dirent dirs[2];
77 int len; 83 int len;
78 EXPECT_EQ(0, root->GetDents(0, dirs, sizeof(dirs), &len)); 84 EXPECT_EQ(0, root->GetDents(0, dirs, sizeof(dirs), &len));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 EXPECT_EQ(ENOTEMPTY, mnt->Rmdir(Path("/foo"))); 135 EXPECT_EQ(ENOTEMPTY, mnt->Rmdir(Path("/foo")));
130 136
131 // Unlink the file, then delete the directory 137 // Unlink the file, then delete the directory
132 EXPECT_EQ(0, mnt->Unlink(Path("/foo/bar"))); 138 EXPECT_EQ(0, mnt->Unlink(Path("/foo/bar")));
133 EXPECT_EQ(0, mnt->Rmdir(Path("/foo"))); 139 EXPECT_EQ(0, mnt->Rmdir(Path("/foo")));
134 EXPECT_EQ(2, mnt->num_nodes()); 140 EXPECT_EQ(2, mnt->num_nodes());
135 mnt->ReleaseNode(file); 141 mnt->ReleaseNode(file);
136 EXPECT_EQ(1, mnt->num_nodes()); 142 EXPECT_EQ(1, mnt->num_nodes());
137 143
138 // Verify the directory is gone 144 // Verify the directory is gone
145 EXPECT_EQ(ENOENT, mnt->Access(Path("/foo"), F_OK));
139 EXPECT_EQ(ENOENT, mnt->Open(Path("/foo"), O_RDWR, &file)); 146 EXPECT_EQ(ENOENT, mnt->Open(Path("/foo"), O_RDWR, &file));
140 EXPECT_EQ(NULL_NODE, file); 147 EXPECT_EQ(NULL_NODE, file);
141 } 148 }
142 149
143 TEST(MountTest, MemMountRemove) { 150 TEST(MountTest, MemMountRemove) {
144 MountMemMock* mnt = new MountMemMock(); 151 MountMemMock* mnt = new MountMemMock();
145 MountNode* file; 152 MountNode* file;
146 MountNode* result_node; 153 MountNode* result_node;
147 154
148 EXPECT_EQ(0, mnt->Mkdir(Path("/dir"), O_RDWR)); 155 EXPECT_EQ(0, mnt->Mkdir(Path("/dir"), O_RDWR));
149 EXPECT_EQ(0, mnt->Open(Path("/file"), O_RDWR | O_CREAT | O_EXCL, &file)); 156 EXPECT_EQ(0, mnt->Open(Path("/file"), O_RDWR | O_CREAT | O_EXCL, &file));
150 EXPECT_NE(NULL_NODE, file); 157 EXPECT_NE(NULL_NODE, file);
151 mnt->ReleaseNode(file); 158 mnt->ReleaseNode(file);
152 159
153 EXPECT_EQ(0, mnt->Remove(Path("/dir"))); 160 EXPECT_EQ(0, mnt->Remove(Path("/dir")));
154 EXPECT_EQ(0, mnt->Remove(Path("/file"))); 161 EXPECT_EQ(0, mnt->Remove(Path("/file")));
155 162
156 EXPECT_EQ(ENOENT, 163 EXPECT_EQ(ENOENT,
157 mnt->Open(Path("/dir/foo"), O_CREAT | O_RDWR, &result_node)); 164 mnt->Open(Path("/dir/foo"), O_CREAT | O_RDWR, &result_node));
158 EXPECT_EQ(NULL_NODE, result_node); 165 EXPECT_EQ(NULL_NODE, result_node);
159 EXPECT_EQ(ENOENT, mnt->Open(Path("/file"), O_RDONLY, &result_node)); 166 EXPECT_EQ(ENOENT, mnt->Open(Path("/file"), O_RDONLY, &result_node));
160 EXPECT_EQ(NULL_NODE, result_node); 167 EXPECT_EQ(NULL_NODE, result_node);
161 } 168 }
162 169
170 TEST(MountTest, DevAccess) {
171 // Should not be able to open non-existent file.
172 MountDevMock* mnt = new MountDevMock();
173 ASSERT_EQ(ENOENT, mnt->Access(Path("/foo"), F_OK));
174 }
175
163 TEST(MountTest, DevNull) { 176 TEST(MountTest, DevNull) {
164 MountDevMock* mnt = new MountDevMock(); 177 MountDevMock* mnt = new MountDevMock();
165 MountNode* dev_null = NULL; 178 MountNode* dev_null = NULL;
166 int result_bytes = 0; 179 int result_bytes = 0;
167 180
181 ASSERT_EQ(0, mnt->Access(Path("/null"), R_OK | W_OK));
182 ASSERT_EQ(EACCES, mnt->Access(Path("/null"), X_OK));
168 ASSERT_EQ(0, mnt->Open(Path("/null"), O_RDWR, &dev_null)); 183 ASSERT_EQ(0, mnt->Open(Path("/null"), O_RDWR, &dev_null));
169 ASSERT_NE(NULL_NODE, dev_null); 184 ASSERT_NE(NULL_NODE, dev_null);
170 185
171 // Writing to /dev/null should write everything. 186 // Writing to /dev/null should write everything.
172 const char msg[] = "Dummy test message."; 187 const char msg[] = "Dummy test message.";
173 EXPECT_EQ(0, dev_null->Write(0, &msg[0], strlen(msg), &result_bytes)); 188 EXPECT_EQ(0, dev_null->Write(0, &msg[0], strlen(msg), &result_bytes));
174 EXPECT_EQ(strlen(msg), result_bytes); 189 EXPECT_EQ(strlen(msg), result_bytes);
175 190
176 // Reading from /dev/null should read nothing. 191 // Reading from /dev/null should read nothing.
177 const int kBufferLength = 100; 192 const int kBufferLength = 100;
178 char buffer[kBufferLength]; 193 char buffer[kBufferLength];
179 EXPECT_EQ(0, dev_null->Read(0, &buffer[0], kBufferLength, &result_bytes)); 194 EXPECT_EQ(0, dev_null->Read(0, &buffer[0], kBufferLength, &result_bytes));
180 EXPECT_EQ(0, result_bytes); 195 EXPECT_EQ(0, result_bytes);
181 mnt->ReleaseNode(dev_null); 196 mnt->ReleaseNode(dev_null);
182 } 197 }
183 198
184 TEST(MountTest, DevZero) { 199 TEST(MountTest, DevZero) {
185 MountDevMock* mnt = new MountDevMock(); 200 MountDevMock* mnt = new MountDevMock();
186 MountNode* dev_zero = NULL; 201 MountNode* dev_zero = NULL;
187 int result_bytes = 0; 202 int result_bytes = 0;
188 203
204 ASSERT_EQ(0, mnt->Access(Path("/zero"), R_OK | W_OK));
205 ASSERT_EQ(EACCES, mnt->Access(Path("/zero"), X_OK));
189 ASSERT_EQ(0, mnt->Open(Path("/zero"), O_RDWR, &dev_zero)); 206 ASSERT_EQ(0, mnt->Open(Path("/zero"), O_RDWR, &dev_zero));
190 ASSERT_NE(NULL_NODE, dev_zero); 207 ASSERT_NE(NULL_NODE, dev_zero);
191 208
192 // Writing to /dev/zero should write everything. 209 // Writing to /dev/zero should write everything.
193 const char msg[] = "Dummy test message."; 210 const char msg[] = "Dummy test message.";
194 EXPECT_EQ(0, dev_zero->Write(0, &msg[0], strlen(msg), &result_bytes)); 211 EXPECT_EQ(0, dev_zero->Write(0, &msg[0], strlen(msg), &result_bytes));
195 EXPECT_EQ(strlen(msg), result_bytes); 212 EXPECT_EQ(strlen(msg), result_bytes);
196 213
197 // Reading from /dev/zero should read all zeroes. 214 // Reading from /dev/zero should read all zeroes.
198 const int kBufferLength = 100; 215 const int kBufferLength = 100;
199 char buffer[kBufferLength]; 216 char buffer[kBufferLength];
200 // First fill with all 1s. 217 // First fill with all 1s.
201 memset(&buffer[0], 0x1, kBufferLength); 218 memset(&buffer[0], 0x1, kBufferLength);
202 EXPECT_EQ(0, dev_zero->Read(0, &buffer[0], kBufferLength, &result_bytes)); 219 EXPECT_EQ(0, dev_zero->Read(0, &buffer[0], kBufferLength, &result_bytes));
203 EXPECT_EQ(kBufferLength, result_bytes); 220 EXPECT_EQ(kBufferLength, result_bytes);
204 221
205 char zero_buffer[kBufferLength]; 222 char zero_buffer[kBufferLength];
206 memset(&zero_buffer[0], 0, kBufferLength); 223 memset(&zero_buffer[0], 0, kBufferLength);
207 EXPECT_EQ(0, memcmp(&buffer[0], &zero_buffer[0], kBufferLength)); 224 EXPECT_EQ(0, memcmp(&buffer[0], &zero_buffer[0], kBufferLength));
208 mnt->ReleaseNode(dev_zero); 225 mnt->ReleaseNode(dev_zero);
209 } 226 }
210 227
211 TEST(MountTest, DevUrandom) { 228 TEST(MountTest, DevUrandom) {
212 MountDevMock* mnt = new MountDevMock(); 229 MountDevMock* mnt = new MountDevMock();
213 MountNode* dev_urandom = NULL; 230 MountNode* dev_urandom = NULL;
214 int result_bytes = 0; 231 int result_bytes = 0;
215 232
233 ASSERT_EQ(0, mnt->Access(Path("/urandom"), R_OK | W_OK));
234 ASSERT_EQ(EACCES, mnt->Access(Path("/urandom"), X_OK));
216 ASSERT_EQ(0, mnt->Open(Path("/urandom"), O_RDWR, &dev_urandom)); 235 ASSERT_EQ(0, mnt->Open(Path("/urandom"), O_RDWR, &dev_urandom));
217 ASSERT_NE(NULL_NODE, dev_urandom); 236 ASSERT_NE(NULL_NODE, dev_urandom);
218 237
219 // Writing to /dev/urandom should write everything. 238 // Writing to /dev/urandom should write everything.
220 const char msg[] = "Dummy test message."; 239 const char msg[] = "Dummy test message.";
221 EXPECT_EQ(0, dev_urandom->Write(0, &msg[0], strlen(msg), &result_bytes)); 240 EXPECT_EQ(0, dev_urandom->Write(0, &msg[0], strlen(msg), &result_bytes));
222 EXPECT_EQ(strlen(msg), result_bytes); 241 EXPECT_EQ(strlen(msg), result_bytes);
223 242
224 // Reading from /dev/urandom should read random bytes. 243 // Reading from /dev/urandom should read random bytes.
225 const int kSampleBatches = 1000; 244 const int kSampleBatches = 1000;
(...skipping 17 matching lines...) Expand all
243 double expected_count = kTotalSamples / 256.; 262 double expected_count = kTotalSamples / 256.;
244 double chi_squared = 0; 263 double chi_squared = 0;
245 for (int i = 0; i < 256; ++i) { 264 for (int i = 0; i < 256; ++i) {
246 double difference = byte_count[i] - expected_count; 265 double difference = byte_count[i] - expected_count;
247 chi_squared += difference * difference / expected_count; 266 chi_squared += difference * difference / expected_count;
248 } 267 }
249 268
250 // Approximate chi-squared value for p-value 0.05, 255 degrees-of-freedom. 269 // Approximate chi-squared value for p-value 0.05, 255 degrees-of-freedom.
251 EXPECT_LE(chi_squared, 293.24); 270 EXPECT_LE(chi_squared, 293.24);
252 } 271 }
OLDNEW
« no previous file with comments | « native_client_sdk/src/libraries/nacl_io_test/mount_http_test.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698