// Copyright 2019 The Fuchsia 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 "src/modular/lib/base64url/base64url.h"

#include <gtest/gtest.h>

namespace base64url {
namespace {

TEST(Base64UrlTest, Base64UrlEncode) {
  // These examples are from RFC 4648.
  EXPECT_EQ(Base64UrlEncode(""), "");
  EXPECT_EQ(Base64UrlEncode("f"), "Zg==");
  EXPECT_EQ(Base64UrlEncode("fo"), "Zm8=");
  EXPECT_EQ(Base64UrlEncode("foo"), "Zm9v");
  EXPECT_EQ(Base64UrlEncode("foob"), "Zm9vYg==");
  EXPECT_EQ(Base64UrlEncode("fooba"), "Zm9vYmE=");
  EXPECT_EQ(Base64UrlEncode("foobar"), "Zm9vYmFy");

  // Extra tests for URL safe version.
  EXPECT_EQ(Base64UrlEncode(".s>"), "LnM-");
  EXPECT_EQ(Base64UrlEncode(".s?"), "LnM_");
}

TEST(Base64UrlTest, Base64UrlDecode) {
  std::string decoded;

  // These examples are from RFC 4648.
  EXPECT_TRUE(Base64UrlDecode("", &decoded));
  EXPECT_EQ(decoded, "");
  EXPECT_TRUE(Base64UrlDecode("Zg==", &decoded));
  EXPECT_EQ(decoded, "f");
  EXPECT_TRUE(Base64UrlDecode("Zm8=", &decoded));
  EXPECT_EQ(decoded, "fo");
  EXPECT_TRUE(Base64UrlDecode("Zm9v", &decoded));
  EXPECT_EQ(decoded, "foo");
  EXPECT_TRUE(Base64UrlDecode("Zm9vYg==", &decoded));
  EXPECT_EQ(decoded, "foob");
  EXPECT_TRUE(Base64UrlDecode("Zm9vYmE=", &decoded));
  EXPECT_EQ(decoded, "fooba");
  EXPECT_TRUE(Base64UrlDecode("Zm9vYmFy", &decoded));
  EXPECT_EQ(decoded, "foobar");

  // Extra tests for URL safe version.
  EXPECT_TRUE(Base64UrlDecode("LnM-", &decoded));
  EXPECT_EQ(decoded, ".s>");
  EXPECT_TRUE(Base64UrlDecode("LnM_", &decoded));
  EXPECT_EQ(decoded, ".s?");
}

}  // namespace
}  // namespace base64url
