// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/updater/lib_util.h"

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

namespace updater {

// Characters that must be percent-encoded.
TEST(UnescapeUrlComponentTest, ReservedCharacters) {
  std::map<base::StringPiece, base::StringPiece> reserved_characters = {
      {"!", "%21"}, {"#", "%23"}, {"$", "%24"}, {"%", "%25"}, {"&", "%26"},
      {"'", "%27"}, {"(", "%28"}, {")", "%29"}, {"*", "%2A"}, {"+", "%2B"},
      {",", "%2C"}, {"/", "%2F"}, {":", "%3A"}, {";", "%3B"}, {"=", "%3D"},
      {"?", "%3F"}, {"@", "%40"}, {"[", "%5B"}, {"]", "%5D"}};

  for (auto pair : reserved_characters) {
    EXPECT_EQ(pair.first, UnescapeURLComponent(pair.second));
  }

  for (auto pair : reserved_characters) {
    // If input contains a reserved character, just ignore it.
    std::string escaped_includes_reserved = pair.first.as_string() + "%20";
    std::string unescaped = pair.first.as_string() + " ";
    EXPECT_EQ(unescaped, UnescapeURLComponent(escaped_includes_reserved));
  }
}

TEST(UnescapeUrlComponentTest, CommonCharacters) {
  std::map<base::StringPiece, base::StringPiece> common_characters = {
      {"\n", "%0A"}, {"\r", "%0D"},   {" ", "%20"},       {"\"", "%22"},
      {"%", "%25"},  {"-", "%2D"},    {".", "%2E"},       {"<", "%3C"},
      {">", "%3E"},  {"\\", "%5C"},   {"^", "%5E"},       {"_", "%5F"},
      {"`", "%60"},  {"{", "%7B"},    {"|", "%7C"},       {"}", "%7D"},
      {"~", "%7E"},  {"£", "%C2%A3"}, {"円", "%E5%86%86"}};

  for (auto pair : common_characters) {
    EXPECT_EQ(pair.first, UnescapeURLComponent(pair.second));
  }
}

TEST(UnescapeUrlComponentTest, MixedEscapedAndUnicode) {
  EXPECT_EQ("££", UnescapeURLComponent("£%C2%A3"));
}

}  // namespace updater
