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

Side by Side Diff: chrome/browser/password_manager/kwallet_dbus_unittest.cc

Issue 2057123002: Refactor native_backend_kwallet_x (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nit Created 4 years, 6 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 "chrome/browser/password_manager/kwallet_dbus.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/logging.h"
11 #include "base/nix/xdg_util.h"
12 #include "dbus/message.h"
13 #include "dbus/mock_bus.h"
14 #include "dbus/mock_object_proxy.h"
15 #include "dbus/object_path.h"
16 #include "dbus/object_proxy.h"
17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace {
21
22 using testing::_;
23 using testing::Return;
24 using testing::Invoke;
25 using testing::DoAll;
26 using testing::ElementsAreArray;
27
28 const char kKWalletInterface[] = "org.kde.KWallet";
29 const char kKLauncherInterface[] = "org.kde.KLauncher";
30
31 dbus::Response* RespondBool(bool value) {
32 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
33 dbus::MessageWriter writer(response.get());
34 writer.AppendBool(value);
35 return response.release();
36 }
37
38 dbus::Response* RespondString(const std::string& value) {
39 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
40 dbus::MessageWriter writer(response.get());
41 writer.AppendString(value);
42 return response.release();
43 }
44
45 dbus::Response* RespondBytes(const uint8_t* bytes, int count) {
46 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
47 dbus::MessageWriter writer(response.get());
48 writer.AppendArrayOfBytes(bytes, count);
49 return response.release();
50 }
51
52 dbus::Response* RespondArrayOfStrings(std::vector<std::string> strings) {
vasilii 2016/06/16 17:54:43 const std::vector<std::string>&
cfroussios 2016/06/17 12:17:26 Done.
53 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
54 dbus::MessageWriter writer(response.get());
55 writer.AppendArrayOfStrings(strings);
56 return response.release();
57 }
58
59 dbus::Response* RespondInt32(int value) {
60 std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
61 dbus::MessageWriter writer(response.get());
62 writer.AppendInt32(value);
63 return response.release();
64 }
65
66 dbus::Response* RespondEmpty() {
67 return dbus::Response::CreateEmpty().release();
68 }
69
70 class KWalletDBusTest
71 : public testing::TestWithParam<base::nix::DesktopEnvironment> {
72 public:
73 KWalletDBusTest() : desktop_env_(GetParam()), kwallet_dbus_(desktop_env_) {
74 if (desktop_env_ == base::nix::DESKTOP_ENVIRONMENT_KDE5) {
75 dbus_service_name_ = "org.kde.kwalletd5";
76 dbus_path_ = "/modules/kwalletd5";
77 kwalletd_name_ = "kwalletd5";
78 } else {
79 dbus_service_name_ = "org.kde.kwalletd";
80 dbus_path_ = "/modules/kwalletd";
81 kwalletd_name_ = "kwalletd";
82 }
83 }
84
85 void SetUp() override {
vasilii 2016/06/16 17:54:44 Why not doing everything in the constructor?
cfroussios 2016/06/17 12:17:27 Done.
86 dbus::Bus::Options options;
87 options.bus_type = dbus::Bus::SESSION;
88 mock_session_bus_ = new dbus::MockBus(options);
89
90 mock_klauncher_proxy_ =
91 new dbus::MockObjectProxy(mock_session_bus_.get(), "org.kde.klauncher",
92 dbus::ObjectPath("/KLauncher"));
93 mock_kwallet_proxy_ =
94 new dbus::MockObjectProxy(mock_session_bus_.get(), dbus_service_name_,
95 dbus::ObjectPath(dbus_path_));
96
97 // The kwallet proxy is aquired once, when preparing |kwallet_dbus_|
98 EXPECT_CALL(
99 *mock_session_bus_.get(),
100 GetObjectProxy(dbus_service_name_, dbus::ObjectPath(dbus_path_)))
101 .WillOnce(Return(mock_kwallet_proxy_.get()));
102
103 // The klauncher proxy is aquired every time StartKWalletd() is tested
vasilii 2016/06/16 17:54:43 It's tested only once. Therefore, the EXPECT_CALL
cfroussios 2016/06/17 12:17:26 Done.
104 EXPECT_CALL(
vasilii 2016/06/16 17:54:43 EXPECT_CALLs should be just above the method which
cfroussios 2016/06/17 12:17:26 Done.
105 *mock_session_bus_.get(),
106 GetObjectProxy("org.kde.klauncher", dbus::ObjectPath("/KLauncher")))
107 .WillRepeatedly(Return(mock_klauncher_proxy_.get()));
108
109 kwallet_dbus_.SetSessionBus(mock_session_bus_);
110
111 // No unexpected calls.
112 EXPECT_CALL(*mock_kwallet_proxy_.get(), MockCallMethodAndBlock(_, _))
vasilii 2016/06/16 17:54:44 This is achieved by instantiating StrictMock<dbus:
cfroussios 2016/06/17 12:17:27 I cannot instantiate StrictMock<dbus::MockObjectPr
vasilii 2016/06/17 14:43:41 It's protected. What is the problem? scoped_refpt
cfroussios 2016/06/20 13:00:43 Done.
113 .Times(0);
114 }
115
116 virtual ~KWalletDBusTest() = default;
vasilii 2016/06/16 17:54:43 That's probably unnecessary.
cfroussios 2016/06/17 12:17:27 Done.
117
118 protected:
119 base::nix::DesktopEnvironment desktop_env_;
vasilii 2016/06/16 17:54:43 const?
cfroussios 2016/06/17 12:17:27 Done.
120 scoped_refptr<dbus::MockBus> mock_session_bus_;
121 scoped_refptr<dbus::MockObjectProxy> mock_klauncher_proxy_;
122 scoped_refptr<dbus::MockObjectProxy> mock_kwallet_proxy_;
123 KWalletDBus kwallet_dbus_;
124
125 std::string dbus_service_name_;
126 std::string dbus_path_;
127 std::string kwalletd_name_;
128
129 private:
130 DISALLOW_COPY_AND_ASSIGN(KWalletDBusTest);
131 };
132
133 INSTANTIATE_TEST_CASE_P(,
134 KWalletDBusTest,
135 ::testing::Values(base::nix::DESKTOP_ENVIRONMENT_KDE4,
136 base::nix::DESKTOP_ENVIRONMENT_KDE5));
137
138 // Matches a method call to the specified dbus target.
139 MATCHER_P2(Calls, interface, member, "") {
140 return arg->GetMember() == member && arg->GetInterface() == interface;
141 }
142
143 // Pops items from the dbus message and compares them to the expected values.
144 ACTION_P3(PopIntStringString, int_1, str_2, str_3) {
vasilii 2016/06/16 17:54:43 This is not an action. This is a matcher because y
cfroussios 2016/06/17 12:17:26 I like the style of composing the expectation one
vasilii 2016/06/17 14:43:40 Good point regarding the reader. This should work:
cfroussios 2016/06/20 13:00:43 Done.
145 dbus::MessageReader reader(arg0);
146
147 int i;
148 EXPECT_TRUE(reader.PopInt32(&i));
149 EXPECT_EQ(int_1, i);
150
151 std::string str;
152 EXPECT_TRUE(reader.PopString(&str));
153 EXPECT_EQ(str_2, str);
154
155 EXPECT_TRUE(reader.PopString(&str));
156 EXPECT_EQ(str_3, str);
157 }
158
159 // Pops items from the dbus message and compares them to the expected values.
160 ACTION_P4(PopIntStringStringString, int_1, str_2, str_3, str_4) {
161 dbus::MessageReader reader(arg0);
162
163 int i;
164 EXPECT_TRUE(reader.PopInt32(&i));
165 EXPECT_EQ(int_1, i);
166 std::string str;
167
168 EXPECT_TRUE(reader.PopString(&str));
169 EXPECT_EQ(str_2, str);
170
171 EXPECT_TRUE(reader.PopString(&str));
172 EXPECT_EQ(str_3, str);
173
174 EXPECT_TRUE(reader.PopString(&str));
175 EXPECT_EQ(str_4, str);
176 }
177
178 // Pops items from the dbus message and compares them to the expected values.
179 ACTION_P5(PopIntStringStringVectorString, int_1, str_2, str_3, vec_4, str_5) {
180 dbus::MessageReader reader(arg0);
181
182 int i;
183 EXPECT_TRUE(reader.PopInt32(&i));
184 EXPECT_EQ(int_1, i);
185
186 std::string str;
187 EXPECT_TRUE(reader.PopString(&str));
188 EXPECT_EQ(str_2, str);
189
190 EXPECT_TRUE(reader.PopString(&str));
191 EXPECT_EQ(str_3, str);
192
193 const uint8_t* bytes = nullptr;
194 size_t length = 0;
195 EXPECT_TRUE(reader.PopArrayOfBytes(&bytes, &length));
196 EXPECT_EQ(vec_4.size(), length);
197 EXPECT_THAT(vec_4, ElementsAreArray(bytes, length));
198
199 EXPECT_TRUE(reader.PopString(&str));
200 EXPECT_EQ(str_5, str);
201 }
202
203 // Pops items from the dbus message and compares them to the expected values.
204 ACTION_P3(PopStringInt64String, str_1, int_2, str_3) {
205 dbus::MessageReader reader(arg0);
206
207 std::string str;
208 EXPECT_TRUE(reader.PopString(&str));
209 EXPECT_EQ(str_1, str);
210
211 int64_t i;
212 EXPECT_TRUE(reader.PopInt64(&i));
213 EXPECT_EQ(int_2, i);
214
215 EXPECT_TRUE(reader.PopString(&str));
216 EXPECT_EQ(str_3, str);
217 }
218
219 // Pops items from the dbus message and compares them to the expected values.
220 ACTION_P5(PopStringStringsStringsStringBool,
221 str_1,
222 vec_2,
223 vec_3,
224 str_4,
225 bool_5) {
226 dbus::MessageReader reader(arg0);
227
228 std::string str;
229 EXPECT_TRUE(reader.PopString(&str));
230 EXPECT_EQ(str_1, str);
231
232 std::vector<std::string> strings;
233 EXPECT_TRUE(reader.PopArrayOfStrings(&strings));
234 EXPECT_EQ(vec_2, strings);
235
236 EXPECT_TRUE(reader.PopArrayOfStrings(&strings));
237 EXPECT_EQ(vec_3, strings);
238
239 EXPECT_TRUE(reader.PopString(&str));
240 EXPECT_EQ(str_4, str);
241
242 bool b;
243 EXPECT_TRUE(reader.PopBool(&b));
244 EXPECT_EQ(bool_5, b);
245 }
246
247 TEST_P(KWalletDBusTest, StartWalletd) {
248 // The receiver of the message takes ownership of the response object.
249 dbus::Response* response_success = dbus::Response::CreateEmpty().release();
250 dbus::MessageWriter writer(response_success);
251 writer.AppendInt32(0); // return code
252 writer.AppendString("dbus_name");
253 writer.AppendString(std::string()); // error message
254 writer.AppendInt32(100); // pid
255
256 std::vector<std::string> empty;
257
258 EXPECT_CALL(
259 *mock_klauncher_proxy_.get(),
260 MockCallMethodAndBlock(
261 Calls(kKLauncherInterface, "start_service_by_desktop_name"), _))
262 .WillOnce(DoAll(PopStringStringsStringsStringBool(
263 kwalletd_name_, empty, empty, std::string(), false),
264 Return(response_success)))
265 .WillOnce(Return(RespondEmpty()))
266 .WillOnce(Return(nullptr));
vasilii 2016/06/16 17:54:44 Here and below. Those WillOnce are extremely confu
cfroussios 2016/06/17 12:17:27 According to https://github.com/google/googletest/
vasilii 2016/06/17 14:43:40 That's why I mentioned different tests (or VerifyA
cfroussios 2016/06/20 13:00:43 Done.
267
268 EXPECT_TRUE(kwallet_dbus_.StartKWalletd());
269 EXPECT_FALSE(kwallet_dbus_.StartKWalletd());
270 EXPECT_FALSE(kwallet_dbus_.StartKWalletd());
271 }
272
273 TEST_P(KWalletDBusTest, IsEnabled) {
274 EXPECT_CALL(*mock_kwallet_proxy_.get(),
275 MockCallMethodAndBlock(Calls(kKWalletInterface, "isEnabled"), _))
276 .WillOnce(Return(RespondBool(false)))
277 .WillOnce(Return(RespondBool(true)))
278 .WillOnce(Return(RespondEmpty()))
279 .WillOnce(Return(nullptr));
280
281 bool is_enabled = true;
282 EXPECT_EQ(KWalletDBus::Error::SUCCESS, kwallet_dbus_.IsEnabled(&is_enabled));
283 EXPECT_FALSE(is_enabled);
284
285 is_enabled = false;
286 EXPECT_EQ(KWalletDBus::Error::SUCCESS, kwallet_dbus_.IsEnabled(&is_enabled));
287 EXPECT_TRUE(is_enabled);
288
289 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
290 kwallet_dbus_.IsEnabled(&is_enabled));
291 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
292 kwallet_dbus_.IsEnabled(&is_enabled));
293 }
294
295 TEST_P(KWalletDBusTest, NetworkWallet) {
296 EXPECT_CALL(
297 *mock_kwallet_proxy_.get(),
298 MockCallMethodAndBlock(Calls(kKWalletInterface, "networkWallet"), _))
299 .WillOnce(Return(RespondString("mock_wallet")))
300 .WillOnce(Return(RespondEmpty()))
301 .WillOnce(Return(nullptr));
302
303 std::string wallet;
304 EXPECT_EQ(KWalletDBus::Error::SUCCESS, kwallet_dbus_.NetworkWallet(&wallet));
305 EXPECT_EQ("mock_wallet", wallet);
306
307 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
308 kwallet_dbus_.NetworkWallet(&wallet));
309 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
310 kwallet_dbus_.NetworkWallet(&wallet));
311 }
312
313 TEST_P(KWalletDBusTest, HasEntry) {
314 EXPECT_CALL(*mock_kwallet_proxy_.get(),
315 MockCallMethodAndBlock(Calls(kKWalletInterface, "hasEntry"), _))
316 .WillOnce(DoAll(PopIntStringStringString(123, "folder", "realm", "app"),
317 Return(RespondBool(true))))
318 .WillOnce(Return(RespondEmpty()))
319 .WillOnce(Return(nullptr));
320
321 bool has_entry = false;
322 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
323 kwallet_dbus_.HasEntry(123, "folder", "realm", "app", &has_entry));
324 EXPECT_TRUE(has_entry);
325
326 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
327 kwallet_dbus_.HasEntry(123, "folder", "realm", "app", &has_entry));
328 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
329 kwallet_dbus_.HasEntry(123, "folder", "realm", "app", &has_entry));
330 }
331
332 TEST_P(KWalletDBusTest, ReadEntry) {
333 std::vector<uint8_t> bytes_expected = {1, 2, 1, 2};
334 EXPECT_CALL(*mock_kwallet_proxy_.get(),
335 MockCallMethodAndBlock(Calls(kKWalletInterface, "readEntry"), _))
336 .WillOnce(DoAll(
337 PopIntStringStringString(123, "folder", "realm", "app"),
338 Return(RespondBytes(bytes_expected.data(), bytes_expected.size()))))
339 .WillOnce(Return(RespondEmpty()))
340 .WillOnce(Return(nullptr));
341
342 std::vector<uint8_t> bytes;
343 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
344 kwallet_dbus_.ReadEntry(123, "folder", "realm", "app", &bytes));
345 EXPECT_EQ(bytes_expected, bytes);
346
347 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
348 kwallet_dbus_.ReadEntry(123, "folder", "realm", "app", &bytes));
349 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
350 kwallet_dbus_.ReadEntry(123, "folder", "realm", "app", &bytes));
351 }
352
353 TEST_P(KWalletDBusTest, EntryList) {
354 std::vector<std::string> strings_expected = {"one", "two"};
355 EXPECT_CALL(*mock_kwallet_proxy_.get(),
356 MockCallMethodAndBlock(Calls(kKWalletInterface, "entryList"), _))
357 .WillOnce(DoAll(PopIntStringString(123, "folder", "app"),
358 Return(RespondArrayOfStrings(strings_expected))))
359 .WillOnce(Return(RespondEmpty()))
360 .WillOnce(Return(nullptr));
361
362 std::vector<std::string> strings;
363 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
364 kwallet_dbus_.EntryList(123, "folder", "app", &strings));
365 EXPECT_EQ(strings_expected, strings);
366
367 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
368 kwallet_dbus_.EntryList(123, "folder", "app", &strings));
369 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
370 kwallet_dbus_.EntryList(123, "folder", "app", &strings));
371 }
372
373 TEST_P(KWalletDBusTest, RemoveEntry) {
374 EXPECT_CALL(
375 *mock_kwallet_proxy_.get(),
376 MockCallMethodAndBlock(Calls(kKWalletInterface, "removeEntry"), _))
377 .WillOnce(DoAll(PopIntStringStringString(123, "folder", "realm", "app"),
378 Return(RespondInt32(0))))
379 .WillOnce(Return(RespondEmpty()))
380 .WillOnce(Return(nullptr));
381
382 int ret;
383 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
384 kwallet_dbus_.RemoveEntry(123, "folder", "realm", "app", &ret));
385 EXPECT_EQ(0, ret);
386
387 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
388 kwallet_dbus_.RemoveEntry(123, "folder", "realm", "app", &ret));
389 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
390 kwallet_dbus_.RemoveEntry(123, "folder", "realm", "app", &ret));
391 }
392
393 TEST_P(KWalletDBusTest, WriteEntry) {
394 std::vector<uint8_t> bytes = {1, 2, 3, 1};
395 EXPECT_CALL(*mock_kwallet_proxy_.get(),
396 MockCallMethodAndBlock(Calls(kKWalletInterface, "writeEntry"), _))
397 .WillOnce(DoAll(
398 PopIntStringStringVectorString(123, "folder", "realm", bytes, "app"),
399 Return(RespondInt32(0))))
400 .WillOnce(Return(RespondEmpty()))
401 .WillOnce(Return(nullptr));
402
403 int ret;
404 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
405 kwallet_dbus_.WriteEntry(123, "folder", "realm", "app",
406 bytes.data(), bytes.size(), &ret));
407 EXPECT_EQ(0, ret);
408
409 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
410 kwallet_dbus_.WriteEntry(123, "folder", "realm", "app",
411 bytes.data(), bytes.size(), &ret));
412 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
413 kwallet_dbus_.WriteEntry(123, "folder", "realm", "app",
414 bytes.data(), bytes.size(), &ret));
415 }
416
417 TEST_P(KWalletDBusTest, Open) {
418 EXPECT_CALL(*mock_kwallet_proxy_.get(),
419 MockCallMethodAndBlock(Calls(kKWalletInterface, "open"), _))
420 .WillOnce(DoAll(PopStringInt64String("wallet", 0, "app"),
421 Return(RespondInt32(1234))))
422 .WillOnce(Return(RespondEmpty()))
423 .WillOnce(Return(nullptr));
424
425 int ret;
426 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
427 kwallet_dbus_.Open("wallet", "app", &ret));
428 EXPECT_EQ(1234, ret);
429
430 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
431 kwallet_dbus_.Open("wallet", "app", &ret));
432 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
433 kwallet_dbus_.Open("wallet", "app", &ret));
434 }
435
436 TEST_P(KWalletDBusTest, HasFolder) {
437 EXPECT_CALL(*mock_kwallet_proxy_.get(),
438 MockCallMethodAndBlock(Calls(kKWalletInterface, "hasFolder"), _))
439 .WillOnce(DoAll(PopIntStringString(123, "wallet", "app"),
440 Return(RespondBool(true))))
441 .WillOnce(Return(RespondEmpty()))
442 .WillOnce(Return(nullptr));
443
444 bool has_folder = false;
445 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
446 kwallet_dbus_.HasFolder(123, "wallet", "app", &has_folder));
447 EXPECT_EQ(true, has_folder);
448
449 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
450 kwallet_dbus_.HasFolder(123, "wallet", "app", &has_folder));
451 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
452 kwallet_dbus_.HasFolder(123, "wallet", "app", &has_folder));
453 }
454
455 TEST_P(KWalletDBusTest, CreateFolder) {
456 EXPECT_CALL(
457 *mock_kwallet_proxy_.get(),
458 MockCallMethodAndBlock(Calls(kKWalletInterface, "createFolder"), _))
459 .WillOnce(DoAll(PopIntStringString(123, "folder", "app"),
460 Return(RespondBool(true))))
461 .WillOnce(Return(RespondEmpty()))
462 .WillOnce(Return(nullptr));
463
464 bool created_folder = false;
465 EXPECT_EQ(KWalletDBus::Error::SUCCESS,
466 kwallet_dbus_.CreateFolder(123, "folder", "app", &created_folder));
467 EXPECT_EQ(true, created_folder);
468
469 EXPECT_EQ(KWalletDBus::Error::CANNOT_READ,
470 kwallet_dbus_.CreateFolder(123, "folder", "app", &created_folder));
471 EXPECT_EQ(KWalletDBus::Error::CANNOT_CONTACT,
472 kwallet_dbus_.CreateFolder(123, "folder", "app", &created_folder));
473 }
474
475 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698