Index: chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc b/chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc |
index b4956a90a48579fa1e496b99495a19f87f8da2e3..399b2997669e02a68830fb0cdf8bf9b06cc1f6e6 100644 |
--- a/chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc |
+++ b/chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc |
@@ -2,6 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <map> |
#include <string> |
#include <vector> |
@@ -13,6 +14,7 @@ |
#include "base/memory/scoped_vector.h" |
#include "base/memory/weak_ptr.h" |
#include "base/run_loop.h" |
+#include "chrome/browser/chromeos/file_system_provider/notification_manager_interface.h" |
#include "chrome/browser/chromeos/file_system_provider/request_manager.h" |
#include "chrome/browser/chromeos/file_system_provider/request_value.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
@@ -22,6 +24,53 @@ namespace chromeos { |
namespace file_system_provider { |
namespace { |
+// Fake implementation for the notification manager. Simulates user action on |
+// a notification. |
+class FakeNotificationManager : public NotificationManagerInterface { |
+ public: |
+ FakeNotificationManager() {} |
+ virtual ~FakeNotificationManager() {} |
+ |
+ // NotificationManagerInterface overrides: |
+ virtual void ShowUnresponsiveNotification( |
+ int id, |
+ const NotificationCallback& callback) OVERRIDE { |
+ callbacks_[id] = callback; |
+ } |
+ |
+ virtual void HideUnresponsiveNotification(int id) OVERRIDE { |
+ callbacks_.erase(id); |
+ } |
+ |
+ // Aborts all of the virtually shown notifications. |
+ void Abort() { OnNotificationResult(ABORT); } |
+ |
+ // Discards all of the virtually shown notifications. |
+ void Continue() { OnNotificationResult(CONTINUE); } |
+ |
+ // Returns number of currently shown notifications. |
+ size_t size() { return callbacks_.size(); } |
+ |
+ private: |
+ typedef std::map<int, NotificationCallback> CallbackMap; |
+ |
+ // Handles a notification result by calling all registered callbacks and |
+ // clearing the list. |
+ void OnNotificationResult(NotificationResult result) { |
+ CallbackMap::iterator it = callbacks_.begin(); |
+ while (it != callbacks_.end()) { |
+ CallbackMap::iterator current_it = it++; |
+ NotificationCallback callback = current_it->second; |
+ callbacks_.erase(current_it); |
+ callback.Run(result); |
+ } |
+ } |
+ |
+ CallbackMap callbacks_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeNotificationManager); |
+}; |
+ |
// Logs calls of the success and error callbacks on requests. |
class EventLogger { |
public: |
@@ -259,10 +308,12 @@ class FileSystemProviderRequestManagerTest : public testing::Test { |
virtual ~FileSystemProviderRequestManagerTest() {} |
virtual void SetUp() OVERRIDE { |
- request_manager_.reset(new RequestManager()); |
+ notification_manager_.reset(new FakeNotificationManager); |
+ request_manager_.reset(new RequestManager(notification_manager_.get())); |
} |
content::TestBrowserThreadBundle thread_bundle_; |
+ scoped_ptr<FakeNotificationManager> notification_manager_; |
scoped_ptr<RequestManager> request_manager_; |
}; |
@@ -603,7 +654,7 @@ TEST_F(FileSystemProviderRequestManagerTest, AbortOnDestroy) { |
int request_id; |
{ |
- RequestManager request_manager; |
+ RequestManager request_manager(NULL); |
request_manager.AddObserver(&observer); |
request_id = request_manager.CreateRequest( |
@@ -658,6 +709,7 @@ TEST_F(FileSystemProviderRequestManagerTest, AbortOnTimeout) { |
EXPECT_EQ(1, request_id); |
EXPECT_EQ(0u, logger.success_events().size()); |
EXPECT_EQ(0u, logger.error_events().size()); |
+ EXPECT_EQ(0u, notification_manager_->size()); |
ASSERT_EQ(1u, observer.created().size()); |
EXPECT_EQ(request_id, observer.created()[0].request_id()); |
@@ -669,6 +721,11 @@ TEST_F(FileSystemProviderRequestManagerTest, AbortOnTimeout) { |
// Wait until the request is timeouted. |
base::RunLoop().RunUntilIdle(); |
+ // Abort the request. |
+ EXPECT_EQ(1u, notification_manager_->size()); |
+ notification_manager_->Abort(); |
+ EXPECT_EQ(0u, notification_manager_->size()); |
+ |
ASSERT_EQ(1u, logger.error_events().size()); |
EventLogger::ErrorEvent* event = logger.error_events()[0]; |
EXPECT_EQ(base::File::FILE_ERROR_ABORT, event->error()); |
@@ -684,5 +741,46 @@ TEST_F(FileSystemProviderRequestManagerTest, AbortOnTimeout) { |
request_manager_->RemoveObserver(&observer); |
} |
+TEST_F(FileSystemProviderRequestManagerTest, ContinueOnTimeout) { |
+ EventLogger logger; |
+ RequestObserver observer; |
+ request_manager_->AddObserver(&observer); |
+ |
+ request_manager_->SetTimeoutForTesting(base::TimeDelta::FromSeconds(0)); |
+ const int request_id = request_manager_->CreateRequest( |
+ TESTING, |
+ make_scoped_ptr<RequestManager::HandlerInterface>( |
+ new FakeHandler(logger.GetWeakPtr(), true /* execute_reply */))); |
+ EXPECT_EQ(1, request_id); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ EXPECT_EQ(0u, notification_manager_->size()); |
+ |
+ ASSERT_EQ(1u, observer.created().size()); |
+ EXPECT_EQ(request_id, observer.created()[0].request_id()); |
+ EXPECT_EQ(TESTING, observer.created()[0].type()); |
+ |
+ ASSERT_EQ(1u, observer.executed().size()); |
+ EXPECT_EQ(request_id, observer.executed()[0].request_id()); |
+ |
+ // Wait until the request is timeouted. |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ // Let the extension more time by closing the notification. |
+ EXPECT_EQ(1u, notification_manager_->size()); |
+ notification_manager_->Continue(); |
+ EXPECT_EQ(0u, notification_manager_->size()); |
+ |
+ // The request is still active. |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ |
+ // Wait until the request is timeouted again. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1u, notification_manager_->size()); |
+ |
+ request_manager_->RemoveObserver(&observer); |
+} |
+ |
} // namespace file_system_provider |
} // namespace chromeos |