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