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

Side by Side Diff: chromeos/dbus/biod_biometrics_manager_client_unittest.cc

Issue 2567813002: cros: DBUS client to interact with fingerprint DBUS API. (Closed)
Patch Set: ScanFailed -> SessionFailed. Created 3 years, 9 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
OLDNEW
(Empty)
1 // Copyright 2016 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 "chromeos/dbus/biod_biometrics_manager_client.h"
6
7 #include <map>
8 #include <string>
9
10 #include "base/bind.h"
11 #include "base/run_loop.h"
12 #include "dbus/mock_bus.h"
13 #include "dbus/mock_object_proxy.h"
14 #include "dbus/object_path.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using ::testing::_;
19 using ::testing::Invoke;
20 using ::testing::Return;
21
22 namespace chromeos {
23
24 namespace {
25
26 // Shorthand for a commonly-used constant.
27 const char* kInterface = biod::kBiometricsManagerInterface;
28
29 void CheckObjectPathCallback(const dbus::ObjectPath& expected_object_path,
30 const dbus::ObjectPath& object_path) {
31 EXPECT_EQ(expected_object_path, object_path);
32 }
33
34 void CheckObjectPathArrayCallback(
35 const std::vector<dbus::ObjectPath>& expected_object_paths,
36 const std::vector<dbus::ObjectPath>& object_paths) {
37 EXPECT_EQ(expected_object_paths.size(), object_paths.size());
38 for (size_t i = 0; i < expected_object_paths.size(); ++i)
39 EXPECT_EQ(expected_object_paths[i], object_paths[i]);
40 }
41
42 // Implementation of BiodBiometricsManagerClient::Observer.
43 class TestBiometricsObserver : public BiodBiometricsManagerClient::Observer {
44 public:
45 TestBiometricsObserver() {}
46 ~TestBiometricsObserver() override {}
47
48 int num_enroll_scan_received() const { return num_enroll_scan_received_; }
49 int num_auth_scan_received() const { return num_auth_scan_received_; }
50 int num_failure_received() const { return num_failure_received_; }
51
52 // BiodBiometricsManagerClient::Observer:
53 void ClientRestarted() override {}
54
55 void EnrollScanDoneReceived(uint32_t scan_result, bool is_complete) override {
56 num_enroll_scan_received_++;
57 }
58
59 void AuthScanDoneReceived(uint32_t scan_result,
60 const AuthScanMatches& matches) override {
61 num_auth_scan_received_++;
62 }
63
64 void SessionFailedReceived() override { num_failure_received_++; }
65
66 private:
67 int num_enroll_scan_received_ = 0;
68 int num_auth_scan_received_ = 0;
69 int num_failure_received_ = 0;
70
71 DISALLOW_COPY_AND_ASSIGN(TestBiometricsObserver);
72 };
73
74 } // namespace
75
76 class BiodBiometricsManagerClientTest : public testing::Test {
77 public:
78 BiodBiometricsManagerClientTest() {}
79 ~BiodBiometricsManagerClientTest() override {}
80
81 void SetUp() override {
82 dbus::Bus::Options options;
83 options.bus_type = dbus::Bus::SYSTEM;
84 bus_ = new dbus::MockBus(options);
85
86 proxy_ =
87 new dbus::MockObjectProxy(bus_.get(), biod::kBiodServiceName,
88 dbus::ObjectPath(biod::kBiodServicePath));
89
90 // |client_|'s Init() method should request a proxy for communicating with
91 // biometrics api.
92 EXPECT_CALL(*bus_.get(),
93 GetObjectProxy(biod::kBiodServiceName,
94 dbus::ObjectPath(biod::kBiodServicePath)))
95 .WillRepeatedly(Return(proxy_.get()));
96
97 // Save |client_|'s signal callback.
98 EXPECT_CALL(*proxy_.get(), ConnectToSignal(kInterface, _, _, _))
99 .WillRepeatedly(
100 Invoke(this, &BiodBiometricsManagerClientTest::ConnectToSignal));
101
102 // |client_|'s Init() method should register methods.
103 EXPECT_CALL(*proxy_.get(), CallMethod(_, _, _))
104 .WillRepeatedly(
105 Invoke(this, &BiodBiometricsManagerClientTest::OnCallMethod));
106
107 client_.reset(
108 BiodBiometricsManagerClient::Create(REAL_DBUS_CLIENT_IMPLEMENTATION));
109 client_->Init(bus_.get());
110
111 // Execute callbacks posted by Init().
112 base::RunLoop().RunUntilIdle();
113 }
114
115 protected:
116 // Set the values a method is expected to have when a dbus method is called.
117 void SetExpectedMethodArguments(const std::string& expected_interface,
118 const std::string& expected_name,
119 dbus::Response* response) {
120 expected_interface_ = expected_interface;
121 expected_name_ = expected_name;
122 expected_response_ = response;
123 }
124
125 // Synchronously passes |signal| to |client_|'s handler, simulating the signal
126 // from biometrics.
127 void EmitSignal(dbus::Signal* signal) {
128 const std::string signal_name = signal->GetMember();
129 const auto it = signal_callbacks_.find(signal_name);
130 ASSERT_TRUE(it != signal_callbacks_.end())
131 << "Client didn't register for signal " << signal_name;
132 it->second.Run(signal);
133 }
134
135 // Passes a enroll scan done signal to |client_|.
136 void EmitEnrollScanDoneSignal(uint32_t scan_result, bool is_complete) {
137 dbus::Signal signal(kInterface,
138 biod::kBiometricsManagerEnrollScanDoneSignal);
139 dbus::MessageWriter writer(&signal);
140 writer.AppendUint32(scan_result);
141 writer.AppendBool(is_complete);
142 EmitSignal(&signal);
143 }
144
145 // Passes a auth scan done signal to |client_|.
146 void EmitAuthScanDoneSignal(uint32_t scan_result,
147 const AuthScanMatches& matches) {
148 dbus::Signal signal(kInterface, biod::kBiometricsManagerAuthScanDoneSignal);
149 dbus::MessageWriter writer(&signal);
150 writer.AppendUint32(scan_result);
151
152 dbus::MessageWriter array_writer(NULL);
153 writer.OpenArray("{sx}", &array_writer);
154 for (auto& match : matches) {
155 dbus::MessageWriter entry_writer(NULL);
156 array_writer.OpenDictEntry(&entry_writer);
157 entry_writer.AppendString(match.first);
158 entry_writer.AppendArrayOfStrings(match.second);
159 array_writer.CloseContainer(&entry_writer);
160 }
161 writer.CloseContainer(&array_writer);
162 EmitSignal(&signal);
163 }
164
165 // Passes a scan failed signal to |client_|.
166 void EmitScanFailedSignal() {
167 dbus::Signal signal(kInterface,
168 biod::kBiometricsManagerSessionFailedSignal);
169 EmitSignal(&signal);
170 }
171
172 std::string expected_interface_;
173 std::string expected_name_;
174 dbus::Response* expected_response_;
175
176 base::MessageLoop message_loop_;
177
178 // Mock bus and proxy for simulating calls.
179 scoped_refptr<dbus::MockBus> bus_;
180 scoped_refptr<dbus::MockObjectProxy> proxy_;
181
182 std::unique_ptr<BiodBiometricsManagerClient> client_;
183
184 // Maps from powerd signal name to the corresponding callback provided by
185 // |client_|.
186 std::map<std::string, dbus::ObjectProxy::SignalCallback> signal_callbacks_;
187
188 private:
189 // Handles calls to |proxy_|'s ConnectToSignal() method.
190 void ConnectToSignal(
191 const std::string& interface_name,
192 const std::string& signal_name,
193 dbus::ObjectProxy::SignalCallback signal_callback,
194 dbus::ObjectProxy::OnConnectedCallback on_connected_callback) {
195 EXPECT_EQ(interface_name, kInterface);
196 signal_callbacks_[signal_name] = signal_callback;
197
198 message_loop_.task_runner()->PostTask(
199 FROM_HERE, base::Bind(on_connected_callback, interface_name,
200 signal_name, true /* success */));
201 }
202
203 // Handles calls to |proxy_|'s CallMethod().
204 void OnCallMethod(dbus::MethodCall* method_call,
205 int timeout_ms,
206 const dbus::ObjectProxy::ResponseCallback& callback) {
207 EXPECT_EQ(expected_interface_, method_call->GetInterface());
208 EXPECT_EQ(expected_name_, method_call->GetMember());
209
210 message_loop_.task_runner()->PostTask(
211 FROM_HERE, base::Bind(callback, expected_response_));
212 }
213
214 DISALLOW_COPY_AND_ASSIGN(BiodBiometricsManagerClientTest);
215 };
216
217 TEST_F(BiodBiometricsManagerClientTest, TestStartEnrollSession) {
218 const std::string& fake_id("fakeId");
219 const std::string& fake_label("fakeLabel");
220 const dbus::ObjectPath& fake_object_path(std::string("/fake/object/path"));
221
222 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
223 dbus::MessageWriter writer(response.get());
224 writer.AppendObjectPath(fake_object_path);
225
226 // Create a fake response with a fake object path. The start enroll
227 // call should return this object path.
228 SetExpectedMethodArguments(kInterface,
229 biod::kBiometricsManagerStartEnrollSessionMethod,
230 response.get());
231 client_->StartEnrollSession(
232 fake_id, fake_label,
233 base::Bind(&CheckObjectPathCallback, fake_object_path));
234 }
235
236 TEST_F(BiodBiometricsManagerClientTest, TestGetRecordsForUser) {
237 const std::string& fake_id("fakeId");
238 const dbus::ObjectPath& fake_object_path(std::string("/fake/object/path"));
239 const dbus::ObjectPath& fake_object_path2(std::string("/fake/object/path2"));
240 const std::vector<dbus::ObjectPath>& fake_object_paths = {fake_object_path,
241 fake_object_path2};
242
243 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
244 dbus::MessageWriter writer(response.get());
245 writer.AppendArrayOfObjectPaths(fake_object_paths);
246
247 // Create a fake response with an array fake object paths. The get enrollments
248 // call should return this array of object paths.
249 SetExpectedMethodArguments(kInterface,
250 biod::kBiometricsManagerGetRecordsForUserMethod,
251 response.get());
252 client_->GetRecordsForUser(
253 fake_id, base::Bind(&CheckObjectPathArrayCallback, fake_object_paths));
254 }
255
256 TEST_F(BiodBiometricsManagerClientTest, TestDestroyAllRecords) {
257 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
258
259 SetExpectedMethodArguments(kInterface,
260 biod::kBiometricsManagerDestroyAllRecordsMethod,
261 response.get());
262 client_->DestroyAllRecords();
263 }
264
265 TEST_F(BiodBiometricsManagerClientTest, TestStartAuthentication) {
266 const dbus::ObjectPath& fake_object_path(std::string("/fake/object/path"));
267
268 // Create a fake response with a fake object path. The start authentication
269 // call should return this object path.
270 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
271 dbus::MessageWriter writer(response.get());
272 writer.AppendObjectPath(fake_object_path);
273
274 SetExpectedMethodArguments(kInterface,
275 biod::kBiometricsManagerStartAuthSessionMethod,
276 response.get());
277 client_->StartAuthSession(
278 base::Bind(&CheckObjectPathCallback, fake_object_path));
279 }
280
281 // Verify when enroll scan done signals are mocked, observer(s) catch the
282 // signals as expected.
283 TEST_F(BiodBiometricsManagerClientTest, TestEnrollScanDoneObserver) {
284 TestBiometricsObserver observer1;
285 TestBiometricsObserver observer2;
286 client_->AddObserver(&observer1);
287
288 const uint32_t scan_signal = 0;
289 const bool is_complete = false;
290 EmitEnrollScanDoneSignal(scan_signal, is_complete);
291 EXPECT_EQ(1, observer1.num_enroll_scan_received());
292 EXPECT_EQ(0, observer2.num_enroll_scan_received());
293
294 client_->AddObserver(&observer2);
295 EmitEnrollScanDoneSignal(scan_signal, is_complete);
296 EXPECT_EQ(2, observer1.num_enroll_scan_received());
297 EXPECT_EQ(1, observer2.num_enroll_scan_received());
298
299 client_->RemoveObserver(&observer1);
300 EmitEnrollScanDoneSignal(scan_signal, is_complete);
301 EXPECT_EQ(2, observer1.num_enroll_scan_received());
302 EXPECT_EQ(2, observer2.num_enroll_scan_received());
303 }
304
305 // Verify when auth scan done signals are mocked, observer(s) catch the signals
306 // as expected.
307 TEST_F(BiodBiometricsManagerClientTest, TestAuthScanDoneObserver) {
308 TestBiometricsObserver observer1;
309 TestBiometricsObserver observer2;
310 client_->AddObserver(&observer1);
311
312 const uint32_t scan_signal = 0;
313 const AuthScanMatches test_attempt;
314 EmitAuthScanDoneSignal(scan_signal, test_attempt);
315 EXPECT_EQ(1, observer1.num_auth_scan_received());
316 EXPECT_EQ(0, observer2.num_auth_scan_received());
317
318 client_->AddObserver(&observer2);
319 EmitAuthScanDoneSignal(scan_signal, test_attempt);
320 EXPECT_EQ(2, observer1.num_auth_scan_received());
321 EXPECT_EQ(1, observer2.num_auth_scan_received());
322
323 client_->RemoveObserver(&observer1);
324 EmitAuthScanDoneSignal(scan_signal, test_attempt);
325 EXPECT_EQ(2, observer1.num_auth_scan_received());
326 EXPECT_EQ(2, observer2.num_auth_scan_received());
327 }
328 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698