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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2ca0113c1eccbbc556dfba768dc570d968a5d080 |
--- /dev/null |
+++ b/chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc |
@@ -0,0 +1,348 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <string> |
+ |
+#include "base/bind.h" |
+#include "base/files/file.h" |
+#include "base/files/file_path.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/scoped_vector.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/values.h" |
+#include "chrome/browser/chromeos/file_system_provider/request_manager.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace chromeos { |
+namespace file_system_provider { |
+namespace { |
+ |
+const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; |
+const int kFileSystemId = 1; |
+const char kFileSystemName[] = "Camera Pictures"; |
+const base::FilePath::CharType kMountPath[] = FILE_PATH_LITERAL( |
+ "/provided/mbflcebpggnecokmikipoihdbecnjfoj-1-testing_profile-hash"); |
+ |
+// Logs calls of the success and error callbacks on requests. |
+class EventLogger { |
+ public: |
+ class SuccessEvent { |
+ public: |
+ SuccessEvent(scoped_ptr<base::DictionaryValue> result, bool has_next) |
+ : result_(result.Pass()), has_next_(has_next) {} |
+ ~SuccessEvent() {} |
+ |
+ base::DictionaryValue* result() { return result_.get(); } |
+ bool has_next() { return has_next_; } |
+ |
+ private: |
+ scoped_ptr<base::DictionaryValue> result_; |
+ bool has_next_; |
+ }; |
+ |
+ class ErrorEvent { |
+ public: |
+ explicit ErrorEvent(base::File::Error error) : error_(error) {} |
+ ~ErrorEvent() {} |
+ |
+ base::File::Error error() { return error_; } |
+ |
+ private: |
+ base::File::Error error_; |
+ }; |
+ |
+ EventLogger() : weak_ptr_factory_(this) {} |
+ virtual ~EventLogger() {} |
+ |
+ void OnSuccess(scoped_ptr<base::DictionaryValue> result, bool has_next) { |
+ success_events_.push_back(new SuccessEvent(result.Pass(), has_next)); |
+ } |
+ |
+ void OnError(base::File::Error error) { |
+ error_events_.push_back(new ErrorEvent(error)); |
+ } |
+ |
+ ScopedVector<SuccessEvent>& success_events() { return success_events_; } |
+ ScopedVector<ErrorEvent>& error_events() { return error_events_; } |
+ |
+ base::WeakPtr<EventLogger> GetWeakPtr() { |
+ return weak_ptr_factory_.GetWeakPtr(); |
+ } |
+ |
+ private: |
+ ScopedVector<SuccessEvent> success_events_; |
+ ScopedVector<ErrorEvent> error_events_; |
+ base::WeakPtrFactory<EventLogger> weak_ptr_factory_; |
+}; |
+ |
+} // namespace |
+ |
+class FileSystemProviderRequestManagerTest : public testing::Test { |
+ protected: |
+ FileSystemProviderRequestManagerTest() {} |
+ virtual ~FileSystemProviderRequestManagerTest() {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ request_manager_.reset(new RequestManager()); |
+ |
+ // Configure the testing file system. |
+ file_system = ProvidedFileSystem(kExtensionId, |
+ kFileSystemId, |
+ kFileSystemName, |
+ base::FilePath(kMountPath)); |
+ } |
+ |
+ scoped_ptr<RequestManager> request_manager_; |
+ ProvidedFileSystem file_system; |
+}; |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill) { |
+ EventLogger logger; |
+ |
+ int request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ EXPECT_EQ(1, request_id); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ |
+ scoped_ptr<base::DictionaryValue> response(new base::DictionaryValue()); |
+ const bool has_next = false; |
+ response->SetString("path", "i-like-vanilla"); |
+ |
+ bool result = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), has_next); |
+ EXPECT_TRUE(result); |
+ |
+ // Validate if the callback has correct arguments. |
+ ASSERT_EQ(1u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ EventLogger::SuccessEvent* event = logger.success_events()[0]; |
+ ASSERT_TRUE(event->result()); |
+ std::string response_test_string; |
+ EXPECT_TRUE(event->result()->GetString("path", &response_test_string)); |
+ EXPECT_EQ("i-like-vanilla", response_test_string); |
+ EXPECT_EQ(has_next, event->has_next()); |
+ |
+ // Confirm, that the request is removed. Basically, fulfilling again for the |
+ // same request, should fail. |
+ { |
+ bool retry = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), has_next); |
+ EXPECT_FALSE(retry); |
+ } |
+ |
+ // Rejecting should also fail. |
+ { |
+ bool retry = request_manager_->RejectRequest( |
+ file_system, request_id, base::File::FILE_ERROR_FAILED); |
+ EXPECT_FALSE(retry); |
+ } |
+} |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, CreateAndFulFill_WithHasNext) { |
+ EventLogger logger; |
+ |
+ int request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ EXPECT_EQ(1, request_id); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ |
+ scoped_ptr<base::DictionaryValue> response; |
+ const bool has_next = true; |
+ |
+ bool result = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), has_next); |
+ EXPECT_TRUE(result); |
+ |
+ // Validate if the callback has correct arguments. |
+ ASSERT_EQ(1u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ EventLogger::SuccessEvent* event = logger.success_events()[0]; |
+ EXPECT_FALSE(event->result()); |
+ EXPECT_EQ(has_next, event->has_next()); |
+ |
+ // Confirm, that the request is not removed (since it has has_next == true). |
+ // Basically, fulfilling again for the same request, should not fail. |
+ { |
+ bool new_has_next = false; |
+ bool retry = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), new_has_next); |
+ EXPECT_TRUE(retry); |
+ } |
+ |
+ // Since |new_has_next| is false, then the request should be removed. To check |
+ // it, try to fulfill again, what should fail. |
+ { |
+ bool new_has_next = false; |
+ bool retry = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), new_has_next); |
+ EXPECT_FALSE(retry); |
+ } |
+} |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, CreateAndReject) { |
+ EventLogger logger; |
+ |
+ int request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ EXPECT_EQ(1, request_id); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ |
+ base::File::Error error = base::File::FILE_ERROR_NO_MEMORY; |
+ bool result = request_manager_->RejectRequest(file_system, request_id, error); |
+ EXPECT_TRUE(result); |
+ |
+ // Validate if the callback has correct arguments. |
+ ASSERT_EQ(1u, logger.error_events().size()); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EventLogger::ErrorEvent* event = logger.error_events()[0]; |
+ EXPECT_EQ(error, event->error()); |
+ |
+ // Confirm, that the request is removed. Basically, fulfilling again for the |
+ // same request, should fail. |
+ { |
+ scoped_ptr<base::DictionaryValue> response; |
+ bool has_next = false; |
+ bool retry = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), has_next); |
+ EXPECT_FALSE(retry); |
+ } |
+ |
+ // Rejecting should also fail. |
+ { |
+ bool retry = |
+ request_manager_->RejectRequest(file_system, request_id, error); |
+ EXPECT_FALSE(retry); |
+ } |
+} |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, |
+ CreateAndFulfillWithWrongRequestId) { |
+ EventLogger logger; |
+ |
+ int request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ EXPECT_EQ(1, request_id); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ |
+ base::File::Error error = base::File::FILE_ERROR_NO_MEMORY; |
+ bool result = |
+ request_manager_->RejectRequest(file_system, request_id + 1, error); |
+ EXPECT_FALSE(result); |
+ |
+ // Callbacks should not be called. |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ |
+ // Confirm, that the request hasn't been removed, by rejecting it correctly. |
+ { |
+ bool retry = |
+ request_manager_->RejectRequest(file_system, request_id, error); |
+ EXPECT_TRUE(retry); |
+ } |
+} |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, |
+ CreateAndRejectWithWrongRequestId) { |
+ EventLogger logger; |
+ |
+ int request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ EXPECT_EQ(1, request_id); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ |
+ base::File::Error error = base::File::FILE_ERROR_NO_MEMORY; |
+ bool result = |
+ request_manager_->RejectRequest(file_system, request_id + 1, error); |
+ EXPECT_FALSE(result); |
+ |
+ // Callbacks should not be called. |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ |
+ // Confirm, that the request hasn't been removed, by rejecting it correctly. |
+ { |
+ bool retry = |
+ request_manager_->RejectRequest(file_system, request_id, error); |
+ EXPECT_TRUE(retry); |
+ } |
+} |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, |
+ CreateAndFulfillWithUnownedRequestId) { |
+ EventLogger logger; |
+ |
+ int request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ EXPECT_EQ(1, request_id); |
+ |
+ // Create another file system, which has just a different fiel system id |
+ // (1 -> 2). |
+ ProvidedFileSystem another_file_system( |
+ kExtensionId, |
+ 2, // file_system_id |
+ "Music", |
+ base::FilePath::FromUTF8Unsafe( |
+ "/provided/mbflcebpggnecokmikipoihdbecnjfoj-2-testing_profile-hash")); |
+ |
+ scoped_ptr<base::DictionaryValue> response; |
+ const bool has_next = false; |
+ |
+ bool result = request_manager_->FulfillRequest( |
+ another_file_system, request_id, response.Pass(), has_next); |
+ EXPECT_FALSE(result); |
+ |
+ // Callbacks should not be called. |
+ EXPECT_EQ(0u, logger.error_events().size()); |
+ EXPECT_EQ(0u, logger.success_events().size()); |
+ |
+ // Confirm, that the request hasn't been removed, by fulfilling it again, but |
+ // with a correct file system. |
+ { |
+ bool retry = request_manager_->FulfillRequest( |
+ file_system, request_id, response.Pass(), has_next); |
+ EXPECT_TRUE(retry); |
+ } |
+} |
+ |
+TEST_F(FileSystemProviderRequestManagerTest, UniqueIds) { |
+ EventLogger logger; |
+ |
+ int first_request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ int second_request_id = request_manager_->CreateRequest( |
+ file_system, |
+ base::Bind(&EventLogger::OnSuccess, logger.GetWeakPtr()), |
+ base::Bind(&EventLogger::OnError, logger.GetWeakPtr())); |
+ |
+ EXPECT_EQ(1, first_request_id); |
+ EXPECT_EQ(2, second_request_id); |
+} |
+ |
+} // namespace file_system_provider |
+} // namespace chromeos |