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

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

Issue 11932004: Implemented attestation message flow for Chrome OS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 months 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 | Annotate | Revision Log
OLDNEW
(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.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698