OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "chromeos/dbus/biod/biod_client.h" | 5 #include "chromeos/dbus/biod/biod_client.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "chromeos/dbus/biod/biod_test_utils.h" |
12 #include "dbus/mock_bus.h" | 13 #include "dbus/mock_bus.h" |
13 #include "dbus/mock_object_proxy.h" | 14 #include "dbus/mock_object_proxy.h" |
14 #include "dbus/object_path.h" | 15 #include "dbus/object_path.h" |
15 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
17 | 18 |
18 using ::testing::_; | 19 using ::testing::_; |
19 using ::testing::Invoke; | 20 using ::testing::Invoke; |
20 using ::testing::Return; | 21 using ::testing::Return; |
21 | 22 |
22 namespace chromeos { | 23 namespace chromeos { |
23 | 24 |
24 namespace { | 25 namespace { |
25 | 26 |
26 // Shorthand for a commonly-used constant. | 27 // Shorthand for a commonly-used constant. |
27 const char* kInterface = biod::kBiometricsManagerInterface; | 28 const char* kInterface = biod::kBiometricsManagerInterface; |
28 | 29 |
29 // Value used to intialize dbus::ObjectPath objects in tests to make it easier | 30 // Value used to intialize dbus::ObjectPath objects in tests to make it easier |
30 // to determine when empty values have been assigned. | 31 // to determine when empty values have been assigned. |
31 const char kInvalidTestPath[] = "/invalid/test/path"; | 32 const char kInvalidTestPath[] = "/invalid/test/path"; |
32 | 33 |
33 // Value used to intialize string objects in tests to make it easier to | 34 // Value used to intialize string objects in tests to make it easier to |
34 // determine when empty values have been assigned. | 35 // determine when empty values have been assigned. |
35 const char kInvalidString[] = "invalidString"; | 36 const char kInvalidString[] = "invalidString"; |
36 | 37 |
37 void CopyObjectPath(dbus::ObjectPath* dest_path, | |
38 const dbus::ObjectPath& src_path) { | |
39 CHECK(dest_path); | |
40 *dest_path = src_path; | |
41 } | |
42 | |
43 void CopyObjectPathArray( | |
44 std::vector<dbus::ObjectPath>* dest_object_paths, | |
45 const std::vector<dbus::ObjectPath>& src_object_paths) { | |
46 CHECK(dest_object_paths); | |
47 *dest_object_paths = src_object_paths; | |
48 } | |
49 | |
50 void CopyString(std::string* dest_str, const std::string& src_str) { | |
51 CHECK(dest_str); | |
52 *dest_str = src_str; | |
53 } | |
54 | |
55 // Matcher that verifies that a dbus::Message has member |name|. | 38 // Matcher that verifies that a dbus::Message has member |name|. |
56 MATCHER_P(HasMember, name, "") { | 39 MATCHER_P(HasMember, name, "") { |
57 if (arg->GetMember() != name) { | 40 if (arg->GetMember() != name) { |
58 *result_listener << "has member " << arg->GetMember(); | 41 *result_listener << "has member " << arg->GetMember(); |
59 return false; | 42 return false; |
60 } | 43 } |
61 return true; | 44 return true; |
62 } | 45 } |
63 | 46 |
64 // Runs |callback| with |response|. Needed due to ResponseCallback expecting a | 47 // Runs |callback| with |response|. Needed due to ResponseCallback expecting a |
65 // bare pointer rather than an std::unique_ptr. | 48 // bare pointer rather than an std::unique_ptr. |
66 void RunResponseCallback(dbus::ObjectProxy::ResponseCallback callback, | 49 void RunResponseCallback(dbus::ObjectProxy::ResponseCallback callback, |
67 std::unique_ptr<dbus::Response> response) { | 50 std::unique_ptr<dbus::Response> response) { |
68 callback.Run(response.get()); | 51 callback.Run(response.get()); |
69 } | 52 } |
70 | 53 |
71 // Implementation of BiodClient::Observer. | |
72 class TestBiodObserver : public BiodClient::Observer { | |
73 public: | |
74 TestBiodObserver() {} | |
75 ~TestBiodObserver() override {} | |
76 | |
77 int num_enroll_scans_received() const { return num_enroll_scans_received_; } | |
78 int num_auth_scans_received() const { return num_auth_scans_received_; } | |
79 int num_failures_received() const { return num_failures_received_; } | |
80 | |
81 // BiodClient::Observer: | |
82 void BiodServiceRestarted() override {} | |
83 | |
84 void BiodEnrollScanDoneReceived(biod::ScanResult scan_result, | |
85 bool enroll_sesion_complete) override { | |
86 num_enroll_scans_received_++; | |
87 } | |
88 | |
89 void BiodAuthScanDoneReceived(biod::ScanResult scan_result, | |
90 const AuthScanMatches& matches) override { | |
91 num_auth_scans_received_++; | |
92 } | |
93 | |
94 void BiodSessionFailedReceived() override { num_failures_received_++; } | |
95 | |
96 private: | |
97 int num_enroll_scans_received_ = 0; | |
98 int num_auth_scans_received_ = 0; | |
99 int num_failures_received_ = 0; | |
100 | |
101 DISALLOW_COPY_AND_ASSIGN(TestBiodObserver); | |
102 }; | |
103 | |
104 } // namespace | 54 } // namespace |
105 | 55 |
106 class BiodClientTest : public testing::Test { | 56 class BiodClientTest : public testing::Test { |
107 public: | 57 public: |
108 BiodClientTest() {} | 58 BiodClientTest() {} |
109 ~BiodClientTest() override {} | 59 ~BiodClientTest() override {} |
110 | 60 |
111 void SetUp() override { | 61 void SetUp() override { |
112 dbus::Bus::Options options; | 62 dbus::Bus::Options options; |
113 options.bus_type = dbus::Bus::SYSTEM; | 63 options.bus_type = dbus::Bus::SYSTEM; |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 | 195 |
246 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | 196 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
247 dbus::MessageWriter writer(response.get()); | 197 dbus::MessageWriter writer(response.get()); |
248 writer.AppendObjectPath(kFakeObjectPath); | 198 writer.AppendObjectPath(kFakeObjectPath); |
249 | 199 |
250 // Create a fake response with a fake object path. The start enroll | 200 // Create a fake response with a fake object path. The start enroll |
251 // call should return this object path. | 201 // call should return this object path. |
252 AddMethodExpectation(biod::kBiometricsManagerStartEnrollSessionMethod, | 202 AddMethodExpectation(biod::kBiometricsManagerStartEnrollSessionMethod, |
253 std::move(response)); | 203 std::move(response)); |
254 dbus::ObjectPath returned_path(kInvalidTestPath); | 204 dbus::ObjectPath returned_path(kInvalidTestPath); |
255 client_->StartEnrollSession(kFakeId, kFakeLabel, | 205 client_->StartEnrollSession( |
256 base::Bind(&CopyObjectPath, &returned_path)); | 206 kFakeId, kFakeLabel, |
| 207 base::Bind(&test_utils::CopyObjectPath, &returned_path)); |
257 base::RunLoop().RunUntilIdle(); | 208 base::RunLoop().RunUntilIdle(); |
258 EXPECT_EQ(kFakeObjectPath, returned_path); | 209 EXPECT_EQ(kFakeObjectPath, returned_path); |
259 | 210 |
260 // Verify that by sending a empty reponse or a improperly formatted one, the | 211 // Verify that by sending a empty reponse or a improperly formatted one, the |
261 // response is an empty object path. Also, logs will get printed. | 212 // response is an empty object path. Also, logs will get printed. |
262 AddMethodExpectation(biod::kBiometricsManagerStartEnrollSessionMethod, | 213 AddMethodExpectation(biod::kBiometricsManagerStartEnrollSessionMethod, |
263 nullptr); | 214 nullptr); |
264 returned_path = dbus::ObjectPath(kInvalidTestPath); | 215 returned_path = dbus::ObjectPath(kInvalidTestPath); |
265 client_->StartEnrollSession(kFakeId, kFakeLabel, | 216 client_->StartEnrollSession( |
266 base::Bind(&CopyObjectPath, &returned_path)); | 217 kFakeId, kFakeLabel, |
| 218 base::Bind(&test_utils::CopyObjectPath, &returned_path)); |
267 base::RunLoop().RunUntilIdle(); | 219 base::RunLoop().RunUntilIdle(); |
268 EXPECT_EQ(dbus::ObjectPath(), returned_path); | 220 EXPECT_EQ(dbus::ObjectPath(), returned_path); |
269 | 221 |
270 std::unique_ptr<dbus::Response> bad_response(dbus::Response::CreateEmpty()); | 222 std::unique_ptr<dbus::Response> bad_response(dbus::Response::CreateEmpty()); |
271 dbus::MessageWriter bad_writer(bad_response.get()); | 223 dbus::MessageWriter bad_writer(bad_response.get()); |
272 bad_writer.AppendString(""); | 224 bad_writer.AppendString(""); |
273 AddMethodExpectation(biod::kBiometricsManagerStartEnrollSessionMethod, | 225 AddMethodExpectation(biod::kBiometricsManagerStartEnrollSessionMethod, |
274 std::move(bad_response)); | 226 std::move(bad_response)); |
275 returned_path = dbus::ObjectPath(kInvalidTestPath); | 227 returned_path = dbus::ObjectPath(kInvalidTestPath); |
276 client_->StartEnrollSession(kFakeId, kFakeLabel, | 228 client_->StartEnrollSession( |
277 base::Bind(&CopyObjectPath, &returned_path)); | 229 kFakeId, kFakeLabel, |
| 230 base::Bind(&test_utils::CopyObjectPath, &returned_path)); |
278 base::RunLoop().RunUntilIdle(); | 231 base::RunLoop().RunUntilIdle(); |
279 EXPECT_EQ(dbus::ObjectPath(), returned_path); | 232 EXPECT_EQ(dbus::ObjectPath(), returned_path); |
280 } | 233 } |
281 | 234 |
282 TEST_F(BiodClientTest, TestGetRecordsForUser) { | 235 TEST_F(BiodClientTest, TestGetRecordsForUser) { |
283 const std::string kFakeId("fakeId"); | 236 const std::string kFakeId("fakeId"); |
284 const dbus::ObjectPath kFakeObjectPath(std::string("/fake/object/path")); | 237 const dbus::ObjectPath kFakeObjectPath(std::string("/fake/object/path")); |
285 const dbus::ObjectPath kFakeObjectPath2(std::string("/fake/object/path2")); | 238 const dbus::ObjectPath kFakeObjectPath2(std::string("/fake/object/path2")); |
286 const std::vector<dbus::ObjectPath> kFakeObjectPaths = {kFakeObjectPath, | 239 const std::vector<dbus::ObjectPath> kFakeObjectPaths = {kFakeObjectPath, |
287 kFakeObjectPath2}; | 240 kFakeObjectPath2}; |
288 | 241 |
289 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | 242 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
290 dbus::MessageWriter writer(response.get()); | 243 dbus::MessageWriter writer(response.get()); |
291 writer.AppendArrayOfObjectPaths(kFakeObjectPaths); | 244 writer.AppendArrayOfObjectPaths(kFakeObjectPaths); |
292 | 245 |
293 // Create a fake response with an array of fake object paths. The get | 246 // Create a fake response with an array of fake object paths. The get |
294 // records for user call should return this array of object paths. | 247 // records for user call should return this array of object paths. |
295 AddMethodExpectation(biod::kBiometricsManagerGetRecordsForUserMethod, | 248 AddMethodExpectation(biod::kBiometricsManagerGetRecordsForUserMethod, |
296 std::move(response)); | 249 std::move(response)); |
297 std::vector<dbus::ObjectPath> returned_object_paths = { | 250 std::vector<dbus::ObjectPath> returned_object_paths = { |
298 dbus::ObjectPath(kInvalidTestPath)}; | 251 dbus::ObjectPath(kInvalidTestPath)}; |
299 client_->GetRecordsForUser( | 252 client_->GetRecordsForUser( |
300 kFakeId, base::Bind(&CopyObjectPathArray, &returned_object_paths)); | 253 kFakeId, |
| 254 base::Bind(&test_utils::CopyObjectPathArray, &returned_object_paths)); |
301 base::RunLoop().RunUntilIdle(); | 255 base::RunLoop().RunUntilIdle(); |
302 EXPECT_EQ(kFakeObjectPaths, returned_object_paths); | 256 EXPECT_EQ(kFakeObjectPaths, returned_object_paths); |
303 | 257 |
304 // Verify that by sending a empty reponse the response is an empty array of | 258 // Verify that by sending a empty reponse the response is an empty array of |
305 // object paths. Also, logs will get printed. | 259 // object paths. Also, logs will get printed. |
306 AddMethodExpectation(biod::kBiometricsManagerGetRecordsForUserMethod, | 260 AddMethodExpectation(biod::kBiometricsManagerGetRecordsForUserMethod, |
307 nullptr); | 261 nullptr); |
308 returned_object_paths = {dbus::ObjectPath(kInvalidTestPath)}; | 262 returned_object_paths = {dbus::ObjectPath(kInvalidTestPath)}; |
309 client_->GetRecordsForUser( | 263 client_->GetRecordsForUser( |
310 kFakeId, base::Bind(&CopyObjectPathArray, &returned_object_paths)); | 264 kFakeId, |
| 265 base::Bind(&test_utils::CopyObjectPathArray, &returned_object_paths)); |
311 base::RunLoop().RunUntilIdle(); | 266 base::RunLoop().RunUntilIdle(); |
312 EXPECT_EQ(std::vector<dbus::ObjectPath>(), returned_object_paths); | 267 EXPECT_EQ(std::vector<dbus::ObjectPath>(), returned_object_paths); |
313 } | 268 } |
314 | 269 |
315 TEST_F(BiodClientTest, TestStartAuthentication) { | 270 TEST_F(BiodClientTest, TestStartAuthentication) { |
316 const dbus::ObjectPath kFakeObjectPath(std::string("/fake/object/path")); | 271 const dbus::ObjectPath kFakeObjectPath(std::string("/fake/object/path")); |
317 | 272 |
318 // Create a fake response with a fake object path. The start authentication | 273 // Create a fake response with a fake object path. The start authentication |
319 // call should return this object path. | 274 // call should return this object path. |
320 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | 275 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
321 dbus::MessageWriter writer(response.get()); | 276 dbus::MessageWriter writer(response.get()); |
322 writer.AppendObjectPath(kFakeObjectPath); | 277 writer.AppendObjectPath(kFakeObjectPath); |
323 | 278 |
324 AddMethodExpectation(biod::kBiometricsManagerStartAuthSessionMethod, | 279 AddMethodExpectation(biod::kBiometricsManagerStartAuthSessionMethod, |
325 std::move(response)); | 280 std::move(response)); |
326 dbus::ObjectPath returned_path(kInvalidTestPath); | 281 dbus::ObjectPath returned_path(kInvalidTestPath); |
327 client_->StartAuthSession(base::Bind(&CopyObjectPath, &returned_path)); | 282 client_->StartAuthSession( |
| 283 base::Bind(&test_utils::CopyObjectPath, &returned_path)); |
328 base::RunLoop().RunUntilIdle(); | 284 base::RunLoop().RunUntilIdle(); |
329 EXPECT_EQ(kFakeObjectPath, returned_path); | 285 EXPECT_EQ(kFakeObjectPath, returned_path); |
330 | 286 |
331 // Verify that by sending a empty reponse or a improperly formatted one, the | 287 // Verify that by sending a empty reponse or a improperly formatted one, the |
332 // response is an empty object path. Also, logs will get printed. | 288 // response is an empty object path. Also, logs will get printed. |
333 AddMethodExpectation(biod::kBiometricsManagerStartAuthSessionMethod, nullptr); | 289 AddMethodExpectation(biod::kBiometricsManagerStartAuthSessionMethod, nullptr); |
334 returned_path = dbus::ObjectPath(kInvalidTestPath); | 290 returned_path = dbus::ObjectPath(kInvalidTestPath); |
335 client_->StartAuthSession(base::Bind(&CopyObjectPath, &returned_path)); | 291 client_->StartAuthSession( |
| 292 base::Bind(&test_utils::CopyObjectPath, &returned_path)); |
336 base::RunLoop().RunUntilIdle(); | 293 base::RunLoop().RunUntilIdle(); |
337 EXPECT_EQ(dbus::ObjectPath(), returned_path); | 294 EXPECT_EQ(dbus::ObjectPath(), returned_path); |
338 | 295 |
339 std::unique_ptr<dbus::Response> bad_response(dbus::Response::CreateEmpty()); | 296 std::unique_ptr<dbus::Response> bad_response(dbus::Response::CreateEmpty()); |
340 dbus::MessageWriter bad_writer(bad_response.get()); | 297 dbus::MessageWriter bad_writer(bad_response.get()); |
341 bad_writer.AppendString(""); | 298 bad_writer.AppendString(""); |
342 AddMethodExpectation(biod::kBiometricsManagerStartAuthSessionMethod, | 299 AddMethodExpectation(biod::kBiometricsManagerStartAuthSessionMethod, |
343 std::move(bad_response)); | 300 std::move(bad_response)); |
344 returned_path = dbus::ObjectPath(kInvalidTestPath); | 301 returned_path = dbus::ObjectPath(kInvalidTestPath); |
345 client_->StartAuthSession(base::Bind(&CopyObjectPath, &returned_path)); | 302 client_->StartAuthSession( |
| 303 base::Bind(&test_utils::CopyObjectPath, &returned_path)); |
346 base::RunLoop().RunUntilIdle(); | 304 base::RunLoop().RunUntilIdle(); |
347 EXPECT_EQ(dbus::ObjectPath(), returned_path); | 305 EXPECT_EQ(dbus::ObjectPath(), returned_path); |
348 } | 306 } |
349 | 307 |
350 // Verify when signals are mocked, an observer will catch the signals as | 308 // Verify when signals are mocked, an observer will catch the signals as |
351 // expected. | 309 // expected. |
352 TEST_F(BiodClientTest, TestNotifyObservers) { | 310 TEST_F(BiodClientTest, TestNotifyObservers) { |
353 TestBiodObserver observer; | 311 test_utils::TestBiodObserver observer; |
354 client_->AddObserver(&observer); | 312 client_->AddObserver(&observer); |
355 EXPECT_TRUE(client_->HasObserver(&observer)); | 313 EXPECT_TRUE(client_->HasObserver(&observer)); |
356 | 314 |
357 const biod::ScanResult scan_signal = biod::ScanResult::SCAN_RESULT_SUCCESS; | 315 const biod::ScanResult scan_signal = biod::ScanResult::SCAN_RESULT_SUCCESS; |
358 const bool enroll_session_complete = false; | 316 const bool enroll_session_complete = false; |
359 const AuthScanMatches test_attempt; | 317 const AuthScanMatches test_attempt; |
360 EXPECT_EQ(0, observer.num_enroll_scans_received()); | 318 EXPECT_EQ(0, observer.NumEnrollScansReceived()); |
361 EXPECT_EQ(0, observer.num_auth_scans_received()); | 319 EXPECT_EQ(0, observer.NumAuthScansReceived()); |
362 EXPECT_EQ(0, observer.num_failures_received()); | 320 EXPECT_EQ(0, observer.num_failures_received()); |
363 | 321 |
364 EmitEnrollScanDoneSignal(scan_signal, enroll_session_complete); | 322 EmitEnrollScanDoneSignal(scan_signal, enroll_session_complete); |
365 EXPECT_EQ(1, observer.num_enroll_scans_received()); | 323 EXPECT_EQ(1, observer.NumEnrollScansReceived()); |
366 | 324 |
367 EmitAuthScanDoneSignal(scan_signal, test_attempt); | 325 EmitAuthScanDoneSignal(scan_signal, test_attempt); |
368 EXPECT_EQ(1, observer.num_auth_scans_received()); | 326 EXPECT_EQ(1, observer.NumAuthScansReceived()); |
369 | 327 |
370 EmitScanFailedSignal(); | 328 EmitScanFailedSignal(); |
371 EXPECT_EQ(1, observer.num_failures_received()); | 329 EXPECT_EQ(1, observer.num_failures_received()); |
372 | 330 |
373 client_->RemoveObserver(&observer); | 331 client_->RemoveObserver(&observer); |
374 | 332 |
375 EmitEnrollScanDoneSignal(scan_signal, enroll_session_complete); | 333 EmitEnrollScanDoneSignal(scan_signal, enroll_session_complete); |
376 EmitAuthScanDoneSignal(scan_signal, test_attempt); | 334 EmitAuthScanDoneSignal(scan_signal, test_attempt); |
377 EXPECT_EQ(1, observer.num_enroll_scans_received()); | 335 EXPECT_EQ(1, observer.NumEnrollScansReceived()); |
378 EXPECT_EQ(1, observer.num_auth_scans_received()); | 336 EXPECT_EQ(1, observer.NumAuthScansReceived()); |
379 EXPECT_EQ(1, observer.num_failures_received()); | 337 EXPECT_EQ(1, observer.num_failures_received()); |
380 } | 338 } |
381 | 339 |
382 TEST_F(BiodClientTest, TestGetRecordLabel) { | 340 TEST_F(BiodClientTest, TestGetRecordLabel) { |
383 const std::string kFakeLabel("fakeLabel"); | 341 const std::string kFakeLabel("fakeLabel"); |
384 const dbus::ObjectPath kFakeRecordPath(std::string("/fake/record/path")); | 342 const dbus::ObjectPath kFakeRecordPath(std::string("/fake/record/path")); |
385 | 343 |
386 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | 344 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); |
387 dbus::MessageWriter writer(response.get()); | 345 dbus::MessageWriter writer(response.get()); |
388 writer.AppendString(kFakeLabel); | 346 writer.AppendString(kFakeLabel); |
389 | 347 |
390 // Create a fake response with string. The get label call should return this | 348 // Create a fake response with string. The get label call should return this |
391 // exact string. | 349 // exact string. |
392 std::string returned_label = kInvalidString; | 350 std::string returned_label = kInvalidString; |
393 AddMethodExpectation(dbus::kDBusPropertiesGet, std::move(response)); | 351 AddMethodExpectation(dbus::kDBusPropertiesGet, std::move(response)); |
394 client_->RequestRecordLabel(kFakeRecordPath, | 352 client_->RequestRecordLabel( |
395 base::Bind(&CopyString, &returned_label)); | 353 kFakeRecordPath, base::Bind(&test_utils::CopyLabel, &returned_label)); |
396 base::RunLoop().RunUntilIdle(); | 354 base::RunLoop().RunUntilIdle(); |
397 EXPECT_EQ(kFakeLabel, returned_label); | 355 EXPECT_EQ(kFakeLabel, returned_label); |
398 | 356 |
399 // Verify that by sending a empty reponse the response is an empty string. | 357 // Verify that by sending a empty reponse the response is an empty string. |
400 // Also, logs will get printed. | 358 // Also, logs will get printed. |
401 returned_label = kInvalidString; | 359 returned_label = kInvalidString; |
402 AddMethodExpectation(dbus::kDBusPropertiesGet, nullptr); | 360 AddMethodExpectation(dbus::kDBusPropertiesGet, nullptr); |
403 client_->RequestRecordLabel(kFakeRecordPath, | 361 client_->RequestRecordLabel( |
404 base::Bind(&CopyString, &returned_label)); | 362 kFakeRecordPath, base::Bind(&test_utils::CopyLabel, &returned_label)); |
405 base::RunLoop().RunUntilIdle(); | 363 base::RunLoop().RunUntilIdle(); |
406 EXPECT_EQ("", returned_label); | 364 EXPECT_EQ("", returned_label); |
407 } | 365 } |
408 } // namespace chromeos | 366 } // namespace chromeos |
OLD | NEW |