OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "base/command_line.h" | |
6 #include "base/memory/ref_counted.h" | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "chrome/browser/extensions/api/bluetooth/bluetooth_api.h" | |
9 #include "chrome/browser/extensions/api/bluetooth/bluetooth_event_router.h" | |
10 #include "chrome/browser/extensions/extension_apitest.h" | |
11 #include "chrome/common/extensions/api/bluetooth_private.h" | |
12 #include "device/bluetooth/test/mock_bluetooth_adapter.h" | |
13 #include "device/bluetooth/test/mock_bluetooth_device.h" | |
14 #include "extensions/browser/event_router.h" | |
15 #include "extensions/common/switches.h" | |
16 #include "testing/gmock/include/gmock/gmock.h" | |
17 | |
18 using device::MockBluetoothAdapter; | |
19 using device::MockBluetoothDevice; | |
20 using testing::_; | |
21 using testing::InSequence; | |
22 using testing::NiceMock; | |
23 using testing::Return; | |
24 using testing::ReturnPointee; | |
25 using testing::WithArgs; | |
26 using testing::WithoutArgs; | |
27 | |
28 namespace bt = extensions::api::bluetooth; | |
29 namespace bt_private = extensions::api::bluetooth_private; | |
30 | |
31 namespace { | |
32 | |
33 const char kTestExtensionId[] = "jofgjdphhceggjecimellaapdjjadibj"; | |
34 const char kAdapterName[] = "Helix"; | |
35 const char kDeviceName[] = "Red"; | |
36 } | |
37 | |
38 class BluetoothPrivateApiTest : public ExtensionApiTest { | |
39 public: | |
40 BluetoothPrivateApiTest() | |
41 : adapter_name_(kAdapterName), | |
42 adapter_powered_(false), | |
43 adapter_discoverable_(false) {} | |
44 | |
45 virtual ~BluetoothPrivateApiTest() {} | |
46 | |
47 virtual void SetUpOnMainThread() OVERRIDE { | |
48 CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
49 extensions::switches::kWhitelistedExtensionID, kTestExtensionId); | |
50 mock_adapter_ = new NiceMock<MockBluetoothAdapter>(); | |
51 event_router()->SetAdapterForTest(mock_adapter_.get()); | |
52 mock_device_.reset(new NiceMock<MockBluetoothDevice>(mock_adapter_.get(), | |
53 0, | |
54 kDeviceName, | |
55 "11:12:13:14:15:16", | |
56 false, | |
57 false)); | |
58 ON_CALL(*mock_adapter_.get(), GetDevice(mock_device_->GetAddress())) | |
59 .WillByDefault(Return(mock_device_.get())); | |
60 ON_CALL(*mock_adapter_.get(), IsPresent()).WillByDefault(Return(true)); | |
61 } | |
62 | |
63 virtual void TearDownOnMainThread() OVERRIDE {} | |
64 | |
65 extensions::BluetoothEventRouter* event_router() { | |
66 return extensions::BluetoothAPI::Get(browser()->profile()) | |
67 ->event_router(); | |
68 } | |
69 | |
70 void SetName(const std::string& name, const base::Closure& callback) { | |
71 adapter_name_ = name; | |
72 callback.Run(); | |
73 } | |
74 | |
75 void SetPowered(bool powered, const base::Closure& callback) { | |
76 adapter_powered_ = powered; | |
77 callback.Run(); | |
78 } | |
79 | |
80 void SetDiscoverable(bool discoverable, const base::Closure& callback) { | |
81 adapter_discoverable_ = discoverable; | |
82 callback.Run(); | |
83 } | |
84 | |
85 void DispatchPairingEvent(bt_private::PairingEventType pairing_event_type) { | |
86 bt_private::PairingEvent pairing_event; | |
87 pairing_event.pairing = pairing_event_type; | |
88 pairing_event.device.name.reset(new std::string(kDeviceName)); | |
89 pairing_event.device.address = mock_device_->GetAddress(); | |
90 pairing_event.device.vendor_id_source = bt::VENDOR_ID_SOURCE_USB; | |
91 pairing_event.device.type = bt::DEVICE_TYPE_PHONE; | |
92 | |
93 scoped_ptr<base::ListValue> args = | |
94 bt_private::OnPairing::Create(pairing_event); | |
95 scoped_ptr<extensions::Event> event( | |
96 new extensions::Event(bt_private::OnPairing::kEventName, args.Pass())); | |
97 extensions::EventRouter::Get(browser()->profile()) | |
98 ->DispatchEventToExtension(kTestExtensionId, event.Pass()); | |
99 } | |
100 | |
101 void DispatchAuthorizePairingEvent() { | |
102 DispatchPairingEvent(bt_private::PAIRING_EVENT_TYPE_REQUESTAUTHORIZATION); | |
103 } | |
104 | |
105 void DispatchPincodePairingEvent() { | |
106 DispatchPairingEvent(bt_private::PAIRING_EVENT_TYPE_REQUESTPINCODE); | |
107 } | |
108 | |
109 void DispatchPasskeyPairingEvent() { | |
110 DispatchPairingEvent(bt_private::PAIRING_EVENT_TYPE_REQUESTPASSKEY); | |
111 } | |
112 | |
113 protected: | |
114 std::string adapter_name_; | |
115 bool adapter_powered_; | |
116 bool adapter_discoverable_; | |
117 | |
118 scoped_refptr<NiceMock<MockBluetoothAdapter> > mock_adapter_; | |
119 scoped_ptr<NiceMock<MockBluetoothDevice> > mock_device_; | |
120 }; | |
121 | |
122 IN_PROC_BROWSER_TEST_F(BluetoothPrivateApiTest, SetAdapterState) { | |
123 ON_CALL(*mock_adapter_.get(), GetName()) | |
124 .WillByDefault(ReturnPointee(&adapter_name_)); | |
125 ON_CALL(*mock_adapter_.get(), IsPowered()) | |
126 .WillByDefault(ReturnPointee(&adapter_powered_)); | |
127 ON_CALL(*mock_adapter_.get(), IsDiscoverable()) | |
128 .WillByDefault(ReturnPointee(&adapter_discoverable_)); | |
129 | |
130 EXPECT_CALL(*mock_adapter_.get(), SetName("Dome", _, _)).WillOnce( | |
131 WithArgs<0, 1>(Invoke(this, &BluetoothPrivateApiTest::SetName))); | |
132 EXPECT_CALL(*mock_adapter_.get(), SetPowered(true, _, _)).WillOnce( | |
133 WithArgs<0, 1>(Invoke(this, &BluetoothPrivateApiTest::SetPowered))); | |
134 EXPECT_CALL(*mock_adapter_.get(), SetDiscoverable(true, _, _)).WillOnce( | |
135 WithArgs<0, 1>(Invoke(this, &BluetoothPrivateApiTest::SetDiscoverable))); | |
136 | |
137 ASSERT_TRUE(RunComponentExtensionTest("bluetooth_private/adapter_state")) | |
138 << message_; | |
139 } | |
140 | |
141 IN_PROC_BROWSER_TEST_F(BluetoothPrivateApiTest, NoBluetoothAdapter) { | |
142 ON_CALL(*mock_adapter_.get(), IsPresent()).WillByDefault(Return(false)); | |
143 ASSERT_TRUE(RunComponentExtensionTest("bluetooth_private/no_adapter")) | |
144 << message_; | |
145 } | |
146 | |
147 IN_PROC_BROWSER_TEST_F(BluetoothPrivateApiTest, CancelPairing) { | |
148 InSequence s; | |
149 EXPECT_CALL(*mock_adapter_.get(), | |
150 AddPairingDelegate( | |
151 _, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH)) | |
152 .WillOnce(WithoutArgs(Invoke( | |
153 this, &BluetoothPrivateApiTest::DispatchAuthorizePairingEvent))); | |
154 EXPECT_CALL(*mock_device_, ExpectingConfirmation()) | |
155 .WillRepeatedly(Return(true)); | |
156 EXPECT_CALL(*mock_device_, CancelPairing()); | |
157 ASSERT_TRUE(RunComponentExtensionTest("bluetooth_private/cancel_pairing")) | |
158 << message_; | |
159 } | |
160 | |
161 IN_PROC_BROWSER_TEST_F(BluetoothPrivateApiTest, PincodePairing) { | |
162 EXPECT_CALL(*mock_adapter_.get(), | |
163 AddPairingDelegate( | |
164 _, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH)) | |
165 .WillOnce(WithoutArgs( | |
166 Invoke(this, &BluetoothPrivateApiTest::DispatchPincodePairingEvent))); | |
167 EXPECT_CALL(*mock_device_, ExpectingPinCode()).WillRepeatedly(Return(true)); | |
168 EXPECT_CALL(*mock_device_, SetPinCode("abbbbbbk")); | |
169 ASSERT_TRUE(RunComponentExtensionTest("bluetooth_private/pincode_pairing")) | |
170 << message_; | |
171 } | |
172 | |
173 IN_PROC_BROWSER_TEST_F(BluetoothPrivateApiTest, PasskeyPairing) { | |
174 EXPECT_CALL(*mock_adapter_.get(), | |
175 AddPairingDelegate( | |
176 _, device::BluetoothAdapter::PAIRING_DELEGATE_PRIORITY_HIGH)) | |
177 .WillOnce(WithoutArgs( | |
178 Invoke(this, &BluetoothPrivateApiTest::DispatchPasskeyPairingEvent))); | |
179 EXPECT_CALL(*mock_device_, ExpectingPasskey()).WillRepeatedly(Return(true)); | |
180 EXPECT_CALL(*mock_device_, SetPasskey(900531)); | |
181 ASSERT_TRUE(RunComponentExtensionTest("bluetooth_private/passkey_pairing")) | |
182 << message_; | |
183 } | |
OLD | NEW |