blob: 0766a13a5bd8f3030408d9fc9d862ae698bbb281 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/common/permissions/permission_message_test_util.h"
#include <stddef.h>
#include <iterator>
#include "base/logging.h"
#include "base/ranges/algorithm.h"
#include "base/strings/strcat.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "extensions/common/permissions/permission_message_provider.h"
#include "extensions/common/permissions/permissions_data.h"
namespace extensions {
namespace {
PermissionMessages GetMessages(const PermissionSet& permissions,
Manifest::Type extension_type) {
const PermissionMessageProvider* provider = PermissionMessageProvider::Get();
return provider->GetPermissionMessages(
provider->GetAllPermissionIDs(permissions, extension_type));
}
std::vector<std::u16string> MakeVectorString16(
const std::vector<std::string>& vec) {
std::vector<std::u16string> result;
for (const std::string& msg : vec)
result.push_back(base::UTF8ToUTF16(msg));
return result;
}
std::vector<std::vector<std::u16string>> MakeVectorVectorString16(
const std::vector<std::vector<std::string>>& vecs) {
std::vector<std::vector<std::u16string>> result;
for (const std::vector<std::string>& vec : vecs)
result.push_back(MakeVectorString16(vec));
return result;
}
// Returns the vector of messages concatenated into a single string, separated
// by newlines, e.g.: "Bar"\n"Baz"\n
std::string MessagesVectorToString(
const std::vector<std::u16string>& messages) {
if (messages.empty())
return "\n";
return base::StrCat(
{"\"", base::UTF16ToUTF8(base::JoinString(messages, u"\"\n\"")), "\"\n"});
}
std::string MessagesToString(const PermissionMessages& messages) {
std::vector<std::u16string> messages_vec;
for (const PermissionMessage& msg : messages)
messages_vec.push_back(msg.message());
return MessagesVectorToString(messages_vec);
}
bool CheckThatSubmessagesMatch(
const std::u16string& message,
const std::vector<std::u16string>& expected_submessages,
const std::vector<std::u16string>& actual_submessages) {
bool result = true;
std::vector<std::u16string> expected_sorted(expected_submessages);
std::sort(expected_sorted.begin(), expected_sorted.end());
std::vector<std::u16string> actual_sorted(actual_submessages);
std::sort(actual_sorted.begin(), actual_sorted.end());
if (expected_sorted != actual_sorted) {
// This is always a failure, even within an EXPECT_FALSE.
// Message: Expected submessages for "Message" to be { "Foo" }, but got
// { "Bar", "Baz" }
ADD_FAILURE() << "Expected submessages for \"" << message << "\" to be:\n"
<< MessagesVectorToString(expected_sorted) << "But got:\n"
<< MessagesVectorToString(actual_sorted);
result = false;
}
return result;
}
testing::AssertionResult VerifyHasPermissionMessageImpl(
const std::u16string& expected_message,
const std::vector<std::u16string>& expected_submessages,
const PermissionMessages& actual_messages) {
auto message_it = base::ranges::find(actual_messages, expected_message,
&PermissionMessage::message);
bool found = message_it != actual_messages.end();
if (!found) {
// Message: Expected messages to contain "Foo", but got { "Bar", "Baz" }
return testing::AssertionFailure() << "Expected messages to contain \""
<< expected_message << "\", but got "
<< MessagesToString(actual_messages);
}
if (!CheckThatSubmessagesMatch(expected_message, expected_submessages,
message_it->submessages())) {
return testing::AssertionFailure();
}
// Message: Expected messages NOT to contain "Foo", but got { "Bar", "Baz" }
return testing::AssertionSuccess() << "Expected messages NOT to contain \""
<< expected_message << "\", but got "
<< MessagesToString(actual_messages);
}
testing::AssertionResult VerifyPermissionMessagesWithSubmessagesImpl(
const std::vector<std::u16string>& expected_messages,
const std::vector<std::vector<std::u16string>>& expected_submessages,
const PermissionMessages& actual_messages,
bool check_order) {
CHECK_EQ(expected_messages.size(), expected_submessages.size());
if (expected_messages.size() != actual_messages.size()) {
// Message: Expected 2 messages { "Bar", "Baz" }, but got 0 {}
return testing::AssertionFailure()
<< "Expected " << expected_messages.size() << " messages:\n"
<< MessagesVectorToString(expected_messages) << "But got "
<< actual_messages.size() << " messages:\n"
<< MessagesToString(actual_messages);
}
if (check_order) {
auto it = actual_messages.begin();
for (size_t i = 0; i < expected_messages.size(); i++, ++it) {
const PermissionMessage& actual_message = *it;
if (expected_messages[i] != actual_message.message()) {
// Message: Expected messages to be { "Foo" }, but got { "Bar", "Baz" }
return testing::AssertionFailure()
<< "Expected messages to be:\n"
<< MessagesVectorToString(expected_messages) << "But got:\n"
<< MessagesToString(actual_messages);
}
if (!CheckThatSubmessagesMatch(expected_messages[i],
expected_submessages[i],
actual_message.submessages())) {
return testing::AssertionFailure();
}
}
} else {
for (size_t i = 0; i < expected_messages.size(); i++) {
testing::AssertionResult result = VerifyHasPermissionMessageImpl(
expected_messages[i], expected_submessages[i], actual_messages);
if (!result)
return result;
}
}
return testing::AssertionSuccess();
}
} // namespace
testing::AssertionResult VerifyHasPermissionMessage(
const PermissionsData* permissions_data,
const std::u16string& expected_message) {
return VerifyHasPermissionMessageImpl(
expected_message, {}, permissions_data->GetPermissionMessages());
}
testing::AssertionResult VerifyHasPermissionMessage(
const PermissionSet& permissions,
Manifest::Type extension_type,
const std::string& expected_message) {
return VerifyHasPermissionMessageImpl(
base::UTF8ToUTF16(expected_message), {},
GetMessages(permissions, extension_type));
}
testing::AssertionResult VerifyNoPermissionMessages(
const PermissionsData* permissions_data) {
return VerifyPermissionMessages(permissions_data,
std::vector<std::u16string>(), true);
}
testing::AssertionResult VerifyOnePermissionMessage(
const PermissionsData* permissions_data,
const std::string& expected_message) {
return VerifyOnePermissionMessage(permissions_data,
base::UTF8ToUTF16(expected_message));
}
testing::AssertionResult VerifyOnePermissionMessage(
const PermissionsData* permissions_data,
const std::u16string& expected_message) {
return VerifyPermissionMessages(permissions_data, {expected_message}, true);
}
testing::AssertionResult VerifyOnePermissionMessage(
const PermissionSet& permissions,
Manifest::Type extension_type,
const std::u16string& expected_message) {
return VerifyPermissionMessagesWithSubmessagesImpl(
{expected_message}, std::vector<std::vector<std::u16string>>(1),
GetMessages(permissions, extension_type), true);
}
testing::AssertionResult VerifyOnePermissionMessageWithSubmessages(
const PermissionsData* permissions_data,
const std::string& expected_message,
const std::vector<std::string>& expected_submessages) {
return VerifyPermissionMessagesWithSubmessages(
permissions_data, {expected_message}, {expected_submessages}, true);
}
testing::AssertionResult VerifyTwoPermissionMessages(
const PermissionsData* permissions_data,
const std::string& expected_message_1,
const std::string& expected_message_2,
bool check_order) {
return VerifyPermissionMessages(permissions_data,
{base::UTF8ToUTF16(expected_message_1),
base::UTF8ToUTF16(expected_message_2)},
check_order);
}
testing::AssertionResult VerifyPermissionMessages(
const PermissionsData* permissions_data,
const std::vector<std::string>& expected_messages,
bool check_order) {
return VerifyPermissionMessages(
permissions_data, MakeVectorString16(expected_messages), check_order);
}
testing::AssertionResult VerifyPermissionMessages(
const PermissionsData* permissions_data,
const std::vector<std::u16string>& expected_messages,
bool check_order) {
return VerifyPermissionMessagesWithSubmessages(
permissions_data, expected_messages,
std::vector<std::vector<std::u16string>>(expected_messages.size()),
check_order);
}
testing::AssertionResult VerifyPermissionMessagesWithSubmessages(
const PermissionsData* permissions_data,
const std::vector<std::string>& expected_messages,
const std::vector<std::vector<std::string>>& expected_submessages,
bool check_order) {
return VerifyPermissionMessagesWithSubmessages(
permissions_data, MakeVectorString16(expected_messages),
MakeVectorVectorString16(expected_submessages), check_order);
}
testing::AssertionResult VerifyPermissionMessagesWithSubmessages(
const PermissionsData* permissions_data,
const std::vector<std::u16string>& expected_messages,
const std::vector<std::vector<std::u16string>>& expected_submessages,
bool check_order) {
CHECK_EQ(expected_messages.size(), expected_submessages.size());
return VerifyPermissionMessagesWithSubmessagesImpl(
expected_messages, expected_submessages,
permissions_data->GetPermissionMessages(), check_order);
}
} // namespace extensions