OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/proximity_auth/remote_device_life_cycle_impl.h" | 5 #include "components/proximity_auth/remote_device_life_cycle_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
11 | 11 |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/test/test_simple_task_runner.h" | 14 #include "base/test/test_simple_task_runner.h" |
15 #include "base/threading/thread_task_runner_handle.h" | 15 #include "base/threading/thread_task_runner_handle.h" |
| 16 #include "components/cryptauth/connection_finder.h" |
| 17 #include "components/cryptauth/cryptauth_test_util.h" |
| 18 #include "components/cryptauth/fake_connection.h" |
| 19 #include "components/cryptauth/wire_message.h" |
16 #include "components/proximity_auth/authenticator.h" | 20 #include "components/proximity_auth/authenticator.h" |
17 #include "components/proximity_auth/connection_finder.h" | |
18 #include "components/proximity_auth/fake_connection.h" | |
19 #include "components/proximity_auth/messenger.h" | 21 #include "components/proximity_auth/messenger.h" |
20 #include "components/proximity_auth/proximity_auth_test_util.h" | |
21 #include "components/proximity_auth/secure_context.h" | 22 #include "components/proximity_auth/secure_context.h" |
22 #include "components/proximity_auth/wire_message.h" | |
23 #include "testing/gmock/include/gmock/gmock.h" | 23 #include "testing/gmock/include/gmock/gmock.h" |
24 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
25 | 25 |
26 using testing::_; | 26 using testing::_; |
27 using testing::Mock; | 27 using testing::Mock; |
28 using testing::NiceMock; | 28 using testing::NiceMock; |
29 using testing::Return; | 29 using testing::Return; |
30 using testing::StrictMock; | 30 using testing::StrictMock; |
31 | 31 |
32 namespace proximity_auth { | 32 namespace proximity_auth { |
(...skipping 19 matching lines...) Expand all Loading... |
52 NOTREACHED(); | 52 NOTREACHED(); |
53 return SecureContext::PROTOCOL_VERSION_THREE_ONE; | 53 return SecureContext::PROTOCOL_VERSION_THREE_ONE; |
54 } | 54 } |
55 | 55 |
56 std::string GetChannelBindingData() const override { return std::string(); } | 56 std::string GetChannelBindingData() const override { return std::string(); } |
57 | 57 |
58 private: | 58 private: |
59 DISALLOW_COPY_AND_ASSIGN(StubSecureContext); | 59 DISALLOW_COPY_AND_ASSIGN(StubSecureContext); |
60 }; | 60 }; |
61 | 61 |
62 class FakeConnectionFinder : public ConnectionFinder { | 62 class FakeConnectionFinder : public cryptauth::ConnectionFinder { |
63 public: | 63 public: |
64 FakeConnectionFinder(const cryptauth::RemoteDevice& remote_device) | 64 FakeConnectionFinder(const cryptauth::RemoteDevice& remote_device) |
65 : remote_device_(remote_device), connection_(nullptr) {} | 65 : remote_device_(remote_device), connection_(nullptr) {} |
66 ~FakeConnectionFinder() override {} | 66 ~FakeConnectionFinder() override {} |
67 | 67 |
68 void OnConnectionFound() { | 68 void OnConnectionFound() { |
69 ASSERT_FALSE(connection_callback_.is_null()); | 69 ASSERT_FALSE(connection_callback_.is_null()); |
70 std::unique_ptr<FakeConnection> scoped_connection_( | 70 std::unique_ptr<cryptauth::FakeConnection> scoped_connection_( |
71 new FakeConnection(remote_device_)); | 71 new cryptauth::FakeConnection(remote_device_)); |
72 connection_ = scoped_connection_.get(); | 72 connection_ = scoped_connection_.get(); |
73 connection_callback_.Run(std::move(scoped_connection_)); | 73 connection_callback_.Run(std::move(scoped_connection_)); |
74 } | 74 } |
75 | 75 |
76 FakeConnection* connection() { return connection_; } | 76 cryptauth::FakeConnection* connection() { return connection_; } |
77 | 77 |
78 private: | 78 private: |
79 // ConnectionFinder: | 79 // cryptauth::ConnectionFinder: |
80 void Find(const ConnectionCallback& connection_callback) override { | 80 void Find(const cryptauth::ConnectionFinder::ConnectionCallback& |
| 81 connection_callback) override { |
81 ASSERT_TRUE(connection_callback_.is_null()); | 82 ASSERT_TRUE(connection_callback_.is_null()); |
82 connection_callback_ = connection_callback; | 83 connection_callback_ = connection_callback; |
83 } | 84 } |
84 | 85 |
85 const cryptauth::RemoteDevice remote_device_; | 86 const cryptauth::RemoteDevice remote_device_; |
86 | 87 |
87 FakeConnection* connection_; | 88 cryptauth::FakeConnection* connection_; |
88 | 89 |
89 ConnectionCallback connection_callback_; | 90 cryptauth::ConnectionFinder::ConnectionCallback connection_callback_; |
90 | 91 |
91 DISALLOW_COPY_AND_ASSIGN(FakeConnectionFinder); | 92 DISALLOW_COPY_AND_ASSIGN(FakeConnectionFinder); |
92 }; | 93 }; |
93 | 94 |
94 class FakeAuthenticator : public Authenticator { | 95 class FakeAuthenticator : public Authenticator { |
95 public: | 96 public: |
96 FakeAuthenticator(Connection* connection) : connection_(connection) {} | 97 FakeAuthenticator(cryptauth::Connection* connection) |
| 98 : connection_(connection) {} |
97 ~FakeAuthenticator() override { | 99 ~FakeAuthenticator() override { |
98 // This object should be destroyed immediately after authentication is | 100 // This object should be destroyed immediately after authentication is |
99 // complete in order not to outlive the underlying connection. | 101 // complete in order not to outlive the underlying connection. |
100 EXPECT_FALSE(callback_.is_null()); | 102 EXPECT_FALSE(callback_.is_null()); |
101 EXPECT_EQ(kTestRemoteDevicePublicKey, | 103 EXPECT_EQ(cryptauth::kTestRemoteDevicePublicKey, |
102 connection_->remote_device().public_key); | 104 connection_->remote_device().public_key); |
103 } | 105 } |
104 | 106 |
105 void OnAuthenticationResult(Authenticator::Result result) { | 107 void OnAuthenticationResult(Authenticator::Result result) { |
106 ASSERT_FALSE(callback_.is_null()); | 108 ASSERT_FALSE(callback_.is_null()); |
107 std::unique_ptr<SecureContext> secure_context; | 109 std::unique_ptr<SecureContext> secure_context; |
108 if (result == Authenticator::Result::SUCCESS) | 110 if (result == Authenticator::Result::SUCCESS) |
109 secure_context.reset(new StubSecureContext()); | 111 secure_context.reset(new StubSecureContext()); |
110 callback_.Run(result, std::move(secure_context)); | 112 callback_.Run(result, std::move(secure_context)); |
111 } | 113 } |
112 | 114 |
113 private: | 115 private: |
114 // Authenticator: | 116 // Authenticator: |
115 void Authenticate(const AuthenticationCallback& callback) override { | 117 void Authenticate(const AuthenticationCallback& callback) override { |
116 ASSERT_TRUE(callback_.is_null()); | 118 ASSERT_TRUE(callback_.is_null()); |
117 callback_ = callback; | 119 callback_ = callback; |
118 } | 120 } |
119 | 121 |
120 Connection* connection_; | 122 cryptauth::Connection* connection_; |
121 | 123 |
122 AuthenticationCallback callback_; | 124 AuthenticationCallback callback_; |
123 | 125 |
124 DISALLOW_COPY_AND_ASSIGN(FakeAuthenticator); | 126 DISALLOW_COPY_AND_ASSIGN(FakeAuthenticator); |
125 }; | 127 }; |
126 | 128 |
127 // Subclass of RemoteDeviceLifeCycleImpl to make it testable. | 129 // Subclass of RemoteDeviceLifeCycleImpl to make it testable. |
128 class TestableRemoteDeviceLifeCycleImpl : public RemoteDeviceLifeCycleImpl { | 130 class TestableRemoteDeviceLifeCycleImpl : public RemoteDeviceLifeCycleImpl { |
129 public: | 131 public: |
130 TestableRemoteDeviceLifeCycleImpl( | 132 TestableRemoteDeviceLifeCycleImpl( |
131 const cryptauth::RemoteDevice& remote_device) | 133 const cryptauth::RemoteDevice& remote_device) |
132 : RemoteDeviceLifeCycleImpl(remote_device, nullptr), | 134 : RemoteDeviceLifeCycleImpl(remote_device, nullptr), |
133 remote_device_(remote_device) {} | 135 remote_device_(remote_device) {} |
134 | 136 |
135 ~TestableRemoteDeviceLifeCycleImpl() override {} | 137 ~TestableRemoteDeviceLifeCycleImpl() override {} |
136 | 138 |
137 FakeConnectionFinder* connection_finder() { return connection_finder_; } | 139 FakeConnectionFinder* connection_finder() { return connection_finder_; } |
138 FakeAuthenticator* authenticator() { return authenticator_; } | 140 FakeAuthenticator* authenticator() { return authenticator_; } |
139 | 141 |
140 private: | 142 private: |
141 std::unique_ptr<ConnectionFinder> CreateConnectionFinder() override { | 143 std::unique_ptr<cryptauth::ConnectionFinder> CreateConnectionFinder() |
| 144 override { |
142 std::unique_ptr<FakeConnectionFinder> scoped_connection_finder( | 145 std::unique_ptr<FakeConnectionFinder> scoped_connection_finder( |
143 new FakeConnectionFinder(remote_device_)); | 146 new FakeConnectionFinder(remote_device_)); |
144 connection_finder_ = scoped_connection_finder.get(); | 147 connection_finder_ = scoped_connection_finder.get(); |
145 return std::move(scoped_connection_finder); | 148 return std::move(scoped_connection_finder); |
146 } | 149 } |
147 | 150 |
148 std::unique_ptr<Authenticator> CreateAuthenticator() override { | 151 std::unique_ptr<Authenticator> CreateAuthenticator() override { |
149 EXPECT_TRUE(connection_finder_); | 152 EXPECT_TRUE(connection_finder_); |
150 std::unique_ptr<FakeAuthenticator> scoped_authenticator( | 153 std::unique_ptr<FakeAuthenticator> scoped_authenticator( |
151 new FakeAuthenticator(connection_finder_->connection())); | 154 new FakeAuthenticator(connection_finder_->connection())); |
152 authenticator_ = scoped_authenticator.get(); | 155 authenticator_ = scoped_authenticator.get(); |
153 return std::move(scoped_authenticator); | 156 return std::move(scoped_authenticator); |
154 } | 157 } |
155 | 158 |
156 const cryptauth::RemoteDevice remote_device_; | 159 const cryptauth::RemoteDevice remote_device_; |
157 FakeConnectionFinder* connection_finder_; | 160 FakeConnectionFinder* connection_finder_; |
158 FakeAuthenticator* authenticator_; | 161 FakeAuthenticator* authenticator_; |
159 | 162 |
160 DISALLOW_COPY_AND_ASSIGN(TestableRemoteDeviceLifeCycleImpl); | 163 DISALLOW_COPY_AND_ASSIGN(TestableRemoteDeviceLifeCycleImpl); |
161 }; | 164 }; |
162 | 165 |
163 } // namespace | 166 } // namespace |
164 | 167 |
165 class ProximityAuthRemoteDeviceLifeCycleImplTest | 168 class ProximityAuthRemoteDeviceLifeCycleImplTest |
166 : public testing::Test, | 169 : public testing::Test, |
167 public RemoteDeviceLifeCycle::Observer { | 170 public RemoteDeviceLifeCycle::Observer { |
168 protected: | 171 protected: |
169 ProximityAuthRemoteDeviceLifeCycleImplTest() | 172 ProximityAuthRemoteDeviceLifeCycleImplTest() |
170 : life_cycle_(CreateClassicRemoteDeviceForTest()), | 173 : life_cycle_(cryptauth::CreateClassicRemoteDeviceForTest()), |
171 task_runner_(new base::TestSimpleTaskRunner()), | 174 task_runner_(new base::TestSimpleTaskRunner()), |
172 thread_task_runner_handle_(task_runner_) {} | 175 thread_task_runner_handle_(task_runner_) {} |
173 | 176 |
174 ~ProximityAuthRemoteDeviceLifeCycleImplTest() override { | 177 ~ProximityAuthRemoteDeviceLifeCycleImplTest() override { |
175 life_cycle_.RemoveObserver(this); | 178 life_cycle_.RemoveObserver(this); |
176 } | 179 } |
177 | 180 |
178 void StartLifeCycle() { | 181 void StartLifeCycle() { |
179 EXPECT_EQ(RemoteDeviceLifeCycle::State::STOPPED, life_cycle_.GetState()); | 182 EXPECT_EQ(RemoteDeviceLifeCycle::State::STOPPED, life_cycle_.GetState()); |
180 life_cycle_.AddObserver(this); | 183 life_cycle_.AddObserver(this); |
181 | 184 |
182 EXPECT_CALL(*this, OnLifeCycleStateChanged( | 185 EXPECT_CALL(*this, OnLifeCycleStateChanged( |
183 RemoteDeviceLifeCycle::State::STOPPED, | 186 RemoteDeviceLifeCycle::State::STOPPED, |
184 RemoteDeviceLifeCycle::State::FINDING_CONNECTION)); | 187 RemoteDeviceLifeCycle::State::FINDING_CONNECTION)); |
185 life_cycle_.Start(); | 188 life_cycle_.Start(); |
186 task_runner_->RunUntilIdle(); | 189 task_runner_->RunUntilIdle(); |
187 Mock::VerifyAndClearExpectations(this); | 190 Mock::VerifyAndClearExpectations(this); |
188 | 191 |
189 EXPECT_EQ(RemoteDeviceLifeCycle::State::FINDING_CONNECTION, | 192 EXPECT_EQ(RemoteDeviceLifeCycle::State::FINDING_CONNECTION, |
190 life_cycle_.GetState()); | 193 life_cycle_.GetState()); |
191 } | 194 } |
192 | 195 |
193 FakeConnection* OnConnectionFound() { | 196 cryptauth::FakeConnection* OnConnectionFound() { |
194 EXPECT_EQ(RemoteDeviceLifeCycle::State::FINDING_CONNECTION, | 197 EXPECT_EQ(RemoteDeviceLifeCycle::State::FINDING_CONNECTION, |
195 life_cycle_.GetState()); | 198 life_cycle_.GetState()); |
196 | 199 |
197 EXPECT_CALL(*this, OnLifeCycleStateChanged( | 200 EXPECT_CALL(*this, OnLifeCycleStateChanged( |
198 RemoteDeviceLifeCycle::State::FINDING_CONNECTION, | 201 RemoteDeviceLifeCycle::State::FINDING_CONNECTION, |
199 RemoteDeviceLifeCycle::State::AUTHENTICATING)); | 202 RemoteDeviceLifeCycle::State::AUTHENTICATING)); |
200 life_cycle_.connection_finder()->OnConnectionFound(); | 203 life_cycle_.connection_finder()->OnConnectionFound(); |
201 task_runner_->RunUntilIdle(); | 204 task_runner_->RunUntilIdle(); |
202 Mock::VerifyAndClearExpectations(this); | 205 Mock::VerifyAndClearExpectations(this); |
203 | 206 |
(...skipping 30 matching lines...) Expand all Loading... |
234 TestableRemoteDeviceLifeCycleImpl life_cycle_; | 237 TestableRemoteDeviceLifeCycleImpl life_cycle_; |
235 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 238 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
236 base::ThreadTaskRunnerHandle thread_task_runner_handle_; | 239 base::ThreadTaskRunnerHandle thread_task_runner_handle_; |
237 | 240 |
238 private: | 241 private: |
239 DISALLOW_COPY_AND_ASSIGN(ProximityAuthRemoteDeviceLifeCycleImplTest); | 242 DISALLOW_COPY_AND_ASSIGN(ProximityAuthRemoteDeviceLifeCycleImplTest); |
240 }; | 243 }; |
241 | 244 |
242 TEST_F(ProximityAuthRemoteDeviceLifeCycleImplTest, GetRemoteDevice) { | 245 TEST_F(ProximityAuthRemoteDeviceLifeCycleImplTest, GetRemoteDevice) { |
243 cryptauth::RemoteDevice expected_remote_device = | 246 cryptauth::RemoteDevice expected_remote_device = |
244 CreateClassicRemoteDeviceForTest(); | 247 cryptauth::CreateClassicRemoteDeviceForTest(); |
245 cryptauth::RemoteDevice remote_device = life_cycle_.GetRemoteDevice(); | 248 cryptauth::RemoteDevice remote_device = life_cycle_.GetRemoteDevice(); |
246 EXPECT_EQ(expected_remote_device.user_id, remote_device.user_id); | 249 EXPECT_EQ(expected_remote_device.user_id, remote_device.user_id); |
247 EXPECT_EQ(expected_remote_device.name, remote_device.name); | 250 EXPECT_EQ(expected_remote_device.name, remote_device.name); |
248 EXPECT_EQ(expected_remote_device.public_key, remote_device.public_key); | 251 EXPECT_EQ(expected_remote_device.public_key, remote_device.public_key); |
249 EXPECT_EQ(expected_remote_device.bluetooth_address, | 252 EXPECT_EQ(expected_remote_device.bluetooth_address, |
250 remote_device.bluetooth_address); | 253 remote_device.bluetooth_address); |
251 EXPECT_EQ(expected_remote_device.persistent_symmetric_key, | 254 EXPECT_EQ(expected_remote_device.persistent_symmetric_key, |
252 remote_device.persistent_symmetric_key); | 255 remote_device.persistent_symmetric_key); |
253 } | 256 } |
254 | 257 |
255 TEST_F(ProximityAuthRemoteDeviceLifeCycleImplTest, AuthenticateAndDisconnect) { | 258 TEST_F(ProximityAuthRemoteDeviceLifeCycleImplTest, AuthenticateAndDisconnect) { |
256 StartLifeCycle(); | 259 StartLifeCycle(); |
257 for (size_t i = 0; i < 3; ++i) { | 260 for (size_t i = 0; i < 3; ++i) { |
258 Connection* connection = OnConnectionFound(); | 261 cryptauth::Connection* connection = OnConnectionFound(); |
259 Authenticate(Authenticator::Result::SUCCESS); | 262 Authenticate(Authenticator::Result::SUCCESS); |
260 EXPECT_TRUE(life_cycle_.GetMessenger()); | 263 EXPECT_TRUE(life_cycle_.GetMessenger()); |
261 | 264 |
262 EXPECT_CALL(*this, | 265 EXPECT_CALL(*this, |
263 OnLifeCycleStateChanged( | 266 OnLifeCycleStateChanged( |
264 RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED, | 267 RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED, |
265 RemoteDeviceLifeCycle::State::FINDING_CONNECTION)); | 268 RemoteDeviceLifeCycle::State::FINDING_CONNECTION)); |
266 connection->Disconnect(); | 269 connection->Disconnect(); |
267 Mock::VerifyAndClearExpectations(this); | 270 Mock::VerifyAndClearExpectations(this); |
268 } | 271 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 AuthenticationFailsThenSucceeds) { | 304 AuthenticationFailsThenSucceeds) { |
302 // Authentication fails on first pass. | 305 // Authentication fails on first pass. |
303 StartLifeCycle(); | 306 StartLifeCycle(); |
304 OnConnectionFound(); | 307 OnConnectionFound(); |
305 Authenticate(Authenticator::Result::FAILURE); | 308 Authenticate(Authenticator::Result::FAILURE); |
306 EXPECT_FALSE(life_cycle_.GetMessenger()); | 309 EXPECT_FALSE(life_cycle_.GetMessenger()); |
307 EXPECT_CALL(*this, OnLifeCycleStateChanged(_, _)); | 310 EXPECT_CALL(*this, OnLifeCycleStateChanged(_, _)); |
308 task_runner_->RunUntilIdle(); | 311 task_runner_->RunUntilIdle(); |
309 | 312 |
310 // Authentication succeeds on second pass. | 313 // Authentication succeeds on second pass. |
311 Connection* connection = OnConnectionFound(); | 314 cryptauth::Connection* connection = OnConnectionFound(); |
312 Authenticate(Authenticator::Result::SUCCESS); | 315 Authenticate(Authenticator::Result::SUCCESS); |
313 EXPECT_TRUE(life_cycle_.GetMessenger()); | 316 EXPECT_TRUE(life_cycle_.GetMessenger()); |
314 EXPECT_CALL(*this, OnLifeCycleStateChanged(_, _)); | 317 EXPECT_CALL(*this, OnLifeCycleStateChanged(_, _)); |
315 connection->Disconnect(); | 318 connection->Disconnect(); |
316 } | 319 } |
317 | 320 |
318 } // namespace proximity_auth | 321 } // namespace proximity_auth |
OLD | NEW |