| 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 |