Index: chrome/browser/chromeos/file_system_provider/operations/open_file_unittest.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/operations/open_file_unittest.cc b/chrome/browser/chromeos/file_system_provider/operations/open_file_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..02fff320514f88842900c2196a289ed42a7d6faf |
--- /dev/null |
+++ b/chrome/browser/chromeos/file_system_provider/operations/open_file_unittest.cc |
@@ -0,0 +1,215 @@ |
+// 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 <vector> |
+ |
+#include "base/files/file.h" |
+#include "base/files/file_path.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/scoped_vector.h" |
+#include "chrome/browser/chromeos/file_system_provider/operations/open_file.h" |
+#include "chrome/browser/chromeos/file_system_provider/provided_file_system_interface.h" |
+#include "chrome/common/extensions/api/file_system_provider.h" |
+#include "chrome/common/extensions/api/file_system_provider_internal.h" |
+#include "extensions/browser/event_router.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "webkit/browser/fileapi/async_file_util.h" |
+ |
+namespace chromeos { |
+namespace file_system_provider { |
+namespace operations { |
+namespace { |
+ |
+const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; |
+const int kFileSystemId = 1; |
+const int kRequestId = 2; |
+const base::FilePath::CharType kFilePath[] = "/directory/blueberries.txt"; |
+ |
+// Fake event dispatcher implementation with extra logging capability. Acts as |
+// a providing extension end-point. |
+class LoggingDispatchEventImpl { |
+ public: |
+ explicit LoggingDispatchEventImpl(bool dispatch_reply) |
+ : dispatch_reply_(dispatch_reply) {} |
+ virtual ~LoggingDispatchEventImpl() {} |
+ |
+ bool OnDispatchEventImpl(scoped_ptr<extensions::Event> event) { |
+ events_.push_back(event->DeepCopy()); |
+ return dispatch_reply_; |
+ } |
+ |
+ ScopedVector<extensions::Event>& events() { return events_; } |
+ |
+ private: |
+ ScopedVector<extensions::Event> events_; |
+ bool dispatch_reply_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(LoggingDispatchEventImpl); |
+}; |
+ |
+// Callback invocation logger. Acts as a fileapi end-point. |
+class CallbackLogger { |
+ public: |
+ CallbackLogger() : weak_ptr_factory_(this) {} |
+ virtual ~CallbackLogger() {} |
+ |
+ void OnOpenFile(base::File::Error result) { events_.push_back(result); } |
+ |
+ std::vector<base::File::Error>& events() { return events_; } |
+ |
+ base::WeakPtr<CallbackLogger> GetWeakPtr() { |
+ return weak_ptr_factory_.GetWeakPtr(); |
+ } |
+ |
+ private: |
+ std::vector<base::File::Error> events_; |
+ base::WeakPtrFactory<CallbackLogger> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CallbackLogger); |
+}; |
+ |
+} // namespace |
+ |
+class FileSystemProviderOperationsOpenFileTest : public testing::Test { |
+ protected: |
+ FileSystemProviderOperationsOpenFileTest() {} |
+ virtual ~FileSystemProviderOperationsOpenFileTest() {} |
+ |
+ virtual void SetUp() OVERRIDE { |
+ file_system_info_ = |
+ ProvidedFileSystemInfo(kExtensionId, |
+ kFileSystemId, |
+ "" /* file_system_name */, |
+ base::FilePath() /* mount_path */); |
+ } |
+ |
+ ProvidedFileSystemInfo file_system_info_; |
+}; |
+ |
+TEST_F(FileSystemProviderOperationsOpenFileTest, Execute) { |
+ LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); |
+ CallbackLogger callback_logger; |
+ |
+ OpenFile open_file( |
+ NULL, |
+ file_system_info_, |
+ base::FilePath::FromUTF8Unsafe(kFilePath), |
+ ProvidedFileSystemInterface::OPEN_FILE_MODE_READ, |
+ false /* create */, |
+ base::Bind(&CallbackLogger::OnOpenFile, callback_logger.GetWeakPtr())); |
+ open_file.SetDispatchEventImplForTesting( |
+ base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, |
+ base::Unretained(&dispatcher))); |
+ |
+ EXPECT_TRUE(open_file.Execute(kRequestId)); |
+ |
+ ASSERT_EQ(1u, dispatcher.events().size()); |
+ extensions::Event* event = dispatcher.events()[0]; |
+ EXPECT_EQ( |
+ extensions::api::file_system_provider::OnOpenFileRequested::kEventName, |
+ event->event_name); |
+ base::ListValue* event_args = event->event_args.get(); |
+ ASSERT_EQ(5u, event_args->GetSize()); |
+ |
+ int event_file_system_id = -1; |
+ EXPECT_TRUE(event_args->GetInteger(0, &event_file_system_id)); |
+ EXPECT_EQ(kFileSystemId, event_file_system_id); |
+ |
+ int event_request_id = -1; |
+ EXPECT_TRUE(event_args->GetInteger(1, &event_request_id)); |
+ EXPECT_EQ(kRequestId, event_request_id); |
+ |
+ std::string event_file_path; |
+ EXPECT_TRUE(event_args->GetString(2, &event_file_path)); |
+ EXPECT_EQ(kFilePath, event_file_path); |
+ |
+ std::string event_file_open_mode; |
+ EXPECT_TRUE(event_args->GetString(3, &event_file_open_mode)); |
+ const std::string expected_file_open_mode = |
+ extensions::api::file_system_provider::ToString( |
+ extensions::api::file_system_provider::OPEN_FILE_MODE_READ); |
+ EXPECT_EQ(expected_file_open_mode, event_file_open_mode); |
+ |
+ bool event_create; |
+ EXPECT_TRUE(event_args->GetBoolean(4, &event_create)); |
+ EXPECT_FALSE(event_create); |
+} |
+ |
+TEST_F(FileSystemProviderOperationsOpenFileTest, Execute_NoListener) { |
+ LoggingDispatchEventImpl dispatcher(false /* dispatch_reply */); |
+ CallbackLogger callback_logger; |
+ |
+ OpenFile open_file( |
+ NULL, |
+ file_system_info_, |
+ base::FilePath::FromUTF8Unsafe(kFilePath), |
+ ProvidedFileSystemInterface::OPEN_FILE_MODE_READ, |
+ false /* create */, |
+ base::Bind(&CallbackLogger::OnOpenFile, callback_logger.GetWeakPtr())); |
+ open_file.SetDispatchEventImplForTesting( |
+ base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, |
+ base::Unretained(&dispatcher))); |
+ |
+ EXPECT_FALSE(open_file.Execute(kRequestId)); |
+} |
+ |
+TEST_F(FileSystemProviderOperationsOpenFileTest, OnSuccess) { |
+ using extensions::api::file_system_provider::EntryMetadata; |
+ using extensions::api::file_system_provider_internal:: |
+ OpenFileRequestedSuccess::Params; |
+ |
+ LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); |
+ CallbackLogger callback_logger; |
+ |
+ OpenFile open_file( |
+ NULL, |
+ file_system_info_, |
+ base::FilePath::FromUTF8Unsafe(kFilePath), |
+ ProvidedFileSystemInterface::OPEN_FILE_MODE_READ, |
+ false /* create */, |
+ base::Bind(&CallbackLogger::OnOpenFile, callback_logger.GetWeakPtr())); |
+ open_file.SetDispatchEventImplForTesting( |
+ base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, |
+ base::Unretained(&dispatcher))); |
+ |
+ EXPECT_TRUE(open_file.Execute(kRequestId)); |
+ |
+ open_file.OnSuccess(kRequestId, |
+ scoped_ptr<RequestValue>(new RequestValue()), |
+ false /* has_next */); |
+ ASSERT_EQ(1u, callback_logger.events().size()); |
+ EXPECT_EQ(base::File::FILE_OK, callback_logger.events()[0]); |
+} |
+ |
+TEST_F(FileSystemProviderOperationsOpenFileTest, OnError) { |
+ using extensions::api::file_system_provider::EntryMetadata; |
+ using extensions::api::file_system_provider_internal::OpenFileRequestedError:: |
+ Params; |
+ |
+ LoggingDispatchEventImpl dispatcher(true /* dispatch_reply */); |
+ CallbackLogger callback_logger; |
+ |
+ OpenFile open_file( |
+ NULL, |
+ file_system_info_, |
+ base::FilePath::FromUTF8Unsafe(kFilePath), |
+ ProvidedFileSystemInterface::OPEN_FILE_MODE_READ, |
+ false /* create */, |
+ base::Bind(&CallbackLogger::OnOpenFile, callback_logger.GetWeakPtr())); |
+ open_file.SetDispatchEventImplForTesting( |
+ base::Bind(&LoggingDispatchEventImpl::OnDispatchEventImpl, |
+ base::Unretained(&dispatcher))); |
+ |
+ EXPECT_TRUE(open_file.Execute(kRequestId)); |
+ |
+ open_file.OnError(kRequestId, base::File::FILE_ERROR_TOO_MANY_OPENED); |
+ ASSERT_EQ(1u, callback_logger.events().size()); |
+ EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, |
+ callback_logger.events()[0]); |
+} |
+ |
+} // namespace operations |
+} // namespace file_system_provider |
+} // namespace chromeos |