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 <fcntl.h> | 5 #include <fcntl.h> |
6 #include <gmock/gmock.h> | 6 #include <gmock/gmock.h> |
7 #include <ppapi/c/ppb_file_io.h> | 7 #include <ppapi/c/ppb_file_io.h> |
8 #include <ppapi/c/pp_errors.h> | 8 #include <ppapi/c/pp_errors.h> |
9 #include <ppapi/c/pp_instance.h> | 9 #include <ppapi/c/pp_instance.h> |
10 #include <sys/stat.h> | 10 #include <sys/stat.h> |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 | 171 |
172 TEST_P(HttpFsTest, GetStat) { | 172 TEST_P(HttpFsTest, GetStat) { |
173 const char contents[] = "contents"; | 173 const char contents[] = "contents"; |
174 ASSERT_TRUE(ppapi_.server_template()->AddEntity("file", contents, NULL)); | 174 ASSERT_TRUE(ppapi_.server_template()->AddEntity("file", contents, NULL)); |
175 | 175 |
176 ScopedNode node; | 176 ScopedNode node; |
177 ASSERT_EQ(0, fs_.Open(Path("/file"), O_RDONLY, &node)); | 177 ASSERT_EQ(0, fs_.Open(Path("/file"), O_RDONLY, &node)); |
178 | 178 |
179 struct stat statbuf; | 179 struct stat statbuf; |
180 EXPECT_EQ(0, node->GetStat(&statbuf)); | 180 EXPECT_EQ(0, node->GetStat(&statbuf)); |
181 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, | 181 EXPECT_EQ(S_IFREG | S_IRUSR | S_IRGRP | S_IROTH, statbuf.st_mode); |
182 statbuf.st_mode); | |
183 EXPECT_EQ(strlen(contents), statbuf.st_size); | 182 EXPECT_EQ(strlen(contents), statbuf.st_size); |
184 // These are not currently set. | 183 // These are not currently set. |
185 EXPECT_EQ(0, statbuf.st_atime); | 184 EXPECT_EQ(0, statbuf.st_atime); |
186 EXPECT_EQ(0, statbuf.st_ctime); | 185 EXPECT_EQ(0, statbuf.st_ctime); |
187 EXPECT_EQ(0, statbuf.st_mtime); | 186 EXPECT_EQ(0, statbuf.st_mtime); |
188 } | 187 } |
189 | 188 |
190 TEST_P(HttpFsTest, FTruncate) { | 189 TEST_P(HttpFsTest, FTruncate) { |
191 const char contents[] = "contents"; | 190 const char contents[] = "contents"; |
192 ASSERT_TRUE(ppapi_.server_template()->AddEntity("file", contents, NULL)); | 191 ASSERT_TRUE(ppapi_.server_template()->AddEntity("file", contents, NULL)); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 // TODO(binji): If the server doesn't send the content length, this operation | 245 // TODO(binji): If the server doesn't send the content length, this operation |
247 // will be incredibly slow; it will attempt to read all of the data from the | 246 // will be incredibly slow; it will attempt to read all of the data from the |
248 // server to find the file length. Can we do anything smarter? | 247 // server to find the file length. Can we do anything smarter? |
249 ppapi_.server_template()->set_send_content_length(true); | 248 ppapi_.server_template()->set_send_content_length(true); |
250 | 249 |
251 ScopedNode node; | 250 ScopedNode node; |
252 ASSERT_EQ(0, fs_.Open(Path("/file"), O_RDONLY, &node)); | 251 ASSERT_EQ(0, fs_.Open(Path("/file"), O_RDONLY, &node)); |
253 | 252 |
254 struct stat statbuf; | 253 struct stat statbuf; |
255 EXPECT_EQ(0, node->GetStat(&statbuf)); | 254 EXPECT_EQ(0, node->GetStat(&statbuf)); |
256 EXPECT_EQ(S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, | 255 EXPECT_EQ(S_IFREG | S_IRUSR | S_IRGRP | S_IROTH, statbuf.st_mode); |
257 statbuf.st_mode); | |
258 EXPECT_EQ(size, statbuf.st_size); | 256 EXPECT_EQ(size, statbuf.st_size); |
259 // These are not currently set. | 257 // These are not currently set. |
260 EXPECT_EQ(0, statbuf.st_atime); | 258 EXPECT_EQ(0, statbuf.st_atime); |
261 EXPECT_EQ(0, statbuf.st_ctime); | 259 EXPECT_EQ(0, statbuf.st_ctime); |
262 EXPECT_EQ(0, statbuf.st_mtime); | 260 EXPECT_EQ(0, statbuf.st_mtime); |
263 } | 261 } |
264 | 262 |
265 // Instantiate the large file tests, only when cache content is off. | 263 // Instantiate the large file tests, only when cache content is off. |
266 // TODO(binji): make cache content smarter, so it doesn't try to cache enormous | 264 // TODO(binji): make cache content smarter, so it doesn't try to cache enormous |
267 // files. See http://crbug.com/369279. | 265 // files. See http://crbug.com/369279. |
268 INSTANTIATE_TEST_CASE_P(Default, | 266 INSTANTIATE_TEST_CASE_P(Default, |
269 HttpFsLargeFileTest, | 267 HttpFsLargeFileTest, |
270 ::testing::Values((uint32_t)kStringMapParamCacheNone, | 268 ::testing::Values((uint32_t)kStringMapParamCacheNone, |
271 (uint32_t)kStringMapParamCacheStat)); | 269 (uint32_t)kStringMapParamCacheStat)); |
272 | 270 |
| 271 TEST(HttpFsDirTest, Root) { |
| 272 StringMap_t args; |
| 273 HttpFsForTesting fs(args, NULL); |
| 274 |
| 275 // Check root node is directory |
| 276 ScopedNode node; |
| 277 ASSERT_EQ(0, fs.Open(Path("/"), O_RDONLY, &node)); |
| 278 ASSERT_TRUE(node->IsaDir()); |
| 279 |
| 280 // We have to r+w access to the root node |
| 281 ASSERT_EQ(0, fs.Access(Path("/"), R_OK)); |
| 282 ASSERT_EQ(0, fs.Access(Path("/"), X_OK)); |
| 283 ASSERT_EQ(EACCES, fs.Access(Path("/"), W_OK)); |
| 284 } |
| 285 |
273 TEST(HttpFsDirTest, Mkdir) { | 286 TEST(HttpFsDirTest, Mkdir) { |
274 StringMap_t args; | 287 StringMap_t args; |
275 HttpFsForTesting fs(args, NULL); | 288 HttpFsForTesting fs(args, NULL); |
276 char manifest[] = "-r-- 123 /mydir/foo\n-rw- 234 /thatdir/bar\n"; | 289 char manifest[] = "-r-- 123 /mydir/foo\n-rw- 234 /thatdir/bar\n"; |
277 ASSERT_EQ(0, fs.ParseManifest(manifest)); | 290 ASSERT_EQ(0, fs.ParseManifest(manifest)); |
278 // mkdir of existing directories should give "File exists". | 291 // mkdir of existing directories should give "File exists". |
279 EXPECT_EQ(EEXIST, fs.Mkdir(Path("/"), 0)); | 292 EXPECT_EQ(EEXIST, fs.Mkdir(Path("/"), 0)); |
280 EXPECT_EQ(EEXIST, fs.Mkdir(Path("/mydir"), 0)); | 293 EXPECT_EQ(EEXIST, fs.Mkdir(Path("/mydir"), 0)); |
281 // mkdir of non-existent directories should give "Permission denied". | 294 // mkdir of non-existent directories should give "Permission denied". |
282 EXPECT_EQ(EACCES, fs.Mkdir(Path("/non_existent"), 0)); | 295 EXPECT_EQ(EACCES, fs.Mkdir(Path("/non_existent"), 0)); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 EXPECT_FALSE(bar->GetStat(&sbar)); | 375 EXPECT_FALSE(bar->GetStat(&sbar)); |
363 | 376 |
364 EXPECT_EQ(123, sfoo.st_size); | 377 EXPECT_EQ(123, sfoo.st_size); |
365 EXPECT_EQ(S_IFREG | S_IRALL, sfoo.st_mode); | 378 EXPECT_EQ(S_IFREG | S_IRALL, sfoo.st_mode); |
366 | 379 |
367 EXPECT_EQ(234, sbar.st_size); | 380 EXPECT_EQ(234, sbar.st_size); |
368 EXPECT_EQ(S_IFREG | S_IRALL | S_IWALL, sbar.st_mode); | 381 EXPECT_EQ(S_IFREG | S_IRALL | S_IWALL, sbar.st_mode); |
369 } | 382 } |
370 | 383 |
371 TEST(HttpFsBlobUrlTest, Basic) { | 384 TEST(HttpFsBlobUrlTest, Basic) { |
372 const char* kUrl = | 385 const char* kUrl = "blob:http%3A//example.com/6b87a5a6-713e"; |
373 "blob:http%3A//example.com/6b87a5a6-713e-46a4-9f0c-78066406455d"; | 386 const char* kContent = "hello"; |
374 FakePepperInterfaceURLLoader ppapi; | 387 FakePepperInterfaceURLLoader ppapi; |
375 ASSERT_TRUE(ppapi.server_template()->SetBlobEntity(kUrl, "", NULL)); | 388 ASSERT_TRUE(ppapi.server_template()->SetBlobEntity(kUrl, kContent, NULL)); |
376 | 389 |
377 StringMap_t args; | 390 StringMap_t args; |
378 args["SOURCE"] = kUrl; | 391 args["SOURCE"] = kUrl; |
379 | 392 |
380 HttpFsForTesting fs(args, &ppapi); | 393 HttpFsForTesting fs(args, &ppapi); |
381 | 394 |
382 // We have to read from the mount root to read a Blob URL. | 395 // Check access to root folder |
383 ASSERT_EQ(0, fs.Access(Path("/"), R_OK)); | 396 ASSERT_EQ(0, fs.Access(Path("/"), R_OK)); |
384 ASSERT_EQ(EACCES, fs.Access(Path("/"), W_OK)); | 397 ASSERT_EQ(EACCES, fs.Access(Path("/"), W_OK)); |
385 ASSERT_EQ(EACCES, fs.Access(Path("/"), X_OK)); | 398 ASSERT_EQ(EACCES, fs.Access(Path("/"), X_OK)); |
386 | 399 |
387 // Any other path will fail. | 400 // Any other path will fail. |
388 ScopedNode foo; | 401 ScopedNode foo; |
389 ASSERT_EQ(ENOENT, fs.Access(Path(""), R_OK)); | 402 ASSERT_EQ(ENOENT, fs.Access(Path("/blah"), R_OK)); |
390 ASSERT_EQ(ENOENT, fs.Access(Path("."), R_OK)); | 403 |
391 ASSERT_EQ(ENOENT, fs.Access(Path("blah"), R_OK)); | 404 // Verify file size |
| 405 ScopedNode node; |
| 406 struct stat statbuf; |
| 407 ASSERT_EQ(0, fs.Open(Path("/"), O_RDONLY, &node)); |
| 408 ASSERT_EQ(0, node->GetStat(&statbuf)); |
| 409 ASSERT_EQ(0, node->GetStat(&statbuf)); |
| 410 ASSERT_EQ(strlen(kContent), statbuf.st_size); |
392 } | 411 } |
OLD | NEW |