blob: d4d85f15bc3e4fa9d43746f283864c74815d01ea [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/sync_file_system/drive_backend/sync_engine.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/thread_task_runner_handle.h"
#include "chrome/browser/drive/drive_uploader.h"
#include "chrome/browser/drive/fake_drive_service.h"
#include "chrome/browser/sync_file_system/drive_backend/callback_helper.h"
#include "chrome/browser/sync_file_system/drive_backend/fake_sync_worker.h"
#include "chrome/browser/sync_file_system/drive_backend/sync_worker_interface.h"
#include "chrome/browser/sync_file_system/remote_file_sync_service.h"
#include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace sync_file_system {
namespace drive_backend {
class SyncEngineTest : public testing::Test,
public base::SupportsWeakPtr<SyncEngineTest> {
public:
typedef RemoteFileSyncService::OriginStatusMap RemoteOriginStatusMap;
SyncEngineTest() {}
virtual ~SyncEngineTest() {}
virtual void SetUp() OVERRIDE {
ASSERT_TRUE(profile_dir_.CreateUniqueTempDir());
scoped_ptr<drive::DriveServiceInterface>
fake_drive_service(new drive::FakeDriveService);
worker_pool_ = new base::SequencedWorkerPool(1, "Worker");
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner =
base::ThreadTaskRunnerHandle::Get();
worker_task_runner_ =
worker_pool_->GetSequencedTaskRunnerWithShutdownBehavior(
worker_pool_->GetSequenceToken(),
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
sync_engine_.reset(new drive_backend::SyncEngine(
ui_task_runner,
worker_task_runner_,
NULL /* drive_task_runner */,
profile_dir_.path(),
NULL /* task_logger */,
NULL /* notification_manager */,
NULL /* extension_service */,
NULL /* signin_manager */,
NULL /* token_service */,
NULL /* request_context */,
scoped_ptr<SyncEngine::DriveServiceFactory>(),
NULL /* in_memory_env */));
sync_engine_->InitializeForTesting(
fake_drive_service.Pass(),
scoped_ptr<drive::DriveUploaderInterface>(),
scoped_ptr<SyncWorkerInterface>(new FakeSyncWorker));
sync_engine_->SetSyncEnabled(true);
sync_engine_->OnReadyToSendRequests();
WaitForWorkerTaskRunner();
}
virtual void TearDown() OVERRIDE {
sync_engine_.reset();
WaitForWorkerTaskRunner();
worker_pool_->Shutdown();
base::RunLoop().RunUntilIdle();
}
bool FindOriginStatus(const GURL& origin, std::string* status) {
scoped_ptr<RemoteOriginStatusMap> status_map;
sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map));
WaitForWorkerTaskRunner();
RemoteOriginStatusMap::const_iterator itr = status_map->find(origin);
if (itr == status_map->end())
return false;
*status = itr->second;
// If an origin is uninstalled, it should not be found actually.
if (*status == "Uninstalled")
return false;
return true;
}
void PostUpdateServiceState(RemoteServiceState state,
const std::string& description) {
worker_task_runner_->PostTask(
FROM_HERE,
base::Bind(&FakeSyncWorker::UpdateServiceState,
base::Unretained(fake_sync_worker()),
state,
description));
WaitForWorkerTaskRunner();
}
void WaitForWorkerTaskRunner() {
DCHECK(worker_task_runner_);
base::RunLoop run_loop;
worker_task_runner_->PostTask(
FROM_HERE,
RelayCallbackToCurrentThread(
FROM_HERE, run_loop.QuitClosure()));
run_loop.Run();
}
// Accessors
SyncEngine* sync_engine() { return sync_engine_.get(); }
FakeSyncWorker* fake_sync_worker() {
return static_cast<FakeSyncWorker*>(sync_engine_->sync_worker_.get());
}
private:
content::TestBrowserThreadBundle browser_threads_;
base::ScopedTempDir profile_dir_;
scoped_ptr<drive_backend::SyncEngine> sync_engine_;
scoped_refptr<base::SequencedWorkerPool> worker_pool_;
scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
DISALLOW_COPY_AND_ASSIGN(SyncEngineTest);
};
TEST_F(SyncEngineTest, OriginTest) {
GURL origin("chrome-extension://app_0");
SyncStatusCode sync_status;
std::string status;
sync_engine()->RegisterOrigin(
origin,
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
ASSERT_TRUE(FindOriginStatus(origin, &status));
EXPECT_EQ("Registered", status);
sync_engine()->DisableOrigin(
origin,
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
ASSERT_TRUE(FindOriginStatus(origin, &status));
EXPECT_EQ("Disabled", status);
sync_engine()->EnableOrigin(
origin,
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
ASSERT_TRUE(FindOriginStatus(origin, &status));
EXPECT_EQ("Enabled", status);
sync_engine()->UninstallOrigin(
origin,
RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE,
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
EXPECT_FALSE(FindOriginStatus(origin, &status));
EXPECT_EQ("Uninstalled", status);
}
TEST_F(SyncEngineTest, GetOriginStatusMap) {
SyncStatusCode sync_status = SYNC_STATUS_UNKNOWN;
sync_engine()->RegisterOrigin(GURL("chrome-extension://app_0"),
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
sync_engine()->RegisterOrigin(GURL("chrome-extension://app_1"),
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
scoped_ptr<RemoteOriginStatusMap> status_map;
sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map));
WaitForWorkerTaskRunner();
ASSERT_EQ(2u, status_map->size());
EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_0")]);
EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_1")]);
sync_engine()->DisableOrigin(GURL("chrome-extension://app_1"),
CreateResultReceiver(&sync_status));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map));
WaitForWorkerTaskRunner();
ASSERT_EQ(2u, status_map->size());
EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_0")]);
EXPECT_EQ("Disabled", (*status_map)[GURL("chrome-extension://app_1")]);
}
TEST_F(SyncEngineTest, UpdateServiceState) {
struct {
RemoteServiceState state;
const char* description;
} test_data[] = {
{REMOTE_SERVICE_OK, "OK"},
{REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "TEMPORARY_UNAVAILABLE"},
{REMOTE_SERVICE_AUTHENTICATION_REQUIRED, "AUTHENTICATION_REQUIRED"},
{REMOTE_SERVICE_DISABLED, "DISABLED"},
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) {
PostUpdateServiceState(test_data[i].state, test_data[i].description);
EXPECT_EQ(test_data[i].state, sync_engine()->GetCurrentState())
<< "Expected state: REMOTE_SERVICE_" << test_data[i].description;
}
}
TEST_F(SyncEngineTest, ProcessRemoteChange) {
SyncStatusCode sync_status;
fileapi::FileSystemURL url;
sync_engine()->ProcessRemoteChange(CreateResultReceiver(&sync_status, &url));
WaitForWorkerTaskRunner();
EXPECT_EQ(SYNC_STATUS_OK, sync_status);
}
} // namespace drive_backend
} // namespace sync_file_system