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

Unified Diff: chrome/browser/chromeos/file_system_provider/request_manager_unittest.cc

Issue 194693002: [fsp] Add requestUnmount() method together with the request manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed some too strict thread checks. Created 6 years, 8 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698