| OLD | NEW |
| 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 <fcntl.h> | 6 #include <fcntl.h> |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <gmock/gmock.h> | 8 #include <gmock/gmock.h> |
| 9 #include <ppapi/c/ppb_file_io.h> | 9 #include <ppapi/c/ppb_file_io.h> |
| 10 #include <ppapi/c/pp_errors.h> | 10 #include <ppapi/c/pp_errors.h> |
| 11 #include <ppapi/c/pp_instance.h> | 11 #include <ppapi/c/pp_instance.h> |
| 12 #if defined(WIN32) |
| 13 #include <windows.h> // For Sleep() |
| 14 #endif |
| 12 | 15 |
| 13 #include "mock_util.h" | 16 #include "mock_util.h" |
| 14 #include "nacl_io/mount_html5fs.h" | 17 #include "nacl_io/mount_html5fs.h" |
| 15 #include "nacl_io/osdirent.h" | 18 #include "nacl_io/osdirent.h" |
| 16 #include "pepper_interface_mock.h" | 19 #include "pepper_interface_mock.h" |
| 17 | 20 |
| 18 using ::testing::_; | 21 using ::testing::_; |
| 19 using ::testing::DoAll; | 22 using ::testing::DoAll; |
| 20 using ::testing::Invoke; | 23 using ::testing::Invoke; |
| 21 using ::testing::Return; | 24 using ::testing::Return; |
| 25 using ::testing::SaveArg; |
| 22 using ::testing::SetArgPointee; | 26 using ::testing::SetArgPointee; |
| 23 using ::testing::StrEq; | 27 using ::testing::StrEq; |
| 24 using ::testing::WithArgs; | 28 using ::testing::WithArgs; |
| 25 | 29 |
| 26 namespace { | 30 namespace { |
| 27 | 31 |
| 28 class MountHtml5FsMock : public MountHtml5Fs { | 32 class MountHtml5FsMock : public MountHtml5Fs { |
| 29 public: | 33 public: |
| 30 MountHtml5FsMock(StringMap_t map, PepperInterfaceMock* ppapi) { | 34 MountHtml5FsMock(StringMap_t map, PepperInterfaceMock* ppapi) { |
| 31 Init(1, map, ppapi); | 35 Init(1, map, ppapi); |
| 32 } | 36 } |
| 33 | 37 |
| 34 ~MountHtml5FsMock() { | 38 ~MountHtml5FsMock() { |
| 35 Destroy(); | 39 Destroy(); |
| 36 } | 40 } |
| 37 }; | 41 }; |
| 38 | 42 |
| 39 class MountHtml5FsTest : public ::testing::Test { | 43 class MountHtml5FsTest : public ::testing::Test { |
| 40 public: | 44 public: |
| 41 MountHtml5FsTest(); | 45 MountHtml5FsTest(); |
| 42 ~MountHtml5FsTest(); | 46 ~MountHtml5FsTest(); |
| 43 void SetUpFilesystem(PP_FileSystemType, int); | 47 void SetUpFilesystemExpectations(PP_FileSystemType, int, |
| 48 bool async_callback=false); |
| 44 | 49 |
| 45 protected: | 50 protected: |
| 46 PepperInterfaceMock* ppapi_; | 51 PepperInterfaceMock* ppapi_; |
| 52 PP_CompletionCallback open_filesystem_callback_; |
| 47 | 53 |
| 48 static const PP_Instance instance_ = 123; | 54 static const PP_Instance instance_ = 123; |
| 49 static const PP_Resource filesystem_resource_ = 234; | 55 static const PP_Resource filesystem_resource_ = 234; |
| 50 }; | 56 }; |
| 51 | 57 |
| 52 MountHtml5FsTest::MountHtml5FsTest() | 58 MountHtml5FsTest::MountHtml5FsTest() |
| 53 : ppapi_(NULL) { | 59 : ppapi_(new PepperInterfaceMock(instance_)) { |
| 54 } | 60 } |
| 55 | 61 |
| 56 MountHtml5FsTest::~MountHtml5FsTest() { | 62 MountHtml5FsTest::~MountHtml5FsTest() { |
| 57 delete ppapi_; | 63 delete ppapi_; |
| 58 } | 64 } |
| 59 | 65 |
| 60 void MountHtml5FsTest::SetUpFilesystem(PP_FileSystemType fstype, | 66 void MountHtml5FsTest::SetUpFilesystemExpectations( |
| 61 int expected_size) { | 67 PP_FileSystemType fstype, |
| 62 ppapi_ = new PepperInterfaceMock(instance_); | 68 int expected_size, |
| 69 bool async_callback) { |
| 63 FileSystemInterfaceMock* filesystem = ppapi_->GetFileSystemInterface(); | 70 FileSystemInterfaceMock* filesystem = ppapi_->GetFileSystemInterface(); |
| 64 EXPECT_CALL(*filesystem, Create(instance_, fstype)) | 71 EXPECT_CALL(*filesystem, Create(instance_, fstype)) |
| 65 .Times(1) | 72 .Times(1) |
| 66 .WillOnce(Return(filesystem_resource_)); | 73 .WillOnce(Return(filesystem_resource_)); |
| 67 EXPECT_CALL(*filesystem, Open(filesystem_resource_, expected_size, _)) | 74 |
| 68 .WillOnce(CallCallback<2>(int32_t(PP_OK))); | 75 if (async_callback) { |
| 76 EXPECT_CALL(*filesystem, Open(filesystem_resource_, expected_size, _)) |
| 77 .WillOnce(DoAll(SaveArg<2>(&open_filesystem_callback_), |
| 78 Return(int32_t(PP_OK)))); |
| 79 EXPECT_CALL(*ppapi_, IsMainThread()).WillOnce(Return(PP_TRUE)); |
| 80 } else { |
| 81 EXPECT_CALL(*filesystem, Open(filesystem_resource_, expected_size, _)) |
| 82 .WillOnce(CallCallback<2>(int32_t(PP_OK))); |
| 83 EXPECT_CALL(*ppapi_, IsMainThread()).WillOnce(Return(PP_FALSE)); |
| 84 } |
| 69 | 85 |
| 70 EXPECT_CALL(*ppapi_, ReleaseResource(filesystem_resource_)); | 86 EXPECT_CALL(*ppapi_, ReleaseResource(filesystem_resource_)); |
| 71 } | 87 } |
| 72 | 88 |
| 73 class MountHtml5FsNodeTest : public MountHtml5FsTest { | 89 class MountHtml5FsNodeTest : public MountHtml5FsTest { |
| 74 public: | 90 public: |
| 75 MountHtml5FsNodeTest(); | 91 MountHtml5FsNodeTest(); |
| 76 virtual void SetUp(); | 92 virtual void SetUp(); |
| 77 virtual void TearDown(); | 93 virtual void TearDown(); |
| 78 | 94 |
| 95 void SetUpNodeExpectations(); |
| 96 void InitFilesystem(); |
| 97 void InitNode(); |
| 98 |
| 79 protected: | 99 protected: |
| 80 MountHtml5FsMock* mnt_; | 100 MountHtml5FsMock* mnt_; |
| 81 MountNode* node_; | 101 MountNode* node_; |
| 82 | 102 |
| 83 FileRefInterfaceMock* fileref_; | 103 FileRefInterfaceMock* fileref_; |
| 84 FileIoInterfaceMock* fileio_; | 104 FileIoInterfaceMock* fileio_; |
| 85 | 105 |
| 86 static const char path_[]; | 106 static const char path_[]; |
| 87 static const PP_Resource fileref_resource_ = 235; | 107 static const PP_Resource fileref_resource_ = 235; |
| 88 static const PP_Resource fileio_resource_ = 236; | 108 static const PP_Resource fileio_resource_ = 236; |
| 89 }; | 109 }; |
| 90 | 110 |
| 91 // static | 111 // static |
| 92 const char MountHtml5FsNodeTest::path_[] = "/foo"; | 112 const char MountHtml5FsNodeTest::path_[] = "/foo"; |
| 93 | 113 |
| 94 MountHtml5FsNodeTest::MountHtml5FsNodeTest() | 114 MountHtml5FsNodeTest::MountHtml5FsNodeTest() |
| 95 : mnt_(NULL), | 115 : mnt_(NULL), |
| 96 node_(NULL), | 116 node_(NULL), |
| 97 fileref_(NULL), | 117 fileref_(NULL), |
| 98 fileio_(NULL) { | 118 fileio_(NULL) { |
| 99 } | 119 } |
| 100 | 120 |
| 101 void MountHtml5FsNodeTest::SetUp() { | 121 void MountHtml5FsNodeTest::SetUp() { |
| 102 SetUpFilesystem(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0); | |
| 103 StringMap_t map; | |
| 104 mnt_ = new MountHtml5FsMock(map, ppapi_); | |
| 105 | |
| 106 fileref_ = ppapi_->GetFileRefInterface(); | 122 fileref_ = ppapi_->GetFileRefInterface(); |
| 107 fileio_ = ppapi_->GetFileIoInterface(); | 123 fileio_ = ppapi_->GetFileIoInterface(); |
| 124 } |
| 108 | 125 |
| 126 void MountHtml5FsNodeTest::TearDown() { |
| 127 if (mnt_) { |
| 128 mnt_->ReleaseNode(node_); |
| 129 delete mnt_; |
| 130 } |
| 131 } |
| 132 |
| 133 void MountHtml5FsNodeTest::SetUpNodeExpectations() { |
| 109 // Open. | 134 // Open. |
| 110 EXPECT_CALL(*fileref_, Create(filesystem_resource_, StrEq(&path_[0]))) | 135 EXPECT_CALL(*fileref_, Create(filesystem_resource_, StrEq(&path_[0]))) |
| 111 .WillOnce(Return(fileref_resource_)); | 136 .WillOnce(Return(fileref_resource_)); |
| 112 EXPECT_CALL(*fileio_, Create(instance_)).WillOnce(Return(fileio_resource_)); | 137 EXPECT_CALL(*fileio_, Create(instance_)).WillOnce(Return(fileio_resource_)); |
| 113 int32_t open_flags = PP_FILEOPENFLAG_READ | PP_FILEOPENFLAG_WRITE | | 138 int32_t open_flags = PP_FILEOPENFLAG_READ | PP_FILEOPENFLAG_WRITE | |
| 114 PP_FILEOPENFLAG_CREATE; | 139 PP_FILEOPENFLAG_CREATE; |
| 115 EXPECT_CALL(*fileio_, | 140 EXPECT_CALL(*fileio_, |
| 116 Open(fileio_resource_, fileref_resource_, open_flags, _)) | 141 Open(fileio_resource_, fileref_resource_, open_flags, _)) |
| 117 .WillOnce(Return(int32_t(PP_OK))); | 142 .WillOnce(Return(int32_t(PP_OK))); |
| 118 | 143 |
| 119 // Close. | 144 // Close. |
| 120 EXPECT_CALL(*fileio_, Close(fileio_resource_)); | 145 EXPECT_CALL(*fileio_, Close(fileio_resource_)); |
| 121 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource_)); | 146 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource_)); |
| 122 EXPECT_CALL(*ppapi_, ReleaseResource(fileio_resource_)); | 147 EXPECT_CALL(*ppapi_, ReleaseResource(fileio_resource_)); |
| 123 EXPECT_CALL(*fileio_, Flush(fileio_resource_, _)); | 148 EXPECT_CALL(*fileio_, Flush(fileio_resource_, _)); |
| 149 } |
| 124 | 150 |
| 151 void MountHtml5FsNodeTest::InitFilesystem() { |
| 152 StringMap_t map; |
| 153 mnt_ = new MountHtml5FsMock(map, ppapi_); |
| 154 } |
| 155 |
| 156 void MountHtml5FsNodeTest::InitNode() { |
| 125 node_ = mnt_->Open(Path(path_), O_CREAT | O_RDWR); | 157 node_ = mnt_->Open(Path(path_), O_CREAT | O_RDWR); |
| 126 ASSERT_NE((MountNode*)NULL, node_); | 158 ASSERT_NE((MountNode*)NULL, node_); |
| 127 } | 159 } |
| 128 | 160 |
| 129 void MountHtml5FsNodeTest::TearDown() { | 161 // Node test where the filesystem is opened synchronously; that is, the |
| 130 mnt_->ReleaseNode(node_); | 162 // creation of the mount blocks until the filesystem is ready. |
| 131 delete mnt_; | 163 class MountHtml5FsNodeSyncTest : public MountHtml5FsNodeTest { |
| 164 public: |
| 165 virtual void SetUp(); |
| 166 }; |
| 167 |
| 168 void MountHtml5FsNodeSyncTest::SetUp() { |
| 169 MountHtml5FsNodeTest::SetUp(); |
| 170 SetUpFilesystemExpectations(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0); |
| 171 InitFilesystem(); |
| 172 SetUpNodeExpectations(); |
| 173 InitNode(); |
| 132 } | 174 } |
| 133 | 175 |
| 134 void ReadEntriesAction(const PP_ArrayOutput& output) { | 176 void ReadEntriesAction(const PP_ArrayOutput& output) { |
| 135 const int fileref_resource_1 = 238; | 177 const int fileref_resource_1 = 238; |
| 136 const int fileref_resource_2 = 239; | 178 const int fileref_resource_2 = 239; |
| 137 | 179 |
| 138 std::vector<PP_DirectoryEntry_Dev> entries; | 180 std::vector<PP_DirectoryEntry_Dev> entries; |
| 139 PP_DirectoryEntry_Dev entry1 = { fileref_resource_1, PP_FILETYPE_REGULAR }; | 181 PP_DirectoryEntry_Dev entry1 = { fileref_resource_1, PP_FILETYPE_REGULAR }; |
| 140 PP_DirectoryEntry_Dev entry2 = { fileref_resource_2, PP_FILETYPE_REGULAR }; | 182 PP_DirectoryEntry_Dev entry2 = { fileref_resource_2, PP_FILETYPE_REGULAR }; |
| 141 entries.push_back(entry1); | 183 entries.push_back(entry1); |
| 142 entries.push_back(entry2); | 184 entries.push_back(entry2); |
| 143 | 185 |
| 144 void* dest = output.GetDataBuffer( | 186 void* dest = output.GetDataBuffer( |
| 145 output.user_data, 2, sizeof(PP_DirectoryEntry_Dev)); | 187 output.user_data, 2, sizeof(PP_DirectoryEntry_Dev)); |
| 146 memcpy(dest, &entries[0], sizeof(PP_DirectoryEntry_Dev) * 2); | 188 memcpy(dest, &entries[0], sizeof(PP_DirectoryEntry_Dev) * 2); |
| 147 } | 189 } |
| 148 | 190 |
| 191 class MountHtml5FsNodeAsyncTest : public MountHtml5FsNodeTest { |
| 192 public: |
| 193 virtual void SetUp(); |
| 194 virtual void TearDown(); |
| 195 |
| 196 private: |
| 197 static void* ThreadThunk(void* param); |
| 198 void Thread(); |
| 199 |
| 200 enum { |
| 201 STATE_INIT, |
| 202 STATE_INIT_NODE, |
| 203 STATE_INIT_NODE_FINISHED, |
| 204 } state_; |
| 205 |
| 206 pthread_t thread_; |
| 207 pthread_cond_t cond_; |
| 208 pthread_mutex_t mutex_; |
| 209 }; |
| 210 |
| 211 void MountHtml5FsNodeAsyncTest::SetUp() { |
| 212 MountHtml5FsNodeTest::SetUp(); |
| 213 |
| 214 state_ = STATE_INIT; |
| 215 |
| 216 pthread_create(&thread_, NULL, &MountHtml5FsNodeAsyncTest::ThreadThunk, this); |
| 217 pthread_mutex_init(&mutex_, NULL); |
| 218 pthread_cond_init(&cond_, NULL); |
| 219 |
| 220 // This test shows that even if the filesystem open callback happens after an |
| 221 // attempt to open a node, it still works (opening the node blocks until the |
| 222 // filesystem is ready). |
| 223 // true => asynchronous filesystem open. |
| 224 SetUpFilesystemExpectations(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0, true); |
| 225 InitFilesystem(); |
| 226 SetUpNodeExpectations(); |
| 227 |
| 228 // Signal the other thread to try opening a Node. |
| 229 pthread_mutex_lock(&mutex_); |
| 230 state_ = STATE_INIT_NODE; |
| 231 pthread_cond_signal(&cond_); |
| 232 pthread_mutex_unlock(&mutex_); |
| 233 |
| 234 // Wait for a bit... |
| 235 // TODO(binji): this will be flaky. How to test this better? |
| 236 #if defined(WIN32) |
| 237 Sleep(500); // milliseconds |
| 238 #else |
| 239 usleep(500*1000); // microseconds |
| 240 #endif |
| 241 |
| 242 // Call the filesystem open callback. |
| 243 (*open_filesystem_callback_.func)(open_filesystem_callback_.user_data, PP_OK); |
| 244 |
| 245 // Wait for the other thread to unblock and signal us. |
| 246 pthread_mutex_lock(&mutex_); |
| 247 while (state_ != STATE_INIT_NODE_FINISHED) |
| 248 pthread_cond_wait(&cond_, &mutex_); |
| 249 pthread_mutex_unlock(&mutex_); |
| 250 } |
| 251 |
| 252 void MountHtml5FsNodeAsyncTest::TearDown() { |
| 253 pthread_cond_destroy(&cond_); |
| 254 pthread_mutex_destroy(&mutex_); |
| 255 |
| 256 MountHtml5FsNodeTest::TearDown(); |
| 257 } |
| 258 |
| 259 void* MountHtml5FsNodeAsyncTest::ThreadThunk(void* param) { |
| 260 static_cast<MountHtml5FsNodeAsyncTest*>(param)->Thread(); |
| 261 return NULL; |
| 262 } |
| 263 |
| 264 void MountHtml5FsNodeAsyncTest::Thread() { |
| 265 // Wait for the "main" thread to tell us to open the Node. |
| 266 pthread_mutex_lock(&mutex_); |
| 267 while (state_ != STATE_INIT_NODE) |
| 268 pthread_cond_wait(&cond_, &mutex_); |
| 269 pthread_mutex_unlock(&mutex_); |
| 270 |
| 271 // Opening the node blocks until the filesystem is open... |
| 272 InitNode(); |
| 273 |
| 274 // Signal the "main" thread to tell it we're unblocked. |
| 275 pthread_mutex_lock(&mutex_); |
| 276 state_ = STATE_INIT_NODE_FINISHED; |
| 277 pthread_cond_signal(&cond_); |
| 278 pthread_mutex_unlock(&mutex_); |
| 279 } |
| 280 |
| 149 } // namespace | 281 } // namespace |
| 150 | 282 |
| 151 | 283 |
| 152 TEST_F(MountHtml5FsTest, FilesystemType) { | 284 TEST_F(MountHtml5FsTest, FilesystemType) { |
| 153 SetUpFilesystem(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 100); | 285 SetUpFilesystemExpectations(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 100); |
| 154 | 286 |
| 155 StringMap_t map; | 287 StringMap_t map; |
| 156 map["type"] = "PERSISTENT"; | 288 map["type"] = "PERSISTENT"; |
| 157 map["expected_size"] = "100"; | 289 map["expected_size"] = "100"; |
| 158 MountHtml5FsMock mnt(map, ppapi_); | 290 MountHtml5FsMock mnt(map, ppapi_); |
| 159 } | 291 } |
| 160 | 292 |
| 161 TEST_F(MountHtml5FsTest, Mkdir) { | 293 TEST_F(MountHtml5FsTest, Mkdir) { |
| 162 const char path[] = "/foo"; | 294 const char path[] = "/foo"; |
| 163 const PP_Resource fileref_resource = 235; | 295 const PP_Resource fileref_resource = 235; |
| 164 | 296 |
| 165 // These are the default values. | 297 // These are the default values. |
| 166 SetUpFilesystem(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0); | 298 SetUpFilesystemExpectations(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0); |
| 167 | 299 |
| 168 FileRefInterfaceMock* fileref = ppapi_->GetFileRefInterface(); | 300 FileRefInterfaceMock* fileref = ppapi_->GetFileRefInterface(); |
| 169 | 301 |
| 170 EXPECT_CALL(*fileref, Create(filesystem_resource_, StrEq(&path[0]))) | 302 EXPECT_CALL(*fileref, Create(filesystem_resource_, StrEq(&path[0]))) |
| 171 .WillOnce(Return(fileref_resource)); | 303 .WillOnce(Return(fileref_resource)); |
| 172 EXPECT_CALL(*fileref, MakeDirectory(fileref_resource, _, _)) | 304 EXPECT_CALL(*fileref, MakeDirectory(fileref_resource, _, _)) |
| 173 .WillOnce(Return(int32_t(PP_OK))); | 305 .WillOnce(Return(int32_t(PP_OK))); |
| 174 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource)); | 306 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource)); |
| 175 | 307 |
| 176 StringMap_t map; | 308 StringMap_t map; |
| 177 MountHtml5FsMock mnt(map, ppapi_); | 309 MountHtml5FsMock mnt(map, ppapi_); |
| 178 | 310 |
| 179 const int permissions = 0; // unused. | 311 const int permissions = 0; // unused. |
| 180 int32_t result = mnt.Mkdir(Path(path), permissions); | 312 int32_t result = mnt.Mkdir(Path(path), permissions); |
| 181 ASSERT_EQ(0, result); | 313 ASSERT_EQ(0, result); |
| 182 } | 314 } |
| 183 | 315 |
| 184 TEST_F(MountHtml5FsTest, Remove) { | 316 TEST_F(MountHtml5FsTest, Remove) { |
| 185 const char path[] = "/foo"; | 317 const char path[] = "/foo"; |
| 186 const PP_Resource fileref_resource = 235; | 318 const PP_Resource fileref_resource = 235; |
| 187 | 319 |
| 188 // These are the default values. | 320 // These are the default values. |
| 189 SetUpFilesystem(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0); | 321 SetUpFilesystemExpectations(PP_FILESYSTEMTYPE_LOCALPERSISTENT, 0); |
| 190 | 322 |
| 191 FileRefInterfaceMock* fileref = ppapi_->GetFileRefInterface(); | 323 FileRefInterfaceMock* fileref = ppapi_->GetFileRefInterface(); |
| 192 | 324 |
| 193 EXPECT_CALL(*fileref, Create(filesystem_resource_, StrEq(&path[0]))) | 325 EXPECT_CALL(*fileref, Create(filesystem_resource_, StrEq(&path[0]))) |
| 194 .WillOnce(Return(fileref_resource)); | 326 .WillOnce(Return(fileref_resource)); |
| 195 EXPECT_CALL(*fileref, Delete(fileref_resource, _)) | 327 EXPECT_CALL(*fileref, Delete(fileref_resource, _)) |
| 196 .WillOnce(Return(int32_t(PP_OK))); | 328 .WillOnce(Return(int32_t(PP_OK))); |
| 197 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource)); | 329 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource)); |
| 198 | 330 |
| 199 StringMap_t map; | 331 StringMap_t map; |
| 200 MountHtml5FsMock mnt(map, ppapi_); | 332 MountHtml5FsMock mnt(map, ppapi_); |
| 201 | 333 |
| 202 int32_t result = mnt.Remove(Path(path)); | 334 int32_t result = mnt.Remove(Path(path)); |
| 203 ASSERT_EQ(0, result); | 335 ASSERT_EQ(0, result); |
| 204 } | 336 } |
| 205 | 337 |
| 206 TEST_F(MountHtml5FsNodeTest, OpenAndClose) { | 338 TEST_F(MountHtml5FsNodeAsyncTest, AsyncFilesystemOpen) { |
| 207 } | 339 } |
| 208 | 340 |
| 209 TEST_F(MountHtml5FsNodeTest, Write) { | 341 TEST_F(MountHtml5FsNodeSyncTest, OpenAndClose) { |
| 342 } |
| 343 |
| 344 TEST_F(MountHtml5FsNodeSyncTest, Write) { |
| 210 const int offset = 10; | 345 const int offset = 10; |
| 211 const int count = 20; | 346 const int count = 20; |
| 212 const char buffer[30] = {0}; | 347 const char buffer[30] = {0}; |
| 213 | 348 |
| 214 EXPECT_CALL(*fileio_, Write(fileio_resource_, offset, &buffer[0], count, _)) | 349 EXPECT_CALL(*fileio_, Write(fileio_resource_, offset, &buffer[0], count, _)) |
| 215 .WillOnce(Return(count)); | 350 .WillOnce(Return(count)); |
| 216 | 351 |
| 217 int result = node_->Write(offset, &buffer, count); | 352 int result = node_->Write(offset, &buffer, count); |
| 218 EXPECT_EQ(count, result); | 353 EXPECT_EQ(count, result); |
| 219 } | 354 } |
| 220 | 355 |
| 221 TEST_F(MountHtml5FsNodeTest, Read) { | 356 TEST_F(MountHtml5FsNodeSyncTest, Read) { |
| 222 const int offset = 10; | 357 const int offset = 10; |
| 223 const int count = 20; | 358 const int count = 20; |
| 224 char buffer[30] = {0}; | 359 char buffer[30] = {0}; |
| 225 | 360 |
| 226 EXPECT_CALL(*fileio_, Read(fileio_resource_, offset, &buffer[0], count, _)) | 361 EXPECT_CALL(*fileio_, Read(fileio_resource_, offset, &buffer[0], count, _)) |
| 227 .WillOnce(Return(count)); | 362 .WillOnce(Return(count)); |
| 228 | 363 |
| 229 int result = node_->Read(offset, &buffer, count); | 364 int result = node_->Read(offset, &buffer, count); |
| 230 EXPECT_EQ(count, result); | 365 EXPECT_EQ(count, result); |
| 231 } | 366 } |
| 232 | 367 |
| 233 TEST_F(MountHtml5FsNodeTest, GetStat) { | 368 TEST_F(MountHtml5FsNodeSyncTest, GetStat) { |
| 234 const int size = 123; | 369 const int size = 123; |
| 235 const int creation_time = 1000; | 370 const int creation_time = 1000; |
| 236 const int access_time = 2000; | 371 const int access_time = 2000; |
| 237 const int modified_time = 3000; | 372 const int modified_time = 3000; |
| 238 | 373 |
| 239 PP_FileInfo info; | 374 PP_FileInfo info; |
| 240 info.size = size; | 375 info.size = size; |
| 241 info.type = PP_FILETYPE_REGULAR; | 376 info.type = PP_FILETYPE_REGULAR; |
| 242 info.system_type = PP_FILESYSTEMTYPE_LOCALPERSISTENT; | 377 info.system_type = PP_FILESYSTEMTYPE_LOCALPERSISTENT; |
| 243 info.creation_time = creation_time; | 378 info.creation_time = creation_time; |
| 244 info.last_access_time = access_time; | 379 info.last_access_time = access_time; |
| 245 info.last_modified_time = modified_time; | 380 info.last_modified_time = modified_time; |
| 246 | 381 |
| 247 EXPECT_CALL(*fileio_, Query(fileio_resource_, _, _)) | 382 EXPECT_CALL(*fileio_, Query(fileio_resource_, _, _)) |
| 248 .WillOnce(DoAll(SetArgPointee<1>(info), | 383 .WillOnce(DoAll(SetArgPointee<1>(info), |
| 249 Return(int32_t(PP_OK)))); | 384 Return(int32_t(PP_OK)))); |
| 250 | 385 |
| 251 struct stat statbuf; | 386 struct stat statbuf; |
| 252 int result = node_->GetStat(&statbuf); | 387 int result = node_->GetStat(&statbuf); |
| 253 | 388 |
| 254 EXPECT_EQ(0, result); | 389 EXPECT_EQ(0, result); |
| 255 EXPECT_EQ(S_IFREG | S_IWRITE | S_IREAD, statbuf.st_mode); | 390 EXPECT_EQ(S_IFREG | S_IWRITE | S_IREAD, statbuf.st_mode); |
| 256 EXPECT_EQ(size, statbuf.st_size); | 391 EXPECT_EQ(size, statbuf.st_size); |
| 257 EXPECT_EQ(access_time, statbuf.st_atime); | 392 EXPECT_EQ(access_time, statbuf.st_atime); |
| 258 EXPECT_EQ(modified_time, statbuf.st_mtime); | 393 EXPECT_EQ(modified_time, statbuf.st_mtime); |
| 259 EXPECT_EQ(creation_time, statbuf.st_ctime); | 394 EXPECT_EQ(creation_time, statbuf.st_ctime); |
| 260 } | 395 } |
| 261 | 396 |
| 262 TEST_F(MountHtml5FsNodeTest, Truncate) { | 397 TEST_F(MountHtml5FsNodeSyncTest, Truncate) { |
| 263 const int size = 123; | 398 const int size = 123; |
| 264 EXPECT_CALL(*fileio_, SetLength(fileio_resource_, size, _)) | 399 EXPECT_CALL(*fileio_, SetLength(fileio_resource_, size, _)) |
| 265 .WillOnce(Return(int32_t(PP_OK))); | 400 .WillOnce(Return(int32_t(PP_OK))); |
| 266 | 401 |
| 267 int result = node_->Truncate(size); | 402 int result = node_->Truncate(size); |
| 268 EXPECT_EQ(0, result); | 403 EXPECT_EQ(0, result); |
| 269 } | 404 } |
| 270 | 405 |
| 271 TEST_F(MountHtml5FsNodeTest, GetDents) { | 406 TEST_F(MountHtml5FsNodeSyncTest, GetDents) { |
| 272 const int dir_reader_resource = 237; | 407 const int dir_reader_resource = 237; |
| 273 const int fileref_resource_1 = 238; | 408 const int fileref_resource_1 = 238; |
| 274 const int fileref_resource_2 = 239; | 409 const int fileref_resource_2 = 239; |
| 275 | 410 |
| 276 const int fileref_name_id_1 = 240; | 411 const int fileref_name_id_1 = 240; |
| 277 const char fileref_name_cstr_1[] = "bar"; | 412 const char fileref_name_cstr_1[] = "bar"; |
| 278 PP_Var fileref_name_1; | 413 PP_Var fileref_name_1; |
| 279 fileref_name_1.type = PP_VARTYPE_STRING; | 414 fileref_name_1.type = PP_VARTYPE_STRING; |
| 280 fileref_name_1.value.as_id = fileref_name_id_1; | 415 fileref_name_1.value.as_id = fileref_name_id_1; |
| 281 | 416 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 310 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource_2)); | 445 EXPECT_CALL(*ppapi_, ReleaseResource(fileref_resource_2)); |
| 311 | 446 |
| 312 struct dirent dirents[2]; | 447 struct dirent dirents[2]; |
| 313 memset(&dirents[0], 0, sizeof(dirents)); | 448 memset(&dirents[0], 0, sizeof(dirents)); |
| 314 int result = node_->GetDents(0, &dirents[0], sizeof(dirent) * 2); | 449 int result = node_->GetDents(0, &dirents[0], sizeof(dirent) * 2); |
| 315 | 450 |
| 316 EXPECT_EQ(0, result); | 451 EXPECT_EQ(0, result); |
| 317 EXPECT_STREQ(&fileref_name_cstr_1[0], &dirents[0].d_name[0]); | 452 EXPECT_STREQ(&fileref_name_cstr_1[0], &dirents[0].d_name[0]); |
| 318 EXPECT_STREQ(&fileref_name_cstr_2[0], &dirents[1].d_name[0]); | 453 EXPECT_STREQ(&fileref_name_cstr_2[0], &dirents[1].d_name[0]); |
| 319 } | 454 } |
| OLD | NEW |