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