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 "chrome/browser/nearby_sharing/bluetooth_advertising_interval_client.h"
6
7 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
8
9 using ::testing::_;
10 using testing::NiceMock;
11
12 namespace {
13
14 const int64_t kInterval = 100;
15 const int64_t kDefaultInterval = 0;
16
17 } // namespace
18
19 class MockBluetoothAdapterWithInterval : public device::MockBluetoothAdapter {
20 public:
21 MOCK_METHOD2(OnSetAdvertisingInterval, void(int64_t, int64_t));
22 MOCK_METHOD0(OnSetAdvertisingIntervalError, void());
23
SetAdvertisingInterval(const base::TimeDelta & min,const base::TimeDelta & max,base::OnceClosure callback,AdvertisementErrorCallback error_callback)24 void SetAdvertisingInterval(
25 const base::TimeDelta& min,
26 const base::TimeDelta& max,
27 base::OnceClosure callback,
28 AdvertisementErrorCallback error_callback) override {
29 if (set_advertising_interval_error_) {
30 std::move(error_callback)
31 .Run(device::BluetoothAdvertisement::ErrorCode::
32 ERROR_INVALID_ADVERTISEMENT_INTERVAL);
33 OnSetAdvertisingIntervalError();
34 } else {
35 std::move(callback).Run();
36 OnSetAdvertisingInterval(min.InMilliseconds(), max.InMilliseconds());
37 }
38 }
39
SetAdvertisingIntervalError(bool error)40 void SetAdvertisingIntervalError(bool error) {
41 set_advertising_interval_error_ = error;
42 }
43
44 protected:
45 ~MockBluetoothAdapterWithInterval() override = default;
46
47 bool set_advertising_interval_error_ = false;
48 };
49
50 class BluetoothAdvertisingIntervalClientTest : public testing::Test {
51 protected:
SetUp()52 void SetUp() override {
53 mock_adapter_ =
54 base::MakeRefCounted<NiceMock<MockBluetoothAdapterWithInterval>>();
55 ON_CALL(*mock_adapter_, OnSetAdvertisingInterval(_, _))
56 .WillByDefault(Invoke(
57 this,
58 &BluetoothAdvertisingIntervalClientTest::OnSetAdvertisingInterval));
59 ON_CALL(*mock_adapter_, OnSetAdvertisingIntervalError())
60 .WillByDefault(Invoke(this, &BluetoothAdvertisingIntervalClientTest::
61 OnSetAdvertisingIntervalError));
62 client_ =
63 std::make_unique<BluetoothAdvertisingIntervalClient>(mock_adapter_);
64 }
65
OnSetAdvertisingInterval(int64_t min,int64_t max)66 void OnSetAdvertisingInterval(int64_t min, int64_t max) {
67 ++set_advertising_interval_call_count_;
68 last_advertising_interval_min_ = min;
69 last_advertising_interval_max_ = max;
70 }
71
OnSetAdvertisingIntervalError()72 void OnSetAdvertisingIntervalError() {
73 ++set_advertising_interval_error_call_count_;
74 }
75
RestoreDefaultInterval()76 void RestoreDefaultInterval() { client_->RestoreDefaultInterval(); }
77
set_advertising_interval_call_count()78 const size_t set_advertising_interval_call_count() {
79 return set_advertising_interval_call_count_;
80 }
81
set_advertising_interval_error_call_count()82 const size_t set_advertising_interval_error_call_count() {
83 return set_advertising_interval_error_call_count_;
84 }
85
last_advertising_interval_min()86 const int64_t last_advertising_interval_min() {
87 return last_advertising_interval_min_;
88 }
89
last_advertising_interval_max()90 const int64_t last_advertising_interval_max() {
91 return last_advertising_interval_max_;
92 }
93
94 scoped_refptr<NiceMock<MockBluetoothAdapterWithInterval>> mock_adapter_;
95 std::unique_ptr<BluetoothAdvertisingIntervalClient> client_;
96 size_t set_advertising_interval_call_count_ = 0u;
97 size_t set_advertising_interval_error_call_count_ = 0u;
98 int64_t last_advertising_interval_min_ = 0;
99 int64_t last_advertising_interval_max_ = 0;
100 };
101
TEST_F(BluetoothAdvertisingIntervalClientTest,SetAndRestore)102 TEST_F(BluetoothAdvertisingIntervalClientTest, SetAndRestore) {
103 client_->ReduceInterval();
104 EXPECT_EQ(1, set_advertising_interval_call_count());
105 EXPECT_EQ(0, set_advertising_interval_error_call_count());
106 EXPECT_EQ(kInterval, last_advertising_interval_min());
107 EXPECT_EQ(kInterval, last_advertising_interval_max());
108
109 RestoreDefaultInterval();
110 EXPECT_EQ(2, set_advertising_interval_call_count());
111 EXPECT_EQ(0, set_advertising_interval_error_call_count());
112 EXPECT_EQ(kDefaultInterval, last_advertising_interval_min());
113 EXPECT_EQ(kDefaultInterval, last_advertising_interval_max());
114 }
115
TEST_F(BluetoothAdvertisingIntervalClientTest,SetError)116 TEST_F(BluetoothAdvertisingIntervalClientTest, SetError) {
117 mock_adapter_->SetAdvertisingIntervalError(true);
118 client_->ReduceInterval();
119 EXPECT_EQ(0, set_advertising_interval_call_count());
120 EXPECT_EQ(1, set_advertising_interval_error_call_count());
121 }
122