Index: chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc |
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6f5c7193a27e2e71ae107813a1149cbbe0ab0f07 |
--- /dev/null |
+++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc |
@@ -0,0 +1,341 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <string> |
+ |
+#include "base/bind.h" |
+#include "base/macros.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/ui/bluetooth/bluetooth_chooser_controller.h" |
+#include "chrome/grit/generated_resources.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+namespace { |
+ |
+class MockBluetoothChooserView : public ChooserController::View { |
+ public: |
+ MockBluetoothChooserView() {} |
+ |
+ // ChooserController::View: |
+ MOCK_METHOD0(OnOptionsInitialized, void()); |
+ MOCK_METHOD1(OnOptionAdded, void(size_t index)); |
+ MOCK_METHOD1(OnOptionRemoved, void(size_t index)); |
+ MOCK_METHOD1(OnOptionUpdated, void(size_t index)); |
+ MOCK_METHOD1(OnAdapterEnabledChanged, void(bool enabled)); |
+ MOCK_METHOD1(OnRefreshStateChanged, void(bool enabled)); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockBluetoothChooserView); |
+}; |
+ |
+} // namespace |
+ |
+class BluetoothChooserControllerTest : public testing::Test { |
+ public: |
+ BluetoothChooserControllerTest() |
+ : bluetooth_chooser_controller_( |
+ nullptr, |
+ base::Bind(&BluetoothChooserControllerTest::OnBluetoothChooserEvent, |
+ base::Unretained(this))) { |
+ bluetooth_chooser_controller_.set_view(&mock_bluetooth_chooser_view_); |
+ } |
+ |
+ protected: |
+ void OnBluetoothChooserEvent(content::BluetoothChooser::Event event, |
+ const std::string& device_id) { |
+ last_event_ = event; |
+ last_device_id_ = device_id; |
+ } |
+ |
+ BluetoothChooserController bluetooth_chooser_controller_; |
+ MockBluetoothChooserView mock_bluetooth_chooser_view_; |
+ content::BluetoothChooser::Event last_event_; |
+ std::string last_device_id_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(BluetoothChooserControllerTest); |
+}; |
+ |
+class BluetoothChooserControllerWithDevicesAddedTest |
+ : public BluetoothChooserControllerTest { |
+ public: |
+ BluetoothChooserControllerWithDevicesAddedTest() { |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_b", false /* should_update_name */, base::ASCIIToUTF16("b"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 0 /* signal_strength_level */); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_c", false /* should_update_name */, base::ASCIIToUTF16("c"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 1 /* signal_strength_level */); |
+ } |
+}; |
+ |
+TEST_F(BluetoothChooserControllerTest, AddDevice) { |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionAdded(0)).Times(1); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ EXPECT_EQ(1u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ EXPECT_EQ(-1, bluetooth_chooser_controller_.GetSignalStrengthLevel(0)); |
+ testing::Mock::VerifyAndClearExpectations(&mock_bluetooth_chooser_view_); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionAdded(1)).Times(1); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_b", false /* should_update_name */, base::ASCIIToUTF16("b"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 0 /* signal_strength_level */); |
+ EXPECT_EQ(2u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("b"), |
+ bluetooth_chooser_controller_.GetOption(1)); |
+ EXPECT_EQ(0, bluetooth_chooser_controller_.GetSignalStrengthLevel(1)); |
+ testing::Mock::VerifyAndClearExpectations(&mock_bluetooth_chooser_view_); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionAdded(2)).Times(1); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_c", false /* should_update_name */, base::ASCIIToUTF16("c"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 1 /* signal_strength_level */); |
+ EXPECT_EQ(3u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("c"), |
+ bluetooth_chooser_controller_.GetOption(2)); |
+ EXPECT_EQ(1, bluetooth_chooser_controller_.GetSignalStrengthLevel(2)); |
+} |
+ |
+TEST_F(BluetoothChooserControllerTest, RemoveDevice) { |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_b", false /* should_update_name */, base::ASCIIToUTF16("b"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 0 /* signal_strength_level */); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_c", false /* should_update_name */, base::ASCIIToUTF16("c"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 1 /* signal_strength_level */); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionRemoved(1)).Times(1); |
+ bluetooth_chooser_controller_.RemoveDevice("id_b"); |
+ EXPECT_EQ(2u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ EXPECT_EQ(base::ASCIIToUTF16("c"), |
+ bluetooth_chooser_controller_.GetOption(1)); |
+ testing::Mock::VerifyAndClearExpectations(&mock_bluetooth_chooser_view_); |
+ |
+ // Remove a non-existent device, the number of devices should not change. |
+ bluetooth_chooser_controller_.RemoveDevice("non-existent"); |
+ EXPECT_EQ(2u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ EXPECT_EQ(base::ASCIIToUTF16("c"), |
+ bluetooth_chooser_controller_.GetOption(1)); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionRemoved(0)).Times(1); |
+ bluetooth_chooser_controller_.RemoveDevice("id_a"); |
+ EXPECT_EQ(1u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("c"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ testing::Mock::VerifyAndClearExpectations(&mock_bluetooth_chooser_view_); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionRemoved(0)).Times(1); |
+ bluetooth_chooser_controller_.RemoveDevice("id_c"); |
+ EXPECT_EQ(0u, bluetooth_chooser_controller_.NumOptions()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerTest, MultipleDevicesWithSameNameShowIds) { |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a_1", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_b", false /* should_update_name */, base::ASCIIToUTF16("b"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 0 /* signal_strength_level */); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a_2", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 1 /* signal_strength_level */); |
+ EXPECT_EQ(base::ASCIIToUTF16("a (id_a_1)"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ EXPECT_EQ(base::ASCIIToUTF16("b"), |
+ bluetooth_chooser_controller_.GetOption(1)); |
+ EXPECT_EQ(base::ASCIIToUTF16("a (id_a_2)"), |
+ bluetooth_chooser_controller_.GetOption(2)); |
+ |
+ bluetooth_chooser_controller_.RemoveDevice("id_a_1"); |
+ EXPECT_EQ(base::ASCIIToUTF16("b"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(1)); |
+} |
+ |
+TEST_F(BluetoothChooserControllerTest, UpdateDeviceName) { |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionUpdated(0)).Times(1); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("aa"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ // The name is still "a" since |should_update_name| is false. |
+ EXPECT_EQ(base::ASCIIToUTF16("a"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ testing::Mock::VerifyAndClearExpectations(&mock_bluetooth_chooser_view_); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionUpdated(0)).Times(1); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", true /* should_update_name */, base::ASCIIToUTF16("aa"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ EXPECT_EQ(1u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(base::ASCIIToUTF16("aa"), |
+ bluetooth_chooser_controller_.GetOption(0)); |
+ |
+ bluetooth_chooser_controller_.RemoveDevice("id_a"); |
+ EXPECT_EQ(0u, bluetooth_chooser_controller_.NumOptions()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerTest, UpdateDeviceSignalStrengthLevel) { |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ EXPECT_EQ(-1, bluetooth_chooser_controller_.GetSignalStrengthLevel(0)); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionUpdated(0)).Times(1); |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ 1 /* signal_strength_level */); |
+ EXPECT_EQ(1, bluetooth_chooser_controller_.GetSignalStrengthLevel(0)); |
+ testing::Mock::VerifyAndClearExpectations(&mock_bluetooth_chooser_view_); |
+ |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, OnOptionUpdated(0)).Times(1); |
+ // When Bluetooth device scanning stops, an update is sent and the signal |
+ // strength level is -1, and in this case, should still use the previously |
+ // stored signal strength level. So here the signal strength level is |
+ // still 1. |
+ bluetooth_chooser_controller_.AddOrUpdateDevice( |
+ "id_a", false /* should_update_name */, base::ASCIIToUTF16("a"), |
+ true /* is_gatt_connected */, true /* is_paired */, |
+ -1 /* signal_strength_level */); |
+ EXPECT_EQ(1, bluetooth_chooser_controller_.GetSignalStrengthLevel(0)); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, |
+ InitialNoOptionsTextAndStatusText) { |
+ EXPECT_EQ(l10n_util::GetStringUTF16( |
+ IDS_BLUETOOTH_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT), |
+ bluetooth_chooser_controller_.GetNoOptionsText()); |
+ EXPECT_EQ(base::string16(), bluetooth_chooser_controller_.GetStatus()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, |
+ BluetoothAdapterTurnedOff) { |
+ EXPECT_CALL( |
+ mock_bluetooth_chooser_view_, |
+ OnAdapterEnabledChanged(false /* Bluetooth adapter is turned off */)) |
+ .Times(1); |
+ bluetooth_chooser_controller_.OnAdapterPresenceChanged( |
+ content::BluetoothChooser::AdapterPresence::POWERED_OFF); |
+ EXPECT_EQ(0u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_ADAPTER_OFF), |
+ bluetooth_chooser_controller_.GetNoOptionsText()); |
+ EXPECT_EQ(base::string16(), bluetooth_chooser_controller_.GetStatus()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, |
+ BluetoothAdapterTurnedOn) { |
+ EXPECT_CALL( |
+ mock_bluetooth_chooser_view_, |
+ OnAdapterEnabledChanged(true /* Bluetooth adapter is turned on */)) |
+ .Times(1); |
+ bluetooth_chooser_controller_.OnAdapterPresenceChanged( |
+ content::BluetoothChooser::AdapterPresence::POWERED_ON); |
+ EXPECT_EQ(0u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(l10n_util::GetStringUTF16( |
+ IDS_BLUETOOTH_DEVICE_CHOOSER_NO_DEVICES_FOUND_PROMPT), |
+ bluetooth_chooser_controller_.GetNoOptionsText()); |
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN), |
+ bluetooth_chooser_controller_.GetStatus()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, DiscoveringState) { |
+ EXPECT_CALL( |
+ mock_bluetooth_chooser_view_, |
+ OnRefreshStateChanged(true /* Refreshing options is in progress */)) |
+ .Times(1); |
+ bluetooth_chooser_controller_.OnDiscoveryStateChanged( |
+ content::BluetoothChooser::DiscoveryState::DISCOVERING); |
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_SCANNING), |
+ bluetooth_chooser_controller_.GetStatus()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, IdleState) { |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, |
+ OnRefreshStateChanged(false /* Refreshing options is complete */)) |
+ .Times(1); |
+ bluetooth_chooser_controller_.OnDiscoveryStateChanged( |
+ content::BluetoothChooser::DiscoveryState::IDLE); |
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN), |
+ bluetooth_chooser_controller_.GetStatus()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, FailedToStartState) { |
+ EXPECT_CALL(mock_bluetooth_chooser_view_, |
+ OnRefreshStateChanged(false /* Refreshing options is complete */)) |
+ .Times(1); |
+ bluetooth_chooser_controller_.OnDiscoveryStateChanged( |
+ content::BluetoothChooser::DiscoveryState::FAILED_TO_START); |
+ EXPECT_EQ(l10n_util::GetStringUTF16(IDS_BLUETOOTH_DEVICE_CHOOSER_RE_SCAN), |
+ bluetooth_chooser_controller_.GetStatus()); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, RefreshOptions) { |
+ bluetooth_chooser_controller_.RefreshOptions(); |
+ EXPECT_EQ(0u, bluetooth_chooser_controller_.NumOptions()); |
+ EXPECT_EQ(content::BluetoothChooser::Event::RESCAN, last_event_); |
+ EXPECT_EQ(std::string(), last_device_id_); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, |
+ SelectingOneDeviceShouldCallEventHandler) { |
+ bluetooth_chooser_controller_.Select(0); |
+ EXPECT_EQ(content::BluetoothChooser::Event::SELECTED, last_event_); |
+ EXPECT_EQ("id_a", last_device_id_); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, |
+ CancelShouldCallEventHandler) { |
+ bluetooth_chooser_controller_.Cancel(); |
+ EXPECT_EQ(content::BluetoothChooser::Event::CANCELLED, last_event_); |
+ EXPECT_EQ(std::string(), last_device_id_); |
+} |
+ |
+TEST_F(BluetoothChooserControllerWithDevicesAddedTest, |
+ CloseShouldCallEventHandler) { |
+ bluetooth_chooser_controller_.Close(); |
+ EXPECT_EQ(content::BluetoothChooser::Event::CANCELLED, last_event_); |
+ EXPECT_EQ(std::string(), last_device_id_); |
+} |