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

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: review (the easy parts) 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 concatenated into a single string, separated
71 // by newlines, e.g.: "Bar"\n"Baz"\n
72 base::string16 MessagesVectorToString(
73 const std::vector<base::string16>& messages) {
74 if (messages.empty())
75 return base::ASCIIToUTF16("\n");
76 return base::ASCIIToUTF16("\"") +
77 JoinString(messages, base::ASCIIToUTF16("\"\n\"")) +
78 base::ASCIIToUTF16("\"\n");
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 ADD_FAILURE() << "Expected details for \"" << message << "\" to be:\n"
113 << MessagesVectorToString(expected_sorted) << "But got:\n"
114 << MessagesVectorToString(actual_legacy_details)
115 << "in the legacy system";
116 result = false;
117 }
118
119 std::vector<base::string16> actual_sorted(actual_submessages);
120 std::sort(actual_sorted.begin(), actual_sorted.end());
121 if (actual_sorted != actual_submessages) {
122 // This is always a failure, even within an EXPECT_FALSE.
123 // Message: Expected submessages for "Message" to be { "Foo" }, but got
124 // { "Bar", "Baz" }
125 ADD_FAILURE() << "Expected submessages for \"" << message << "\" to be:\n"
126 << MessagesVectorToString(expected_sorted) << "But got:\n"
127 << MessagesVectorToString(actual_sorted);
128 result = false;
129 }
130
131 return result;
132 }
133
134 testing::AssertionResult VerifyHasPermissionMessageImpl(
135 const std::vector<base::string16>& actual_legacy_messages,
136 const std::vector<base::string16>& actual_legacy_message_details,
137 const CoalescedPermissionMessages& actual_messages,
138 const base::string16& expected_message,
139 const std::vector<base::string16>& expected_submessages) {
140 CHECK_EQ(actual_legacy_messages.size(), actual_legacy_message_details.size());
141
142 auto legacy_message_it =
143 std::find(actual_legacy_messages.begin(), actual_legacy_messages.end(),
144 expected_message);
145 bool legacy_found = legacy_message_it != actual_legacy_messages.end();
146
147 auto message_it =
148 std::find_if(actual_messages.begin(), actual_messages.end(),
149 [&expected_message](const CoalescedPermissionMessage& msg) {
150 return msg.message() == expected_message;
151 });
152 bool found = message_it != actual_messages.end();
153
154 if (legacy_found != found) {
155 // This is always a failure, even within an EXPECT_FALSE.
156 ADD_FAILURE()
157 << "Mismatch between legacy and new system when looking for \""
158 << expected_message << "\".\nLegacy system returned:\n"
159 << MessagesVectorToString(actual_legacy_messages)
160 << "New system returned:\n" << MessagesToString(actual_messages);
161 return testing::AssertionFailure();
162 }
163
164 if (!found) {
165 // Message: Expected messages to contain "Foo", but got { "Bar", "Baz" }
166 // in the legacy system
167 return testing::AssertionFailure() << "Expected messages to contain \""
168 << expected_message << "\", but got "
169 << MessagesToString(actual_messages);
170 }
171
172 auto legacy_message_details_it =
173 actual_legacy_message_details.begin() +
174 std::distance(actual_legacy_messages.begin(), legacy_message_it);
175 if (!CheckThatSubmessagesMatch(expected_message, *legacy_message_details_it,
176 message_it->submessages(),
177 expected_submessages)) {
178 return testing::AssertionFailure();
179 }
180
181 // Message: Expected messages NOT to contain "Foo", but got { "Bar", "Baz" }
182 return testing::AssertionSuccess() << "Expected messages NOT to contain \""
183 << expected_message << "\", but got "
184 << MessagesToString(actual_messages);
185 }
186
187 } // namespace
188
189 namespace extensions {
190
191 testing::AssertionResult VerifyHasPermissionMessage(
192 const PermissionsData* permissions_data,
193 const std::string& expected_message) {
194 return VerifyHasPermissionMessage(permissions_data,
195 base::UTF8ToUTF16(expected_message));
196 }
197
198 testing::AssertionResult VerifyHasPermissionMessage(
199 const PermissionsData* permissions_data,
200 const base::string16& expected_message) {
201 return VerifyHasPermissionMessageImpl(
202 permissions_data->GetLegacyPermissionMessageStrings(),
203 permissions_data->GetLegacyPermissionMessageDetailsStrings(),
204 permissions_data->GetCoalescedPermissionMessages(), expected_message,
205 std::vector<base::string16>());
206 }
207
208 testing::AssertionResult VerifyNoPermissionMessages(
209 const PermissionsData* permissions_data) {
210 return VerifyPermissionMessages(permissions_data,
211 std::vector<base::string16>(), true);
212 }
213
214 testing::AssertionResult VerifyOnePermissionMessage(
215 const PermissionsData* permissions_data,
216 const std::string& expected_message) {
217 return VerifyPermissionMessages(permissions_data,
218 MakeVectorString16(expected_message), true);
219 }
220
221 testing::AssertionResult VerifyOnePermissionMessage(
222 const PermissionsData* permissions_data,
223 const base::string16& expected_message) {
224 return VerifyPermissionMessages(permissions_data,
225 MakeVectorString16(expected_message), true);
226 }
227
228 testing::AssertionResult VerifyOnePermissionMessageWithSubmessages(
229 const PermissionsData* permissions_data,
230 const std::string& expected_message,
231 const std::vector<std::string>& expected_submessages) {
232 return VerifyPermissionMessagesWithSubmessages(
233 permissions_data, MakeVectorString16(expected_message),
234 MakeVectorVectorString16(expected_submessages), true);
235 }
236
237 testing::AssertionResult VerifyOnePermissionMessageWithSubmessages(
238 const PermissionsData* permissions_data,
239 const base::string16& expected_message,
240 const std::vector<base::string16>& expected_submessages) {
241 return VerifyPermissionMessagesWithSubmessages(
242 permissions_data, MakeVectorString16(expected_message),
243 MakeVectorVectorString16(expected_submessages), true);
244 }
245
246 testing::AssertionResult VerifyTwoPermissionMessages(
247 const PermissionsData* permissions_data,
248 const std::string& expected_message_1,
249 const std::string& expected_message_2,
250 bool check_order) {
251 return VerifyPermissionMessages(
252 permissions_data,
253 MakeVectorString16(expected_message_1, expected_message_2), check_order);
254 }
255
256 testing::AssertionResult VerifyTwoPermissionMessages(
257 const PermissionsData* permissions_data,
258 const base::string16& expected_message_1,
259 const base::string16& expected_message_2,
260 bool check_order) {
261 return VerifyPermissionMessages(
262 permissions_data,
263 MakeVectorString16(expected_message_1, expected_message_2), check_order);
264 }
265
266 testing::AssertionResult VerifyPermissionMessages(
267 const PermissionsData* permissions_data,
268 const std::vector<std::string>& expected_messages,
269 bool check_order) {
270 return VerifyPermissionMessages(
271 permissions_data, MakeVectorString16(expected_messages), check_order);
272 }
273
274 testing::AssertionResult VerifyPermissionMessages(
275 const PermissionsData* permissions_data,
276 const std::vector<base::string16>& expected_messages,
277 bool check_order) {
278 return VerifyPermissionMessagesWithSubmessages(
279 permissions_data, expected_messages,
280 std::vector<std::vector<base::string16>>(expected_messages.size()),
281 check_order);
282 }
283
284 testing::AssertionResult VerifyPermissionMessagesWithSubmessages(
285 const PermissionsData* permissions_data,
286 const std::vector<std::string>& expected_messages,
287 const std::vector<std::vector<std::string>>& expected_submessages,
288 bool check_order) {
289 return VerifyPermissionMessagesWithSubmessages(
290 permissions_data, MakeVectorString16(expected_messages),
291 MakeVectorVectorString16(expected_submessages), check_order);
292 }
293
294 testing::AssertionResult VerifyPermissionMessagesWithSubmessages(
295 const PermissionsData* permissions_data,
296 const std::vector<base::string16>& expected_messages,
297 const std::vector<std::vector<base::string16>>& expected_submessages,
298 bool check_order) {
299 CHECK_EQ(expected_messages.size(), expected_submessages.size());
300
301 std::vector<base::string16> actual_legacy_messages =
302 permissions_data->GetLegacyPermissionMessageStrings();
303 std::vector<base::string16> actual_legacy_message_details =
304 permissions_data->GetLegacyPermissionMessageDetailsStrings();
305 if (expected_messages.size() != actual_legacy_messages.size()) {
306 // Message: Expected 2 messages { "Bar", "Baz" }, but got 0 {} in the
307 // legacy system
308 return testing::AssertionFailure()
309 << "Expected " << expected_messages.size() << " messages:\n"
310 << MessagesVectorToString(expected_messages) << "But got "
311 << actual_legacy_messages.size() << " messages:\n"
312 << MessagesVectorToString(actual_legacy_messages)
313 << "in the legacy system";
314 }
315
316 CoalescedPermissionMessages actual_messages =
317 permissions_data->GetCoalescedPermissionMessages();
318 if (expected_messages.size() != actual_messages.size()) {
319 // Message: Expected 2 messages { "Bar", "Baz" }, but got 0 {}
320 return testing::AssertionFailure()
321 << "Expected " << expected_messages.size() << " messages:\n"
322 << MessagesVectorToString(expected_messages) << "But got "
323 << actual_messages.size() << " messages:\n"
324 << MessagesToString(actual_messages);
325 }
326
327 if (check_order) {
328 auto msg_it = actual_messages.begin();
329 for (size_t i = 0; i < expected_messages.size(); i++, msg_it++) {
330 const base::string16& expected_message = expected_messages[i];
331
332 if (expected_message != actual_legacy_messages[i]) {
333 // Message: Expected messages to be { "Foo" }, but got { "Bar", "Baz" }
334 // in the legacy system
335 return testing::AssertionFailure()
336 << "Expected messages to be:\n"
337 << MessagesVectorToString(expected_messages) << "But got:\n"
338 << MessagesVectorToString(actual_legacy_messages)
339 << "in the legacy system";
340 }
341
342 if (expected_message != msg_it->message()) {
343 // Message: Expected messages to be { "Foo" }, but got { "Bar", "Baz" }
344 return testing::AssertionFailure()
345 << "Expected messages to be:\n"
346 << MessagesVectorToString(expected_messages) << "But got:\n"
347 << MessagesToString(actual_messages);
348 }
349
350 if (!CheckThatSubmessagesMatch(
351 expected_message, actual_legacy_message_details[i],
352 msg_it->submessages(), expected_submessages[i])) {
353 return testing::AssertionFailure();
354 }
355 }
356 } else {
357 for (size_t i = 0; i < expected_messages.size(); i++) {
358 testing::AssertionResult result = VerifyHasPermissionMessageImpl(
359 actual_legacy_messages, actual_legacy_message_details,
360 actual_messages, expected_messages[i], expected_submessages[i]);
361 if (!result)
362 return result;
363 }
364 }
365 return testing::AssertionSuccess();
366 }
367
368 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698