Index: chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_apitest.cc |
diff --git a/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_apitest.cc b/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_apitest.cc |
index b7bb236f5a246503cea952d9bd9dad7d9529b312..6eef6b81a0deab24d20f26b7f7044cfc83a87ad4 100644 |
--- a/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_apitest.cc |
+++ b/chrome/browser/extensions/api/bluetooth_socket/bluetooth_socket_apitest.cc |
@@ -132,3 +132,61 @@ IN_PROC_BROWSER_TEST_F(BluetoothSocketApiTest, Connect) { |
listener.Reply("go"); |
EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); |
} |
+ |
+IN_PROC_BROWSER_TEST_F(BluetoothSocketApiTest, Listen) { |
+ ResultCatcher catcher; |
+ catcher.RestrictToProfile(browser()->profile()); |
+ |
+ // Return a mock socket object as a successful result to the create service |
+ // call. |
+ BluetoothUUID service_uuid("2de497f9-ab28-49db-b6d2-066ea69f1737"); |
+ scoped_refptr<testing::StrictMock<MockBluetoothSocket> > mock_server_socket |
+ = new testing::StrictMock<MockBluetoothSocket>(); |
+ EXPECT_CALL(*mock_adapter_, |
+ CreateRfcommService(service_uuid, |
+ BluetoothAdapter::kPsmAuto, |
+ false, |
+ testing::_, testing::_)) |
+ .WillOnce(InvokeCallbackArgument<3>(mock_server_socket)); |
+ |
+ // Since the socket is unpaused, expect a call to Accept() from the socket |
+ // dispatcher. We'll immediately send back another mock socket to represent |
+ // the client API. Further calls will return no data and behave as if |
+ // pending. |
+ scoped_refptr<testing::StrictMock<MockBluetoothSocket> > mock_client_socket |
+ = new testing::StrictMock<MockBluetoothSocket>(); |
+ EXPECT_CALL(*mock_server_socket, Accept(testing::_, testing::_)) |
+ .Times(2) |
+ .WillOnce(InvokeCallbackArgument<0>(mock_device1_.get(), |
+ mock_client_socket)) |
+ .WillOnce(testing::Return()); |
+ |
+ // Run the test, it sends a ready signal once it's ready for us to dispatch |
+ // a client connection to it. |
+ ExtensionTestMessageListener socket_listening("ready", true); |
+ scoped_refptr<const Extension> extension( |
+ LoadExtension(test_data_dir_.AppendASCII("bluetooth_socket/listen"))); |
+ ASSERT_TRUE(extension.get()); |
+ EXPECT_TRUE(socket_listening.WaitUntilSatisfied()); |
+ |
+ // Connection events are dispatched using a couple of PostTask to the UI |
+ // thread. Waiting until idle ensures the event is dispatched to the |
+ // receiver(s). |
+ base::RunLoop().RunUntilIdle(); |
+ ExtensionTestMessageListener listener("ready", true); |
+ socket_listening.Reply("go"); |
+ |
+ // Second stage of tests checks for error conditions, and will clean up |
+ // the existing server and client sockets. |
+ EXPECT_CALL(*mock_server_socket, Disconnect(testing::_)) |
+ .WillOnce(InvokeCallbackArgument<0>()); |
+ EXPECT_CALL(*mock_server_socket, Close()); |
+ |
+ EXPECT_CALL(*mock_client_socket, Disconnect(testing::_)) |
+ .WillOnce(InvokeCallbackArgument<0>()); |
+ EXPECT_CALL(*mock_client_socket, Close()); |
+ |
+ EXPECT_TRUE(listener.WaitUntilSatisfied()); |
+ listener.Reply("go"); |
+ EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); |
+} |