1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/browser_sync/active_devices_provider_impl.h"
6
7 #include <memory>
8 #include <string>
9 #include <vector>
10
11 #include "base/guid.h"
12 #include "base/test/mock_callback.h"
13 #include "base/test/simple_test_clock.h"
14 #include "base/time/time.h"
15 #include "components/sync_device_info/device_info_util.h"
16 #include "components/sync_device_info/fake_device_info_tracker.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 using syncer::DeviceInfo;
20 using syncer::FakeDeviceInfoTracker;
21
22 namespace browser_sync {
23 namespace {
24
25 constexpr int kPulseIntervalMinutes = 60;
26
CreateFakeDeviceInfo(const std::string & name,base::Time last_updated_timestamp)27 std::unique_ptr<DeviceInfo> CreateFakeDeviceInfo(
28 const std::string& name,
29 base::Time last_updated_timestamp) {
30 return std::make_unique<syncer::DeviceInfo>(
31 base::GenerateGUID(), name, "chrome_version", "user_agent",
32 sync_pb::SyncEnums::TYPE_UNSET, "device_id", "manufacturer_name",
33 "model_name", last_updated_timestamp,
34 base::TimeDelta::FromMinutes(kPulseIntervalMinutes),
35 /*send_tab_to_self_receiving_enabled=*/false,
36 /*sharing_info=*/base::nullopt,
37 /*fcm_registration_token=*/std::string(),
38 /*interested_data_types=*/syncer::ModelTypeSet());
39 }
40
41 class ActiveDevicesProviderImplTest : public testing::Test {
42 public:
ActiveDevicesProviderImplTest()43 ActiveDevicesProviderImplTest()
44 : active_devices_provider_(&fake_device_info_tracker_, &clock_) {}
45
46 ~ActiveDevicesProviderImplTest() override = default;
47
AddDevice(const std::string & name,base::Time last_updated_timestamp)48 void AddDevice(const std::string& name, base::Time last_updated_timestamp) {
49 device_list_.push_back(CreateFakeDeviceInfo(name, last_updated_timestamp));
50 fake_device_info_tracker_.Add(device_list_.back().get());
51 }
52
53 protected:
54 std::vector<std::unique_ptr<DeviceInfo>> device_list_;
55 FakeDeviceInfoTracker fake_device_info_tracker_;
56 base::SimpleTestClock clock_;
57 ActiveDevicesProviderImpl active_devices_provider_;
58 };
59
TEST_F(ActiveDevicesProviderImplTest,ShouldFilterInactiveDevices)60 TEST_F(ActiveDevicesProviderImplTest, ShouldFilterInactiveDevices) {
61 AddDevice("device_recent", clock_.Now() - base::TimeDelta::FromMinutes(1));
62
63 // Should be considered as active device due to margin even though the device
64 // is outside the pulse interval.
65 AddDevice(
66 "device_pulse_interval",
67 clock_.Now() - base::TimeDelta::FromMinutes(kPulseIntervalMinutes + 1));
68
69 // Very old device.
70 AddDevice("device_inactive", clock_.Now() - base::TimeDelta::FromDays(100));
71
72 EXPECT_EQ(2u, active_devices_provider_.CountActiveDevicesIfAvailable());
73 }
74
TEST_F(ActiveDevicesProviderImplTest,ShouldReturnZeroDevices)75 TEST_F(ActiveDevicesProviderImplTest, ShouldReturnZeroDevices) {
76 EXPECT_EQ(0u, active_devices_provider_.CountActiveDevicesIfAvailable());
77 }
78
TEST_F(ActiveDevicesProviderImplTest,ShouldInvokeCallback)79 TEST_F(ActiveDevicesProviderImplTest, ShouldInvokeCallback) {
80 base::MockCallback<
81 syncer::ActiveDevicesProvider::ActiveDevicesChangedCallback>
82 callback;
83 active_devices_provider_.SetActiveDevicesChangedCallback(callback.Get());
84 EXPECT_CALL(callback, Run());
85 active_devices_provider_.OnDeviceInfoChange();
86 active_devices_provider_.SetActiveDevicesChangedCallback(
87 base::RepeatingClosure());
88 }
89
90 } // namespace
91 } // namespace browser_sync
92