910e62b5创建于 1月15日历史提交
// Copyright 2019 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/error_utils.h"

#include <string_view>

#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {
namespace {

// Tests ErrorUtils::FormatErrorMessage which takes two placeholders.
TEST(ErrorUtils, FormatErrorMessage_Success) {
  struct {
    std::string_view format;
    std::string_view s1;
    std::string_view s2;
    const char* expected;
  } cases[] = {
      {"Hello * Bye *", "arg1", "arg2", "Hello arg1 Bye arg2"},
      // Ensure substitutions respect the size of the string_view.
      {"Hello * Bye *", std::string_view("12345", 2), "3", "Hello 12 Bye 3"},
      // Regression test for crbug.com/928415.
      {"Hello * Bye *", "*arg1", "*arg2", "Hello *arg1 Bye *arg2"},
  };

  for (const auto& test_case : cases) {
    SCOPED_TRACE(test_case.format);

    EXPECT_EQ(test_case.expected,
              ErrorUtils::FormatErrorMessage(test_case.format, test_case.s1,
                                             test_case.s2));
    EXPECT_EQ(base::UTF8ToUTF16(test_case.expected),
              ErrorUtils::FormatErrorMessageUTF16(test_case.format,
                                                  test_case.s1, test_case.s2));
  }
}

#if defined(GTEST_HAS_DEATH_TEST)
// Tests that we raise an error if the number of placeholders and substitution
// arguments are not equal.
TEST(ErrorUtils, FormatErrorMessage_Death) {
  struct {
    std::string_view format;
    std::string_view s1;
    std::string_view s2;
    const char* death_message_regex;
  } cases[] = {{"Hello * Bye * *", "arg1", "arg2", "More placeholders"},
               {"Hello * Bye", "arg1", "arg2", "Fewer placeholders"}};

  auto get_death_regex = [](const char* death_message_regex) {
// String arguments aren't passed to CHECK() in official builds.
#if defined(OFFICIAL_BUILD) && defined(NDEBUG)
    return "";
#else
    return death_message_regex;
#endif
  };

  for (const auto& test_case : cases) {
    SCOPED_TRACE(test_case.format);

    EXPECT_DEATH(ErrorUtils::FormatErrorMessage(test_case.format, test_case.s1,
                                                test_case.s2),
                 get_death_regex(test_case.death_message_regex));
    EXPECT_DEATH(ErrorUtils::FormatErrorMessageUTF16(
                     test_case.format, test_case.s1, test_case.s2),
                 get_death_regex(test_case.death_message_regex));
  }
}
#endif  // defined(GTEST_HAS_DEATH_TEST)

}  // namespace
}  // namespace extensions