Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: chromeos/attestation/attestation_flow_unittest.cc

Issue 2529743002: Wait for the attestation to be ready (TPM being prepared for attestation) before trying to enroll. (Closed)
Patch Set: AttestationFlow supports a timeout. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 <memory> 5 #include <memory>
6 #include <utility> 6 #include <utility>
7 7
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/memory/ptr_util.h"
10 #include "base/run_loop.h" 11 #include "base/run_loop.h"
11 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/test/test_mock_time_task_runner.h"
12 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "base/time/tick_clock.h"
16 #include "base/timer/timer.h"
13 #include "chromeos/attestation/mock_attestation_flow.h" 17 #include "chromeos/attestation/mock_attestation_flow.h"
14 #include "chromeos/cryptohome/cryptohome_parameters.h" 18 #include "chromeos/cryptohome/cryptohome_parameters.h"
15 #include "chromeos/cryptohome/mock_async_method_caller.h" 19 #include "chromeos/cryptohome/mock_async_method_caller.h"
16 #include "chromeos/dbus/mock_cryptohome_client.h" 20 #include "chromeos/dbus/mock_cryptohome_client.h"
17 #include "components/signin/core/account_id/account_id.h" 21 #include "components/signin/core/account_id/account_id.h"
18 #include "testing/gmock/include/gmock/gmock.h" 22 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
20 24
21 using testing::_; 25 using testing::_;
22 using testing::AtLeast; 26 using testing::AtLeast;
23 using testing::DoDefault; 27 using testing::DoDefault;
24 using testing::Invoke; 28 using testing::Invoke;
25 using testing::NiceMock; 29 using testing::NiceMock;
26 using testing::Return; 30 using testing::Return;
27 using testing::Sequence; 31 using testing::Sequence;
28 using testing::StrictMock; 32 using testing::StrictMock;
29 using testing::WithArgs; 33 using testing::WithArgs;
30 34
31 namespace chromeos { 35 namespace chromeos {
32 namespace attestation { 36 namespace attestation {
33 37
34 namespace { 38 namespace {
35 39
40 constexpr base::TimeDelta kPreparednessTimeout =
41 base::TimeDelta::FromSeconds(7);
42
36 void DBusCallbackFalse(const BoolDBusMethodCallback& callback) { 43 void DBusCallbackFalse(const BoolDBusMethodCallback& callback) {
37 base::ThreadTaskRunnerHandle::Get()->PostTask( 44 base::ThreadTaskRunnerHandle::Get()->PostTask(
38 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); 45 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false));
39 } 46 }
40 47
41 void DBusCallbackTrue(const BoolDBusMethodCallback& callback) { 48 void DBusCallbackTrue(const BoolDBusMethodCallback& callback) {
42 base::ThreadTaskRunnerHandle::Get()->PostTask( 49 base::ThreadTaskRunnerHandle::Get()->PostTask(
43 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); 50 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true));
44 } 51 }
45 52
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 TEST_F(AttestationFlowTest, GetCertificate) { 86 TEST_F(AttestationFlowTest, GetCertificate) {
80 // Verify the order of calls in a sequence. 87 // Verify the order of calls in a sequence.
81 Sequence flow_order; 88 Sequence flow_order;
82 89
83 // Use DBusCallbackFalse so the full enrollment flow is triggered. 90 // Use DBusCallbackFalse so the full enrollment flow is triggered.
84 chromeos::MockCryptohomeClient client; 91 chromeos::MockCryptohomeClient client;
85 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 92 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
86 .InSequence(flow_order) 93 .InSequence(flow_order)
87 .WillRepeatedly(Invoke(DBusCallbackFalse)); 94 .WillRepeatedly(Invoke(DBusCallbackFalse));
88 95
96 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
97 .InSequence(flow_order)
98 .WillOnce(Invoke(DBusCallbackTrue));
99
89 // Use StrictMock when we want to verify invocation frequency. 100 // Use StrictMock when we want to verify invocation frequency.
90 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 101 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
91 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 102 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
103 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _))
104 .Times(1)
105 .InSequence(flow_order);
106
107 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
108 proxy->DeferToFake(true);
109 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
110 EXPECT_CALL(
111 *proxy,
112 SendEnrollRequest(
113 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, _))
114 .Times(1)
115 .InSequence(flow_order);
116
117 std::string fake_enroll_response =
118 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest;
119 fake_enroll_response += "_response";
120 EXPECT_CALL(async_caller,
121 AsyncTpmAttestationEnroll(_, fake_enroll_response, _))
122 .Times(1)
123 .InSequence(flow_order);
124
125 const AccountId account_id = AccountId::FromUserEmail("fake@test.com");
126 EXPECT_CALL(async_caller,
127 AsyncTpmAttestationCreateCertRequest(
128 _, PROFILE_ENTERPRISE_USER_CERTIFICATE,
129 cryptohome::Identification(account_id), "fake_origin", _))
130 .Times(1)
131 .InSequence(flow_order);
132
133 EXPECT_CALL(
134 *proxy,
135 SendCertificateRequest(
136 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest, _))
137 .Times(1)
138 .InSequence(flow_order);
139
140 std::string fake_cert_response =
141 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest;
142 fake_cert_response += "_response";
143 EXPECT_CALL(async_caller, AsyncTpmAttestationFinishCertRequest(
144 fake_cert_response, KEY_USER,
145 cryptohome::Identification(account_id),
146 kEnterpriseUserKey, _))
147 .Times(1)
148 .InSequence(flow_order);
149
150 StrictMock<MockObserver> observer;
151 EXPECT_CALL(
152 observer,
153 MockCertificateCallback(
154 true, cryptohome::MockAsyncMethodCaller::kFakeAttestationCert))
155 .Times(1)
156 .InSequence(flow_order);
157 AttestationFlow::CertificateCallback mock_callback = base::Bind(
158 &MockObserver::MockCertificateCallback, base::Unretained(&observer));
159
160 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
161 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
162 kPreparednessTimeout);
163 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, account_id,
164 "fake_origin", true, mock_callback);
165 Run();
166 }
167
168 TEST_F(AttestationFlowTest, GetCertificate_Attestation_Not_Prepared) {
169 // Verify the order of calls in a sequence.
170 Sequence flow_order;
171
172 // Use DBusCallbackFalse so the full enrollment flow is triggered.
173 chromeos::MockCryptohomeClient client;
174 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
175 .InSequence(flow_order)
176 .WillRepeatedly(Invoke(DBusCallbackFalse));
177
178 // It will take a bit for attestation to be prepared.
179 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
180 .InSequence(flow_order)
181 .WillOnce(Invoke(DBusCallbackFalse))
182 .WillOnce(Invoke(DBusCallbackTrue));
183
184 // Use StrictMock when we want to verify invocation frequency.
185 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
186 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
92 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _)) 187 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _))
93 .Times(1) 188 .Times(1)
94 .InSequence(flow_order); 189 .InSequence(flow_order);
95 190
96 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 191 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
97 proxy->DeferToFake(true); 192 proxy->DeferToFake(true);
98 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 193 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
99 EXPECT_CALL(*proxy, SendEnrollRequest( 194 EXPECT_CALL(*proxy, SendEnrollRequest(
100 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, 195 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest,
101 _)).Times(1) 196 _)).Times(1)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 StrictMock<MockObserver> observer; 230 StrictMock<MockObserver> observer;
136 EXPECT_CALL(observer, MockCertificateCallback( 231 EXPECT_CALL(observer, MockCertificateCallback(
137 true, 232 true,
138 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)) 233 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert))
139 .Times(1) 234 .Times(1)
140 .InSequence(flow_order); 235 .InSequence(flow_order);
141 AttestationFlow::CertificateCallback mock_callback = base::Bind( 236 AttestationFlow::CertificateCallback mock_callback = base::Bind(
142 &MockObserver::MockCertificateCallback, 237 &MockObserver::MockCertificateCallback,
143 base::Unretained(&observer)); 238 base::Unretained(&observer));
144 239
240 scoped_refptr<base::TestMockTimeTaskRunner> task_runner(
241 new base::TestMockTimeTaskRunner(base::Time::Now(),
242 base::TimeTicks::Now()));
243 std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock());
244 message_loop_.SetTaskRunner(task_runner);
245
145 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 246 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
146 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 247 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
248 kPreparednessTimeout);
249 flow.SetRetryTimerForTest(
250 base::MakeUnique<base::OneShotTimer>(tick_clock.get()));
147 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, account_id, 251 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, account_id,
148 "fake_origin", true, mock_callback); 252 "fake_origin", true, mock_callback);
253
254 task_runner->FastForwardBy(kPreparednessTimeout);
149 Run(); 255 Run();
150 } 256 }
151 257
258 TEST_F(AttestationFlowTest, GetCertificate_Attestation_Never_Prepared) {
259 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
260 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE);
261
262 chromeos::MockCryptohomeClient client;
263 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
264 .WillRepeatedly(Invoke(DBusCallbackFalse));
265
266 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
267 .WillRepeatedly(Invoke(DBusCallbackFalse));
268
269 // We're not expecting any server calls in this case; StrictMock will verify.
270 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
271 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
272
273 StrictMock<MockObserver> observer;
274 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1);
275 AttestationFlow::CertificateCallback mock_callback = base::Bind(
276 &MockObserver::MockCertificateCallback, base::Unretained(&observer));
277
278 scoped_refptr<base::TestMockTimeTaskRunner> task_runner(
279 new base::TestMockTimeTaskRunner(base::Time::Now(),
280 base::TimeTicks::Now()));
281 std::unique_ptr<base::TickClock> tick_clock(task_runner->GetMockTickClock());
282 message_loop_.SetTaskRunner(task_runner);
283
284 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
285 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
286 kPreparednessTimeout);
287 flow.SetRetryTimerForTest(
288 base::MakeUnique<base::OneShotTimer>(tick_clock.get()));
289 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(),
290 "fake_origin", true, mock_callback);
291
292 task_runner->FastForwardBy(kPreparednessTimeout);
293 Run();
294 }
295
152 TEST_F(AttestationFlowTest, GetCertificate_NoEK) { 296 TEST_F(AttestationFlowTest, GetCertificate_NoEK) {
153 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 297 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
154 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE); 298 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE);
155 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _)) 299 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _))
156 .Times(1); 300 .Times(1);
157 301
158 chromeos::MockCryptohomeClient client; 302 chromeos::MockCryptohomeClient client;
159 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 303 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
160 .WillRepeatedly(Invoke(DBusCallbackFalse)); 304 .WillRepeatedly(Invoke(DBusCallbackFalse));
161 305
306 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
307 .WillOnce(Invoke(DBusCallbackTrue));
308
162 // We're not expecting any server calls in this case; StrictMock will verify. 309 // We're not expecting any server calls in this case; StrictMock will verify.
163 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 310 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
164 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 311 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
165 312
166 StrictMock<MockObserver> observer; 313 StrictMock<MockObserver> observer;
167 EXPECT_CALL(observer, MockCertificateCallback(false, "")) 314 EXPECT_CALL(observer, MockCertificateCallback(false, ""))
168 .Times(1); 315 .Times(1);
169 AttestationFlow::CertificateCallback mock_callback = base::Bind( 316 AttestationFlow::CertificateCallback mock_callback = base::Bind(
170 &MockObserver::MockCertificateCallback, 317 &MockObserver::MockCertificateCallback,
171 base::Unretained(&observer)); 318 base::Unretained(&observer));
172 319
173 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 320 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
174 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 321 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
322 kPreparednessTimeout);
175 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 323 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
176 true, mock_callback); 324 true, mock_callback);
177 Run(); 325 Run();
178 } 326 }
179 327
180 TEST_F(AttestationFlowTest, GetCertificate_EKRejected) { 328 TEST_F(AttestationFlowTest, GetCertificate_EKRejected) {
181 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 329 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
182 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 330 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
183 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _)) 331 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _))
184 .Times(1); 332 .Times(1);
185 333
186 chromeos::MockCryptohomeClient client; 334 chromeos::MockCryptohomeClient client;
187 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 335 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
188 .WillRepeatedly(Invoke(DBusCallbackFalse)); 336 .WillRepeatedly(Invoke(DBusCallbackFalse));
189 337
338 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
339 .WillOnce(Invoke(DBusCallbackTrue));
340
190 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 341 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
191 proxy->DeferToFake(false); 342 proxy->DeferToFake(false);
192 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 343 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
193 EXPECT_CALL(*proxy, SendEnrollRequest( 344 EXPECT_CALL(*proxy, SendEnrollRequest(
194 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, 345 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest,
195 _)).Times(1); 346 _)).Times(1);
196 347
197 StrictMock<MockObserver> observer; 348 StrictMock<MockObserver> observer;
198 EXPECT_CALL(observer, MockCertificateCallback(false, "")) 349 EXPECT_CALL(observer, MockCertificateCallback(false, ""))
199 .Times(1); 350 .Times(1);
200 AttestationFlow::CertificateCallback mock_callback = base::Bind( 351 AttestationFlow::CertificateCallback mock_callback = base::Bind(
201 &MockObserver::MockCertificateCallback, 352 &MockObserver::MockCertificateCallback,
202 base::Unretained(&observer)); 353 base::Unretained(&observer));
203 354
204 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 355 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
205 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 356 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
357 kPreparednessTimeout);
206 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 358 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
207 true, mock_callback); 359 true, mock_callback);
208 Run(); 360 Run();
209 } 361 }
210 362
211 TEST_F(AttestationFlowTest, GetCertificate_FailEnroll) { 363 TEST_F(AttestationFlowTest, GetCertificate_FailEnroll) {
212 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 364 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
213 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 365 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
214 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _)) 366 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_, _))
215 .Times(1); 367 .Times(1);
216 std::string fake_enroll_response = 368 std::string fake_enroll_response =
217 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest; 369 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest;
218 fake_enroll_response += "_response"; 370 fake_enroll_response += "_response";
219 EXPECT_CALL(async_caller, 371 EXPECT_CALL(async_caller,
220 AsyncTpmAttestationEnroll(_, fake_enroll_response, _)) 372 AsyncTpmAttestationEnroll(_, fake_enroll_response, _))
221 .WillOnce(WithArgs<2>(Invoke(AsyncCallbackFalse))); 373 .WillOnce(WithArgs<2>(Invoke(AsyncCallbackFalse)));
222 374
223 chromeos::MockCryptohomeClient client; 375 chromeos::MockCryptohomeClient client;
224 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 376 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
225 .WillRepeatedly(Invoke(DBusCallbackFalse)); 377 .WillRepeatedly(Invoke(DBusCallbackFalse));
226 378
379 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
380 .WillOnce(Invoke(DBusCallbackTrue));
381
227 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 382 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
228 proxy->DeferToFake(true); 383 proxy->DeferToFake(true);
229 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 384 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
230 EXPECT_CALL(*proxy, SendEnrollRequest( 385 EXPECT_CALL(*proxy, SendEnrollRequest(
231 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, 386 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest,
232 _)).Times(1); 387 _)).Times(1);
233 388
234 StrictMock<MockObserver> observer; 389 StrictMock<MockObserver> observer;
235 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); 390 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1);
236 AttestationFlow::CertificateCallback mock_callback = base::Bind( 391 AttestationFlow::CertificateCallback mock_callback = base::Bind(
237 &MockObserver::MockCertificateCallback, 392 &MockObserver::MockCertificateCallback,
238 base::Unretained(&observer)); 393 base::Unretained(&observer));
239 394
240 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 395 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
241 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 396 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
397 kPreparednessTimeout);
242 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 398 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
243 true, mock_callback); 399 true, mock_callback);
244 Run(); 400 Run();
245 } 401 }
246 402
247 TEST_F(AttestationFlowTest, GetMachineCertificateAlreadyEnrolled) { 403 TEST_F(AttestationFlowTest, GetMachineCertificateAlreadyEnrolled) {
248 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 404 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
249 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 405 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
250 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest( 406 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(
251 _, PROFILE_ENTERPRISE_MACHINE_CERTIFICATE, 407 _, PROFILE_ENTERPRISE_MACHINE_CERTIFICATE,
(...skipping 21 matching lines...) Expand all
273 429
274 StrictMock<MockObserver> observer; 430 StrictMock<MockObserver> observer;
275 EXPECT_CALL(observer, MockCertificateCallback( 431 EXPECT_CALL(observer, MockCertificateCallback(
276 true, 432 true,
277 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)).Times(1); 433 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)).Times(1);
278 AttestationFlow::CertificateCallback mock_callback = base::Bind( 434 AttestationFlow::CertificateCallback mock_callback = base::Bind(
279 &MockObserver::MockCertificateCallback, 435 &MockObserver::MockCertificateCallback,
280 base::Unretained(&observer)); 436 base::Unretained(&observer));
281 437
282 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 438 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
283 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 439 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
440 kPreparednessTimeout);
284 flow.GetCertificate(PROFILE_ENTERPRISE_MACHINE_CERTIFICATE, EmptyAccountId(), 441 flow.GetCertificate(PROFILE_ENTERPRISE_MACHINE_CERTIFICATE, EmptyAccountId(),
285 "", true, mock_callback); 442 "", true, mock_callback);
286 Run(); 443 Run();
287 } 444 }
288 445
289 TEST_F(AttestationFlowTest, GetCertificate_FailCreateCertRequest) { 446 TEST_F(AttestationFlowTest, GetCertificate_FailCreateCertRequest) {
290 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 447 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
291 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE); 448 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE);
292 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest( 449 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(
293 _, PROFILE_ENTERPRISE_USER_CERTIFICATE, 450 _, PROFILE_ENTERPRISE_USER_CERTIFICATE,
294 cryptohome::Identification(), "", _)) 451 cryptohome::Identification(), "", _))
295 .Times(1); 452 .Times(1);
296 453
297 chromeos::MockCryptohomeClient client; 454 chromeos::MockCryptohomeClient client;
298 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 455 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
299 .WillRepeatedly(Invoke(DBusCallbackTrue)); 456 .WillRepeatedly(Invoke(DBusCallbackTrue));
300 457
301 // We're not expecting any server calls in this case; StrictMock will verify. 458 // We're not expecting any server calls in this case; StrictMock will verify.
302 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 459 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
303 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 460 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
304 461
305 StrictMock<MockObserver> observer; 462 StrictMock<MockObserver> observer;
306 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); 463 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1);
307 AttestationFlow::CertificateCallback mock_callback = base::Bind( 464 AttestationFlow::CertificateCallback mock_callback = base::Bind(
308 &MockObserver::MockCertificateCallback, 465 &MockObserver::MockCertificateCallback,
309 base::Unretained(&observer)); 466 base::Unretained(&observer));
310 467
311 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 468 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
312 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 469 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
470 kPreparednessTimeout);
313 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 471 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
314 true, mock_callback); 472 true, mock_callback);
315 Run(); 473 Run();
316 } 474 }
317 475
318 TEST_F(AttestationFlowTest, GetCertificate_CertRequestRejected) { 476 TEST_F(AttestationFlowTest, GetCertificate_CertRequestRejected) {
319 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 477 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
320 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 478 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
321 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest( 479 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(
322 _, PROFILE_ENTERPRISE_USER_CERTIFICATE, 480 _, PROFILE_ENTERPRISE_USER_CERTIFICATE,
(...skipping 11 matching lines...) Expand all
334 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest, 492 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest,
335 _)).Times(1); 493 _)).Times(1);
336 494
337 StrictMock<MockObserver> observer; 495 StrictMock<MockObserver> observer;
338 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); 496 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1);
339 AttestationFlow::CertificateCallback mock_callback = base::Bind( 497 AttestationFlow::CertificateCallback mock_callback = base::Bind(
340 &MockObserver::MockCertificateCallback, 498 &MockObserver::MockCertificateCallback,
341 base::Unretained(&observer)); 499 base::Unretained(&observer));
342 500
343 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 501 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
344 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 502 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
503 kPreparednessTimeout);
345 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 504 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
346 true, mock_callback); 505 true, mock_callback);
347 Run(); 506 Run();
348 } 507 }
349 508
350 TEST_F(AttestationFlowTest, GetCertificate_FailIsEnrolled) { 509 TEST_F(AttestationFlowTest, GetCertificate_FailIsEnrolled) {
351 // We're not expecting any async calls in this case; StrictMock will verify. 510 // We're not expecting any async calls in this case; StrictMock will verify.
352 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 511 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
353 512
354 chromeos::MockCryptohomeClient client; 513 chromeos::MockCryptohomeClient client;
355 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 514 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
356 .WillRepeatedly(Invoke(DBusCallbackFail)); 515 .WillRepeatedly(Invoke(DBusCallbackFail));
357 516
358 // We're not expecting any server calls in this case; StrictMock will verify. 517 // We're not expecting any server calls in this case; StrictMock will verify.
359 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 518 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
360 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 519 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
361 520
362 StrictMock<MockObserver> observer; 521 StrictMock<MockObserver> observer;
363 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); 522 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1);
364 AttestationFlow::CertificateCallback mock_callback = base::Bind( 523 AttestationFlow::CertificateCallback mock_callback = base::Bind(
365 &MockObserver::MockCertificateCallback, 524 &MockObserver::MockCertificateCallback,
366 base::Unretained(&observer)); 525 base::Unretained(&observer));
367 526
368 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 527 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
369 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 528 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
529 kPreparednessTimeout);
370 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 530 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
371 true, mock_callback); 531 true, mock_callback);
372 Run(); 532 Run();
373 } 533 }
374 534
375 TEST_F(AttestationFlowTest, GetCertificate_CheckExisting) { 535 TEST_F(AttestationFlowTest, GetCertificate_CheckExisting) {
376 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 536 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
377 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 537 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
378 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest( 538 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(
379 _, PROFILE_ENTERPRISE_USER_CERTIFICATE, 539 _, PROFILE_ENTERPRISE_USER_CERTIFICATE,
(...skipping 25 matching lines...) Expand all
405 565
406 StrictMock<MockObserver> observer; 566 StrictMock<MockObserver> observer;
407 EXPECT_CALL(observer, MockCertificateCallback( 567 EXPECT_CALL(observer, MockCertificateCallback(
408 true, 568 true,
409 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)).Times(1); 569 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)).Times(1);
410 AttestationFlow::CertificateCallback mock_callback = base::Bind( 570 AttestationFlow::CertificateCallback mock_callback = base::Bind(
411 &MockObserver::MockCertificateCallback, 571 &MockObserver::MockCertificateCallback,
412 base::Unretained(&observer)); 572 base::Unretained(&observer));
413 573
414 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 574 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
415 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 575 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
576 kPreparednessTimeout);
416 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 577 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
417 false, mock_callback); 578 false, mock_callback);
418 Run(); 579 Run();
419 } 580 }
420 581
421 TEST_F(AttestationFlowTest, GetCertificate_AlreadyExists) { 582 TEST_F(AttestationFlowTest, GetCertificate_AlreadyExists) {
422 // We're not expecting any async calls in this case; StrictMock will verify. 583 // We're not expecting any async calls in this case; StrictMock will verify.
423 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; 584 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller;
424 585
425 chromeos::MockCryptohomeClient client; 586 chromeos::MockCryptohomeClient client;
(...skipping 12 matching lines...) Expand all
438 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>()); 599 std::unique_ptr<MockServerProxy> proxy(new StrictMock<MockServerProxy>());
439 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault()); 600 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(DoDefault());
440 601
441 StrictMock<MockObserver> observer; 602 StrictMock<MockObserver> observer;
442 EXPECT_CALL(observer, MockCertificateCallback(true, "fake_cert")).Times(1); 603 EXPECT_CALL(observer, MockCertificateCallback(true, "fake_cert")).Times(1);
443 AttestationFlow::CertificateCallback mock_callback = base::Bind( 604 AttestationFlow::CertificateCallback mock_callback = base::Bind(
444 &MockObserver::MockCertificateCallback, 605 &MockObserver::MockCertificateCallback,
445 base::Unretained(&observer)); 606 base::Unretained(&observer));
446 607
447 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 608 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
448 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 609 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
610 kPreparednessTimeout);
449 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 611 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
450 false, mock_callback); 612 false, mock_callback);
451 Run(); 613 Run();
452 } 614 }
453 615
454 TEST_F(AttestationFlowTest, AlternatePCA) { 616 TEST_F(AttestationFlowTest, AlternatePCA) {
455 // Strategy: Create a ServerProxy mock which reports ALTERNATE_PCA and check 617 // Strategy: Create a ServerProxy mock which reports ALTERNATE_PCA and check
456 // that all calls to the AsyncMethodCaller reflect this PCA type. 618 // that all calls to the AsyncMethodCaller reflect this PCA type.
457 std::unique_ptr<MockServerProxy> proxy(new NiceMock<MockServerProxy>()); 619 std::unique_ptr<MockServerProxy> proxy(new NiceMock<MockServerProxy>());
458 proxy->DeferToFake(true); 620 proxy->DeferToFake(true);
459 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(Return(ALTERNATE_PCA)); 621 EXPECT_CALL(*proxy, GetType()).WillRepeatedly(Return(ALTERNATE_PCA));
460 622
461 chromeos::MockCryptohomeClient client; 623 chromeos::MockCryptohomeClient client;
462 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) 624 EXPECT_CALL(client, TpmAttestationIsEnrolled(_))
463 .WillRepeatedly(Invoke(DBusCallbackFalse)); 625 .WillRepeatedly(Invoke(DBusCallbackFalse));
464 626
627 EXPECT_CALL(client, TpmAttestationIsPrepared(_))
628 .WillRepeatedly(Invoke(DBusCallbackTrue));
629
465 NiceMock<cryptohome::MockAsyncMethodCaller> async_caller; 630 NiceMock<cryptohome::MockAsyncMethodCaller> async_caller;
466 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); 631 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE);
467 EXPECT_CALL(async_caller, 632 EXPECT_CALL(async_caller,
468 AsyncTpmAttestationCreateEnrollRequest(ALTERNATE_PCA, _)) 633 AsyncTpmAttestationCreateEnrollRequest(ALTERNATE_PCA, _))
469 .Times(AtLeast(1)); 634 .Times(AtLeast(1));
470 EXPECT_CALL(async_caller, 635 EXPECT_CALL(async_caller,
471 AsyncTpmAttestationEnroll(ALTERNATE_PCA, _, _)) 636 AsyncTpmAttestationEnroll(ALTERNATE_PCA, _, _))
472 .Times(AtLeast(1)); 637 .Times(AtLeast(1));
473 EXPECT_CALL(async_caller, 638 EXPECT_CALL(async_caller,
474 AsyncTpmAttestationCreateCertRequest(ALTERNATE_PCA, _, _, _, _)) 639 AsyncTpmAttestationCreateCertRequest(ALTERNATE_PCA, _, _, _, _))
475 .Times(AtLeast(1)); 640 .Times(AtLeast(1));
476 641
477 NiceMock<MockObserver> observer; 642 NiceMock<MockObserver> observer;
478 AttestationFlow::CertificateCallback mock_callback = base::Bind( 643 AttestationFlow::CertificateCallback mock_callback = base::Bind(
479 &MockObserver::MockCertificateCallback, 644 &MockObserver::MockCertificateCallback,
480 base::Unretained(&observer)); 645 base::Unretained(&observer));
481 646
482 std::unique_ptr<ServerProxy> proxy_interface(proxy.release()); 647 std::unique_ptr<ServerProxy> proxy_interface(proxy.release());
483 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface)); 648 AttestationFlow flow(&async_caller, &client, std::move(proxy_interface),
649 kPreparednessTimeout);
484 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "", 650 flow.GetCertificate(PROFILE_ENTERPRISE_USER_CERTIFICATE, EmptyAccountId(), "",
485 true, mock_callback); 651 true, mock_callback);
486 Run(); 652 Run();
487 } 653 }
488 654
489 } // namespace attestation 655 } // namespace attestation
490 } // namespace chromeos 656 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698