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

Side by Side Diff: chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc

Issue 350683002: [fsp] Add notifications in case of slow operations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed clang. Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <map>
5 #include <string> 6 #include <string>
6 #include <vector> 7 #include <vector>
7 8
8 #include "base/bind.h" 9 #include "base/bind.h"
9 #include "base/callback.h" 10 #include "base/callback.h"
10 #include "base/files/file.h" 11 #include "base/files/file.h"
11 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
12 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h" 14 #include "base/memory/scoped_vector.h"
14 #include "base/memory/weak_ptr.h" 15 #include "base/memory/weak_ptr.h"
15 #include "base/run_loop.h" 16 #include "base/run_loop.h"
17 #include "chrome/browser/chromeos/file_system_provider/notification_manager_inte rface.h"
16 #include "chrome/browser/chromeos/file_system_provider/request_manager.h" 18 #include "chrome/browser/chromeos/file_system_provider/request_manager.h"
17 #include "chrome/browser/chromeos/file_system_provider/request_value.h" 19 #include "chrome/browser/chromeos/file_system_provider/request_value.h"
18 #include "content/public/test/test_browser_thread_bundle.h" 20 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
20 22
21 namespace chromeos { 23 namespace chromeos {
22 namespace file_system_provider { 24 namespace file_system_provider {
23 namespace { 25 namespace {
24 26
27 // Fake implementation for the notification manager. Simulates user action on
28 // a notification.
29 class FakeNotificationManager : public NotificationManagerInterface {
30 public:
31 FakeNotificationManager() {}
32 virtual ~FakeNotificationManager() {}
33
34 // NotificationManagerInterface overrides:
35 virtual void ShowUnresponsiveNotification(
36 int id,
37 const NotificationCallback& callback) OVERRIDE {
38 callbacks_[id] = callback;
39 }
40
41 virtual void HideUnresponsiveNotification(int id) OVERRIDE {
42 callbacks_.erase(id);
43 }
44
45 // Aborts all of the virtually shown notifications.
46 void Abort() { OnNotificationResult(ABORT); }
47
48 // Discards all of the virtually shown notifications.
49 void Continue() { OnNotificationResult(CONTINUE); }
50
51 // Returns number of currently shown notifications.
52 size_t size() { return callbacks_.size(); }
53
54 private:
55 typedef std::map<int, NotificationCallback> CallbackMap;
56
57 // Handles a notification result by calling all registered callbacks and
58 // clearing the list.
59 void OnNotificationResult(NotificationResult result) {
60 CallbackMap::iterator it = callbacks_.begin();
61 while (it != callbacks_.end()) {
62 CallbackMap::iterator current_it = it++;
63 NotificationCallback callback = current_it->second;
64 callbacks_.erase(current_it);
65 callback.Run(result);
66 }
67 }
68
69 CallbackMap callbacks_;
70
71 DISALLOW_COPY_AND_ASSIGN(FakeNotificationManager);
72 };
73
25 // Logs calls of the success and error callbacks on requests. 74 // Logs calls of the success and error callbacks on requests.
26 class EventLogger { 75 class EventLogger {
27 public: 76 public:
28 class ExecuteEvent { 77 class ExecuteEvent {
29 public: 78 public:
30 explicit ExecuteEvent(int request_id) : request_id_(request_id) {} 79 explicit ExecuteEvent(int request_id) : request_id_(request_id) {}
31 virtual ~ExecuteEvent() {} 80 virtual ~ExecuteEvent() {}
32 81
33 int request_id() { return request_id_; } 82 int request_id() { return request_id_; }
34 83
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 }; 301 };
253 302
254 } // namespace 303 } // namespace
255 304
256 class FileSystemProviderRequestManagerTest : public testing::Test { 305 class FileSystemProviderRequestManagerTest : public testing::Test {
257 protected: 306 protected:
258 FileSystemProviderRequestManagerTest() {} 307 FileSystemProviderRequestManagerTest() {}
259 virtual ~FileSystemProviderRequestManagerTest() {} 308 virtual ~FileSystemProviderRequestManagerTest() {}
260 309
261 virtual void SetUp() OVERRIDE { 310 virtual void SetUp() OVERRIDE {
262 request_manager_.reset(new RequestManager()); 311 notification_manager_.reset(new FakeNotificationManager);
312 request_manager_.reset(new RequestManager(notification_manager_.get()));
263 } 313 }
264 314
265 content::TestBrowserThreadBundle thread_bundle_; 315 content::TestBrowserThreadBundle thread_bundle_;
316 scoped_ptr<FakeNotificationManager> notification_manager_;
266 scoped_ptr<RequestManager> request_manager_; 317 scoped_ptr<RequestManager> request_manager_;
267 }; 318 };
268 319
269 TEST_F(FileSystemProviderRequestManagerTest, CreateFailure) { 320 TEST_F(FileSystemProviderRequestManagerTest, CreateFailure) {
270 EventLogger logger; 321 EventLogger logger;
271 RequestObserver observer; 322 RequestObserver observer;
272 request_manager_->AddObserver(&observer); 323 request_manager_->AddObserver(&observer);
273 324
274 const int request_id = request_manager_->CreateRequest( 325 const int request_id = request_manager_->CreateRequest(
275 TESTING, 326 TESTING,
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 EXPECT_EQ(1, first_request_id); 647 EXPECT_EQ(1, first_request_id);
597 EXPECT_EQ(2, second_request_id); 648 EXPECT_EQ(2, second_request_id);
598 } 649 }
599 650
600 TEST_F(FileSystemProviderRequestManagerTest, AbortOnDestroy) { 651 TEST_F(FileSystemProviderRequestManagerTest, AbortOnDestroy) {
601 EventLogger logger; 652 EventLogger logger;
602 RequestObserver observer; 653 RequestObserver observer;
603 int request_id; 654 int request_id;
604 655
605 { 656 {
606 RequestManager request_manager; 657 RequestManager request_manager(NULL);
607 request_manager.AddObserver(&observer); 658 request_manager.AddObserver(&observer);
608 659
609 request_id = request_manager.CreateRequest( 660 request_id = request_manager.CreateRequest(
610 TESTING, 661 TESTING,
611 make_scoped_ptr<RequestManager::HandlerInterface>( 662 make_scoped_ptr<RequestManager::HandlerInterface>(
612 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */))); 663 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
613 664
614 EXPECT_EQ(1, request_id); 665 EXPECT_EQ(1, request_id);
615 EXPECT_EQ(0u, logger.success_events().size()); 666 EXPECT_EQ(0u, logger.success_events().size());
616 EXPECT_EQ(0u, logger.error_events().size()); 667 EXPECT_EQ(0u, logger.error_events().size());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 request_manager_->AddObserver(&observer); 702 request_manager_->AddObserver(&observer);
652 703
653 request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0)); 704 request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0));
654 const int request_id = request_manager_->CreateRequest( 705 const int request_id = request_manager_->CreateRequest(
655 TESTING, 706 TESTING,
656 make_scoped_ptr<RequestManager::HandlerInterface>( 707 make_scoped_ptr<RequestManager::HandlerInterface>(
657 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */))); 708 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
658 EXPECT_EQ(1, request_id); 709 EXPECT_EQ(1, request_id);
659 EXPECT_EQ(0u, logger.success_events().size()); 710 EXPECT_EQ(0u, logger.success_events().size());
660 EXPECT_EQ(0u, logger.error_events().size()); 711 EXPECT_EQ(0u, logger.error_events().size());
712 EXPECT_EQ(0u, notification_manager_->size());
661 713
662 ASSERT_EQ(1u, observer.created().size()); 714 ASSERT_EQ(1u, observer.created().size());
663 EXPECT_EQ(request_id, observer.created()[0].request_id()); 715 EXPECT_EQ(request_id, observer.created()[0].request_id());
664 EXPECT_EQ(TESTING, observer.created()[0].type()); 716 EXPECT_EQ(TESTING, observer.created()[0].type());
665 717
666 ASSERT_EQ(1u, observer.executed().size()); 718 ASSERT_EQ(1u, observer.executed().size());
667 EXPECT_EQ(request_id, observer.executed()[0].request_id()); 719 EXPECT_EQ(request_id, observer.executed()[0].request_id());
668 720
669 // Wait until the request is timeouted. 721 // Wait until the request is timeouted.
670 base::RunLoop().RunUntilIdle(); 722 base::RunLoop().RunUntilIdle();
671 723
724 // Abort the request.
725 EXPECT_EQ(1u, notification_manager_->size());
726 notification_manager_->Abort();
727 EXPECT_EQ(0u, notification_manager_->size());
728
672 ASSERT_EQ(1u, logger.error_events().size()); 729 ASSERT_EQ(1u, logger.error_events().size());
673 EventLogger::ErrorEvent* event = logger.error_events()[0]; 730 EventLogger::ErrorEvent* event = logger.error_events()[0];
674 EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error()); 731 EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error());
675 732
676 ASSERT_EQ(1u, observer.rejected().size()); 733 ASSERT_EQ(1u, observer.rejected().size());
677 EXPECT_EQ(request_id, observer.rejected()[0].request_id()); 734 EXPECT_EQ(request_id, observer.rejected()[0].request_id());
678 EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error()); 735 EXPECT_EQ(base::File::FILE_ERROR_ABORT, observer.rejected()[0].error());
679 ASSERT_EQ(1u, observer.timeouted().size()); 736 ASSERT_EQ(1u, observer.timeouted().size());
680 EXPECT_EQ(request_id, observer.timeouted()[0].request_id()); 737 EXPECT_EQ(request_id, observer.timeouted()[0].request_id());
681 ASSERT_EQ(1u, observer.destroyed().size()); 738 ASSERT_EQ(1u, observer.destroyed().size());
682 EXPECT_EQ(request_id, observer.destroyed()[0].request_id()); 739 EXPECT_EQ(request_id, observer.destroyed()[0].request_id());
683 740
684 request_manager_->RemoveObserver(&observer); 741 request_manager_->RemoveObserver(&observer);
685 } 742 }
686 743
744 TEST_F(FileSystemProviderRequestManagerTest, ContinueOnTimeout) {
745 EventLogger logger;
746 RequestObserver observer;
747 request_manager_->AddObserver(&observer);
748
749 request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0));
750 const int request_id = request_manager_->CreateRequest(
751 TESTING,
752 make_scoped_ptr<RequestManager::HandlerInterface>(
753 new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */)));
754 EXPECT_EQ(1, request_id);
755 EXPECT_EQ(0u, logger.success_events().size());
756 EXPECT_EQ(0u, logger.error_events().size());
757 EXPECT_EQ(0u, notification_manager_->size());
758
759 ASSERT_EQ(1u, observer.created().size());
760 EXPECT_EQ(request_id, observer.created()[0].request_id());
761 EXPECT_EQ(TESTING, observer.created()[0].type());
762
763 ASSERT_EQ(1u, observer.executed().size());
764 EXPECT_EQ(request_id, observer.executed()[0].request_id());
765
766 // Wait until the request is timeouted.
767 base::RunLoop().RunUntilIdle();
768
769 // Let the extension more time by closing the notification.
770 EXPECT_EQ(1u, notification_manager_->size());
771 notification_manager_->Continue();
772 EXPECT_EQ(0u, notification_manager_->size());
773
774 // The request is still active.
775 EXPECT_EQ(0u, logger.success_events().size());
776 EXPECT_EQ(0u, logger.error_events().size());
777
778 // Wait until the request is timeouted again.
779 base::RunLoop().RunUntilIdle();
780 EXPECT_EQ(1u, notification_manager_->size());
781
782 request_manager_->RemoveObserver(&observer);
783 }
784
687 } // namespace file_system_provider 785 } // namespace file_system_provider
688 } // namespace chromeos 786 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698