• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include <base/at_exit.h>
18 #include <base/run_loop.h>
19 #include <gmock/gmock.h>
20 #include <gtest/gtest.h>
21 
22 #include "tpm_manager/server/mock_local_data_store.h"
23 #include "tpm_manager/server/mock_tpm_initializer.h"
24 #include "tpm_manager/server/mock_tpm_nvram.h"
25 #include "tpm_manager/server/mock_tpm_status.h"
26 #include "tpm_manager/server/tpm_manager_service.h"
27 
28 using testing::_;
29 using testing::AtLeast;
30 using testing::Invoke;
31 using testing::NiceMock;
32 using testing::Return;
33 using testing::SaveArg;
34 using testing::SetArgPointee;
35 
36 namespace {
37 
38 const char kOwnerPassword[] = "owner";
39 const char kOwnerDependency[] = "owner_dependency";
40 const char kOtherDependency[] = "other_dependency";
41 
42 base::AtExitManager dummy;
43 
44 }  // namespace
45 
46 namespace tpm_manager {
47 
48 // A test fixture that takes care of message loop management and configuring a
49 // TpmManagerService instance with mock dependencies.
50 class TpmManagerServiceTest : public testing::Test {
51  public:
52   ~TpmManagerServiceTest() override = default;
SetUp()53   void SetUp() override {
54     service_.reset(new TpmManagerService(
55         true /*wait_for_ownership*/, &mock_local_data_store_, &mock_tpm_status_,
56         &mock_tpm_initializer_, &mock_tpm_nvram_));
57     SetupService();
58   }
59 
60  protected:
Run()61   void Run() { run_loop_.Run(); }
62 
RunServiceWorkerAndQuit()63   void RunServiceWorkerAndQuit() {
64     // Run out the service worker loop by posting a new command and waiting for
65     // the response.
66     auto callback = [](decltype(this) test, const GetTpmStatusReply& reply) {
67       test->Quit();
68     };
69     GetTpmStatusRequest request;
70     service_->GetTpmStatus(request,
71                            base::Bind(callback, base::Unretained(this)));
72     Run();
73   }
74 
Quit()75   void Quit() { run_loop_.Quit(); }
76 
SetupService()77   void SetupService() { CHECK(service_->Initialize()); }
78 
79   NiceMock<MockLocalDataStore> mock_local_data_store_;
80   NiceMock<MockTpmInitializer> mock_tpm_initializer_;
81   NiceMock<MockTpmNvram> mock_tpm_nvram_;
82   NiceMock<MockTpmStatus> mock_tpm_status_;
83   std::unique_ptr<TpmManagerService> service_;
84 
85  private:
86   base::MessageLoop message_loop_;
87   base::RunLoop run_loop_;
88 };
89 
90 // Tests must call SetupService().
91 class TpmManagerServiceTest_NoWaitForOwnership : public TpmManagerServiceTest {
92  public:
93   ~TpmManagerServiceTest_NoWaitForOwnership() override = default;
SetUp()94   void SetUp() override {
95     service_.reset(new TpmManagerService(
96         false /*wait_for_ownership*/, &mock_local_data_store_,
97         &mock_tpm_status_, &mock_tpm_initializer_, &mock_tpm_nvram_));
98   }
99 };
100 
TEST_F(TpmManagerServiceTest_NoWaitForOwnership,AutoInitialize)101 TEST_F(TpmManagerServiceTest_NoWaitForOwnership, AutoInitialize) {
102   // Make sure InitializeTpm doesn't get multiple calls.
103   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm()).Times(1);
104   SetupService();
105   RunServiceWorkerAndQuit();
106 }
107 
TEST_F(TpmManagerServiceTest_NoWaitForOwnership,AutoInitializeNoTpm)108 TEST_F(TpmManagerServiceTest_NoWaitForOwnership, AutoInitializeNoTpm) {
109   EXPECT_CALL(mock_tpm_status_, IsTpmEnabled()).WillRepeatedly(Return(false));
110   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm()).Times(0);
111   SetupService();
112   RunServiceWorkerAndQuit();
113 }
114 
TEST_F(TpmManagerServiceTest_NoWaitForOwnership,AutoInitializeFailure)115 TEST_F(TpmManagerServiceTest_NoWaitForOwnership, AutoInitializeFailure) {
116   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm())
117       .WillRepeatedly(Return(false));
118   SetupService();
119   RunServiceWorkerAndQuit();
120 }
121 
TEST_F(TpmManagerServiceTest_NoWaitForOwnership,TakeOwnershipAfterAutoInitialize)122 TEST_F(TpmManagerServiceTest_NoWaitForOwnership,
123        TakeOwnershipAfterAutoInitialize) {
124   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm()).Times(AtLeast(2));
125   SetupService();
126   auto callback = [](decltype(this) test, const TakeOwnershipReply& reply) {
127     EXPECT_EQ(STATUS_SUCCESS, reply.status());
128     test->Quit();
129   };
130   TakeOwnershipRequest request;
131   service_->TakeOwnership(request, base::Bind(callback, base::Unretained(this)));
132   Run();
133 }
134 
TEST_F(TpmManagerServiceTest,NoAutoInitialize)135 TEST_F(TpmManagerServiceTest, NoAutoInitialize) {
136   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm()).Times(0);
137   RunServiceWorkerAndQuit();
138 }
139 
TEST_F(TpmManagerServiceTest,GetTpmStatusSuccess)140 TEST_F(TpmManagerServiceTest, GetTpmStatusSuccess) {
141   EXPECT_CALL(mock_tpm_status_, GetDictionaryAttackInfo(_, _, _, _))
142       .WillRepeatedly(Invoke([](int* counter, int* threshold, bool* lockout,
143                                 int* seconds_remaining) {
144         *counter = 5;
145         *threshold = 6;
146         *lockout = true;
147         *seconds_remaining = 7;
148         return true;
149       }));
150   LocalData local_data;
151   local_data.set_owner_password(kOwnerPassword);
152   EXPECT_CALL(mock_local_data_store_, Read(_))
153       .WillRepeatedly(DoAll(SetArgPointee<0>(local_data), Return(true)));
154 
155   auto callback = [](decltype(this) test, const GetTpmStatusReply& reply) {
156     EXPECT_EQ(STATUS_SUCCESS, reply.status());
157     EXPECT_TRUE(reply.enabled());
158     EXPECT_TRUE(reply.owned());
159     EXPECT_EQ(kOwnerPassword, reply.local_data().owner_password());
160     EXPECT_EQ(5, reply.dictionary_attack_counter());
161     EXPECT_EQ(6, reply.dictionary_attack_threshold());
162     EXPECT_TRUE(reply.dictionary_attack_lockout_in_effect());
163     EXPECT_EQ(7, reply.dictionary_attack_lockout_seconds_remaining());
164     test->Quit();
165   };
166   GetTpmStatusRequest request;
167   service_->GetTpmStatus(request, base::Bind(callback, base::Unretained(this)));
168   Run();
169 }
170 
TEST_F(TpmManagerServiceTest,GetTpmStatusLocalDataFailure)171 TEST_F(TpmManagerServiceTest, GetTpmStatusLocalDataFailure) {
172   EXPECT_CALL(mock_local_data_store_, Read(_)).WillRepeatedly(Return(false));
173   auto callback = [](decltype(this) test, const GetTpmStatusReply& reply) {
174     EXPECT_EQ(STATUS_SUCCESS, reply.status());
175     EXPECT_TRUE(reply.enabled());
176     EXPECT_TRUE(reply.owned());
177     EXPECT_FALSE(reply.has_local_data());
178     EXPECT_TRUE(reply.has_dictionary_attack_counter());
179     EXPECT_TRUE(reply.has_dictionary_attack_threshold());
180     EXPECT_TRUE(reply.has_dictionary_attack_lockout_in_effect());
181     EXPECT_TRUE(reply.has_dictionary_attack_lockout_seconds_remaining());
182     test->Quit();
183   };
184   GetTpmStatusRequest request;
185   service_->GetTpmStatus(request, base::Bind(callback, base::Unretained(this)));
186   Run();
187 }
188 
TEST_F(TpmManagerServiceTest,GetTpmStatusNoTpm)189 TEST_F(TpmManagerServiceTest, GetTpmStatusNoTpm) {
190   EXPECT_CALL(mock_tpm_status_, IsTpmEnabled()).WillRepeatedly(Return(false));
191   EXPECT_CALL(mock_tpm_status_, GetDictionaryAttackInfo(_, _, _, _))
192       .WillRepeatedly(Return(false));
193   auto callback = [](decltype(this) test, const GetTpmStatusReply& reply) {
194     EXPECT_EQ(STATUS_SUCCESS, reply.status());
195     EXPECT_FALSE(reply.enabled());
196     EXPECT_TRUE(reply.owned());
197     EXPECT_TRUE(reply.has_local_data());
198     EXPECT_FALSE(reply.has_dictionary_attack_counter());
199     EXPECT_FALSE(reply.has_dictionary_attack_threshold());
200     EXPECT_FALSE(reply.has_dictionary_attack_lockout_in_effect());
201     EXPECT_FALSE(reply.has_dictionary_attack_lockout_seconds_remaining());
202     test->Quit();
203   };
204   GetTpmStatusRequest request;
205   service_->GetTpmStatus(request, base::Bind(callback, base::Unretained(this)));
206   Run();
207 }
208 
TEST_F(TpmManagerServiceTest,TakeOwnershipSuccess)209 TEST_F(TpmManagerServiceTest, TakeOwnershipSuccess) {
210   // Make sure InitializeTpm doesn't get multiple calls.
211   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm()).Times(1);
212   auto callback = [](decltype(this) test, const TakeOwnershipReply& reply) {
213     EXPECT_EQ(STATUS_SUCCESS, reply.status());
214     test->Quit();
215   };
216   TakeOwnershipRequest request;
217   service_->TakeOwnership(request, base::Bind(callback, base::Unretained(this)));
218   Run();
219 }
220 
TEST_F(TpmManagerServiceTest,TakeOwnershipFailure)221 TEST_F(TpmManagerServiceTest, TakeOwnershipFailure) {
222   EXPECT_CALL(mock_tpm_initializer_, InitializeTpm())
223       .WillRepeatedly(Return(false));
224   auto callback = [](decltype(this) test, const TakeOwnershipReply& reply) {
225     EXPECT_EQ(STATUS_DEVICE_ERROR, reply.status());
226     test->Quit();
227   };
228   TakeOwnershipRequest request;
229   service_->TakeOwnership(request, base::Bind(callback, base::Unretained(this)));
230   Run();
231 }
232 
TEST_F(TpmManagerServiceTest,TakeOwnershipNoTpm)233 TEST_F(TpmManagerServiceTest, TakeOwnershipNoTpm) {
234   EXPECT_CALL(mock_tpm_status_, IsTpmEnabled()).WillRepeatedly(Return(false));
235   auto callback = [](decltype(this) test, const TakeOwnershipReply& reply) {
236     EXPECT_EQ(STATUS_NOT_AVAILABLE, reply.status());
237     test->Quit();
238   };
239   TakeOwnershipRequest request;
240   service_->TakeOwnership(request, base::Bind(callback, base::Unretained(this)));
241   Run();
242 }
243 
TEST_F(TpmManagerServiceTest,RemoveOwnerDependencyReadFailure)244 TEST_F(TpmManagerServiceTest, RemoveOwnerDependencyReadFailure) {
245   EXPECT_CALL(mock_local_data_store_, Read(_)).WillRepeatedly(Return(false));
246   auto callback = [](decltype(this) test, const RemoveOwnerDependencyReply& reply) {
247     EXPECT_EQ(STATUS_DEVICE_ERROR, reply.status());
248     test->Quit();
249   };
250   RemoveOwnerDependencyRequest request;
251   request.set_owner_dependency(kOwnerDependency);
252   service_->RemoveOwnerDependency(request, base::Bind(callback, base::Unretained(this)));
253   Run();
254 }
255 
TEST_F(TpmManagerServiceTest,RemoveOwnerDependencyWriteFailure)256 TEST_F(TpmManagerServiceTest, RemoveOwnerDependencyWriteFailure) {
257   EXPECT_CALL(mock_local_data_store_, Write(_)).WillRepeatedly(Return(false));
258   auto callback = [](decltype(this) test, const RemoveOwnerDependencyReply& reply) {
259     EXPECT_EQ(STATUS_DEVICE_ERROR, reply.status());
260     test->Quit();
261   };
262   RemoveOwnerDependencyRequest request;
263   request.set_owner_dependency(kOwnerDependency);
264   service_->RemoveOwnerDependency(request, base::Bind(callback, base::Unretained(this)));
265   Run();
266 }
267 
TEST_F(TpmManagerServiceTest,RemoveOwnerDependencyNotCleared)268 TEST_F(TpmManagerServiceTest, RemoveOwnerDependencyNotCleared) {
269   LocalData local_data;
270   local_data.set_owner_password(kOwnerPassword);
271   local_data.add_owner_dependency(kOwnerDependency);
272   local_data.add_owner_dependency(kOtherDependency);
273   EXPECT_CALL(mock_local_data_store_, Read(_))
274       .WillOnce(DoAll(SetArgPointee<0>(local_data), Return(true)));
275   EXPECT_CALL(mock_local_data_store_, Write(_))
276       .WillOnce(DoAll(SaveArg<0>(&local_data), Return(true)));
277   auto callback = [](decltype(this) test, LocalData* local_data,
278                      const RemoveOwnerDependencyReply& reply) {
279     EXPECT_EQ(STATUS_SUCCESS, reply.status());
280     EXPECT_EQ(1, local_data->owner_dependency_size());
281     EXPECT_EQ(kOtherDependency, local_data->owner_dependency(0));
282     EXPECT_TRUE(local_data->has_owner_password());
283     EXPECT_EQ(kOwnerPassword, local_data->owner_password());
284     test->Quit();
285   };
286   RemoveOwnerDependencyRequest request;
287   request.set_owner_dependency(kOwnerDependency);
288   service_->RemoveOwnerDependency(request,
289                                   base::Bind(callback, base::Unretained(this),
290                                              base::Unretained(&local_data)));
291   Run();
292 }
293 
TEST_F(TpmManagerServiceTest,RemoveOwnerDependencyCleared)294 TEST_F(TpmManagerServiceTest, RemoveOwnerDependencyCleared) {
295   LocalData local_data;
296   local_data.set_owner_password(kOwnerPassword);
297   local_data.add_owner_dependency(kOwnerDependency);
298   EXPECT_CALL(mock_local_data_store_, Read(_))
299       .WillOnce(DoAll(SetArgPointee<0>(local_data), Return(true)));
300   EXPECT_CALL(mock_local_data_store_, Write(_))
301       .WillOnce(DoAll(SaveArg<0>(&local_data), Return(true)));
302   auto callback = [](decltype(this) test, LocalData* local_data,
303                      const RemoveOwnerDependencyReply& reply) {
304     EXPECT_EQ(STATUS_SUCCESS, reply.status());
305     EXPECT_EQ(0, local_data->owner_dependency_size());
306     EXPECT_FALSE(local_data->has_owner_password());
307     test->Quit();
308   };
309   RemoveOwnerDependencyRequest request;
310   request.set_owner_dependency(kOwnerDependency);
311   service_->RemoveOwnerDependency(request,
312                                   base::Bind(callback, base::Unretained(this),
313                                              base::Unretained(&local_data)));
314   Run();
315 }
316 
TEST_F(TpmManagerServiceTest,RemoveOwnerDependencyNotPresent)317 TEST_F(TpmManagerServiceTest, RemoveOwnerDependencyNotPresent) {
318   LocalData local_data;
319   local_data.set_owner_password(kOwnerPassword);
320   local_data.add_owner_dependency(kOwnerDependency);
321   EXPECT_CALL(mock_local_data_store_, Read(_))
322       .WillOnce(DoAll(SetArgPointee<0>(local_data), Return(true)));
323   EXPECT_CALL(mock_local_data_store_, Write(_))
324       .WillOnce(DoAll(SaveArg<0>(&local_data), Return(true)));
325   auto callback = [](decltype(this) test, const LocalData& local_data,
326                      const RemoveOwnerDependencyReply& reply) {
327     EXPECT_EQ(STATUS_SUCCESS, reply.status());
328     EXPECT_EQ(1, local_data.owner_dependency_size());
329     EXPECT_EQ(kOwnerDependency, local_data.owner_dependency(0));
330     EXPECT_TRUE(local_data.has_owner_password());
331     EXPECT_EQ(kOwnerPassword, local_data.owner_password());
332     test->Quit();
333   };
334   RemoveOwnerDependencyRequest request;
335   request.set_owner_dependency(kOtherDependency);
336   service_->RemoveOwnerDependency(
337       request, base::Bind(callback, base::Unretained(this), local_data));
338   Run();
339 }
340 
TEST_F(TpmManagerServiceTest,DefineSpaceFailure)341 TEST_F(TpmManagerServiceTest, DefineSpaceFailure) {
342   uint32_t nvram_index = 5;
343   size_t nvram_size = 32;
344   std::vector<NvramSpaceAttribute> attributes{NVRAM_BOOT_WRITE_LOCK};
345   NvramSpacePolicy policy = NVRAM_POLICY_PCR0;
346   std::string auth_value = "1234";
347   EXPECT_CALL(mock_tpm_nvram_, DefineSpace(nvram_index, nvram_size, attributes,
348                                            auth_value, policy))
349       .WillRepeatedly(Return(NVRAM_RESULT_INVALID_PARAMETER));
350   auto callback = [](decltype(this) test, const DefineSpaceReply& reply) {
351     EXPECT_EQ(NVRAM_RESULT_INVALID_PARAMETER, reply.result());
352     test->Quit();
353   };
354   DefineSpaceRequest request;
355   request.set_index(nvram_index);
356   request.set_size(nvram_size);
357   request.add_attributes(NVRAM_BOOT_WRITE_LOCK);
358   request.set_policy(policy);
359   request.set_authorization_value(auth_value);
360   service_->DefineSpace(request, base::Bind(callback, base::Unretained(this)));
361   Run();
362 }
363 
TEST_F(TpmManagerServiceTest,DefineSpaceSuccess)364 TEST_F(TpmManagerServiceTest, DefineSpaceSuccess) {
365   uint32_t nvram_index = 5;
366   uint32_t nvram_size = 32;
367   auto define_callback = [](const DefineSpaceReply& reply) {
368     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
369   };
370   auto list_callback = [](uint32_t nvram_index, const ListSpacesReply& reply) {
371     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
372     EXPECT_EQ(1, reply.index_list_size());
373     EXPECT_EQ(nvram_index, reply.index_list(0));
374   };
375   auto info_callback = [](uint32_t nvram_size, const GetSpaceInfoReply& reply) {
376     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
377     EXPECT_EQ(nvram_size, reply.size());
378   };
379   DefineSpaceRequest define_request;
380   define_request.set_index(nvram_index);
381   define_request.set_size(nvram_size);
382   service_->DefineSpace(define_request, base::Bind(define_callback));
383   ListSpacesRequest list_request;
384   service_->ListSpaces(list_request, base::Bind(list_callback, nvram_index));
385   GetSpaceInfoRequest info_request;
386   info_request.set_index(nvram_index);
387   service_->GetSpaceInfo(info_request, base::Bind(info_callback, nvram_size));
388   RunServiceWorkerAndQuit();
389 }
390 
TEST_F(TpmManagerServiceTest,DestroyUnitializedNvram)391 TEST_F(TpmManagerServiceTest, DestroyUnitializedNvram) {
392   auto callback = [](decltype(this) test, const DestroySpaceReply& reply) {
393     EXPECT_EQ(NVRAM_RESULT_SPACE_DOES_NOT_EXIST, reply.result());
394     test->Quit();
395   };
396   DestroySpaceRequest request;
397   service_->DestroySpace(request, base::Bind(callback, base::Unretained(this)));
398   Run();
399 }
400 
TEST_F(TpmManagerServiceTest,DestroySpaceSuccess)401 TEST_F(TpmManagerServiceTest, DestroySpaceSuccess) {
402   uint32_t nvram_index = 5;
403   uint32_t nvram_size = 32;
404   auto define_callback = [](const DefineSpaceReply& reply) {
405     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
406   };
407   auto destroy_callback = [](const DestroySpaceReply& reply) {
408     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
409   };
410   DefineSpaceRequest define_request;
411   define_request.set_index(nvram_index);
412   define_request.set_size(nvram_size);
413   service_->DefineSpace(define_request, base::Bind(define_callback));
414   DestroySpaceRequest destroy_request;
415   destroy_request.set_index(nvram_index);
416   service_->DestroySpace(destroy_request, base::Bind(destroy_callback));
417   RunServiceWorkerAndQuit();
418 }
419 
TEST_F(TpmManagerServiceTest,DoubleDestroySpace)420 TEST_F(TpmManagerServiceTest, DoubleDestroySpace) {
421   uint32_t nvram_index = 5;
422   uint32_t nvram_size = 32;
423   auto define_callback = [](const DefineSpaceReply& reply) {
424     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
425   };
426   auto destroy_callback_success = [](const DestroySpaceReply& reply) {
427     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
428   };
429   auto destroy_callback_failure = [](const DestroySpaceReply& reply) {
430     EXPECT_EQ(NVRAM_RESULT_SPACE_DOES_NOT_EXIST, reply.result());
431   };
432   DefineSpaceRequest define_request;
433   define_request.set_index(nvram_index);
434   define_request.set_size(nvram_size);
435   service_->DefineSpace(define_request, base::Bind(define_callback));
436   DestroySpaceRequest destroy_request;
437   destroy_request.set_index(nvram_index);
438   service_->DestroySpace(destroy_request, base::Bind(destroy_callback_success));
439   service_->DestroySpace(destroy_request, base::Bind(destroy_callback_failure));
440   RunServiceWorkerAndQuit();
441 }
442 
TEST_F(TpmManagerServiceTest,WriteSpaceIncorrectSize)443 TEST_F(TpmManagerServiceTest, WriteSpaceIncorrectSize) {
444   uint32_t nvram_index = 5;
445   std::string nvram_data("nvram_data");
446   auto define_callback = [](const DefineSpaceReply& reply) {
447     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
448   };
449   auto write_callback = [](const WriteSpaceReply& reply) {
450     EXPECT_EQ(NVRAM_RESULT_INVALID_PARAMETER, reply.result());
451   };
452   DefineSpaceRequest define_request;
453   define_request.set_index(nvram_index);
454   define_request.set_size(nvram_data.size() - 1);
455   service_->DefineSpace(define_request, base::Bind(define_callback));
456   WriteSpaceRequest write_request;
457   write_request.set_index(nvram_index);
458   write_request.set_data(nvram_data);
459   service_->WriteSpace(write_request, base::Bind(write_callback));
460   RunServiceWorkerAndQuit();
461 }
462 
TEST_F(TpmManagerServiceTest,WriteBeforeAfterLock)463 TEST_F(TpmManagerServiceTest, WriteBeforeAfterLock) {
464   uint32_t nvram_index = 5;
465   std::string nvram_data("nvram_data");
466   auto define_callback = [](const DefineSpaceReply& reply) {
467     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
468   };
469   auto write_callback_success = [](const WriteSpaceReply& reply) {
470     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
471   };
472   auto lock_callback = [](const LockSpaceReply& reply) {
473     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
474   };
475   auto write_callback_failure = [](const WriteSpaceReply& reply) {
476     EXPECT_EQ(NVRAM_RESULT_OPERATION_DISABLED, reply.result());
477   };
478   DefineSpaceRequest define_request;
479   define_request.set_index(nvram_index);
480   define_request.set_size(nvram_data.size());
481   service_->DefineSpace(define_request, base::Bind(define_callback));
482   WriteSpaceRequest write_request;
483   write_request.set_index(nvram_index);
484   write_request.set_data(nvram_data);
485   service_->WriteSpace(write_request, base::Bind(write_callback_success));
486   LockSpaceRequest lock_request;
487   lock_request.set_index(nvram_index);
488   lock_request.set_lock_write(true);
489   service_->LockSpace(lock_request, base::Bind(lock_callback));
490   service_->WriteSpace(write_request, base::Bind(write_callback_failure));
491   RunServiceWorkerAndQuit();
492 }
493 
TEST_F(TpmManagerServiceTest,ReadUninitializedNvram)494 TEST_F(TpmManagerServiceTest, ReadUninitializedNvram) {
495   auto callback = [](decltype(this) test, const ReadSpaceReply& reply) {
496     EXPECT_EQ(NVRAM_RESULT_SPACE_DOES_NOT_EXIST, reply.result());
497     test->Quit();
498   };
499   ReadSpaceRequest request;
500   service_->ReadSpace(request, base::Bind(callback, base::Unretained(this)));
501   Run();
502 }
503 
TEST_F(TpmManagerServiceTest,ReadWriteSpaceSuccess)504 TEST_F(TpmManagerServiceTest, ReadWriteSpaceSuccess) {
505   uint32_t nvram_index = 5;
506   std::string nvram_data("nvram_data");
507   auto define_callback = [](const DefineSpaceReply& reply) {
508     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
509   };
510   auto write_callback = [](const WriteSpaceReply& reply) {
511     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
512   };
513   auto read_callback = [](const std::string& nvram_data,
514                           const ReadSpaceReply& reply) {
515     EXPECT_EQ(NVRAM_RESULT_SUCCESS, reply.result());
516     EXPECT_EQ(nvram_data, reply.data());
517   };
518   DefineSpaceRequest define_request;
519   define_request.set_index(nvram_index);
520   define_request.set_size(nvram_data.size());
521   service_->DefineSpace(define_request, base::Bind(define_callback));
522   WriteSpaceRequest write_request;
523   write_request.set_index(nvram_index);
524   write_request.set_data(nvram_data);
525   service_->WriteSpace(write_request, base::Bind(write_callback));
526   ReadSpaceRequest read_request;
527   read_request.set_index(nvram_index);
528   service_->ReadSpace(read_request, base::Bind(read_callback, nvram_data));
529   RunServiceWorkerAndQuit();
530 }
531 
532 }  // namespace tpm_manager
533