11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/api/file_system/entry_watcher_service.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector>
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_path.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/scoped_temp_dir.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_vector.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/api/file_system.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_profile.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_browser_thread_bundle.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_file_system_context.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/event_router.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_types.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid LogStatus(std::vector<base::File::Error>* log, base::File::Error status) {
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  log->push_back(status);
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass EntryWatcherServiceTest : public testing::Test {
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EntryWatcherServiceTest() {}
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~EntryWatcherServiceTest() {}
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void SetUp() OVERRIDE {
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_.reset(new TestingProfile);
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file_system_context_ =
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::CreateFileSystemContextForTesting(NULL, data_dir_.path());
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    service_.reset(new EntryWatcherService(profile_.get()));
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    service_->SetDispatchEventImplForTesting(base::Bind(
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &EntryWatcherServiceTest::DispatchEventImpl, base::Unretained(this)));
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    service_->SetGetFileSystemContextImplForTesting(
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&EntryWatcherServiceTest::GetFileSystemContextImpl,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   base::Unretained(this)));
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    testing_url_ = file_system_context_->CreateCrackedFileSystemURL(
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GURL(std::string("chrome-extension://") + kExtensionId),
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        storage::kFileSystemTypeTest,
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::FilePath::FromUTF8Unsafe("/x/y/z"));
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void TearDown() OVERRIDE {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatch_event_log_targets_.clear();
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatch_event_log_events_.clear();
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DispatchEventImpl(const std::string& extension_id,
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         scoped_ptr<Event> event) {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatch_event_log_targets_.push_back(extension_id);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    dispatch_event_log_events_.push_back(event.release());
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  storage::FileSystemContext* GetFileSystemContextImpl(
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const std::string& extension_id,
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      content::BrowserContext* context) {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(kExtensionId, extension_id);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(profile_.get(), context);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return file_system_context_.get();
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::TestBrowserThreadBundle thread_bundle_;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<TestingProfile> profile_;
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedTempDir data_dir_;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<storage::FileSystemContext> file_system_context_;
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<EntryWatcherService> service_;
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  storage::FileSystemURL testing_url_;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> dispatch_event_log_targets_;
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ScopedVector<Event> dispatch_event_log_events_;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EntryWatcherServiceTest, GetWatchedEntries) {
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> log;
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool recursive = false;
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->WatchDirectory(
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, log.size());
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_OK, log[0]);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<storage::FileSystemURL> watched_entries =
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        service_->GetWatchedEntries(kExtensionId);
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_EQ(1u, watched_entries.size());
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(testing_url_, watched_entries[0]);
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string wrong_extension_id = "abcabcabcabcabcabcabcabcabcabcab";
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<storage::FileSystemURL> watched_entries =
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        service_->GetWatchedEntries(wrong_extension_id);
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(0u, watched_entries.size());
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EntryWatcherServiceTest, WatchDirectory) {
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> log;
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool recursive = false;
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->WatchDirectory(
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, log.size());
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_OK, log[0]);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The testing WatcherManager implementation emits two hard-coded fake
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // notifications as soon as the watcher is set properly. See:
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TestWatcherManager::WatchDirectory() for details.
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_LE(1u, dispatch_event_log_targets_.size());
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_LE(1u, dispatch_event_log_events_.size());
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kExtensionId, dispatch_event_log_targets_[0]);
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(api::file_system::OnEntryChanged::kEventName,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dispatch_event_log_events_[0]->event_name);
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_LE(2u, dispatch_event_log_targets_.size());
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_LE(2u, dispatch_event_log_events_.size());
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kExtensionId, dispatch_event_log_targets_[1]);
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(api::file_system::OnEntryRemoved::kEventName,
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            dispatch_event_log_events_[1]->event_name);
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // No unexpected events.
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_targets_.size());
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_events_.size());
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::vector<storage::FileSystemURL> watched_entries =
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      service_->GetWatchedEntries(kExtensionId);
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, watched_entries.size());
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(testing_url_, watched_entries[0]);
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EntryWatcherServiceTest, WatchDirectory_AlreadyExists) {
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> log;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool recursive = false;
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->WatchDirectory(
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, log.size());
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_OK, log[0]);
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_targets_.size());
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_events_.size());
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<storage::FileSystemURL> watched_entries =
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        service_->GetWatchedEntries(kExtensionId);
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1u, watched_entries.size());
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->WatchDirectory(
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, log.size());
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_ERROR_EXISTS, log[1]);
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // No new unexpected events.
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_targets_.size());
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_events_.size());
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<storage::FileSystemURL> watched_entries =
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        service_->GetWatchedEntries(kExtensionId);
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1u, watched_entries.size());
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EntryWatcherServiceTest, WatchDirectory_Recursive) {
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> log;
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool recursive = true;
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->WatchDirectory(
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, recursive, base::Bind(&LogStatus, &log));
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Recursive watchers are not supported yet.
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, log.size());
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]);
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // No unexpected events.
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(0u, dispatch_event_log_targets_.size());
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(0u, dispatch_event_log_events_.size());
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::vector<storage::FileSystemURL> watched_entries =
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      service_->GetWatchedEntries(kExtensionId);
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0u, watched_entries.size());
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EntryWatcherServiceTest, UnwatchEntry) {
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> watch_log;
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool recursive = false;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->WatchDirectory(kExtensionId,
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           testing_url_,
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           recursive,
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           base::Bind(&LogStatus, &watch_log));
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, watch_log.size());
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_OK, watch_log[0]);
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_targets_.size());
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(2u, dispatch_event_log_events_.size());
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<storage::FileSystemURL> watched_entries =
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        service_->GetWatchedEntries(kExtensionId);
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(1u, watched_entries.size());
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> unwatch_log;
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->UnwatchEntry(
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, base::Bind(&LogStatus, &unwatch_log));
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, unwatch_log.size());
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_OK, unwatch_log[0]);
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  {
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<storage::FileSystemURL> watched_entries =
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        service_->GetWatchedEntries(kExtensionId);
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(0u, watched_entries.size());
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(EntryWatcherServiceTest, UnwatchEntry_NotFound) {
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<base::File::Error> log;
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service_->UnwatchEntry(
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kExtensionId, testing_url_, base::Bind(&LogStatus, &log));
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop().RunUntilIdle();
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(1u, log.size());
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]);
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace extensions
255