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

Side by Side Diff: extensions/common/permissions/permission_message_test_util.cc

Issue 980353003: Extensions: Switch to new permission message system, part I (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup;rebase Created 5 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 2015 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 "extensions/common/permissions/permission_message_test_util.h"
6
7 #include <algorithm>
8 #include <iterator>
9
10 #include "base/strings/string_split.h"
11 #include "base/strings/string_util.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "extensions/common/permissions/permissions_data.h"
14
15 // TODO(treib): Remove the legacy messages once we've fully switched to the new
16 // permission message system.
17
18 namespace {
19
20 using extensions::CoalescedPermissionMessage;
21 using extensions::CoalescedPermissionMessages;
22
23 std::vector<base::string16> MakeVectorString16(const base::string16& str) {
24 return std::vector<base::string16>(1, str);
25 }
26
27 std::vector<base::string16> MakeVectorString16(const std::string& str) {
28 return MakeVectorString16(base::UTF8ToUTF16(str));
29 }
30
31 std::vector<base::string16> MakeVectorString16(const base::string16& str1,
32 const base::string16& str2) {
33 std::vector<base::string16> result;
34 result.push_back(str1);
35 result.push_back(str2);
36 return result;
37 }
38
39 std::vector<base::string16> MakeVectorString16(const std::string& str1,
40 const std::string& str2) {
41 return MakeVectorString16(base::UTF8ToUTF16(str1), base::UTF8ToUTF16(str2));
42 }
43
44 std::vector<base::string16> MakeVectorString16(
45 const std::vector<std::string>& vec) {
46 std::vector<base::string16> result;
47 for (const std::string& msg : vec)
48 result.push_back(base::UTF8ToUTF16(msg));
49 return result;
50 }
51
52 std::vector<std::vector<base::string16>> MakeVectorVectorString16(
53 const std::vector<std::string>& vec) {
54 return std::vector<std::vector<base::string16>>(1, MakeVectorString16(vec));
55 }
56
57 std::vector<std::vector<base::string16>> MakeVectorVectorString16(
58 const std::vector<base::string16>& vec) {
59 return std::vector<std::vector<base::string16>>(1, vec);
60 }
61
62 std::vector<std::vector<base::string16>> MakeVectorVectorString16(
63 const std::vector<std::vector<std::string>>& vecs) {
64 std::vector<std::vector<base::string16>> result;
65 for (const std::vector<std::string>& vec : vecs)
66 result.push_back(MakeVectorString16(vec));
67 return result;
68 }
69
70 // Returns the vector of messages in a human-readable string format, e.g.:
71 // { "Bar", "Baz" }
72 base::string16 MessagesVectorToString(
73 const std::vector<base::string16>& messages) {
74 if (messages.empty())
75 return base::ASCIIToUTF16("{}");
76 return base::ASCIIToUTF16("{ \"") +
77 JoinString(messages, base::ASCIIToUTF16("\", \"")) +
78 base::ASCIIToUTF16("\" }");
79 }
80
81 base::string16 MessagesToString(const CoalescedPermissionMessages& messages) {
82 std::vector<base::string16> messages_vec;
83 for (const CoalescedPermissionMessage& msg : messages)
84 messages_vec.push_back(msg.message());
85 return MessagesVectorToString(messages_vec);
86 }
87
88 std::vector<base::string16> SplitLegacyMessageDetails(
89 const base::string16& legacy_message_details) {
90 std::vector<base::string16> details;
91 base::SplitString(legacy_message_details, base::char16('\n'), &details);
92 return details;
93 }
94
95 bool CheckThatSubmessagesMatch(
96 const base::string16& message,
97 const base::string16& actual_legacy_message_details,
98 const std::vector<base::string16>& actual_submessages,
99 const std::vector<base::string16>& expected_submessages) {
100 bool result = true;
101
102 std::vector<base::string16> expected_sorted(expected_submessages);
103 std::sort(expected_sorted.begin(), expected_sorted.end());
104
105 std::vector<base::string16> actual_legacy_details =
106 SplitLegacyMessageDetails(actual_legacy_message_details);
107 std::sort(actual_legacy_details.begin(), actual_legacy_details.end());
108 if (expected_sorted != actual_legacy_details) {
109 // This is always a failure, even within an EXPECT_FALSE.
110 // Message: Expected details for "Message" to be { "Foo" }, but got
111 // { "Bar", "Baz" } in the legacy system
112 EXPECT_TRUE(false) << "Expected details for \"" << message << "\" to be "
Yoyo Zhou 2015/03/11 01:33:23 EXPECT_TRUE(false) can also be written as ADD_FAIL
Marc Treib 2015/03/11 13:08:52 Ah, nice! Thanks, done.
113 << MessagesVectorToString(expected_sorted)
114 << ", but got "
115 << MessagesVectorToString(actual_legacy_details)
116 << " in the legacy system";
117 result = false;
118 }
119
120 std::vector<base::string16> actual_sorted(actual_submessages);
121 std::sort(actual_sorted.begin(), actual_sorted.end());
122 if (actual_sorted != actual_submessages) {
123 // This is always a failure, even within an EXPECT_FALSE.
124 // Message: Expected submessages for "Message" to be { "Foo" }, but got
125 // { "Bar", "Baz" }
126 EXPECT_TRUE(false) << "Expected submessages for \"" << message
127 << "\" to be " << MessagesVectorToString(expected_sorted)
128 << ", but got " << MessagesVectorToString(actual_sorted);
129 result = false;
130 }
131
132 return result;
133 }
134
135 testing::AssertionResult VerifyHasPermissionMessageImpl(
136 const std::vector<base::string16>& actual_legacy_messages,
137 const std::vector<base::string16>& actual_legacy_message_details,
138 const CoalescedPermissionMessages& actual_messages,
139 const base::string16& expected_message,
140 const std::vector<base::string16>& expected_submessages) {
141 CHECK_EQ(actual_legacy_messages.size(), actual_legacy_message_details.size());
142
143 auto legacy_message_it =
144 std::find(actual_legacy_messages.begin(), actual_legacy_messages.end(),
145 expected_message);
146 bool legacy_found = legacy_message_it != actual_legacy_messages.end();
147
148 auto message_it =
149 std::find_if(actual_messages.begin(), actual_messages.end(),
150 [&expected_message](const CoalescedPermissionMessage& msg) {
151 return msg.message() == expected_message;
152 });
153 bool found = message_it != actual_messages.end();
154
155 if (legacy_found != found) {
156 // This is always a failure, even within an EXPECT_FALSE.
157 EXPECT_TRUE(false)
158 << "Mismatch between legacy and new system when looking for \""
159 << expected_message << "\": Got "
160 << MessagesVectorToString(actual_legacy_messages)
161 << " in the legacy system, but " << MessagesToString(actual_messages)
162 << " in the new system";
163 return testing::AssertionFailure();
164 }
165
166 if (!found) {
167 // Message: Expected messages to contain "Foo", but got { "Bar", "Baz" }
168 // in the legacy system
169 return testing::AssertionFailure() << "Expected messages to contain \""
170 << expected_message << "\", but got "
171 << MessagesToString(actual_messages);
172 }
173
174 auto legacy_message_details_it =
175 actual_legacy_message_details.begin() +
176 std::distance(actual_legacy_messages.begin(), legacy_message_it);
177 if (!CheckThatSubmessagesMatch(expected_message, *legacy_message_details_it,
178 message_it->submessages(),
179 expected_submessages)) {
180 return testing::AssertionFailure();
181 }
182
183 // Message: Expected messages NOT to contain "Foo", but got { "Bar", "Baz" }
184 return testing::AssertionSuccess() << "Expected messages NOT to contain \""
185 << expected_message << "\", but got "
186 << MessagesToString(actual_messages);
187 }
188
189 } // namespace
190
191 namespace extensions {
192
193 testing::AssertionResult VerifyHasPermissionMessage(
194 const PermissionsData* permissions_data,
195 const std::string& expected_message) {
196 return VerifyHasPermissionMessage(permissions_data,
197 base::UTF8ToUTF16(expected_message));
198 }
199
200 testing::AssertionResult VerifyHasPermissionMessage(
201 const PermissionsData* permissions_data,
202 const base::string16& expected_message) {
203 return VerifyHasPermissionMessageImpl(
204 permissions_data->GetLegacyPermissionMessageStrings(),
205 permissions_data->GetLegacyPermissionMessageDetailsStrings(),
206 permissions_data->GetCoalescedPermissionMessages(), expected_message,
207 std::vector<base::string16>());
208 }
209
210 testing::AssertionResult VerifyNoPermissionMessages(
211 const PermissionsData* permissions_data) {
212 return VerifyPermissionMessages(permissions_data,
213 std::vector<base::string16>(), true);
214 }
215
216 testing::AssertionResult VerifyOnePermissionMessage(
217 const PermissionsData* permissions_data,
218 const std::string& expected_message) {
219 return VerifyPermissionMessages(permissions_data,
220 MakeVectorString16(expected_message), true);
221 }
222
223 testing::AssertionResult VerifyOnePermissionMessage(
224 const PermissionsData* permissions_data,
225 const base::string16& expected_message) {
226 return VerifyPermissionMessages(permissions_data,
227 MakeVectorString16(expected_message), true);
228 }
229
230 testing::AssertionResult VerifyOnePermissionMessageWithSubmessages(
231 const PermissionsData* permissions_data,
232 const std::string& expected_message,
233 const std::vector<std::string>& expected_submessages) {
234 return VerifyPermissionMessagesWithSubmessages(
235 permissions_data, MakeVectorString16(expected_message),
236 MakeVectorVectorString16(expected_submessages), true);
237 }
238
239 testing::AssertionResult VerifyOnePermissionMessageWithSubmessages(
240 const PermissionsData* permissions_data,
241 const base::string16& expected_message,
242 const std::vector<base::string16>& expected_submessages) {
243 return VerifyPermissionMessagesWithSubmessages(
244 permissions_data, MakeVectorString16(expected_message),
245 MakeVectorVectorString16(expected_submessages), true);
246 }
247
248 testing::AssertionResult VerifyTwoPermissionMessages(
249 const PermissionsData* permissions_data,
250 const std::string& expected_message_1,
251 const std::string& expected_message_2,
252 bool check_order) {
253 return VerifyPermissionMessages(
254 permissions_data,
255 MakeVectorString16(expected_message_1, expected_message_2), check_order);
256 }
257
258 testing::AssertionResult VerifyTwoPermissionMessages(
259 const PermissionsData* permissions_data,
260 const base::string16& expected_message_1,
261 const base::string16& expected_message_2,
262 bool check_order) {
263 return VerifyPermissionMessages(
264 permissions_data,
265 MakeVectorString16(expected_message_1, expected_message_2), check_order);
266 }
267
268 testing::AssertionResult VerifyPermissionMessages(
269 const PermissionsData* permissions_data,
270 const std::vector<std::string>& expected_messages,
271 bool check_order) {
272 return VerifyPermissionMessages(
273 permissions_data, MakeVectorString16(expected_messages), check_order);
274 }
275
276 testing::AssertionResult VerifyPermissionMessages(
277 const PermissionsData* permissions_data,
278 const std::vector<base::string16>& expected_messages,
279 bool check_order) {
280 return VerifyPermissionMessagesWithSubmessages(
281 permissions_data, expected_messages,
282 std::vector<std::vector<base::string16>>(expected_messages.size()),
283 check_order);
284 }
285
286 testing::AssertionResult VerifyPermissionMessagesWithSubmessages(
287 const PermissionsData* permissions_data,
288 const std::vector<std::string>& expected_messages,
289 const std::vector<std::vector<std::string>>& expected_submessages,
290 bool check_order) {
291 return VerifyPermissionMessagesWithSubmessages(
292 permissions_data, MakeVectorString16(expected_messages),
293 MakeVectorVectorString16(expected_submessages), check_order);
294 }
295
296 testing::AssertionResult VerifyPermissionMessagesWithSubmessages(
297 const PermissionsData* permissions_data,
298 const std::vector<base::string16>& expected_messages,
299 const std::vector<std::vector<base::string16>>& expected_submessages,
300 bool check_order) {
301 CHECK_EQ(expected_messages.size(), expected_submessages.size());
302
303 std::vector<base::string16> actual_legacy_messages =
304 permissions_data->GetLegacyPermissionMessageStrings();
305 std::vector<base::string16> actual_legacy_message_details =
306 permissions_data->GetLegacyPermissionMessageDetailsStrings();
307 if (expected_messages.size() != actual_legacy_messages.size()) {
308 // Message: Expected 2 messages { "Bar", "Baz" }, but got 0 {} in the
309 // legacy system
310 return testing::AssertionFailure()
311 << "Expected " << expected_messages.size() << " messages "
Yoyo Zhou 2015/03/11 01:33:23 Since messages can get rather long, it might be be
Marc Treib 2015/03/11 13:08:52 Done.
312 << MessagesVectorToString(expected_messages) << ", but got"
313 << actual_legacy_messages.size() << " "
314 << MessagesVectorToString(actual_legacy_messages)
315 << " in the legacy system";
316 }
317
318 CoalescedPermissionMessages actual_messages =
319 permissions_data->GetCoalescedPermissionMessages();
320 if (expected_messages.size() != actual_messages.size()) {
321 // Message: Expected 2 messages { "Bar", "Baz" }, but got 0 {}
322 return testing::AssertionFailure()
323 << "Expected " << expected_messages.size() << " messages "
324 << MessagesVectorToString(expected_messages) << ", but got"
325 << actual_messages.size() << " "
326 << MessagesToString(actual_messages);
327 }
328
329 if (check_order) {
330 auto msg_it = actual_messages.begin();
331 for (size_t i = 0; i < expected_messages.size(); i++, msg_it++) {
332 const base::string16& expected_message = expected_messages[i];
333
334 if (expected_message != actual_legacy_messages[i]) {
335 // Message: Expected messages to be { "Foo" }, but got { "Bar", "Baz" }
336 // in the legacy system
337 return testing::AssertionFailure()
338 << "Expected messages to be "
339 << MessagesVectorToString(expected_messages) << ", but got "
340 << MessagesVectorToString(actual_legacy_messages)
341 << " in the legacy system";
342 }
343
344 if (expected_message != msg_it->message()) {
345 // Message: Expected messages to be { "Foo" }, but got { "Bar", "Baz" }
346 return testing::AssertionFailure()
347 << "Expected messages to be "
348 << MessagesVectorToString(expected_messages) << ", but got "
349 << MessagesToString(actual_messages);
350 }
351
352 if (!CheckThatSubmessagesMatch(
353 expected_message, actual_legacy_message_details[i],
354 msg_it->submessages(), expected_submessages[i])) {
355 return testing::AssertionFailure();
356 }
357 }
358 } else {
359 for (size_t i = 0; i < expected_messages.size(); i++) {
360 testing::AssertionResult result = VerifyHasPermissionMessageImpl(
361 actual_legacy_messages, actual_legacy_message_details,
362 actual_messages, expected_messages[i], expected_submessages[i]);
363 if (!result)
364 return result;
365 }
366 }
367 return testing::AssertionSuccess();
368 }
369
370 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698