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

Unified Diff: chrome/browser/extensions/api/file_system/entry_watcher_service_unittest.cc

Issue 452043003: [ew] Add basic classes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleaned up. Created 6 years, 4 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/extensions/api/file_system/entry_watcher_service_unittest.cc
diff --git a/chrome/browser/extensions/api/file_system/entry_watcher_service_unittest.cc b/chrome/browser/extensions/api/file_system/entry_watcher_service_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..76d2ce063a0d5aa066f16cb774d7da10ff85f7f9
--- /dev/null
+++ b/chrome/browser/extensions/api/file_system/entry_watcher_service_unittest.cc
@@ -0,0 +1,253 @@
+// 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 "chrome/browser/extensions/api/file_system/entry_watcher_service.h"
+
+#include <string>
+#include <vector>
+
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/memory/scoped_vector.h"
+#include "base/run_loop.h"
+#include "chrome/common/extensions/api/file_system.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+#include "content/public/test/test_file_system_context.h"
+#include "extensions/browser/event_router.h"
+#include "webkit/browser/fileapi/file_system_url.h"
+#include "webkit/common/fileapi/file_system_types.h"
+
+namespace extensions {
+namespace {
+
+const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
+
+void LogStatus(std::vector<base::File::Error>* log, base::File::Error status) {
+ log->push_back(status);
+}
+
+} // namespace
+
+class EntryWatcherServiceTest : public testing::Test {
+ protected:
+ EntryWatcherServiceTest() {}
+ virtual ~EntryWatcherServiceTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ profile_.reset(new TestingProfile);
+ ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
+ file_system_context_ =
+ content::CreateFileSystemContextForTesting(NULL, data_dir_.path());
+ service_.reset(new EntryWatcherService(profile_.get()));
+ service_->SetDispatchEventImplForTesting(base::Bind(
+ &EntryWatcherServiceTest::DispatchEventImpl, base::Unretained(this)));
+ service_->SetGetFileSystemContextImplForTesting(
+ base::Bind(&EntryWatcherServiceTest::GetFileSystemContextImpl,
+ base::Unretained(this)));
+ testing_url_ = file_system_context_->CreateCrackedFileSystemURL(
+ GURL(std::string("chrome-extension://") + kExtensionId),
+ fileapi::kFileSystemTypeTest,
+ base::FilePath::FromUTF8Unsafe("/x/y/z"));
+ }
+
+ virtual void TearDown() OVERRIDE {
+ dispatch_event_log_targets_.clear();
+ dispatch_event_log_events_.clear();
+ }
+
+ void DispatchEventImpl(const std::string& extension_id,
+ scoped_ptr<Event> event) {
+ dispatch_event_log_targets_.push_back(extension_id);
+ dispatch_event_log_events_.push_back(event.release());
+ }
+
+ fileapi::FileSystemContext* GetFileSystemContextImpl(
+ const std::string& extension_id,
+ content::BrowserContext* context) {
+ EXPECT_EQ(kExtensionId, extension_id);
+ EXPECT_EQ(profile_.get(), context);
+ return file_system_context_.get();
+ }
+
+ content::TestBrowserThreadBundle thread_bundle_;
+ scoped_ptr<TestingProfile> profile_;
+ base::ScopedTempDir data_dir_;
+ scoped_refptr<fileapi::FileSystemContext> file_system_context_;
+ scoped_ptr<EntryWatcherService> service_;
+ fileapi::FileSystemURL testing_url_;
+ std::vector<std::string> dispatch_event_log_targets_;
+ ScopedVector<Event> dispatch_event_log_events_;
+};
+
+TEST_F(EntryWatcherServiceTest, GetWatchedEntries) {
+ std::vector<base::File::Error> log;
+
+ const bool recursive = false;
+ service_->WatchDirectory(
+ kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(1u, log.size());
+ EXPECT_EQ(base::File::FILE_OK, log[0]);
+
+ {
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ ASSERT_EQ(1u, watched_entries.size());
+ EXPECT_EQ(testing_url_, watched_entries[0]);
+ }
+
+ {
+ const std::string wrong_extension_id = "abcabcabcabcabcabcabcabcabcabcab";
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(wrong_extension_id);
+ EXPECT_EQ(0u, watched_entries.size());
+ }
+}
+
+TEST_F(EntryWatcherServiceTest, WatchDirectory) {
+ std::vector<base::File::Error> log;
+
+ const bool recursive = false;
+ service_->WatchDirectory(
+ kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(1u, log.size());
+ EXPECT_EQ(base::File::FILE_OK, log[0]);
+
+ // The testing WatcherManager implementation emits a fake notification as soon
benwells 2014/08/18 22:58:32 I think it it emits two. A comment line "The testi
mtomasz 2014/08/19 06:50:36 Done.
+ // as the watcher is set properly.
+ ASSERT_LE(1u, dispatch_event_log_targets_.size());
+ ASSERT_LE(1u, dispatch_event_log_events_.size());
+
+ EXPECT_EQ(kExtensionId, dispatch_event_log_targets_[0]);
+ EXPECT_EQ(api::file_system::OnEntryChanged::kEventName,
+ dispatch_event_log_events_[0]->event_name);
+
+ ASSERT_LE(2u, dispatch_event_log_targets_.size());
+ ASSERT_LE(2u, dispatch_event_log_events_.size());
+ EXPECT_EQ(kExtensionId, dispatch_event_log_targets_[1]);
+ EXPECT_EQ(api::file_system::OnEntryRemoved::kEventName,
+ dispatch_event_log_events_[1]->event_name);
+
+ // No unexpected events.
+ ASSERT_EQ(2u, dispatch_event_log_targets_.size());
+ ASSERT_EQ(2u, dispatch_event_log_events_.size());
+
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ ASSERT_EQ(1u, watched_entries.size());
+ EXPECT_EQ(testing_url_, watched_entries[0]);
+}
+
+TEST_F(EntryWatcherServiceTest, WatchDirectory_AlreadyExists) {
+ std::vector<base::File::Error> log;
+
+ const bool recursive = false;
+ service_->WatchDirectory(
+ kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(1u, log.size());
+ EXPECT_EQ(base::File::FILE_OK, log[0]);
+
+ ASSERT_EQ(2u, dispatch_event_log_targets_.size());
+ ASSERT_EQ(2u, dispatch_event_log_events_.size());
+
+ {
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ EXPECT_EQ(1u, watched_entries.size());
+ }
+
+ service_->WatchDirectory(
+ kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(2u, log.size());
+ EXPECT_EQ(base::File::FILE_ERROR_EXISTS, log[1]);
+
+ // No new unexpected events.
+ ASSERT_EQ(2u, dispatch_event_log_targets_.size());
+ ASSERT_EQ(2u, dispatch_event_log_events_.size());
+
+ {
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ EXPECT_EQ(1u, watched_entries.size());
+ }
+}
+
+TEST_F(EntryWatcherServiceTest, WatchDirectory_Recursive) {
+ std::vector<base::File::Error> log;
+
+ const bool recursive = true;
+ service_->WatchDirectory(
+ kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
+ base::RunLoop().RunUntilIdle();
+
+ // Recursive watchers are not supported yet.
+ ASSERT_EQ(1u, log.size());
+ EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]);
+
+ // No unexpected events.
+ ASSERT_EQ(0u, dispatch_event_log_targets_.size());
+ ASSERT_EQ(0u, dispatch_event_log_events_.size());
+
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ EXPECT_EQ(0u, watched_entries.size());
+}
+
+TEST_F(EntryWatcherServiceTest, UnwatchEntry) {
+ std::vector<base::File::Error> watch_log;
+
+ const bool recursive = false;
+ service_->WatchDirectory(kExtensionId,
+ testing_url_,
+ recursive,
+ base::Bind(&LogStatus, &watch_log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(1u, watch_log.size());
+ EXPECT_EQ(base::File::FILE_OK, watch_log[0]);
+
+ ASSERT_EQ(2u, dispatch_event_log_targets_.size());
+ ASSERT_EQ(2u, dispatch_event_log_events_.size());
+
+ {
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ EXPECT_EQ(1u, watched_entries.size());
+ }
+
+ std::vector<base::File::Error> unwatch_log;
+ service_->UnwatchEntry(
+ kExtensionId, testing_url_, base::Bind(&LogStatus, &unwatch_log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(1u, unwatch_log.size());
+ EXPECT_EQ(base::File::FILE_OK, unwatch_log[0]);
+
+ {
+ const std::vector<fileapi::FileSystemURL> watched_entries =
+ service_->GetWatchedEntries(kExtensionId);
+ EXPECT_EQ(0u, watched_entries.size());
+ }
+}
+
+TEST_F(EntryWatcherServiceTest, UnwatchEntry_NotFound) {
+ std::vector<base::File::Error> log;
+ service_->UnwatchEntry(
+ kExtensionId, testing_url_, base::Bind(&LogStatus, &log));
+ base::RunLoop().RunUntilIdle();
+
+ ASSERT_EQ(1u, log.size());
+ EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]);
+}
+
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698