OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/bind.h" | |
6 #include "base/message_loop.h" | |
7 #include "chromeos/attestation/mock_attestation.h" | |
8 #include "chromeos/cryptohome/mock_async_method_caller.h" | |
9 #include "chromeos/dbus/mock_cryptohome_client.h" | |
10 #include "testing/gmock/include/gmock/gmock.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 | |
Mattias Nissler (ping if slow)
2013/01/16 10:39:26
remove extra blank line
dkrahn
2013/01/17 23:36:24
Done.
| |
14 using testing::_; | |
15 using testing::Invoke; | |
16 using testing::StrictMock; | |
17 using testing::WithArgs; | |
18 | |
19 namespace chromeos { | |
20 namespace attestation { | |
21 | |
22 namespace { | |
23 | |
24 void DbusCallbackFalse(const BoolDBusMethodCallback& callback) { | |
Mattias Nissler (ping if slow)
2013/01/16 10:39:26
nit: You spell Dbus with capital B elsewhere (i.e.
dkrahn
2013/01/17 23:36:24
Done.
| |
25 MessageLoop::current()->PostTask( | |
26 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, false)); | |
27 } | |
28 | |
29 void DbusCallbackTrue(const BoolDBusMethodCallback& callback) { | |
30 MessageLoop::current()->PostTask( | |
31 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_SUCCESS, true)); | |
32 } | |
33 | |
34 void DbusCallbackFail(const BoolDBusMethodCallback& callback) { | |
35 MessageLoop::current()->PostTask( | |
36 FROM_HERE, base::Bind(callback, DBUS_METHOD_CALL_FAILURE, false)); | |
37 } | |
38 | |
39 void AsyncCallbackFalse(cryptohome::AsyncMethodCaller::Callback callback) { | |
40 callback.Run(false, cryptohome::MOUNT_ERROR_NONE); | |
41 } | |
42 | |
43 } // namespace | |
44 | |
45 TEST(AttestationTest, GetCertificate) { | |
46 // Use StrictMock when it is important that calls get triggered exactly once. | |
47 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
48 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
49 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_)) | |
50 .Times(1); | |
51 std::string fake_enroll_response = | |
52 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest; | |
53 fake_enroll_response += "_response"; | |
54 EXPECT_CALL(async_caller, AsyncTpmAttestationEnroll(fake_enroll_response, _)) | |
55 .Times(1); | |
56 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(false, _)) | |
57 .Times(1); | |
58 std::string fake_cert_response = | |
59 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest; | |
60 fake_cert_response += "_response"; | |
61 EXPECT_CALL(async_caller, | |
62 AsyncTpmAttestationFinishCertRequest(fake_cert_response, _)) | |
63 .Times(1); | |
64 | |
65 chromeos::MockCryptohomeClient client; | |
66 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
67 .WillRepeatedly(Invoke(DbusCallbackFalse)); | |
68 | |
69 StrictMock<MockServerProxy> proxy; | |
70 proxy.DeferToFake(true); | |
71 EXPECT_CALL(proxy, SendEnrollRequest( | |
72 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, | |
73 _)).Times(1); | |
74 EXPECT_CALL(proxy, SendCertificateRequest( | |
75 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest, | |
76 _)).Times(1); | |
77 | |
78 StrictMock<MockObserver> observer; | |
79 EXPECT_CALL(observer, MockCertificateCallback( | |
80 true, | |
81 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)).Times(1); | |
82 Attestation::CertificateCallback mock_callback = base::Bind( | |
83 &MockObserver::MockCertificateCallback, | |
84 base::Unretained(&observer)); | |
85 | |
86 MessageLoop message_loop; | |
87 Attestation attestation(&async_caller, &client, &proxy); | |
88 attestation.GetCertificate("test", mock_callback); | |
89 message_loop.RunUntilIdle(); | |
90 } | |
91 | |
92 TEST(AttestationTest, GetCertificate_NoEK) { | |
93 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
94 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE); | |
95 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_)) | |
96 .Times(1); | |
97 | |
98 chromeos::MockCryptohomeClient client; | |
99 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
100 .WillRepeatedly(Invoke(DbusCallbackFalse)); | |
101 | |
102 // We're not expecting any server calls in this case. | |
103 StrictMock<MockServerProxy> proxy; | |
104 | |
105 StrictMock<MockObserver> observer; | |
106 EXPECT_CALL(observer, MockCertificateCallback(false, "")) | |
107 .Times(1); | |
108 Attestation::CertificateCallback mock_callback = base::Bind( | |
109 &MockObserver::MockCertificateCallback, | |
110 base::Unretained(&observer)); | |
111 | |
112 MessageLoop message_loop; | |
113 Attestation attestation(&async_caller, &client, &proxy); | |
114 attestation.GetCertificate("test", mock_callback); | |
115 message_loop.RunUntilIdle(); | |
116 } | |
117 | |
118 TEST(AttestationTest, GetCertificate_EKRejected) { | |
119 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
120 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
121 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_)) | |
122 .Times(1); | |
123 | |
124 chromeos::MockCryptohomeClient client; | |
125 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
126 .WillRepeatedly(Invoke(DbusCallbackFalse)); | |
127 | |
128 StrictMock<MockServerProxy> proxy; | |
129 proxy.DeferToFake(false); | |
130 EXPECT_CALL(proxy, SendEnrollRequest( | |
131 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, | |
132 _)).Times(1); | |
133 | |
134 StrictMock<MockObserver> observer; | |
135 EXPECT_CALL(observer, MockCertificateCallback(false, "")) | |
136 .Times(1); | |
137 Attestation::CertificateCallback mock_callback = base::Bind( | |
138 &MockObserver::MockCertificateCallback, | |
139 base::Unretained(&observer)); | |
140 | |
141 MessageLoop message_loop; | |
142 Attestation attestation(&async_caller, &client, &proxy); | |
143 attestation.GetCertificate("test", mock_callback); | |
144 message_loop.RunUntilIdle(); | |
145 } | |
146 | |
147 TEST(AttestationTest, GetCertificate_FailEnroll) { | |
148 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
149 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
150 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateEnrollRequest(_)) | |
151 .Times(1); | |
152 std::string fake_enroll_response = | |
153 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest; | |
154 fake_enroll_response += "_response"; | |
155 EXPECT_CALL(async_caller, AsyncTpmAttestationEnroll(fake_enroll_response, _)) | |
156 .WillOnce(WithArgs<1>(Invoke(AsyncCallbackFalse))); | |
157 | |
158 chromeos::MockCryptohomeClient client; | |
159 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
160 .WillRepeatedly(Invoke(DbusCallbackFalse)); | |
161 | |
162 StrictMock<MockServerProxy> proxy; | |
163 proxy.DeferToFake(true); | |
164 EXPECT_CALL(proxy, SendEnrollRequest( | |
165 cryptohome::MockAsyncMethodCaller::kFakeAttestationEnrollRequest, | |
166 _)).Times(1); | |
167 | |
168 StrictMock<MockObserver> observer; | |
169 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); | |
170 Attestation::CertificateCallback mock_callback = base::Bind( | |
171 &MockObserver::MockCertificateCallback, | |
172 base::Unretained(&observer)); | |
173 | |
174 MessageLoop message_loop; | |
175 Attestation attestation(&async_caller, &client, &proxy); | |
176 attestation.GetCertificate("test", mock_callback); | |
177 message_loop.RunUntilIdle(); | |
178 } | |
179 | |
180 TEST(AttestationTest, GetOwnerCertificateAlreadyEnrolled) { | |
181 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
182 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
183 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(true, _)) | |
184 .Times(1); | |
185 std::string fake_cert_response = | |
186 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest; | |
187 fake_cert_response += "_response"; | |
188 EXPECT_CALL(async_caller, | |
189 AsyncTpmAttestationFinishCertRequest(fake_cert_response, _)) | |
190 .Times(1); | |
191 | |
192 chromeos::MockCryptohomeClient client; | |
193 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
194 .WillRepeatedly(Invoke(DbusCallbackTrue)); | |
195 | |
196 StrictMock<MockServerProxy> proxy; | |
197 proxy.DeferToFake(true); | |
198 EXPECT_CALL(proxy, SendCertificateRequest( | |
199 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest, | |
200 _)).Times(1); | |
201 | |
202 StrictMock<MockObserver> observer; | |
203 EXPECT_CALL(observer, MockCertificateCallback( | |
204 true, | |
205 cryptohome::MockAsyncMethodCaller::kFakeAttestationCert)).Times(1); | |
206 Attestation::CertificateCallback mock_callback = base::Bind( | |
207 &MockObserver::MockCertificateCallback, | |
208 base::Unretained(&observer)); | |
209 | |
210 MessageLoop message_loop; | |
211 Attestation attestation(&async_caller, &client, &proxy); | |
212 attestation.GetCertificate("attest-ent-machine", mock_callback); | |
213 message_loop.RunUntilIdle(); | |
214 } | |
215 | |
216 TEST(AttestationTest, GetCertificate_FailCreateCertRequest) { | |
217 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
218 async_caller.SetUp(false, cryptohome::MOUNT_ERROR_NONE); | |
219 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(false, _)) | |
220 .Times(1); | |
221 | |
222 chromeos::MockCryptohomeClient client; | |
223 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
224 .WillRepeatedly(Invoke(DbusCallbackTrue)); | |
225 | |
226 // We're not expecting any server calls in this case. | |
227 StrictMock<MockServerProxy> proxy; | |
228 | |
229 StrictMock<MockObserver> observer; | |
230 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); | |
231 Attestation::CertificateCallback mock_callback = base::Bind( | |
232 &MockObserver::MockCertificateCallback, | |
233 base::Unretained(&observer)); | |
234 | |
235 MessageLoop message_loop; | |
236 Attestation attestation(&async_caller, &client, &proxy); | |
237 attestation.GetCertificate("test", mock_callback); | |
238 message_loop.RunUntilIdle(); | |
239 } | |
240 | |
241 TEST(AttestationTest, GetCertificate_CertRequestRejected) { | |
242 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
243 async_caller.SetUp(true, cryptohome::MOUNT_ERROR_NONE); | |
244 EXPECT_CALL(async_caller, AsyncTpmAttestationCreateCertRequest(false, _)) | |
245 .Times(1); | |
246 | |
247 chromeos::MockCryptohomeClient client; | |
248 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
249 .WillRepeatedly(Invoke(DbusCallbackTrue)); | |
250 | |
251 StrictMock<MockServerProxy> proxy; | |
252 proxy.DeferToFake(false); | |
253 EXPECT_CALL(proxy, SendCertificateRequest( | |
254 cryptohome::MockAsyncMethodCaller::kFakeAttestationCertRequest, | |
255 _)).Times(1); | |
256 | |
257 StrictMock<MockObserver> observer; | |
258 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); | |
259 Attestation::CertificateCallback mock_callback = base::Bind( | |
260 &MockObserver::MockCertificateCallback, | |
261 base::Unretained(&observer)); | |
262 | |
263 MessageLoop message_loop; | |
264 Attestation attestation(&async_caller, &client, &proxy); | |
265 attestation.GetCertificate("test", mock_callback); | |
266 message_loop.RunUntilIdle(); | |
267 } | |
268 | |
269 TEST(AttestationTest, GetCertificate_FailIsEnrolled) { | |
270 // Not expecting any calls in this case. | |
271 StrictMock<cryptohome::MockAsyncMethodCaller> async_caller; | |
272 | |
273 chromeos::MockCryptohomeClient client; | |
274 EXPECT_CALL(client, TpmAttestationIsEnrolled(_)) | |
275 .WillRepeatedly(Invoke(DbusCallbackFail)); | |
276 | |
277 // Not expecting any calls in this case. | |
278 StrictMock<MockServerProxy> proxy; | |
279 | |
280 StrictMock<MockObserver> observer; | |
281 EXPECT_CALL(observer, MockCertificateCallback(false, "")).Times(1); | |
282 Attestation::CertificateCallback mock_callback = base::Bind( | |
283 &MockObserver::MockCertificateCallback, | |
284 base::Unretained(&observer)); | |
285 | |
286 MessageLoop message_loop; | |
287 Attestation attestation(&async_caller, &client, &proxy); | |
288 attestation.GetCertificate("test", mock_callback); | |
289 message_loop.RunUntilIdle(); | |
290 } | |
291 | |
292 } // namespace chromeos | |
293 } // namespace attestation | |
Mattias Nissler (ping if slow)
2013/01/16 10:39:26
swap last two lines
dkrahn
2013/01/17 23:36:24
Done.
| |
OLD | NEW |