| Index: chrome/browser/extensions/api/bluetooth/bluetooth_apitest.cc
|
| diff --git a/chrome/browser/extensions/api/bluetooth/bluetooth_apitest.cc b/chrome/browser/extensions/api/bluetooth/bluetooth_apitest.cc
|
| index e6c553f892166f2442b76d75fe7383b8d30fcd58..8f0b28da2d56b0c5c9c15226aa1e2bff2993bf7c 100644
|
| --- a/chrome/browser/extensions/api/bluetooth/bluetooth_apitest.cc
|
| +++ b/chrome/browser/extensions/api/bluetooth/bluetooth_apitest.cc
|
| @@ -17,16 +17,19 @@
|
| #include "device/bluetooth/bluetooth_out_of_band_pairing_data.h"
|
| #include "device/bluetooth/test/mock_bluetooth_adapter.h"
|
| #include "device/bluetooth/test/mock_bluetooth_device.h"
|
| +#include "device/bluetooth/test/mock_bluetooth_discovery_session.h"
|
| #include "device/bluetooth/test/mock_bluetooth_profile.h"
|
| #include "device/bluetooth/test/mock_bluetooth_socket.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
|
|
| using device::BluetoothAdapter;
|
| using device::BluetoothDevice;
|
| +using device::BluetoothDiscoverySession;
|
| using device::BluetoothOutOfBandPairingData;
|
| using device::BluetoothProfile;
|
| using device::MockBluetoothAdapter;
|
| using device::MockBluetoothDevice;
|
| +using device::MockBluetoothDiscoverySession;
|
| using device::MockBluetoothProfile;
|
| using extensions::Extension;
|
|
|
| @@ -65,6 +68,17 @@ class BluetoothApiTest : public ExtensionApiTest {
|
| false /* paired */, false /* connected */));
|
| }
|
|
|
| + void DiscoverySessionCallback(
|
| + const BluetoothAdapter::DiscoverySessionCallback& callback,
|
| + const BluetoothAdapter::ErrorCallback& error_callback) {
|
| + if (mock_session_.get()) {
|
| + callback.Run(
|
| + scoped_ptr<BluetoothDiscoverySession>(mock_session_.release()));
|
| + return;
|
| + }
|
| + error_callback.Run();
|
| + }
|
| +
|
| template <class T>
|
| T* setupFunction(T* function) {
|
| function->set_extension(empty_extension_.get());
|
| @@ -74,6 +88,7 @@ class BluetoothApiTest : public ExtensionApiTest {
|
|
|
| protected:
|
| testing::StrictMock<MockBluetoothAdapter>* mock_adapter_;
|
| + scoped_ptr<testing::NiceMock<MockBluetoothDiscoverySession> > mock_session_;
|
| scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device1_;
|
| scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device2_;
|
| scoped_ptr<testing::NiceMock<MockBluetoothProfile> > profile1_;
|
| @@ -129,18 +144,11 @@ static bool CallClosure(const base::Closure& callback) {
|
| return true;
|
| }
|
|
|
| -static void CallDiscoveryCallback(
|
| - const base::Closure& callback,
|
| - const BluetoothAdapter::ErrorCallback& error_callback) {
|
| +static void StopDiscoverySessionCallback(const base::Closure& callback,
|
| + const base::Closure& error_callback) {
|
| callback.Run();
|
| }
|
|
|
| -static void CallDiscoveryErrorCallback(
|
| - const base::Closure& callback,
|
| - const BluetoothAdapter::ErrorCallback& error_callback) {
|
| - error_callback.Run();
|
| -}
|
| -
|
| static void CallOutOfBandPairingDataCallback(
|
| const BluetoothAdapter::BluetoothOutOfBandPairingDataCallback& callback,
|
| const BluetoothAdapter::ErrorCallback& error_callback) {
|
| @@ -316,9 +324,12 @@ IN_PROC_BROWSER_TEST_F(BluetoothApiTest, SetOutOfBandPairingData) {
|
| }
|
|
|
| IN_PROC_BROWSER_TEST_F(BluetoothApiTest, Discovery) {
|
| - // Try with a failure to start
|
| - EXPECT_CALL(*mock_adapter_, StartDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryErrorCallback));
|
| + // Try with a failure to start. This will return an error as we haven't
|
| + // initialied a session object.
|
| + EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
|
| + .WillOnce(
|
| + testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
|
| +
|
| // StartDiscovery failure will remove the adapter that is no longer used.
|
| EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
|
| scoped_refptr<api::BluetoothStartDiscoveryFunction> start_function;
|
| @@ -327,19 +338,28 @@ IN_PROC_BROWSER_TEST_F(BluetoothApiTest, Discovery) {
|
| utils::RunFunctionAndReturnError(start_function.get(), "[]", browser()));
|
| ASSERT_FALSE(error.empty());
|
|
|
| - // Reset for a successful start
|
| + // Reset the adapter and initiate a discovery session. The ownership of the
|
| + // mock session will be passed to the event router.
|
| + ASSERT_FALSE(mock_session_.get());
|
| SetUpMockAdapter();
|
| - EXPECT_CALL(*mock_adapter_, StartDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryCallback));
|
|
|
| + // Create a mock session to be returned as a result. Get a handle to it as
|
| + // its ownership will be passed and |mock_session_| will be reset.
|
| + mock_session_.reset(new testing::NiceMock<MockBluetoothDiscoverySession>());
|
| + MockBluetoothDiscoverySession* session = mock_session_.get();
|
| + EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
|
| + .WillOnce(
|
| + testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
|
| start_function = setupFunction(new api::BluetoothStartDiscoveryFunction);
|
| (void)
|
| utils::RunFunctionAndReturnError(start_function.get(), "[]", browser());
|
|
|
| - // Reset to try stopping
|
| + // End the discovery session. The StopDiscovery function should succeed.
|
| testing::Mock::VerifyAndClearExpectations(mock_adapter_);
|
| - EXPECT_CALL(*mock_adapter_, StopDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryCallback));
|
| + EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(true));
|
| + EXPECT_CALL(*session, Stop(testing::_, testing::_))
|
| + .WillOnce(testing::Invoke(StopDiscoverySessionCallback));
|
| +
|
| // StopDiscovery success will remove the adapter that is no longer used.
|
| EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
|
| scoped_refptr<api::BluetoothStopDiscoveryFunction> stop_function;
|
| @@ -347,10 +367,10 @@ IN_PROC_BROWSER_TEST_F(BluetoothApiTest, Discovery) {
|
| (void) utils::RunFunctionAndReturnSingleResult(
|
| stop_function.get(), "[]", browser());
|
|
|
| - // Reset to try stopping with an error
|
| + // Reset the adapter. Simulate failure for stop discovery. The event router
|
| + // still owns the session. Make it appear inactive.
|
| SetUpMockAdapter();
|
| - EXPECT_CALL(*mock_adapter_, StopDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryErrorCallback));
|
| + EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(false));
|
| EXPECT_CALL(*mock_adapter_, RemoveObserver(testing::_));
|
| stop_function = setupFunction(new api::BluetoothStopDiscoveryFunction);
|
| error =
|
| @@ -360,10 +380,14 @@ IN_PROC_BROWSER_TEST_F(BluetoothApiTest, Discovery) {
|
| }
|
|
|
| IN_PROC_BROWSER_TEST_F(BluetoothApiTest, DiscoveryCallback) {
|
| - EXPECT_CALL(*mock_adapter_, StartDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryCallback));
|
| - EXPECT_CALL(*mock_adapter_, StopDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryCallback));
|
| + mock_session_.reset(new testing::NiceMock<MockBluetoothDiscoverySession>());
|
| + MockBluetoothDiscoverySession* session = mock_session_.get();
|
| + EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
|
| + .WillOnce(
|
| + testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
|
| + EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(true));
|
| + EXPECT_CALL(*session, Stop(testing::_, testing::_))
|
| + .WillOnce(testing::Invoke(StopDiscoverySessionCallback));
|
|
|
| ResultCatcher catcher;
|
| catcher.RestrictToProfile(browser()->profile());
|
| @@ -408,17 +432,22 @@ IN_PROC_BROWSER_TEST_F(BluetoothApiTest, DiscoveryInProgress) {
|
| ResultCatcher catcher;
|
| catcher.RestrictToProfile(browser()->profile());
|
|
|
| - EXPECT_CALL(*mock_adapter_, StartDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryCallback));
|
| - EXPECT_CALL(*mock_adapter_, StopDiscovering(testing::_, testing::_))
|
| - .WillOnce(testing::Invoke(CallDiscoveryCallback));
|
| + mock_session_.reset(new testing::NiceMock<MockBluetoothDiscoverySession>());
|
| + MockBluetoothDiscoverySession* session = mock_session_.get();
|
| + EXPECT_CALL(*mock_adapter_, StartDiscoverySession(testing::_, testing::_))
|
| + .WillOnce(
|
| + testing::Invoke(this, &BluetoothApiTest::DiscoverySessionCallback));
|
| + EXPECT_CALL(*session, IsActive()).WillOnce(testing::Return(true));
|
| + EXPECT_CALL(*session, Stop(testing::_, testing::_))
|
| + .WillOnce(testing::Invoke(StopDiscoverySessionCallback));
|
|
|
| ExtensionTestMessageListener discovery_started("ready", true);
|
| ASSERT_TRUE(LoadExtension(
|
| test_data_dir_.AppendASCII("bluetooth/discovery_in_progress")));
|
| EXPECT_TRUE(discovery_started.WaitUntilSatisfied());
|
|
|
| - // This should be received in addition to the cached device above.
|
| + // Only this should be received. No additional notification should be sent for
|
| + // devices discovered before the discovery session started.
|
| event_router()->DeviceAdded(mock_adapter_, device2_.get());
|
|
|
| discovery_started.Reply("go");
|
|
|