Chromium Code Reviews| 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..97ae969f11e712adb7a6adcc3acb78ecf0d61947 |
| --- /dev/null |
| +++ b/chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc |
| @@ -0,0 +1,347 @@ |
| +// 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"); |
| + |
| +class EventLogger { |
|
satorux1
2014/03/26 08:15:03
class comment is missing.
mtomasz
2014/03/26 10:27:42
Done.
|
| + 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 |