Index: chromeos/components/tether/message_transfer_operation_unittest.cc |
diff --git a/chromeos/components/tether/message_transfer_operation_unittest.cc b/chromeos/components/tether/message_transfer_operation_unittest.cc |
index 5db05a38893b61d6e1f8589d3786a34fb20c0bd3..0f007d5b1dae51ace10d2cd028be3d519c0cfe97 100644 |
--- a/chromeos/components/tether/message_transfer_operation_unittest.cc |
+++ b/chromeos/components/tether/message_transfer_operation_unittest.cc |
@@ -4,8 +4,10 @@ |
#include "chromeos/components/tether/message_transfer_operation.h" |
+#include "base/timer/mock_timer.h" |
#include "chromeos/components/tether/fake_ble_connection_manager.h" |
#include "chromeos/components/tether/message_wrapper.h" |
+#include "chromeos/components/tether/timer_factory.h" |
#include "components/cryptauth/remote_device_test_util.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -91,6 +93,16 @@ class TestOperation : public MessageTransferOperation { |
bool has_operation_finished_; |
}; |
+class TestTimerFactory : public TimerFactory { |
+ public: |
+ ~TestTimerFactory() override {} |
+ |
+ // TimerFactory: |
+ std::unique_ptr<base::Timer> CreateOneShotTimer() override { |
+ return base::MakeUnique<base::MockTimer>(false, false); |
khorimoto
2017/05/31 17:26:36
/* parameter_names */
Ryan Hansberry
2017/05/31 21:19:04
Done.
|
+ } |
+}; |
+ |
DeviceStatus CreateFakeDeviceStatus() { |
WifiStatus wifi_status; |
wifi_status.set_status_code( |
@@ -133,6 +145,7 @@ class MessageTransferOperationTest : public testing::Test { |
void ConstructOperation(std::vector<cryptauth::RemoteDevice> remote_devices) { |
operation_ = base::WrapUnique( |
new TestOperation(remote_devices, fake_ble_connection_manager_.get())); |
+ operation_->SetTimerFactoryForTest(base::MakeUnique<TestTimerFactory>()); |
VerifyOperationStartedAndFinished(false /* has_started */, |
false /* has_finished */); |
} |
@@ -157,6 +170,16 @@ class MessageTransferOperationTest : public testing::Test { |
EXPECT_EQ(has_finished, operation_->has_operation_finished()); |
} |
+ void UnregisterDevice(const cryptauth::RemoteDevice& remote_device) { |
+ operation_->UnregisterDevice(remote_device); |
+ } |
+ |
+ base::MockTimer* GetResponseTimerForDevice( |
+ const cryptauth::RemoteDevice& remote_device) { |
+ return static_cast<base::MockTimer*>( |
+ operation_->GetResponseTimerForDevice(remote_device)); |
+ } |
+ |
const std::vector<cryptauth::RemoteDevice> test_devices_; |
std::unique_ptr<FakeBleConnectionManager> fake_ble_connection_manager_; |
@@ -266,6 +289,7 @@ TEST_F(MessageTransferOperationTest, |
test_devices_[0], cryptauth::SecureChannel::Status::AUTHENTICATED); |
EXPECT_TRUE(IsDeviceRegistered(test_devices_[0])); |
EXPECT_TRUE(operation_->HasDeviceAuthenticated(test_devices_[0])); |
+ EXPECT_TRUE(GetResponseTimerForDevice(test_devices_[0])); |
khorimoto
2017/05/31 17:26:36
Test that timers are created correctly in all test
Ryan Hansberry
2017/05/31 21:19:04
Done.
|
fake_ble_connection_manager_->ReceiveMessage( |
test_devices_[0], |
@@ -278,6 +302,34 @@ TEST_F(MessageTransferOperationTest, |
message->GetMessageType()); |
EXPECT_EQ(CreateTetherAvailabilityResponse().SerializeAsString(), |
message->GetProto()->SerializeAsString()); |
+ |
+ // Simulate how subclasses behave after a successful response: unregister the |
khorimoto
2017/05/31 17:26:36
Instead of manually calling UnregisterDevice(), up
Ryan Hansberry
2017/05/31 21:19:04
Done.
|
+ // device. |
+ UnregisterDevice(test_devices_[0]); |
+ EXPECT_FALSE(GetResponseTimerForDevice(test_devices_[0])); |
+} |
+ |
+TEST_F(MessageTransferOperationTest, TestAuthenticatesButTimesOut) { |
+ ConstructOperation(std::vector<cryptauth::RemoteDevice>{test_devices_[0]}); |
+ InitializeOperation(); |
+ EXPECT_TRUE(IsDeviceRegistered(test_devices_[0])); |
+ |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::CONNECTING); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::CONNECTED); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::AUTHENTICATING); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::AUTHENTICATED); |
+ EXPECT_TRUE(IsDeviceRegistered(test_devices_[0])); |
+ EXPECT_TRUE(operation_->HasDeviceAuthenticated(test_devices_[0])); |
+ |
+ GetResponseTimerForDevice(test_devices_[0])->Fire(); |
+ |
+ EXPECT_FALSE(IsDeviceRegistered(test_devices_[0])); |
+ EXPECT_TRUE(operation_->has_operation_finished()); |
+ EXPECT_FALSE(GetResponseTimerForDevice(test_devices_[0])); |
} |
TEST_F(MessageTransferOperationTest, TestRepeatedInputDevice) { |
@@ -381,6 +433,35 @@ TEST_F(MessageTransferOperationTest, |
message->GetProto()->SerializeAsString()); |
} |
+TEST_F(MessageTransferOperationTest, |
+ AuthenticatesButTimesOutWaitingForResponse) { |
khorimoto
2017/05/31 17:26:36
nit: Change name to reflect the fact that this tes
Ryan Hansberry
2017/05/31 21:19:04
Done.
|
+ ConstructOperation(std::vector<cryptauth::RemoteDevice>{test_devices_[0]}); |
+ |
+ // Simulate the authentication of |test_devices_[0]|'s channel before |
+ // initialization. |
+ fake_ble_connection_manager_->RegisterRemoteDevice( |
+ test_devices_[0], MessageType::CONNECT_TETHERING_REQUEST); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::CONNECTING); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::CONNECTED); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::AUTHENTICATING); |
+ fake_ble_connection_manager_->SetDeviceStatus( |
+ test_devices_[0], cryptauth::SecureChannel::Status::AUTHENTICATED); |
+ |
+ // Now initialize; the authentication handler should have been invoked. |
+ InitializeOperation(); |
+ EXPECT_TRUE(IsDeviceRegistered(test_devices_[0])); |
+ EXPECT_TRUE(operation_->HasDeviceAuthenticated(test_devices_[0])); |
+ |
+ GetResponseTimerForDevice(test_devices_[0])->Fire(); |
+ |
+ EXPECT_FALSE(IsDeviceRegistered(test_devices_[0])); |
+ EXPECT_TRUE(operation_->has_operation_finished()); |
+ EXPECT_FALSE(GetResponseTimerForDevice(test_devices_[0])); |
+} |
+ |
TEST_F(MessageTransferOperationTest, MultipleDevices) { |
ConstructOperation(test_devices_); |
InitializeOperation(); |