OLD | NEW |
---|---|
(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 | |
OLD | NEW |