OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/chromeos/file_system_provider/provided_file_system.h" | 5 #include "chrome/browser/chromeos/file_system_provider/provided_file_system.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/memory/scoped_vector.h" | 13 #include "base/memory/scoped_vector.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "base/thread_task_runner_handle.h" | 15 #include "base/thread_task_runner_handle.h" |
16 #include "base/values.h" | 16 #include "base/values.h" |
17 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" | 17 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" |
18 #include "chrome/browser/chromeos/file_system_provider/notification_manager.h" | 18 #include "chrome/browser/chromeos/file_system_provider/notification_manager.h" |
19 #include "chrome/browser/chromeos/file_system_provider/observed_entry.h" | |
20 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info
.h" | 19 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info
.h" |
21 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_inte
rface.h" | 20 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_inte
rface.h" |
22 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_obse
rver.h" | 21 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_obse
rver.h" |
23 #include "chrome/browser/chromeos/file_system_provider/request_manager.h" | 22 #include "chrome/browser/chromeos/file_system_provider/request_manager.h" |
| 23 #include "chrome/browser/chromeos/file_system_provider/watcher.h" |
24 #include "chrome/common/extensions/api/file_system_provider.h" | 24 #include "chrome/common/extensions/api/file_system_provider.h" |
25 #include "chrome/common/extensions/api/file_system_provider_internal.h" | 25 #include "chrome/common/extensions/api/file_system_provider_internal.h" |
26 #include "chrome/test/base/testing_profile.h" | 26 #include "chrome/test/base/testing_profile.h" |
27 #include "content/public/test/test_browser_thread_bundle.h" | 27 #include "content/public/test/test_browser_thread_bundle.h" |
28 #include "extensions/browser/event_router.h" | 28 #include "extensions/browser/event_router.h" |
29 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
30 | 30 |
31 namespace chromeos { | 31 namespace chromeos { |
32 namespace file_system_provider { | 32 namespace file_system_provider { |
33 namespace { | 33 namespace { |
(...skipping 24 matching lines...) Expand all Loading... |
58 const std::string& extension_id, | 58 const std::string& extension_id, |
59 scoped_ptr<extensions::Event> event) override { | 59 scoped_ptr<extensions::Event> event) override { |
60 ASSERT_TRUE(file_system_); | 60 ASSERT_TRUE(file_system_); |
61 std::string file_system_id; | 61 std::string file_system_id; |
62 const base::DictionaryValue* dictionary_value = NULL; | 62 const base::DictionaryValue* dictionary_value = NULL; |
63 ASSERT_TRUE(event->event_args->GetDictionary(0, &dictionary_value)); | 63 ASSERT_TRUE(event->event_args->GetDictionary(0, &dictionary_value)); |
64 EXPECT_TRUE(dictionary_value->GetString("fileSystemId", &file_system_id)); | 64 EXPECT_TRUE(dictionary_value->GetString("fileSystemId", &file_system_id)); |
65 EXPECT_EQ(kFileSystemId, file_system_id); | 65 EXPECT_EQ(kFileSystemId, file_system_id); |
66 int request_id = -1; | 66 int request_id = -1; |
67 EXPECT_TRUE(dictionary_value->GetInteger("requestId", &request_id)); | 67 EXPECT_TRUE(dictionary_value->GetInteger("requestId", &request_id)); |
68 EXPECT_TRUE(event->event_name == | 68 EXPECT_TRUE(event->event_name == extensions::api::file_system_provider:: |
69 extensions::api::file_system_provider:: | 69 OnAddWatcherRequested::kEventName || |
70 OnObserveDirectoryRequested::kEventName || | |
71 event->event_name == extensions::api::file_system_provider:: | 70 event->event_name == extensions::api::file_system_provider:: |
72 OnUnobserveEntryRequested::kEventName); | 71 OnRemoveWatcherRequested::kEventName); |
73 | 72 |
74 if (reply_result_ == base::File::FILE_OK) { | 73 if (reply_result_ == base::File::FILE_OK) { |
75 base::ListValue value_as_list; | 74 base::ListValue value_as_list; |
76 value_as_list.Set(0, new base::StringValue(kFileSystemId)); | 75 value_as_list.Set(0, new base::StringValue(kFileSystemId)); |
77 value_as_list.Set(1, new base::FundamentalValue(request_id)); | 76 value_as_list.Set(1, new base::FundamentalValue(request_id)); |
78 value_as_list.Set(2, new base::FundamentalValue(0) /* execution_time */); | 77 value_as_list.Set(2, new base::FundamentalValue(0) /* execution_time */); |
79 | 78 |
80 using extensions::api::file_system_provider_internal:: | 79 using extensions::api::file_system_provider_internal:: |
81 OperationRequestedSuccess::Params; | 80 OperationRequestedSuccess::Params; |
82 scoped_ptr<Params> params(Params::Create(value_as_list)); | 81 scoped_ptr<Params> params(Params::Create(value_as_list)); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 private: | 118 private: |
120 const ProvidedFileSystemObserver::ChangeType change_type_; | 119 const ProvidedFileSystemObserver::ChangeType change_type_; |
121 const ProvidedFileSystemObserver::Changes changes_; | 120 const ProvidedFileSystemObserver::Changes changes_; |
122 | 121 |
123 DISALLOW_COPY_AND_ASSIGN(ChangeEvent); | 122 DISALLOW_COPY_AND_ASSIGN(ChangeEvent); |
124 }; | 123 }; |
125 | 124 |
126 Observer() : list_changed_counter_(0), tag_updated_counter_(0) {} | 125 Observer() : list_changed_counter_(0), tag_updated_counter_(0) {} |
127 | 126 |
128 // ProvidedFileSystemInterfaceObserver overrides. | 127 // ProvidedFileSystemInterfaceObserver overrides. |
129 virtual void OnObservedEntryChanged( | 128 virtual void OnWatcherChanged( |
130 const ProvidedFileSystemInfo& file_system_info, | 129 const ProvidedFileSystemInfo& file_system_info, |
131 const ObservedEntry& observed_entry, | 130 const Watcher& watcher, |
132 ProvidedFileSystemObserver::ChangeType change_type, | 131 ProvidedFileSystemObserver::ChangeType change_type, |
133 const ProvidedFileSystemObserver::Changes& changes, | 132 const ProvidedFileSystemObserver::Changes& changes, |
134 const base::Closure& callback) override { | 133 const base::Closure& callback) override { |
135 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); | 134 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); |
136 change_events_.push_back(new ChangeEvent(change_type, changes)); | 135 change_events_.push_back(new ChangeEvent(change_type, changes)); |
137 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 136 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
138 } | 137 } |
139 | 138 |
140 virtual void OnObservedEntryTagUpdated( | 139 virtual void OnWatcherTagUpdated( |
141 const ProvidedFileSystemInfo& file_system_info, | 140 const ProvidedFileSystemInfo& file_system_info, |
142 const ObservedEntry& observed_entry) override { | 141 const Watcher& watcher) override { |
143 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); | 142 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); |
144 ++tag_updated_counter_; | 143 ++tag_updated_counter_; |
145 } | 144 } |
146 | 145 |
147 virtual void OnObservedEntryListChanged( | 146 virtual void OnWatcherListChanged( |
148 const ProvidedFileSystemInfo& file_system_info, | 147 const ProvidedFileSystemInfo& file_system_info, |
149 const ObservedEntries& observed_entries) override { | 148 const Watchers& watchers) override { |
150 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); | 149 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); |
151 ++list_changed_counter_; | 150 ++list_changed_counter_; |
152 } | 151 } |
153 | 152 |
154 int list_changed_counter() const { return list_changed_counter_; } | 153 int list_changed_counter() const { return list_changed_counter_; } |
155 const ScopedVector<ChangeEvent>& change_events() const { | 154 const ScopedVector<ChangeEvent>& change_events() const { |
156 return change_events_; | 155 return change_events_; |
157 } | 156 } |
158 int tag_updated_counter() const { return tag_updated_counter_; } | 157 int tag_updated_counter() const { return tag_updated_counter_; } |
159 | 158 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 mount_options.file_system_id = kFileSystemId; | 202 mount_options.file_system_id = kFileSystemId; |
204 mount_options.display_name = kDisplayName; | 203 mount_options.display_name = kDisplayName; |
205 mount_options.supports_notify_tag = true; | 204 mount_options.supports_notify_tag = true; |
206 file_system_info_.reset( | 205 file_system_info_.reset( |
207 new ProvidedFileSystemInfo(kExtensionId, mount_options, mount_path)); | 206 new ProvidedFileSystemInfo(kExtensionId, mount_options, mount_path)); |
208 provided_file_system_.reset( | 207 provided_file_system_.reset( |
209 new ProvidedFileSystem(profile_.get(), *file_system_info_.get())); | 208 new ProvidedFileSystem(profile_.get(), *file_system_info_.get())); |
210 event_router_.reset( | 209 event_router_.reset( |
211 new FakeEventRouter(profile_.get(), provided_file_system_.get())); | 210 new FakeEventRouter(profile_.get(), provided_file_system_.get())); |
212 event_router_->AddEventListener(extensions::api::file_system_provider:: | 211 event_router_->AddEventListener(extensions::api::file_system_provider:: |
213 OnObserveDirectoryRequested::kEventName, | 212 OnAddWatcherRequested::kEventName, |
214 NULL, | 213 NULL, |
215 kExtensionId); | 214 kExtensionId); |
216 event_router_->AddEventListener(extensions::api::file_system_provider:: | 215 event_router_->AddEventListener(extensions::api::file_system_provider:: |
217 OnUnobserveEntryRequested::kEventName, | 216 OnRemoveWatcherRequested::kEventName, |
218 NULL, | 217 NULL, |
219 kExtensionId); | 218 kExtensionId); |
220 provided_file_system_->SetEventRouterForTesting(event_router_.get()); | 219 provided_file_system_->SetEventRouterForTesting(event_router_.get()); |
221 provided_file_system_->SetNotificationManagerForTesting( | 220 provided_file_system_->SetNotificationManagerForTesting( |
222 make_scoped_ptr(new StubNotificationManager)); | 221 make_scoped_ptr(new StubNotificationManager)); |
223 } | 222 } |
224 | 223 |
225 content::TestBrowserThreadBundle thread_bundle_; | 224 content::TestBrowserThreadBundle thread_bundle_; |
226 scoped_ptr<TestingProfile> profile_; | 225 scoped_ptr<TestingProfile> profile_; |
227 scoped_ptr<FakeEventRouter> event_router_; | 226 scoped_ptr<FakeEventRouter> event_router_; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 base::Bind(&LogStatus, base::Unretained(&log), base::File::FILE_OK))); | 271 base::Bind(&LogStatus, base::Unretained(&log), base::File::FILE_OK))); |
273 base::Closure callback = auto_updater->CreateCallback(); | 272 base::Closure callback = auto_updater->CreateCallback(); |
274 // The callback gets out of scope, so the ref counted auto updater instance | 273 // The callback gets out of scope, so the ref counted auto updater instance |
275 // gets deleted. Still, updating shouldn't be invoked, since the callback | 274 // gets deleted. Still, updating shouldn't be invoked, since the callback |
276 // wasn't executed. | 275 // wasn't executed. |
277 } | 276 } |
278 base::RunLoop().RunUntilIdle(); | 277 base::RunLoop().RunUntilIdle(); |
279 EXPECT_EQ(0u, log.size()); | 278 EXPECT_EQ(0u, log.size()); |
280 } | 279 } |
281 | 280 |
282 TEST_F(FileSystemProviderProvidedFileSystemTest, ObserveDirectory_NotFound) { | 281 TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_NotFound) { |
283 Log log; | 282 Log log; |
284 Observer observer; | 283 Observer observer; |
285 | 284 |
286 provided_file_system_->AddObserver(&observer); | 285 provided_file_system_->AddObserver(&observer); |
287 | 286 |
288 // First, set the extension response to an error. | 287 // First, set the extension response to an error. |
289 event_router_->set_reply_result(base::File::FILE_ERROR_NOT_FOUND); | 288 event_router_->set_reply_result(base::File::FILE_ERROR_NOT_FOUND); |
290 | 289 |
291 provided_file_system_->ObserveDirectory( | 290 provided_file_system_->AddWatcher( |
292 GURL(kOrigin), | 291 GURL(kOrigin), |
293 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 292 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
294 false /* recursive */, | 293 false /* recursive */, |
295 false /* persistent */, | 294 false /* persistent */, |
296 base::Bind(&LogStatus, base::Unretained(&log))); | 295 base::Bind(&LogStatus, base::Unretained(&log))); |
297 base::RunLoop().RunUntilIdle(); | 296 base::RunLoop().RunUntilIdle(); |
298 | 297 |
299 // The directory should not become observed because of an error. | 298 // The directory should not become watched because of an error. |
300 ASSERT_EQ(1u, log.size()); | 299 ASSERT_EQ(1u, log.size()); |
301 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); | 300 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); |
302 | 301 |
303 ObservedEntries* const observed_entries = | 302 Watchers* const watchers = provided_file_system_->GetWatchers(); |
304 provided_file_system_->GetObservedEntries(); | 303 EXPECT_EQ(0u, watchers->size()); |
305 EXPECT_EQ(0u, observed_entries->size()); | |
306 | 304 |
307 // The observer should not be called. | 305 // The observer should not be called. |
308 EXPECT_EQ(0, observer.list_changed_counter()); | 306 EXPECT_EQ(0, observer.list_changed_counter()); |
309 EXPECT_EQ(0, observer.tag_updated_counter()); | 307 EXPECT_EQ(0, observer.tag_updated_counter()); |
310 | 308 |
311 provided_file_system_->RemoveObserver(&observer); | 309 provided_file_system_->RemoveObserver(&observer); |
312 } | 310 } |
313 | 311 |
314 TEST_F(FileSystemProviderProvidedFileSystemTest, ObserveDirectory) { | 312 TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher) { |
315 Log log; | 313 Log log; |
316 Observer observer; | 314 Observer observer; |
317 | 315 |
318 provided_file_system_->AddObserver(&observer); | 316 provided_file_system_->AddObserver(&observer); |
319 | 317 |
320 provided_file_system_->ObserveDirectory( | 318 provided_file_system_->AddWatcher( |
321 GURL(kOrigin), | 319 GURL(kOrigin), |
322 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 320 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
323 false /* recursive */, | 321 false /* recursive */, |
324 true /* persistent */, | 322 true /* persistent */, |
325 base::Bind(&LogStatus, base::Unretained(&log))); | 323 base::Bind(&LogStatus, base::Unretained(&log))); |
326 base::RunLoop().RunUntilIdle(); | 324 base::RunLoop().RunUntilIdle(); |
327 | 325 |
328 ASSERT_EQ(1u, log.size()); | 326 ASSERT_EQ(1u, log.size()); |
329 EXPECT_EQ(base::File::FILE_OK, log[0]); | 327 EXPECT_EQ(base::File::FILE_OK, log[0]); |
330 EXPECT_EQ(1, observer.list_changed_counter()); | 328 EXPECT_EQ(1, observer.list_changed_counter()); |
331 EXPECT_EQ(0, observer.tag_updated_counter()); | 329 EXPECT_EQ(0, observer.tag_updated_counter()); |
332 | 330 |
333 ObservedEntries* const observed_entries = | 331 Watchers* const watchers = provided_file_system_->GetWatchers(); |
334 provided_file_system_->GetObservedEntries(); | 332 ASSERT_EQ(1u, watchers->size()); |
335 ASSERT_EQ(1u, observed_entries->size()); | 333 const Watcher& watcher = watchers->begin()->second; |
336 const ObservedEntry& observed_entry = observed_entries->begin()->second; | 334 EXPECT_EQ(FILE_PATH_LITERAL(kDirectoryPath), watcher.entry_path.value()); |
337 EXPECT_EQ(FILE_PATH_LITERAL(kDirectoryPath), | 335 EXPECT_FALSE(watcher.recursive); |
338 observed_entry.entry_path.value()); | 336 EXPECT_EQ("", watcher.last_tag); |
339 EXPECT_FALSE(observed_entry.recursive); | |
340 EXPECT_EQ("", observed_entry.last_tag); | |
341 | 337 |
342 provided_file_system_->RemoveObserver(&observer); | 338 provided_file_system_->RemoveObserver(&observer); |
343 } | 339 } |
344 | 340 |
345 TEST_F(FileSystemProviderProvidedFileSystemTest, | 341 TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_PersistentIllegal) { |
346 ObserveDirectory_PersistentIllegal) { | |
347 Log log; | 342 Log log; |
348 Observer observer; | 343 Observer observer; |
349 | 344 |
350 // Create a provided file system interface, which does not support a notify | 345 // Create a provided file system interface, which does not support a notify |
351 // tag, though. | 346 // tag, though. |
352 const base::FilePath mount_path = | 347 const base::FilePath mount_path = |
353 util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); | 348 util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); |
354 MountOptions mount_options; | 349 MountOptions mount_options; |
355 mount_options.file_system_id = kFileSystemId; | 350 mount_options.file_system_id = kFileSystemId; |
356 mount_options.display_name = kDisplayName; | 351 mount_options.display_name = kDisplayName; |
357 mount_options.supports_notify_tag = false; | 352 mount_options.supports_notify_tag = false; |
358 ProvidedFileSystemInfo file_system_info( | 353 ProvidedFileSystemInfo file_system_info( |
359 kExtensionId, mount_options, mount_path); | 354 kExtensionId, mount_options, mount_path); |
360 ProvidedFileSystem simple_provided_file_system(profile_.get(), | 355 ProvidedFileSystem simple_provided_file_system(profile_.get(), |
361 file_system_info); | 356 file_system_info); |
362 simple_provided_file_system.SetEventRouterForTesting(event_router_.get()); | 357 simple_provided_file_system.SetEventRouterForTesting(event_router_.get()); |
363 simple_provided_file_system.SetNotificationManagerForTesting( | 358 simple_provided_file_system.SetNotificationManagerForTesting( |
364 make_scoped_ptr(new StubNotificationManager)); | 359 make_scoped_ptr(new StubNotificationManager)); |
365 | 360 |
366 simple_provided_file_system.AddObserver(&observer); | 361 simple_provided_file_system.AddObserver(&observer); |
367 | 362 |
368 simple_provided_file_system.ObserveDirectory( | 363 simple_provided_file_system.AddWatcher( |
369 GURL(kOrigin), | 364 GURL(kOrigin), |
370 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 365 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
371 false /* recursive */, | 366 false /* recursive */, |
372 true /* persistent */, | 367 true /* persistent */, |
373 base::Bind(&LogStatus, base::Unretained(&log))); | 368 base::Bind(&LogStatus, base::Unretained(&log))); |
374 base::RunLoop().RunUntilIdle(); | 369 base::RunLoop().RunUntilIdle(); |
375 | 370 |
376 ASSERT_EQ(1u, log.size()); | 371 ASSERT_EQ(1u, log.size()); |
377 EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]); | 372 EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]); |
378 EXPECT_EQ(0, observer.list_changed_counter()); | 373 EXPECT_EQ(0, observer.list_changed_counter()); |
379 EXPECT_EQ(0, observer.tag_updated_counter()); | 374 EXPECT_EQ(0, observer.tag_updated_counter()); |
380 | 375 |
381 simple_provided_file_system.RemoveObserver(&observer); | 376 simple_provided_file_system.RemoveObserver(&observer); |
382 } | 377 } |
383 | 378 |
384 TEST_F(FileSystemProviderProvidedFileSystemTest, ObserveDirectory_Exists) { | 379 TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_Exists) { |
385 Observer observer; | 380 Observer observer; |
386 provided_file_system_->AddObserver(&observer); | 381 provided_file_system_->AddObserver(&observer); |
387 | 382 |
388 { | 383 { |
389 // First observe a directory not recursively. | 384 // First watch a directory not recursively. |
390 Log log; | 385 Log log; |
391 provided_file_system_->ObserveDirectory( | 386 provided_file_system_->AddWatcher( |
392 GURL(kOrigin), | 387 GURL(kOrigin), |
393 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 388 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
394 false /* recursive */, | 389 false /* recursive */, |
395 true /* persistent */, | 390 true /* persistent */, |
396 base::Bind(&LogStatus, base::Unretained(&log))); | 391 base::Bind(&LogStatus, base::Unretained(&log))); |
397 base::RunLoop().RunUntilIdle(); | 392 base::RunLoop().RunUntilIdle(); |
398 | 393 |
399 ASSERT_EQ(1u, log.size()); | 394 ASSERT_EQ(1u, log.size()); |
400 EXPECT_EQ(base::File::FILE_OK, log[0]); | 395 EXPECT_EQ(base::File::FILE_OK, log[0]); |
401 EXPECT_EQ(1, observer.list_changed_counter()); | 396 EXPECT_EQ(1, observer.list_changed_counter()); |
402 EXPECT_EQ(0, observer.tag_updated_counter()); | 397 EXPECT_EQ(0, observer.tag_updated_counter()); |
403 | 398 |
404 ObservedEntries* const observed_entries = | 399 Watchers* const watchers = provided_file_system_->GetWatchers(); |
405 provided_file_system_->GetObservedEntries(); | 400 ASSERT_TRUE(watchers); |
406 ASSERT_TRUE(observed_entries); | 401 ASSERT_EQ(1u, watchers->size()); |
407 ASSERT_EQ(1u, observed_entries->size()); | 402 const auto& watcher_it = watchers->find( |
408 const auto& observed_entry_it = observed_entries->find( | 403 WatcherKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), |
409 ObservedEntryKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), | 404 false /* recursive */)); |
410 false /* recursive */)); | 405 ASSERT_NE(watchers->end(), watcher_it); |
411 ASSERT_NE(observed_entries->end(), observed_entry_it); | |
412 | 406 |
413 EXPECT_EQ(1u, observed_entry_it->second.subscribers.size()); | 407 EXPECT_EQ(1u, watcher_it->second.subscribers.size()); |
414 const auto& subscriber_it = | 408 const auto& subscriber_it = |
415 observed_entry_it->second.subscribers.find(GURL(kOrigin)); | 409 watcher_it->second.subscribers.find(GURL(kOrigin)); |
416 ASSERT_NE(observed_entry_it->second.subscribers.end(), subscriber_it); | 410 ASSERT_NE(watcher_it->second.subscribers.end(), subscriber_it); |
417 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); | 411 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); |
418 EXPECT_TRUE(subscriber_it->second.persistent); | 412 EXPECT_TRUE(subscriber_it->second.persistent); |
419 } | 413 } |
420 | 414 |
421 { | 415 { |
422 // Create another non-recursive observer. That should fail. | 416 // Create another non-recursive observer. That should fail. |
423 Log log; | 417 Log log; |
424 provided_file_system_->ObserveDirectory( | 418 provided_file_system_->AddWatcher( |
425 GURL(kOrigin), | 419 GURL(kOrigin), |
426 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 420 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
427 false /* recursive */, | 421 false /* recursive */, |
428 true /* persistent */, | 422 true /* persistent */, |
429 base::Bind(&LogStatus, base::Unretained(&log))); | 423 base::Bind(&LogStatus, base::Unretained(&log))); |
430 base::RunLoop().RunUntilIdle(); | 424 base::RunLoop().RunUntilIdle(); |
431 | 425 |
432 ASSERT_EQ(1u, log.size()); | 426 ASSERT_EQ(1u, log.size()); |
433 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, log[0]); | 427 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, log[0]); |
434 EXPECT_EQ(1, observer.list_changed_counter()); // No changes on the list. | 428 EXPECT_EQ(1, observer.list_changed_counter()); // No changes on the list. |
435 EXPECT_EQ(0, observer.tag_updated_counter()); | 429 EXPECT_EQ(0, observer.tag_updated_counter()); |
436 } | 430 } |
437 | 431 |
438 { | 432 { |
439 // Lastly, create another recursive observer. That should succeed. | 433 // Lastly, create another recursive observer. That should succeed. |
440 Log log; | 434 Log log; |
441 provided_file_system_->ObserveDirectory( | 435 provided_file_system_->AddWatcher( |
442 GURL(kOrigin), | 436 GURL(kOrigin), |
443 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 437 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
444 true /* recursive */, | 438 true /* recursive */, |
445 true /* persistent */, | 439 true /* persistent */, |
446 base::Bind(&LogStatus, base::Unretained(&log))); | 440 base::Bind(&LogStatus, base::Unretained(&log))); |
447 base::RunLoop().RunUntilIdle(); | 441 base::RunLoop().RunUntilIdle(); |
448 | 442 |
449 ASSERT_EQ(1u, log.size()); | 443 ASSERT_EQ(1u, log.size()); |
450 EXPECT_EQ(base::File::FILE_OK, log[0]); | 444 EXPECT_EQ(base::File::FILE_OK, log[0]); |
451 EXPECT_EQ(2, observer.list_changed_counter()); | 445 EXPECT_EQ(2, observer.list_changed_counter()); |
452 EXPECT_EQ(0, observer.tag_updated_counter()); | 446 EXPECT_EQ(0, observer.tag_updated_counter()); |
453 } | 447 } |
454 | 448 |
455 provided_file_system_->RemoveObserver(&observer); | 449 provided_file_system_->RemoveObserver(&observer); |
456 } | 450 } |
457 | 451 |
458 TEST_F(FileSystemProviderProvidedFileSystemTest, | 452 TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_MultipleOrigins) { |
459 ObserveDirectory_MultipleOrigins) { | |
460 Observer observer; | 453 Observer observer; |
461 provided_file_system_->AddObserver(&observer); | 454 provided_file_system_->AddObserver(&observer); |
462 | 455 |
463 { | 456 { |
464 // First observe a directory not recursively. | 457 // First watch a directory not recursively. |
465 Log log; | 458 Log log; |
466 provided_file_system_->ObserveDirectory( | 459 provided_file_system_->AddWatcher( |
467 GURL(kOrigin), | 460 GURL(kOrigin), |
468 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 461 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
469 false /* recursive */, | 462 false /* recursive */, |
470 false /* persistent */, | 463 false /* persistent */, |
471 base::Bind(&LogStatus, base::Unretained(&log))); | 464 base::Bind(&LogStatus, base::Unretained(&log))); |
472 base::RunLoop().RunUntilIdle(); | 465 base::RunLoop().RunUntilIdle(); |
473 | 466 |
474 ASSERT_EQ(1u, log.size()); | 467 ASSERT_EQ(1u, log.size()); |
475 EXPECT_EQ(base::File::FILE_OK, log[0]); | 468 EXPECT_EQ(base::File::FILE_OK, log[0]); |
476 EXPECT_EQ(1, observer.list_changed_counter()); | 469 EXPECT_EQ(1, observer.list_changed_counter()); |
477 EXPECT_EQ(0, observer.tag_updated_counter()); | 470 EXPECT_EQ(0, observer.tag_updated_counter()); |
478 | 471 |
479 ObservedEntries* const observed_entries = | 472 Watchers* const watchers = provided_file_system_->GetWatchers(); |
480 provided_file_system_->GetObservedEntries(); | 473 ASSERT_TRUE(watchers); |
481 ASSERT_TRUE(observed_entries); | 474 ASSERT_EQ(1u, watchers->size()); |
482 ASSERT_EQ(1u, observed_entries->size()); | 475 const auto& watcher_it = watchers->find( |
483 const auto& observed_entry_it = observed_entries->find( | 476 WatcherKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), |
484 ObservedEntryKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), | 477 false /* recursive */)); |
485 false /* recursive */)); | 478 ASSERT_NE(watchers->end(), watcher_it); |
486 ASSERT_NE(observed_entries->end(), observed_entry_it); | |
487 | 479 |
488 EXPECT_EQ(1u, observed_entry_it->second.subscribers.size()); | 480 EXPECT_EQ(1u, watcher_it->second.subscribers.size()); |
489 const auto& subscriber_it = | 481 const auto& subscriber_it = |
490 observed_entry_it->second.subscribers.find(GURL(kOrigin)); | 482 watcher_it->second.subscribers.find(GURL(kOrigin)); |
491 ASSERT_NE(observed_entry_it->second.subscribers.end(), subscriber_it); | 483 ASSERT_NE(watcher_it->second.subscribers.end(), subscriber_it); |
492 EXPECT_EQ(kOrigin, subscriber_it->first.spec()); | 484 EXPECT_EQ(kOrigin, subscriber_it->first.spec()); |
493 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); | 485 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); |
494 EXPECT_FALSE(subscriber_it->second.persistent); | 486 EXPECT_FALSE(subscriber_it->second.persistent); |
495 } | 487 } |
496 | 488 |
497 { | 489 { |
498 // Create another observer, but recursive and with a different origin. | 490 // Create another watcher, but recursive and with a different origin. |
499 Log log; | 491 Log log; |
500 provided_file_system_->ObserveDirectory( | 492 provided_file_system_->AddWatcher( |
501 GURL(kAnotherOrigin), | 493 GURL(kAnotherOrigin), |
502 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 494 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
503 true /* recursive */, | 495 true /* recursive */, |
504 true /* persistent */, | 496 true /* persistent */, |
505 base::Bind(&LogStatus, base::Unretained(&log))); | 497 base::Bind(&LogStatus, base::Unretained(&log))); |
506 base::RunLoop().RunUntilIdle(); | 498 base::RunLoop().RunUntilIdle(); |
507 | 499 |
508 ASSERT_EQ(1u, log.size()); | 500 ASSERT_EQ(1u, log.size()); |
509 EXPECT_EQ(base::File::FILE_OK, log[0]); | 501 EXPECT_EQ(base::File::FILE_OK, log[0]); |
510 EXPECT_EQ(2, observer.list_changed_counter()); | 502 EXPECT_EQ(2, observer.list_changed_counter()); |
511 EXPECT_EQ(0, observer.tag_updated_counter()); | 503 EXPECT_EQ(0, observer.tag_updated_counter()); |
512 | 504 |
513 ObservedEntries* const observed_entries = | 505 Watchers* const watchers = provided_file_system_->GetWatchers(); |
514 provided_file_system_->GetObservedEntries(); | 506 ASSERT_TRUE(watchers); |
515 ASSERT_TRUE(observed_entries); | 507 ASSERT_EQ(2u, watchers->size()); |
516 ASSERT_EQ(2u, observed_entries->size()); | 508 const auto& watcher_it = watchers->find( |
517 const auto& observed_entry_it = observed_entries->find( | 509 WatcherKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), |
518 ObservedEntryKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), | 510 false /* recursive */)); |
519 false /* recursive */)); | 511 ASSERT_NE(watchers->end(), watcher_it); |
520 ASSERT_NE(observed_entries->end(), observed_entry_it); | |
521 | 512 |
522 EXPECT_EQ(1u, observed_entry_it->second.subscribers.size()); | 513 EXPECT_EQ(1u, watcher_it->second.subscribers.size()); |
523 const auto& subscriber_it = | 514 const auto& subscriber_it = |
524 observed_entry_it->second.subscribers.find(GURL(kOrigin)); | 515 watcher_it->second.subscribers.find(GURL(kOrigin)); |
525 ASSERT_NE(observed_entry_it->second.subscribers.end(), subscriber_it); | 516 ASSERT_NE(watcher_it->second.subscribers.end(), subscriber_it); |
526 EXPECT_EQ(kOrigin, subscriber_it->first.spec()); | 517 EXPECT_EQ(kOrigin, subscriber_it->first.spec()); |
527 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); | 518 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); |
528 EXPECT_FALSE(subscriber_it->second.persistent); | 519 EXPECT_FALSE(subscriber_it->second.persistent); |
529 } | 520 } |
530 | 521 |
531 { | 522 { |
532 // Unobserve the second one gracefully. | 523 // Remove the second watcher gracefully. |
533 Log log; | 524 Log log; |
534 provided_file_system_->UnobserveEntry( | 525 provided_file_system_->RemoveWatcher( |
535 GURL(kAnotherOrigin), | 526 GURL(kAnotherOrigin), |
536 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 527 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
537 true /* recursive */, | 528 true /* recursive */, |
538 base::Bind(&LogStatus, base::Unretained(&log))); | 529 base::Bind(&LogStatus, base::Unretained(&log))); |
539 base::RunLoop().RunUntilIdle(); | 530 base::RunLoop().RunUntilIdle(); |
540 | 531 |
541 ASSERT_EQ(1u, log.size()); | 532 ASSERT_EQ(1u, log.size()); |
542 EXPECT_EQ(base::File::FILE_OK, log[0]); | 533 EXPECT_EQ(base::File::FILE_OK, log[0]); |
543 EXPECT_EQ(3, observer.list_changed_counter()); | 534 EXPECT_EQ(3, observer.list_changed_counter()); |
544 EXPECT_EQ(0, observer.tag_updated_counter()); | 535 EXPECT_EQ(0, observer.tag_updated_counter()); |
545 | 536 |
546 ObservedEntries* const observed_entries = | 537 Watchers* const watchers = provided_file_system_->GetWatchers(); |
547 provided_file_system_->GetObservedEntries(); | 538 ASSERT_TRUE(watchers); |
548 ASSERT_TRUE(observed_entries); | 539 EXPECT_EQ(1u, watchers->size()); |
549 EXPECT_EQ(1u, observed_entries->size()); | 540 const auto& watcher_it = watchers->find( |
550 const auto& observed_entry_it = observed_entries->find( | 541 WatcherKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), |
551 ObservedEntryKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), | 542 false /* recursive */)); |
552 false /* recursive */)); | 543 ASSERT_NE(watchers->end(), watcher_it); |
553 ASSERT_NE(observed_entries->end(), observed_entry_it); | |
554 | 544 |
555 EXPECT_EQ(1u, observed_entry_it->second.subscribers.size()); | 545 EXPECT_EQ(1u, watcher_it->second.subscribers.size()); |
556 const auto& subscriber_it = | 546 const auto& subscriber_it = |
557 observed_entry_it->second.subscribers.find(GURL(kOrigin)); | 547 watcher_it->second.subscribers.find(GURL(kOrigin)); |
558 ASSERT_NE(observed_entry_it->second.subscribers.end(), subscriber_it); | 548 ASSERT_NE(watcher_it->second.subscribers.end(), subscriber_it); |
559 EXPECT_EQ(kOrigin, subscriber_it->first.spec()); | 549 EXPECT_EQ(kOrigin, subscriber_it->first.spec()); |
560 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); | 550 EXPECT_EQ(kOrigin, subscriber_it->second.origin.spec()); |
561 EXPECT_FALSE(subscriber_it->second.persistent); | 551 EXPECT_FALSE(subscriber_it->second.persistent); |
562 } | 552 } |
563 | 553 |
564 provided_file_system_->RemoveObserver(&observer); | 554 provided_file_system_->RemoveObserver(&observer); |
565 } | 555 } |
566 | 556 |
567 TEST_F(FileSystemProviderProvidedFileSystemTest, UnobserveEntry) { | 557 TEST_F(FileSystemProviderProvidedFileSystemTest, RemoveWatcher) { |
568 Observer observer; | 558 Observer observer; |
569 provided_file_system_->AddObserver(&observer); | 559 provided_file_system_->AddObserver(&observer); |
570 | 560 |
571 { | 561 { |
572 // First, confirm that unobserving an entry which is not observed, results | 562 // First, confirm that removing a watcher which does not exist results in an |
573 // in an error. | 563 // error. |
574 Log log; | 564 Log log; |
575 provided_file_system_->UnobserveEntry( | 565 provided_file_system_->RemoveWatcher( |
576 GURL(kOrigin), | 566 GURL(kOrigin), |
577 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 567 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
578 false /* recursive */, | 568 false /* recursive */, |
579 base::Bind(&LogStatus, base::Unretained(&log))); | 569 base::Bind(&LogStatus, base::Unretained(&log))); |
580 base::RunLoop().RunUntilIdle(); | 570 base::RunLoop().RunUntilIdle(); |
581 | 571 |
582 ASSERT_EQ(1u, log.size()); | 572 ASSERT_EQ(1u, log.size()); |
583 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); | 573 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); |
584 EXPECT_EQ(0, observer.list_changed_counter()); | 574 EXPECT_EQ(0, observer.list_changed_counter()); |
585 EXPECT_EQ(0, observer.tag_updated_counter()); | 575 EXPECT_EQ(0, observer.tag_updated_counter()); |
586 } | 576 } |
587 | 577 |
588 { | 578 { |
589 // Observe a directory not recursively. | 579 // Watch a directory not recursively. |
590 Log log; | 580 Log log; |
591 provided_file_system_->ObserveDirectory( | 581 provided_file_system_->AddWatcher( |
592 GURL(kOrigin), | 582 GURL(kOrigin), |
593 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 583 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
594 false /* recursive */, | 584 false /* recursive */, |
595 true /* persistent */, | 585 true /* persistent */, |
596 base::Bind(&LogStatus, base::Unretained(&log))); | 586 base::Bind(&LogStatus, base::Unretained(&log))); |
597 base::RunLoop().RunUntilIdle(); | 587 base::RunLoop().RunUntilIdle(); |
598 | 588 |
599 ASSERT_EQ(1u, log.size()); | 589 ASSERT_EQ(1u, log.size()); |
600 EXPECT_EQ(base::File::FILE_OK, log[0]); | 590 EXPECT_EQ(base::File::FILE_OK, log[0]); |
601 EXPECT_EQ(1, observer.list_changed_counter()); | 591 EXPECT_EQ(1, observer.list_changed_counter()); |
602 EXPECT_EQ(0, observer.tag_updated_counter()); | 592 EXPECT_EQ(0, observer.tag_updated_counter()); |
603 | 593 |
604 ObservedEntries* const observed_entries = | 594 Watchers* const watchers = provided_file_system_->GetWatchers(); |
605 provided_file_system_->GetObservedEntries(); | 595 EXPECT_EQ(1u, watchers->size()); |
606 EXPECT_EQ(1u, observed_entries->size()); | |
607 } | 596 } |
608 | 597 |
609 { | 598 { |
610 // Unobserve it gracefully. | 599 // Remove a watcher gracefully. |
611 Log log; | 600 Log log; |
612 provided_file_system_->UnobserveEntry( | 601 provided_file_system_->RemoveWatcher( |
613 GURL(kOrigin), | 602 GURL(kOrigin), |
614 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 603 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
615 false /* recursive */, | 604 false /* recursive */, |
616 base::Bind(&LogStatus, base::Unretained(&log))); | 605 base::Bind(&LogStatus, base::Unretained(&log))); |
617 base::RunLoop().RunUntilIdle(); | 606 base::RunLoop().RunUntilIdle(); |
618 | 607 |
619 ASSERT_EQ(1u, log.size()); | 608 ASSERT_EQ(1u, log.size()); |
620 EXPECT_EQ(base::File::FILE_OK, log[0]); | 609 EXPECT_EQ(base::File::FILE_OK, log[0]); |
621 EXPECT_EQ(2, observer.list_changed_counter()); | 610 EXPECT_EQ(2, observer.list_changed_counter()); |
622 EXPECT_EQ(0, observer.tag_updated_counter()); | 611 EXPECT_EQ(0, observer.tag_updated_counter()); |
623 | 612 |
624 ObservedEntries* const observed_entries = | 613 Watchers* const watchers = provided_file_system_->GetWatchers(); |
625 provided_file_system_->GetObservedEntries(); | 614 EXPECT_EQ(0u, watchers->size()); |
626 EXPECT_EQ(0u, observed_entries->size()); | |
627 } | 615 } |
628 | 616 |
629 { | 617 { |
630 // Confirm that it's possible to observe it again. | 618 // Confirm that it's possible to watch it again. |
631 Log log; | 619 Log log; |
632 provided_file_system_->ObserveDirectory( | 620 provided_file_system_->AddWatcher( |
633 GURL(kOrigin), | 621 GURL(kOrigin), |
634 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 622 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
635 false /* recursive */, | 623 false /* recursive */, |
636 true /* persistent */, | 624 true /* persistent */, |
637 base::Bind(&LogStatus, base::Unretained(&log))); | 625 base::Bind(&LogStatus, base::Unretained(&log))); |
638 base::RunLoop().RunUntilIdle(); | 626 base::RunLoop().RunUntilIdle(); |
639 | 627 |
640 ASSERT_EQ(1u, log.size()); | 628 ASSERT_EQ(1u, log.size()); |
641 EXPECT_EQ(base::File::FILE_OK, log[0]); | 629 EXPECT_EQ(base::File::FILE_OK, log[0]); |
642 EXPECT_EQ(3, observer.list_changed_counter()); | 630 EXPECT_EQ(3, observer.list_changed_counter()); |
643 EXPECT_EQ(0, observer.tag_updated_counter()); | 631 EXPECT_EQ(0, observer.tag_updated_counter()); |
644 | 632 |
645 ObservedEntries* const observed_entries = | 633 Watchers* const watchers = provided_file_system_->GetWatchers(); |
646 provided_file_system_->GetObservedEntries(); | 634 EXPECT_EQ(1u, watchers->size()); |
647 EXPECT_EQ(1u, observed_entries->size()); | |
648 } | 635 } |
649 | 636 |
650 { | 637 { |
651 // Finally, unobserve it, but with an error from extension. That should | 638 // Finally, remove it, but with an error from extension. That should result |
652 // result in a removed observer, anyway. The error code should not be | 639 // in a removed watcher, anyway. The error code should not be passed. |
653 // passed. | |
654 event_router_->set_reply_result(base::File::FILE_ERROR_FAILED); | 640 event_router_->set_reply_result(base::File::FILE_ERROR_FAILED); |
655 | 641 |
656 Log log; | 642 Log log; |
657 provided_file_system_->UnobserveEntry( | 643 provided_file_system_->RemoveWatcher( |
658 GURL(kOrigin), | 644 GURL(kOrigin), |
659 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 645 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
660 false /* recursive */, | 646 false /* recursive */, |
661 base::Bind(&LogStatus, base::Unretained(&log))); | 647 base::Bind(&LogStatus, base::Unretained(&log))); |
662 base::RunLoop().RunUntilIdle(); | 648 base::RunLoop().RunUntilIdle(); |
663 | 649 |
664 ASSERT_EQ(1u, log.size()); | 650 ASSERT_EQ(1u, log.size()); |
665 EXPECT_EQ(base::File::FILE_OK, log[0]); | 651 EXPECT_EQ(base::File::FILE_OK, log[0]); |
666 EXPECT_EQ(4, observer.list_changed_counter()); | 652 EXPECT_EQ(4, observer.list_changed_counter()); |
667 EXPECT_EQ(0, observer.tag_updated_counter()); | 653 EXPECT_EQ(0, observer.tag_updated_counter()); |
668 | 654 |
669 ObservedEntries* const observed_entries = | 655 Watchers* const watchers = provided_file_system_->GetWatchers(); |
670 provided_file_system_->GetObservedEntries(); | 656 EXPECT_EQ(0u, watchers->size()); |
671 EXPECT_EQ(0u, observed_entries->size()); | |
672 } | 657 } |
673 | 658 |
674 provided_file_system_->RemoveObserver(&observer); | 659 provided_file_system_->RemoveObserver(&observer); |
675 } | 660 } |
676 | 661 |
677 TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { | 662 TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { |
678 Observer observer; | 663 Observer observer; |
679 provided_file_system_->AddObserver(&observer); | 664 provided_file_system_->AddObserver(&observer); |
680 | 665 |
681 { | 666 { |
682 // Observe a directory. | 667 // Watch a directory. |
683 Log log; | 668 Log log; |
684 provided_file_system_->ObserveDirectory( | 669 provided_file_system_->AddWatcher( |
685 GURL(kOrigin), | 670 GURL(kOrigin), |
686 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 671 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
687 false /* recursive */, | 672 false /* recursive */, |
688 true /* persistent */, | 673 true /* persistent */, |
689 base::Bind(&LogStatus, base::Unretained(&log))); | 674 base::Bind(&LogStatus, base::Unretained(&log))); |
690 base::RunLoop().RunUntilIdle(); | 675 base::RunLoop().RunUntilIdle(); |
691 | 676 |
692 ASSERT_EQ(1u, log.size()); | 677 ASSERT_EQ(1u, log.size()); |
693 EXPECT_EQ(base::File::FILE_OK, log[0]); | 678 EXPECT_EQ(base::File::FILE_OK, log[0]); |
694 EXPECT_EQ(1, observer.list_changed_counter()); | 679 EXPECT_EQ(1, observer.list_changed_counter()); |
695 EXPECT_EQ(0, observer.tag_updated_counter()); | 680 EXPECT_EQ(0, observer.tag_updated_counter()); |
696 | 681 |
697 ObservedEntries* const observed_entries = | 682 Watchers* const watchers = provided_file_system_->GetWatchers(); |
698 provided_file_system_->GetObservedEntries(); | 683 EXPECT_EQ(1u, watchers->size()); |
699 EXPECT_EQ(1u, observed_entries->size()); | 684 provided_file_system_->GetWatchers(); |
700 provided_file_system_->GetObservedEntries(); | 685 EXPECT_EQ("", watchers->begin()->second.last_tag); |
701 EXPECT_EQ("", observed_entries->begin()->second.last_tag); | |
702 } | 686 } |
703 | 687 |
704 { | 688 { |
705 // Notify about a change. | 689 // Notify about a change. |
706 const ProvidedFileSystemObserver::ChangeType change_type = | 690 const ProvidedFileSystemObserver::ChangeType change_type = |
707 ProvidedFileSystemObserver::CHANGED; | 691 ProvidedFileSystemObserver::CHANGED; |
708 const std::string tag = "hello-world"; | 692 const std::string tag = "hello-world"; |
709 EXPECT_TRUE(provided_file_system_->Notify( | 693 EXPECT_TRUE(provided_file_system_->Notify( |
710 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 694 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
711 false /* recursive */, | 695 false /* recursive */, |
712 change_type, | 696 change_type, |
713 make_scoped_ptr(new ProvidedFileSystemObserver::Changes), | 697 make_scoped_ptr(new ProvidedFileSystemObserver::Changes), |
714 tag)); | 698 tag)); |
715 | 699 |
716 // Verify the observer event. | 700 // Verify the observer event. |
717 ASSERT_EQ(1u, observer.change_events().size()); | 701 ASSERT_EQ(1u, observer.change_events().size()); |
718 const Observer::ChangeEvent* const change_event = | 702 const Observer::ChangeEvent* const change_event = |
719 observer.change_events()[0]; | 703 observer.change_events()[0]; |
720 EXPECT_EQ(change_type, change_event->change_type()); | 704 EXPECT_EQ(change_type, change_event->change_type()); |
721 EXPECT_EQ(0u, change_event->changes().size()); | 705 EXPECT_EQ(0u, change_event->changes().size()); |
722 | 706 |
723 // The tag should not be updated in advance, before all observers handle | 707 // The tag should not be updated in advance, before all observers handle |
724 // the notification. | 708 // the notification. |
725 ObservedEntries* const observed_entries = | 709 Watchers* const watchers = provided_file_system_->GetWatchers(); |
726 provided_file_system_->GetObservedEntries(); | 710 EXPECT_EQ(1u, watchers->size()); |
727 EXPECT_EQ(1u, observed_entries->size()); | 711 provided_file_system_->GetWatchers(); |
728 provided_file_system_->GetObservedEntries(); | 712 EXPECT_EQ("", watchers->begin()->second.last_tag); |
729 EXPECT_EQ("", observed_entries->begin()->second.last_tag); | |
730 | 713 |
731 // Wait until all observers finish handling the notification. | 714 // Wait until all observers finish handling the notification. |
732 base::RunLoop().RunUntilIdle(); | 715 base::RunLoop().RunUntilIdle(); |
733 | 716 |
734 // Confirm, that the entry is still being observed, and that the tag is | 717 // Confirm, that the watcher still exists, and that the tag is updated. |
735 // updated. | 718 ASSERT_EQ(1u, watchers->size()); |
736 ASSERT_EQ(1u, observed_entries->size()); | 719 EXPECT_EQ(tag, watchers->begin()->second.last_tag); |
737 EXPECT_EQ(tag, observed_entries->begin()->second.last_tag); | |
738 EXPECT_EQ(1, observer.list_changed_counter()); | 720 EXPECT_EQ(1, observer.list_changed_counter()); |
739 EXPECT_EQ(1, observer.tag_updated_counter()); | 721 EXPECT_EQ(1, observer.tag_updated_counter()); |
740 } | 722 } |
741 | 723 |
742 { | 724 { |
743 // Notify about deleting of the observed entry. | 725 // Notify about deleting of the watched entry. |
744 const ProvidedFileSystemObserver::ChangeType change_type = | 726 const ProvidedFileSystemObserver::ChangeType change_type = |
745 ProvidedFileSystemObserver::DELETED; | 727 ProvidedFileSystemObserver::DELETED; |
746 const ProvidedFileSystemObserver::Changes changes; | 728 const ProvidedFileSystemObserver::Changes changes; |
747 const std::string tag = "chocolate-disco"; | 729 const std::string tag = "chocolate-disco"; |
748 EXPECT_TRUE(provided_file_system_->Notify( | 730 EXPECT_TRUE(provided_file_system_->Notify( |
749 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 731 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
750 false /* recursive */, | 732 false /* recursive */, |
751 change_type, | 733 change_type, |
752 make_scoped_ptr(new ProvidedFileSystemObserver::Changes), | 734 make_scoped_ptr(new ProvidedFileSystemObserver::Changes), |
753 tag)); | 735 tag)); |
754 base::RunLoop().RunUntilIdle(); | 736 base::RunLoop().RunUntilIdle(); |
755 | 737 |
756 // Verify the observer event. | 738 // Verify the observer event. |
757 ASSERT_EQ(2u, observer.change_events().size()); | 739 ASSERT_EQ(2u, observer.change_events().size()); |
758 const Observer::ChangeEvent* const change_event = | 740 const Observer::ChangeEvent* const change_event = |
759 observer.change_events()[1]; | 741 observer.change_events()[1]; |
760 EXPECT_EQ(change_type, change_event->change_type()); | 742 EXPECT_EQ(change_type, change_event->change_type()); |
761 EXPECT_EQ(0u, change_event->changes().size()); | 743 EXPECT_EQ(0u, change_event->changes().size()); |
762 } | 744 } |
763 | 745 |
764 // Confirm, that the entry is not observed anymore. | 746 // Confirm, that the watcher is removed. |
765 { | 747 { |
766 ObservedEntries* const observed_entries = | 748 Watchers* const watchers = provided_file_system_->GetWatchers(); |
767 provided_file_system_->GetObservedEntries(); | 749 EXPECT_EQ(0u, watchers->size()); |
768 EXPECT_EQ(0u, observed_entries->size()); | |
769 EXPECT_EQ(2, observer.list_changed_counter()); | 750 EXPECT_EQ(2, observer.list_changed_counter()); |
770 EXPECT_EQ(2, observer.tag_updated_counter()); | 751 EXPECT_EQ(2, observer.tag_updated_counter()); |
771 } | 752 } |
772 | 753 |
773 provided_file_system_->RemoveObserver(&observer); | 754 provided_file_system_->RemoveObserver(&observer); |
774 } | 755 } |
775 | 756 |
776 } // namespace file_system_provider | 757 } // namespace file_system_provider |
777 } // namespace chromeos | 758 } // namespace chromeos |
OLD | NEW |