sync_client_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/sync_client.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/prefs/testing_pref_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/change_list_loader.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/chromeos/drive/fake_free_disk_space_getter.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/move_operation.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_observer.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/remove_operation.h"
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/job_scheduler.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/fake_drive_service.h"
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive {
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace internal {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// The content of files initially stored in the cache.
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kLocalContent[] = "Hello!";
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// The content of files stored in the service.
41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kRemoteContent[] = "World!";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// SyncClientTestDriveService will return GDATA_CANCELLED when a request is
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// made with the specified resource ID.
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass SyncClientTestDriveService : public ::drive::FakeDriveService {
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SyncClientTestDriveService() : download_file_count_(0) {}
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // FakeDriveService override:
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual google_apis::CancelCallback DownloadFile(
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const base::FilePath& local_cache_path,
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const std::string& resource_id,
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const google_apis::DownloadActionCallback& download_action_callback,
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const google_apis::GetContentCallback& get_content_callback,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const google_apis::ProgressCallback& progress_callback) OVERRIDE {
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ++download_file_count_;
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (resource_id == resource_id_to_be_cancelled_) {
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::MessageLoopProxy::current()->PostTask(
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          FROM_HERE,
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          base::Bind(download_action_callback,
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     google_apis::GDATA_CANCELLED,
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     base::FilePath()));
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return google_apis::CancelCallback();
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (resource_id == resource_id_to_be_paused_) {
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      paused_action_ = base::Bind(download_action_callback,
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  google_apis::GDATA_OTHER_ERROR,
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  base::FilePath());
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return google_apis::CancelCallback();
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return FakeDriveService::DownloadFile(local_cache_path,
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          resource_id,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          download_action_callback,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          get_content_callback,
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          progress_callback);
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int download_file_count() const { return download_file_count_; }
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void set_resource_id_to_be_cancelled(const std::string& resource_id) {
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_id_to_be_cancelled_ = resource_id;
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void set_resource_id_to_be_paused(const std::string& resource_id) {
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    resource_id_to_be_paused_ = resource_id;
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::Closure& paused_action() const { return paused_action_; }
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int download_file_count_;
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string resource_id_to_be_cancelled_;
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string resource_id_to_be_paused_;
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Closure paused_action_;
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class DummyOperationObserver : public file_system::OperationObserver {
987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // OperationObserver override:
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual void OnDirectoryChangedByOperation(
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      const base::FilePath& path) OVERRIDE {}
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SyncClientTest : public testing::Test {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    pref_service_.reset(new TestingPrefServiceSimple);
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    test_util::RegisterDrivePrefs(pref_service_->registry());
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fake_network_change_notifier_.reset(
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new test_util::FakeNetworkChangeNotifier);
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_.reset(new EventLogger);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    drive_service_.reset(new SyncClientTestDriveService);
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    drive_service_->LoadResourceListForWapi("gdata/empty_feed.json");
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    drive_service_->LoadAccountMetadataForWapi(
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "gdata/account_metadata.json");
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    scheduler_.reset(new JobScheduler(pref_service_.get(),
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      logger_.get(),
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      drive_service_.get(),
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                      base::MessageLoopProxy::current().get()));
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    metadata_storage_.reset(new ResourceMetadataStorage(
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        temp_dir_.path(), base::MessageLoopProxy::current().get()));
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(metadata_storage_->Initialize());
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    metadata_.reset(new internal::ResourceMetadata(
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        metadata_storage_.get(), base::MessageLoopProxy::current()));
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize());
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    cache_.reset(new FileCache(metadata_storage_.get(),
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                               temp_dir_.path(),
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                               base::MessageLoopProxy::current().get(),
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                               NULL /* free_disk_space_getter */));
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    ASSERT_TRUE(cache_->Initialize());
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get()));
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loader_controller_.reset(new LoaderController);
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    change_list_loader_.reset(new ChangeListLoader(
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        logger_.get(),
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::MessageLoopProxy::current().get(),
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        metadata_.get(),
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        scheduler_.get(),
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        about_resource_loader_.get(),
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        loader_controller_.get()));
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(SetUpTestData());
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    sync_client_.reset(new SyncClient(base::MessageLoopProxy::current().get(),
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      &observer_,
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      scheduler_.get(),
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                      metadata_.get(),
1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      cache_.get(),
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      loader_controller_.get(),
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      temp_dir_.path()));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Disable delaying so that DoSyncLoop() starts immediately.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_client_->set_delay_for_testing(base::TimeDelta::FromSeconds(0));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Adds a file to the service root and |resource_ids_|.
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void AddFileEntry(const std::string& title) {
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    google_apis::GDataErrorCode error = google_apis::GDATA_FILE_ERROR;
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_ptr<google_apis::ResourceEntry> entry;
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    drive_service_->AddNewFile(
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        "text/plain",
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        kRemoteContent,
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        drive_service_->GetRootResourceId(),
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        title,
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        false,  // shared_with_me
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        google_apis::test_util::CreateCopyResultCallback(&error, &entry));
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_EQ(google_apis::HTTP_CREATED, error);
178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(entry);
179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    resource_ids_[title] = entry->resource_id();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Sets up data for tests.
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void SetUpTestData() {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Prepare a temp file.
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath temp_file;
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &temp_file));
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_TRUE(google_apis::test_util::WriteStringToFile(temp_file,
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                                          kLocalContent));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Add file entries to the service.
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("foo"));
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("bar"));
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("baz"));
194868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("fetched"));
195868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("dirty"));
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("removed"));
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_NO_FATAL_FAILURE(AddFileEntry("moved"));
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // Load data from the service to the metadata.
200868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    FileError error = FILE_ERROR_FAILED;
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    change_list_loader_->LoadIfNeeded(
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        google_apis::test_util::CreateCopyResultCallback(&error));
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, error);
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Prepare 3 pinned-but-not-present files.
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(GetLocalId("foo")));
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(GetLocalId("bar")));
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(GetLocalId("baz")));
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Prepare a pinned-and-fetched file.
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const std::string md5_fetched = "md5";
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK,
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              cache_->Store(GetLocalId("fetched"), md5_fetched,
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            temp_file, FileCache::FILE_OPERATION_COPY));
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(GetLocalId("fetched")));
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Prepare a pinned-and-fetched-and-dirty file.
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK,
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              cache_->Store(GetLocalId("dirty"), std::string(),
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                            temp_file, FileCache::FILE_OPERATION_COPY));
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(GetLocalId("dirty")));
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Prepare a removed file.
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    file_system::RemoveOperation remove_operation(
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::MessageLoopProxy::current().get(), &observer_, metadata_.get(),
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        cache_.get());
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    remove_operation.Remove(
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        metadata_->GetFilePath(GetLocalId("removed")),
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        false,  // is_recursive
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        google_apis::test_util::CreateCopyResultCallback(&error));
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, error);
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Prepare a moved file.
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    file_system::MoveOperation move_operation(
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::MessageLoopProxy::current().get(), &observer_, metadata_.get());
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    move_operation.Move(
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        metadata_->GetFilePath(GetLocalId("moved")),
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        util::GetDriveMyDriveRootPath().AppendASCII("moved_new_title"),
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        google_apis::test_util::CreateCopyResultCallback(&error));
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK, error);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string GetLocalId(const std::string& title) {
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(1U, resource_ids_.count(title));
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    std::string local_id;
2504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_EQ(FILE_ERROR_OK,
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              metadata_->GetIdByResourceId(resource_ids_[title], &local_id));
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return local_id;
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<TestingPrefServiceSimple> pref_service_;
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<test_util::FakeNetworkChangeNotifier>
259eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      fake_network_change_notifier_;
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<EventLogger> logger_;
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<SyncClientTestDriveService> drive_service_;
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DummyOperationObserver observer_;
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<JobScheduler> scheduler_;
264eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ResourceMetadataStorage,
265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch             test_util::DestroyHelperForTests> metadata_storage_;
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<ResourceMetadata, test_util::DestroyHelperForTests> metadata_;
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_;
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<AboutResourceLoader> about_resource_loader_;
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<LoaderController> loader_controller_;
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<ChangeListLoader> change_list_loader_;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<SyncClient> sync_client_;
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::map<std::string, std::string> resource_ids_;  // Name-to-id map.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(SyncClientTest, StartProcessingBacklog) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_client_->StartProcessingBacklog();
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FileCacheEntry cache_entry;
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Pinned files get downloaded.
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("foo"), &cache_entry));
283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("bar"), &cache_entry));
286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("baz"), &cache_entry));
289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
290868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Dirty file gets uploaded.
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("dirty"), &cache_entry));
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(cache_entry.is_dirty());
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Removed entry is not found.
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  google_apis::GDataErrorCode status = google_apis::GDATA_OTHER_ERROR;
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<google_apis::ResourceEntry> resource_entry;
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  drive_service_->GetResourceEntry(
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      resource_ids_["removed"],
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&status,
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                                       &resource_entry));
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(google_apis::HTTP_SUCCESS, status);
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(resource_entry);
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(resource_entry->deleted());
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Moved entry was moved.
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  status = google_apis::GDATA_OTHER_ERROR;
309a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  drive_service_->GetResourceEntry(
310a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_ids_["moved"],
311a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      google_apis::test_util::CreateCopyResultCallback(&status,
312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                       &resource_entry));
313a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(google_apis::HTTP_SUCCESS, status);
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(resource_entry);
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ("moved_new_title", resource_entry->title());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncClientTest, AddFetchTask) {
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("foo"));
321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FileCacheEntry cache_entry;
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("foo"), &cache_entry));
325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncClientTest, AddFetchTaskAndCancelled) {
329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Trigger fetching of a file which results in cancellation.
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  drive_service_->set_resource_id_to_be_cancelled(resource_ids_["foo"]);
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("foo"));
332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The file should be unpinned if the user wants the download to be cancelled.
335868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FileCacheEntry cache_entry;
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(cache_->GetCacheEntry(GetLocalId("foo"), &cache_entry));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(SyncClientTest, RemoveFetchTask) {
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("foo"));
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("bar"));
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("baz"));
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->RemoveFetchTask(GetLocalId("foo"));
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->RemoveFetchTask(GetLocalId("baz"));
346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
348868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Only "bar" should be fetched.
349868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FileCacheEntry cache_entry;
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("foo"), &cache_entry));
351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(cache_entry.is_present());
352868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("bar"), &cache_entry));
354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(cache_entry.is_present());
355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("baz"), &cache_entry));
357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(cache_entry.is_present());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(SyncClientTest, ExistingPinnedFiles) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start checking the existing pinned files. This will collect the resource
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IDs of pinned files, with stale local cache files.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_client_->StartCheckingExistingPinnedFiles();
365868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
366868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
367868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // "fetched" and "dirty" are the existing pinned files.
368868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The non-dirty one should be synced, but the dirty one should not.
369868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::FilePath cache_file;
370868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string content;
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(GetLocalId("fetched"), &cache_file));
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(base::ReadFileToString(cache_file, &content));
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kRemoteContent, content);
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content.clear();
375868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(GetLocalId("dirty"), &cache_file));
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(base::ReadFileToString(cache_file, &content));
378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kLocalContent, content);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(SyncClientTest, RetryOnDisconnection) {
382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Let the service go down.
383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  drive_service_->set_offline(true);
384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Change the network connection state after some delay, to test that
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // FILE_ERROR_NO_CONNECTION is handled by SyncClient correctly.
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Without this delay, JobScheduler will keep the jobs unrun and SyncClient
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // will receive no error.
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::MessageLoopProxy::current()->PostDelayedTask(
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      FROM_HERE,
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&test_util::FakeNetworkChangeNotifier::SetConnectionType,
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(fake_network_change_notifier_.get()),
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 net::NetworkChangeNotifier::CONNECTION_NONE),
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      TestTimeouts::tiny_timeout());
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Try fetch and upload.
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("foo"));
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_client_->AddUpdateTask(ClientContext(USER_INITIATED),
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              GetLocalId("dirty"));
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::RunLoop().RunUntilIdle();
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Not yet fetched nor uploaded.
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FileCacheEntry cache_entry;
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("foo"), &cache_entry));
404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(cache_entry.is_present());
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("dirty"), &cache_entry));
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(cache_entry.is_dirty());
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Switch to online.
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  fake_network_change_notifier_->SetConnectionType(
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      net::NetworkChangeNotifier::CONNECTION_WIFI);
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  drive_service_->set_offline(false);
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::RunLoop().RunUntilIdle();
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Fetched and uploaded.
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("foo"), &cache_entry));
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(cache_entry.is_present());
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(cache_->GetCacheEntry(GetLocalId("dirty"), &cache_entry));
418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(cache_entry.is_dirty());
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(SyncClientTest, ScheduleRerun) {
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Add a fetch task for "foo", this should result in being paused.
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  drive_service_->set_resource_id_to_be_paused(resource_ids_["foo"]);
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("foo"));
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // While the first task is paused, add a task again.
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // This results in scheduling rerun of the task.
429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  sync_client_->AddFetchTask(GetLocalId("foo"));
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Resume the paused task.
433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  drive_service_->set_resource_id_to_be_paused(std::string());
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_FALSE(drive_service_->paused_action().is_null());
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  drive_service_->paused_action().Run();
436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Task should be run twice.
439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(2, drive_service_->download_file_count());
440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(SyncClientTest, Dependencies) {
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Create directories locally.
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath kPath1(FILE_PATH_LITERAL("drive/root/dir1"));
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath kPath2 = kPath1.AppendASCII("dir2");
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry parent;
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK,
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            metadata_->GetResourceEntryByPath(kPath1.DirName(), &parent));
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry entry1;
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry1.set_parent_local_id(parent.local_id());
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry1.set_title(kPath1.BaseName().AsUTF8Unsafe());
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry1.mutable_file_info()->set_is_directory(true);
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry1.set_metadata_edit_state(ResourceEntry::DIRTY);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string local_id1;
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->AddEntry(entry1, &local_id1));
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceEntry entry2;
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry2.set_parent_local_id(local_id1);
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry2.set_title(kPath2.BaseName().AsUTF8Unsafe());
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry2.mutable_file_info()->set_is_directory(true);
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  entry2.set_metadata_edit_state(ResourceEntry::DIRTY);
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string local_id2;
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->AddEntry(entry2, &local_id2));
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Start syncing the child first.
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_client_->AddUpdateTask(ClientContext(USER_INITIATED), local_id2);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Start syncing the parent later.
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  sync_client_->AddUpdateTask(ClientContext(USER_INITIATED), local_id1);
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Both entries are synced.
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryById(local_id1, &entry1));
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ResourceEntry::CLEAN, entry1.metadata_edit_state());
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(FILE_ERROR_OK, metadata_->GetResourceEntryById(local_id2, &entry2));
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(ResourceEntry::CLEAN, entry2.metadata_edit_state());
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
48190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace internal
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace drive
483