| 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 | 7 |
| 8 #include <set> | 8 #include <set> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| 11 #include <gmock/gmock.h> | 11 #include <ppapi/c/pp_file_info.h> |
| 12 #include <ppapi/c/ppb_file_io.h> | |
| 13 #include <ppapi/c/pp_directory_entry.h> | |
| 14 #include <ppapi/c/pp_errors.h> | |
| 15 #include <ppapi/c/pp_instance.h> | |
| 16 #if defined(WIN32) | |
| 17 #include <windows.h> // For Sleep() | |
| 18 #endif | |
| 19 | 12 |
| 13 #include "fake_ppapi/fake_node.h" |
| 20 #include "fake_ppapi/fake_pepper_interface_html5_fs.h" | 14 #include "fake_ppapi/fake_pepper_interface_html5_fs.h" |
| 21 #include "nacl_io/kernel_handle.h" | 15 #include "nacl_io/kernel_handle.h" |
| 22 #include "nacl_io/html5fs/html5_fs.h" | 16 #include "nacl_io/html5fs/html5_fs.h" |
| 23 #include "nacl_io/osdirent.h" | 17 #include "nacl_io/osdirent.h" |
| 24 #include "nacl_io/osunistd.h" | |
| 25 #include "nacl_io/pepper_interface_delegate.h" | 18 #include "nacl_io/pepper_interface_delegate.h" |
| 26 #include "sdk_util/scoped_ref.h" | 19 #include "sdk_util/scoped_ref.h" |
| 27 #include "mock_util.h" | 20 #include "mock_util.h" |
| 28 #include "pepper_interface_mock.h" | 21 #include "pepper_interface_mock.h" |
| 29 | 22 |
| 30 using namespace nacl_io; | 23 using namespace nacl_io; |
| 31 using namespace sdk_util; | 24 using namespace sdk_util; |
| 32 | 25 |
| 33 using ::testing::_; | 26 using ::testing::_; |
| 34 using ::testing::DoAll; | 27 using ::testing::DoAll; |
| 35 using ::testing::Invoke; | 28 using ::testing::Invoke; |
| 36 using ::testing::Mock; | 29 using ::testing::Mock; |
| 37 using ::testing::Return; | 30 using ::testing::Return; |
| 38 | 31 |
| 39 namespace { | 32 namespace { |
| 40 | 33 |
| 41 class Html5FsForTesting : public Html5Fs { | 34 class Html5FsForTesting : public Html5Fs { |
| 42 public: | 35 public: |
| 43 Html5FsForTesting(StringMap_t& string_map, PepperInterface* ppapi, | 36 Html5FsForTesting(StringMap_t& string_map, |
| 37 PepperInterface* ppapi, |
| 44 int expected_error = 0) { | 38 int expected_error = 0) { |
| 45 FsInitArgs args; | 39 FsInitArgs args; |
| 46 args.string_map = string_map; | 40 args.string_map = string_map; |
| 47 args.ppapi = ppapi; | 41 args.ppapi = ppapi; |
| 48 Error error = Init(args); | 42 Error error = Init(args); |
| 49 EXPECT_EQ(expected_error, error); | 43 EXPECT_EQ(expected_error, error); |
| 50 } | 44 } |
| 51 | 45 |
| 52 bool Exists(const char* filename) { | 46 bool Exists(const char* filename) { |
| 53 ScopedNode node; | 47 ScopedNode node; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 for (int i = 0; filesystem_type_strings[i] != NULL; ++i) { | 95 for (int i = 0; filesystem_type_strings[i] != NULL; ++i) { |
| 102 const char* filesystem_type_string = filesystem_type_strings[i]; | 96 const char* filesystem_type_string = filesystem_type_strings[i]; |
| 103 PP_FileSystemType expected_filesystem_type = filesystem_type_values[i]; | 97 PP_FileSystemType expected_filesystem_type = filesystem_type_values[i]; |
| 104 | 98 |
| 105 for (int j = 0; expected_size_strings[j] != NULL; ++j) { | 99 for (int j = 0; expected_size_strings[j] != NULL; ++j) { |
| 106 const char* expected_size_string = expected_size_strings[j]; | 100 const char* expected_size_string = expected_size_strings[j]; |
| 107 int64_t expected_expected_size = expected_size_values[j]; | 101 int64_t expected_expected_size = expected_size_values[j]; |
| 108 | 102 |
| 109 ppapi_.SetFileSystemInterfaceDelegate(filesystem_mock); | 103 ppapi_.SetFileSystemInterfaceDelegate(filesystem_mock); |
| 110 | 104 |
| 111 ON_CALL(*filesystem_mock, Create(_, _)).WillByDefault( | 105 ON_CALL(*filesystem_mock, Create(_, _)) |
| 112 Invoke(filesystem_fake, &FakeFileSystemInterface::Create)); | 106 .WillByDefault( |
| 107 Invoke(filesystem_fake, &FakeFileSystemInterface::Create)); |
| 113 | 108 |
| 114 EXPECT_CALL(*filesystem_mock, | 109 EXPECT_CALL(*filesystem_mock, |
| 115 Create(ppapi_.GetInstance(), expected_filesystem_type)); | 110 Create(ppapi_.GetInstance(), expected_filesystem_type)); |
| 116 | 111 |
| 117 EXPECT_CALL(*filesystem_mock, Open(_, expected_expected_size, _)) | 112 EXPECT_CALL(*filesystem_mock, Open(_, expected_expected_size, _)) |
| 118 .WillOnce(DoAll(CallCallback<2>(int32_t(PP_OK)), | 113 .WillOnce(DoAll(CallCallback<2>(int32_t(PP_OK)), |
| 119 Return(int32_t(PP_OK_COMPLETIONPENDING)))); | 114 Return(int32_t(PP_OK_COMPLETIONPENDING)))); |
| 120 | 115 |
| 121 StringMap_t map; | 116 StringMap_t map; |
| 122 map["type"] = filesystem_type_string; | 117 map["type"] = filesystem_type_string; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 136 ScopedRef<Html5FsForTesting> fs( | 131 ScopedRef<Html5FsForTesting> fs( |
| 137 new Html5FsForTesting(map, &ppapi_, EINVAL)); | 132 new Html5FsForTesting(map, &ppapi_, EINVAL)); |
| 138 } | 133 } |
| 139 | 134 |
| 140 { | 135 { |
| 141 EXPECT_TRUE(ppapi_html5_.filesystem_template()->AddEmptyFile("/foo", NULL)); | 136 EXPECT_TRUE(ppapi_html5_.filesystem_template()->AddEmptyFile("/foo", NULL)); |
| 142 PP_Resource filesystem = ppapi_html5_.GetFileSystemInterface()->Create( | 137 PP_Resource filesystem = ppapi_html5_.GetFileSystemInterface()->Create( |
| 143 ppapi_html5_.GetInstance(), PP_FILESYSTEMTYPE_LOCALPERSISTENT); | 138 ppapi_html5_.GetInstance(), PP_FILESYSTEMTYPE_LOCALPERSISTENT); |
| 144 | 139 |
| 145 ASSERT_EQ(int32_t(PP_OK), ppapi_html5_.GetFileSystemInterface()->Open( | 140 ASSERT_EQ(int32_t(PP_OK), ppapi_html5_.GetFileSystemInterface()->Open( |
| 146 filesystem, 0, PP_BlockUntilComplete())); | 141 filesystem, 0, PP_BlockUntilComplete())); |
| 147 | 142 |
| 148 StringMap_t map; | 143 StringMap_t map; |
| 149 char buffer[30]; | 144 char buffer[30]; |
| 150 snprintf(buffer, 30, "%d", filesystem); | 145 snprintf(buffer, 30, "%d", filesystem); |
| 151 map["filesystem_resource"] = buffer; | 146 map["filesystem_resource"] = buffer; |
| 152 ScopedRef<Html5FsForTesting> fs( | 147 ScopedRef<Html5FsForTesting> fs(new Html5FsForTesting(map, &ppapi_)); |
| 153 new Html5FsForTesting(map, &ppapi_)); | |
| 154 | 148 |
| 155 ASSERT_TRUE(fs->Exists("/foo")); | 149 ASSERT_TRUE(fs->Exists("/foo")); |
| 156 | 150 |
| 157 ppapi_html5_.GetCoreInterface()->ReleaseResource(filesystem); | 151 ppapi_html5_.GetCoreInterface()->ReleaseResource(filesystem); |
| 158 } | 152 } |
| 159 } | 153 } |
| 160 | 154 |
| 161 TEST_F(Html5FsTest, MountSubtree) { | 155 TEST_F(Html5FsTest, MountSubtree) { |
| 162 EXPECT_TRUE(ppapi_html5_.filesystem_template()->AddEmptyFile("/foo/bar", | 156 EXPECT_TRUE( |
| 163 NULL)); | 157 ppapi_html5_.filesystem_template()->AddEmptyFile("/foo/bar", NULL)); |
| 164 StringMap_t map; | 158 StringMap_t map; |
| 165 map["SOURCE"] = "/foo"; | 159 map["SOURCE"] = "/foo"; |
| 166 ScopedRef<Html5FsForTesting> fs(new Html5FsForTesting(map, &ppapi_)); | 160 ScopedRef<Html5FsForTesting> fs(new Html5FsForTesting(map, &ppapi_)); |
| 167 | 161 |
| 168 ASSERT_TRUE(fs->Exists("/bar")); | 162 ASSERT_TRUE(fs->Exists("/bar")); |
| 169 ASSERT_FALSE(fs->Exists("/foo/bar")); | 163 ASSERT_FALSE(fs->Exists("/foo/bar")); |
| 170 } | 164 } |
| 171 | 165 |
| 172 TEST_F(Html5FsTest, Mkdir) { | 166 TEST_F(Html5FsTest, Mkdir) { |
| 173 StringMap_t map; | 167 StringMap_t map; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 | 243 |
| 250 EXPECT_FALSE(fs->Exists("/foo")); | 244 EXPECT_FALSE(fs->Exists("/foo")); |
| 251 | 245 |
| 252 Path path("/foo"); | 246 Path path("/foo"); |
| 253 ScopedNode node; | 247 ScopedNode node; |
| 254 ASSERT_EQ(0, fs->Open(path, O_CREAT | O_RDWR, &node)); | 248 ASSERT_EQ(0, fs->Open(path, O_CREAT | O_RDWR, &node)); |
| 255 | 249 |
| 256 // Write some data. | 250 // Write some data. |
| 257 const char* contents = "contents"; | 251 const char* contents = "contents"; |
| 258 int bytes_written = 0; | 252 int bytes_written = 0; |
| 259 EXPECT_EQ(0, node->Write(HandleAttr(), contents, strlen(contents), | 253 EXPECT_EQ( |
| 260 &bytes_written)); | 254 0, node->Write(HandleAttr(), contents, strlen(contents), &bytes_written)); |
| 261 EXPECT_EQ(strlen(contents), bytes_written); | 255 EXPECT_EQ(strlen(contents), bytes_written); |
| 262 | 256 |
| 263 // Create again. | 257 // Create again. |
| 264 ASSERT_EQ(0, fs->Open(path, O_CREAT, &node)); | 258 ASSERT_EQ(0, fs->Open(path, O_CREAT, &node)); |
| 265 | 259 |
| 266 // Check that the file still has data. | 260 // Check that the file still has data. |
| 267 off_t size; | 261 off_t size; |
| 268 EXPECT_EQ(0, node->GetSize(&size)); | 262 EXPECT_EQ(0, node->GetSize(&size)); |
| 269 EXPECT_EQ(strlen(contents), size); | 263 EXPECT_EQ(strlen(contents), size); |
| 270 | 264 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 EXPECT_EQ(EISDIR, node->Write(attr, &buffer[0], sizeof(buffer), &bytes_read)); | 356 EXPECT_EQ(EISDIR, node->Write(attr, &buffer[0], sizeof(buffer), &bytes_read)); |
| 363 } | 357 } |
| 364 | 358 |
| 365 TEST_F(Html5FsTest, GetStat) { | 359 TEST_F(Html5FsTest, GetStat) { |
| 366 const int creation_time = 1000; | 360 const int creation_time = 1000; |
| 367 const int access_time = 2000; | 361 const int access_time = 2000; |
| 368 const int modified_time = 3000; | 362 const int modified_time = 3000; |
| 369 const char* contents = "contents"; | 363 const char* contents = "contents"; |
| 370 | 364 |
| 371 // Create fake file. | 365 // Create fake file. |
| 372 FakeHtml5FsNode* fake_node; | 366 FakeNode* fake_node; |
| 373 EXPECT_TRUE(ppapi_html5_.filesystem_template()->AddFile( | 367 EXPECT_TRUE(ppapi_html5_.filesystem_template()->AddFile("/file", contents, |
| 374 "/file", contents, &fake_node)); | 368 &fake_node)); |
| 375 fake_node->set_creation_time(creation_time); | 369 fake_node->set_creation_time(creation_time); |
| 376 fake_node->set_last_access_time(access_time); | 370 fake_node->set_last_access_time(access_time); |
| 377 fake_node->set_last_modified_time(modified_time); | 371 fake_node->set_last_modified_time(modified_time); |
| 378 | 372 |
| 379 // Create fake directory. | 373 // Create fake directory. |
| 380 EXPECT_TRUE( | 374 EXPECT_TRUE( |
| 381 ppapi_html5_.filesystem_template()->AddDirectory("/dir", &fake_node)); | 375 ppapi_html5_.filesystem_template()->AddDirectory("/dir", &fake_node)); |
| 382 fake_node->set_creation_time(creation_time); | 376 fake_node->set_creation_time(creation_time); |
| 383 fake_node->set_last_access_time(access_time); | 377 fake_node->set_last_access_time(access_time); |
| 384 fake_node->set_last_modified_time(modified_time); | 378 fake_node->set_last_modified_time(modified_time); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 EXPECT_EQ(dirents[i].d_ino, file2_ino); | 541 EXPECT_EQ(dirents[i].d_ino, file2_ino); |
| 548 } | 542 } |
| 549 } | 543 } |
| 550 | 544 |
| 551 EXPECT_EQ(1, dirnames.count("file")); | 545 EXPECT_EQ(1, dirnames.count("file")); |
| 552 EXPECT_EQ(1, dirnames.count("file2")); | 546 EXPECT_EQ(1, dirnames.count("file2")); |
| 553 EXPECT_EQ(1, dirnames.count(".")); | 547 EXPECT_EQ(1, dirnames.count(".")); |
| 554 EXPECT_EQ(1, dirnames.count("..")); | 548 EXPECT_EQ(1, dirnames.count("..")); |
| 555 } | 549 } |
| 556 } | 550 } |
| OLD | NEW |