| Index: chromeos/components/tether/tether_connector_unittest.cc
|
| diff --git a/chromeos/components/tether/tether_connector_unittest.cc b/chromeos/components/tether/tether_connector_unittest.cc
|
| index 31e1755564e102381ce70b65edd1bff757549f1e..d4a2513e7658b4e7ff755d76d43b53110d0d4274 100644
|
| --- a/chromeos/components/tether/tether_connector_unittest.cc
|
| +++ b/chromeos/components/tether/tether_connector_unittest.cc
|
| @@ -14,6 +14,7 @@
|
| #include "chromeos/components/tether/fake_notification_presenter.h"
|
| #include "chromeos/components/tether/fake_tether_host_fetcher.h"
|
| #include "chromeos/components/tether/fake_wifi_hotspot_connector.h"
|
| +#include "chromeos/components/tether/mock_host_connection_metrics_logger.h"
|
| #include "chromeos/components/tether/mock_tether_host_response_recorder.h"
|
| #include "chromeos/components/tether/tether_connector.h"
|
| #include "chromeos/dbus/dbus_thread_manager.h"
|
| @@ -27,6 +28,8 @@
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
|
|
|
| +using testing::StrictMock;
|
| +
|
| namespace chromeos {
|
|
|
| namespace tether {
|
| @@ -146,6 +149,8 @@ class TetherConnectorTest : public NetworkStateTest {
|
| fake_host_scan_cache_ = base::MakeUnique<FakeHostScanCache>();
|
| fake_notification_presenter_ =
|
| base::MakeUnique<FakeNotificationPresenter>();
|
| + mock_host_connection_metrics_logger_ =
|
| + base::WrapUnique(new StrictMock<MockHostConnectionMetricsLogger>);
|
|
|
| result_.clear();
|
|
|
| @@ -155,7 +160,8 @@ class TetherConnectorTest : public NetworkStateTest {
|
| fake_ble_connection_manager_.get(),
|
| mock_tether_host_response_recorder_.get(),
|
| device_id_tether_network_guid_map_.get(), fake_host_scan_cache_.get(),
|
| - fake_notification_presenter_.get()));
|
| + fake_notification_presenter_.get(),
|
| + mock_host_connection_metrics_logger_.get()));
|
|
|
| SetUpTetherNetworks();
|
| }
|
| @@ -231,6 +237,58 @@ class TetherConnectorTest : public NetworkStateTest {
|
| base::Unretained(this)));
|
| }
|
|
|
| + void VerifyConnectTetheringOperationFails(
|
| + ConnectTetheringResponse_ResponseCode response_code,
|
| + bool setup_required,
|
| + HostConnectionMetricsLogger::ConnectionToHostResult expected_event_type) {
|
| + EXPECT_CALL(*mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(expected_event_type));
|
| +
|
| + EXPECT_FALSE(
|
| + fake_notification_presenter_->is_setup_required_notification_shown());
|
| +
|
| + // test_devices_[0] does not require first-time setup, but test_devices_[1]
|
| + // does require first-time setup. See SetUpTetherNetworks().
|
| + cryptauth::RemoteDevice test_device = test_devices_[setup_required ? 1 : 0];
|
| +
|
| + CallConnect(GetTetherNetworkGuid(test_device.GetDeviceId()));
|
| + EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| + fake_active_host_->GetActiveHostStatus());
|
| + EXPECT_EQ(test_device.GetDeviceId(),
|
| + fake_active_host_->GetActiveHostDeviceId());
|
| + EXPECT_EQ(GetTetherNetworkGuid(test_device.GetDeviceId()),
|
| + fake_active_host_->GetTetherNetworkGuid());
|
| + EXPECT_TRUE(fake_active_host_->GetWifiNetworkGuid().empty());
|
| +
|
| + EXPECT_EQ(
|
| + setup_required,
|
| + fake_notification_presenter_->is_setup_required_notification_shown());
|
| +
|
| + fake_tether_host_fetcher_->InvokePendingCallbacks();
|
| +
|
| + EXPECT_EQ(
|
| + setup_required,
|
| + fake_notification_presenter_->is_setup_required_notification_shown());
|
| + EXPECT_EQ(
|
| + setup_required,
|
| + fake_operation_factory_->created_operations()[0]->setup_required());
|
| +
|
| + // Simulate a failed connection attempt (either the host cannot provide
|
| + // tethering at this time or a timeout occurs).
|
| + EXPECT_EQ(1u, fake_operation_factory_->created_operations().size());
|
| + fake_operation_factory_->created_operations()[0]->SendFailedResponse(
|
| + response_code);
|
| +
|
| + EXPECT_FALSE(
|
| + fake_notification_presenter_->is_setup_required_notification_shown());
|
| +
|
| + // The failure should have resulted in the host being disconnected.
|
| + EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
|
| + fake_active_host_->GetActiveHostStatus());
|
| + EXPECT_EQ(NetworkConnectionHandler::kErrorConnectFailed,
|
| + GetResultAndReset());
|
| + }
|
| +
|
| std::string GetResultAndReset() {
|
| std::string result;
|
| result.swap(result_);
|
| @@ -252,6 +310,8 @@ class TetherConnectorTest : public NetworkStateTest {
|
| device_id_tether_network_guid_map_;
|
| std::unique_ptr<FakeHostScanCache> fake_host_scan_cache_;
|
| std::unique_ptr<FakeNotificationPresenter> fake_notification_presenter_;
|
| + std::unique_ptr<StrictMock<MockHostConnectionMetricsLogger>>
|
| + mock_host_connection_metrics_logger_;
|
|
|
| std::string result_;
|
|
|
| @@ -262,6 +322,12 @@ class TetherConnectorTest : public NetworkStateTest {
|
| };
|
|
|
| TEST_F(TetherConnectorTest, TestCannotFetchDevice) {
|
| + EXPECT_CALL(
|
| + *mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_INTERNAL_ERROR));
|
| +
|
| // Base64-encoded version of "nonexistentDeviceId".
|
| const char kNonexistentDeviceId[] = "bm9uZXhpc3RlbnREZXZpY2VJZA==";
|
|
|
| @@ -283,6 +349,12 @@ TEST_F(TetherConnectorTest, TestCannotFetchDevice) {
|
| }
|
|
|
| TEST_F(TetherConnectorTest, TestCancelWhileOperationActive) {
|
| + EXPECT_CALL(
|
| + *mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_CANCELED_BY_USER));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| fake_active_host_->GetActiveHostStatus());
|
| @@ -308,60 +380,61 @@ TEST_F(TetherConnectorTest, TestCancelWhileOperationActive) {
|
| GetResultAndReset());
|
| }
|
|
|
| -TEST_F(TetherConnectorTest, TestConnectTetheringOperationFails) {
|
| - CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| - EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| - fake_active_host_->GetActiveHostStatus());
|
| - EXPECT_EQ(test_devices_[0].GetDeviceId(),
|
| - fake_active_host_->GetActiveHostDeviceId());
|
| - EXPECT_EQ(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()),
|
| - fake_active_host_->GetTetherNetworkGuid());
|
| - EXPECT_TRUE(fake_active_host_->GetWifiNetworkGuid().empty());
|
| -
|
| - fake_tether_host_fetcher_->InvokePendingCallbacks();
|
| -
|
| - // Simulate a failed connection attempt (either the host cannot provide
|
| - // tethering at this time or a timeout occurs).
|
| - EXPECT_EQ(1u, fake_operation_factory_->created_operations().size());
|
| - EXPECT_FALSE(
|
| - fake_operation_factory_->created_operations()[0]->setup_required());
|
| - fake_operation_factory_->created_operations()[0]->SendFailedResponse(
|
| +TEST_F(TetherConnectorTest,
|
| + TestConnectTetheringOperationFails_SetupNotRequired) {
|
| + VerifyConnectTetheringOperationFails(
|
| ConnectTetheringResponse_ResponseCode::
|
| - ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR);
|
| -
|
| - // The failure should have resulted in the host being disconnected.
|
| - EXPECT_EQ(ActiveHost::ActiveHostStatus::DISCONNECTED,
|
| - fake_active_host_->GetActiveHostStatus());
|
| - EXPECT_EQ(NetworkConnectionHandler::kErrorConnectFailed, GetResultAndReset());
|
| + ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR,
|
| + false /* setup_required */,
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_UNKNOWN_ERROR);
|
| }
|
|
|
| TEST_F(TetherConnectorTest, TestConnectTetheringOperationFails_SetupRequired) {
|
| - EXPECT_FALSE(
|
| - fake_notification_presenter_->is_setup_required_notification_shown());
|
| -
|
| - CallConnect(GetTetherNetworkGuid(test_devices_[1].GetDeviceId()));
|
| -
|
| - EXPECT_TRUE(
|
| - fake_notification_presenter_->is_setup_required_notification_shown());
|
| -
|
| - fake_tether_host_fetcher_->InvokePendingCallbacks();
|
| -
|
| - EXPECT_TRUE(
|
| - fake_notification_presenter_->is_setup_required_notification_shown());
|
| - EXPECT_TRUE(
|
| - fake_operation_factory_->created_operations()[0]->setup_required());
|
| + VerifyConnectTetheringOperationFails(
|
| + ConnectTetheringResponse_ResponseCode::
|
| + ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR,
|
| + true /* setup_required */,
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_UNKNOWN_ERROR);
|
| +}
|
|
|
| - fake_operation_factory_->created_operations()[0]->SendFailedResponse(
|
| +TEST_F(TetherConnectorTest,
|
| + TestConnectTetheringOperationFails_ProvisioningFailed) {
|
| + VerifyConnectTetheringOperationFails(
|
| ConnectTetheringResponse_ResponseCode::
|
| - ConnectTetheringResponse_ResponseCode_UNKNOWN_ERROR);
|
| + ConnectTetheringResponse_ResponseCode_PROVISIONING_FAILED,
|
| + false /* setup_required */,
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_PROVISIONING_FAILED);
|
| +}
|
|
|
| - EXPECT_FALSE(
|
| - fake_notification_presenter_->is_setup_required_notification_shown());
|
| +TEST_F(TetherConnectorTest,
|
| + TestConnectTetheringOperationFails_TetheringTimeout_SetupNotRequired) {
|
| + VerifyConnectTetheringOperationFails(
|
| + ConnectTetheringResponse_ResponseCode::
|
| + ConnectTetheringResponse_ResponseCode_TETHERING_TIMEOUT,
|
| + false /* setup_required */,
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_TETHERING_TIMED_OUT_FIRST_TIME_SETUP_WAS_NOT_REQUIRED);
|
| +}
|
|
|
| - EXPECT_EQ(NetworkConnectionHandler::kErrorConnectFailed, GetResultAndReset());
|
| +TEST_F(TetherConnectorTest,
|
| + TestConnectTetheringOperationFails_TetheringTimeout_SetupRequired) {
|
| + VerifyConnectTetheringOperationFails(
|
| + ConnectTetheringResponse_ResponseCode::
|
| + ConnectTetheringResponse_ResponseCode_TETHERING_TIMEOUT,
|
| + true /* setup_required */,
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_TETHERING_TIMED_OUT_FIRST_TIME_SETUP_WAS_REQUIRED);
|
| }
|
|
|
| TEST_F(TetherConnectorTest, TestConnectingToWifiFails) {
|
| + EXPECT_CALL(*mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_TIMEOUT));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| fake_active_host_->GetActiveHostStatus());
|
| @@ -398,6 +471,12 @@ TEST_F(TetherConnectorTest, TestConnectingToWifiFails) {
|
| }
|
|
|
| TEST_F(TetherConnectorTest, TestCancelWhileConnectingToWifi) {
|
| + EXPECT_CALL(
|
| + *mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_CANCELED_BY_USER));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| fake_active_host_->GetActiveHostStatus());
|
| @@ -428,6 +507,11 @@ TEST_F(TetherConnectorTest, TestCancelWhileConnectingToWifi) {
|
| }
|
|
|
| TEST_F(TetherConnectorTest, TestSuccessfulConnection) {
|
| + EXPECT_CALL(*mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_SUCCESS));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| fake_active_host_->GetActiveHostStatus());
|
| @@ -472,6 +556,11 @@ TEST_F(TetherConnectorTest, TestSuccessfulConnection) {
|
| }
|
|
|
| TEST_F(TetherConnectorTest, TestSuccessfulConnection_SetupRequired) {
|
| + EXPECT_CALL(*mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_SUCCESS));
|
| +
|
| EXPECT_FALSE(
|
| fake_notification_presenter_->is_setup_required_notification_shown());
|
|
|
| @@ -503,6 +592,12 @@ TEST_F(TetherConnectorTest, TestSuccessfulConnection_SetupRequired) {
|
|
|
| TEST_F(TetherConnectorTest,
|
| TestNewConnectionAttemptDuringFetch_DifferentDevice) {
|
| + EXPECT_CALL(
|
| + *mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_CANCELED_BY_USER));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
|
|
| // Instead of invoking the pending callbacks on |fake_tether_host_fetcher_|,
|
| @@ -524,6 +619,12 @@ TEST_F(TetherConnectorTest,
|
|
|
| TEST_F(TetherConnectorTest,
|
| TestNewConnectionAttemptDuringOperation_DifferentDevice) {
|
| + EXPECT_CALL(
|
| + *mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_CANCELED_BY_USER));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| fake_active_host_->GetActiveHostStatus());
|
| @@ -576,6 +677,12 @@ TEST_F(TetherConnectorTest,
|
|
|
| TEST_F(TetherConnectorTest,
|
| TestNewConnectionAttemptDuringWifiConnection_DifferentDevice) {
|
| + EXPECT_CALL(
|
| + *mock_host_connection_metrics_logger_,
|
| + RecordConnectionToHostResult(
|
| + HostConnectionMetricsLogger::ConnectionToHostResult::
|
| + CONNECTION_RESULT_FAILURE_CLIENT_CONNECTION_CANCELED_BY_USER));
|
| +
|
| CallConnect(GetTetherNetworkGuid(test_devices_[0].GetDeviceId()));
|
| EXPECT_EQ(ActiveHost::ActiveHostStatus::CONNECTING,
|
| fake_active_host_->GetActiveHostStatus());
|
|
|