Chromium Code Reviews| OLD | NEW |
|---|---|
| (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 | |
| OLD | NEW |