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