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