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