blob: 78f18aa10039ffabc82460a9cbc44a8b6c41fa65 [file]
// Copyright 2019 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/sharing/sharing_service.h"
#include <memory>
#include <vector>
#include "base/guid.h"
#include "base/memory/ptr_util.h"
#include "base/test/scoped_task_environment.h"
#include "chrome/browser/sharing/fake_local_device_info_provider.h"
#include "chrome/browser/sharing/sharing_device_info.h"
#include "chrome/browser/sharing/sharing_device_registration.h"
#include "chrome/browser/sharing/sharing_sync_preference.h"
#include "chrome/browser/sharing/vapid_key_manager.h"
#include "components/gcm_driver/fake_gcm_driver.h"
#include "components/gcm_driver/instance_id/instance_id_driver.h"
#include "components/sync/driver/fake_sync_service.h"
#include "components/sync_device_info/device_info.h"
#include "components/sync_device_info/fake_device_info_tracker.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::test::ScopedTaskEnvironment;
using namespace instance_id;
using namespace testing;
namespace {
constexpr int kNoCapabilities =
static_cast<int>(SharingDeviceCapability::kNone);
class MockInstanceIDDriver : public InstanceIDDriver {
public:
MockInstanceIDDriver() : InstanceIDDriver(/*gcm_driver=*/nullptr) {}
~MockInstanceIDDriver() override = default;
private:
DISALLOW_COPY_AND_ASSIGN(MockInstanceIDDriver);
};
class SharingServiceTest : public testing::Test {
public:
SharingServiceTest() {
sync_prefs_ = new SharingSyncPreference(&prefs_);
vapid_key_manager_ = new VapidKeyManager(sync_prefs_);
sharing_device_registration_ = new SharingDeviceRegistration(
sync_prefs_, &mock_instance_id_driver_, vapid_key_manager_,
&fake_gcm_driver_, &fake_local_device_info_provider_);
sharing_service_ = std::make_unique<SharingService>(
base::WrapUnique(sync_prefs_),
base::WrapUnique(sharing_device_registration_),
base::WrapUnique(vapid_key_manager_), &device_info_tracker_,
&fake_sync_service_);
SharingSyncPreference::RegisterProfilePrefs(prefs_.registry());
}
protected:
static std::unique_ptr<syncer::DeviceInfo> CreateFakeDeviceInfo(
const std::string& id) {
return std::make_unique<syncer::DeviceInfo>(
id, "name", "chrome_version", "user_agent",
sync_pb::SyncEnums_DeviceType_TYPE_LINUX, "device_id",
/* last_updated_timestamp= */ base::Time::Now(),
/* send_tab_to_self_receiving_enabled= */ false);
}
static SharingSyncPreference::Device CreateFakeSyncDevice() {
return SharingSyncPreference::Device("fcm_token", "p256dh", "auth_token",
kNoCapabilities);
}
ScopedTaskEnvironment scoped_task_environment_{
ScopedTaskEnvironment::MainThreadType::MOCK_TIME,
ScopedTaskEnvironment::NowSource::MAIN_THREAD_MOCK_TIME};
syncer::FakeDeviceInfoTracker device_info_tracker_;
gcm::FakeGCMDriver fake_gcm_driver_;
FakeLocalDeviceInfoProvider fake_local_device_info_provider_;
syncer::FakeSyncService fake_sync_service_;
NiceMock<MockInstanceIDDriver> mock_instance_id_driver_;
SharingSyncPreference* sync_prefs_;
VapidKeyManager* vapid_key_manager_;
SharingDeviceRegistration* sharing_device_registration_;
std::unique_ptr<SharingService> sharing_service_ = nullptr;
private:
sync_preferences::TestingPrefServiceSyncable prefs_;
};
} // namespace
TEST_F(SharingServiceTest, GetDeviceCandidates_Empty) {
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(kNoCapabilities);
EXPECT_TRUE(candidates.empty());
}
TEST_F(SharingServiceTest, GetDeviceCandidates_NoSynced) {
std::string id = base::GenerateGUID();
std::unique_ptr<syncer::DeviceInfo> device_info = CreateFakeDeviceInfo(id);
device_info_tracker_.Add(device_info.get());
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(kNoCapabilities);
EXPECT_TRUE(candidates.empty());
}
TEST_F(SharingServiceTest, GetDeviceCandidates_NoTracked) {
sync_prefs_->SetSyncDevice(base::GenerateGUID(), CreateFakeSyncDevice());
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(kNoCapabilities);
EXPECT_TRUE(candidates.empty());
}
TEST_F(SharingServiceTest, GetDeviceCandidates_SyncedAndTracked) {
std::string id = base::GenerateGUID();
std::unique_ptr<syncer::DeviceInfo> device_info = CreateFakeDeviceInfo(id);
device_info_tracker_.Add(device_info.get());
sync_prefs_->SetSyncDevice(id, CreateFakeSyncDevice());
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(kNoCapabilities);
ASSERT_EQ(1u, candidates.size());
}
TEST_F(SharingServiceTest, GetDeviceCandidates_Expired) {
std::string id = base::GenerateGUID();
std::unique_ptr<syncer::DeviceInfo> device_info = CreateFakeDeviceInfo(id);
device_info_tracker_.Add(device_info.get());
sync_prefs_->SetSyncDevice(id, CreateFakeSyncDevice());
// Forward time until device expires.
scoped_task_environment_.FastForwardBy(base::TimeDelta::FromDays(10));
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(kNoCapabilities);
EXPECT_TRUE(candidates.empty());
}
TEST_F(SharingServiceTest, GetDeviceCandidates_MissingRequirements) {
std::string id = base::GenerateGUID();
std::unique_ptr<syncer::DeviceInfo> device_info = CreateFakeDeviceInfo(id);
device_info_tracker_.Add(device_info.get());
sync_prefs_->SetSyncDevice(id, CreateFakeSyncDevice());
// Require all capabilities.
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(-1);
EXPECT_TRUE(candidates.empty());
}
TEST_F(SharingServiceTest, GetDeviceCandidates_DuplicateDeviceNames) {
// Add first device.
std::string id1 = base::GenerateGUID();
std::unique_ptr<syncer::DeviceInfo> device_info_1 = CreateFakeDeviceInfo(id1);
device_info_tracker_.Add(device_info_1.get());
sync_prefs_->SetSyncDevice(id1, CreateFakeSyncDevice());
// Advance time for a bit to create a newer device.
scoped_task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(10));
// Add second device.
std::string id2 = base::GenerateGUID();
std::unique_ptr<syncer::DeviceInfo> device_info_2 = CreateFakeDeviceInfo(id2);
device_info_tracker_.Add(device_info_2.get());
sync_prefs_->SetSyncDevice(id2, CreateFakeSyncDevice());
std::vector<SharingDeviceInfo> candidates =
sharing_service_->GetDeviceCandidates(kNoCapabilities);
ASSERT_EQ(1u, candidates.size());
EXPECT_EQ(id2, candidates[0].guid());
}
// TODO(himanshujaju) Add tests for RegisterDevice