| // Copyright 2015 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 "base/base64url.h" | 
 |  | 
 | #include "base/macros.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace { | 
 |  | 
 | TEST(Base64UrlTest, EncodeIncludePaddingPolicy) { | 
 |   std::string output; | 
 |   Base64UrlEncode("hello?world", Base64UrlEncodePolicy::INCLUDE_PADDING, | 
 |                   &output); | 
 |  | 
 |   // Base64 version: aGVsbG8/d29ybGQ= | 
 |   EXPECT_EQ("aGVsbG8_d29ybGQ=", output); | 
 |  | 
 |   // Test for behavior for very short and empty strings. | 
 |   Base64UrlEncode("??", Base64UrlEncodePolicy::INCLUDE_PADDING, &output); | 
 |   EXPECT_EQ("Pz8=", output); | 
 |  | 
 |   Base64UrlEncode("", Base64UrlEncodePolicy::INCLUDE_PADDING, &output); | 
 |   EXPECT_EQ("", output); | 
 | } | 
 |  | 
 | TEST(Base64UrlTest, EncodeOmitPaddingPolicy) { | 
 |   std::string output; | 
 |   Base64UrlEncode("hello?world", Base64UrlEncodePolicy::OMIT_PADDING, &output); | 
 |  | 
 |   // base64 version: aGVsbG8/d29ybGQ= | 
 |   EXPECT_EQ("aGVsbG8_d29ybGQ", output); | 
 |  | 
 |   // Test for behavior for very short and empty strings. | 
 |   Base64UrlEncode("??", Base64UrlEncodePolicy::OMIT_PADDING, &output); | 
 |   EXPECT_EQ("Pz8", output); | 
 |  | 
 |   Base64UrlEncode("", Base64UrlEncodePolicy::OMIT_PADDING, &output); | 
 |   EXPECT_EQ("", output); | 
 | } | 
 |  | 
 | TEST(Base64UrlTest, DecodeRequirePaddingPolicy) { | 
 |   std::string output; | 
 |   ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=", | 
 |                               Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); | 
 |  | 
 |   EXPECT_EQ("hello?world", output); | 
 |  | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); | 
 |  | 
 |   // Test for behavior for very short and empty strings. | 
 |   ASSERT_TRUE( | 
 |       Base64UrlDecode("Pz8=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); | 
 |   EXPECT_EQ("??", output); | 
 |  | 
 |   ASSERT_TRUE( | 
 |       Base64UrlDecode("", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); | 
 |   EXPECT_EQ("", output); | 
 | } | 
 |  | 
 | TEST(Base64UrlTest, DecodeIgnorePaddingPolicy) { | 
 |   std::string output; | 
 |   ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ", | 
 |                               Base64UrlDecodePolicy::IGNORE_PADDING, &output)); | 
 |  | 
 |   EXPECT_EQ("hello?world", output); | 
 |  | 
 |   // Including the padding is accepted as well. | 
 |   ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=", | 
 |                               Base64UrlDecodePolicy::IGNORE_PADDING, &output)); | 
 |  | 
 |   EXPECT_EQ("hello?world", output); | 
 | } | 
 |  | 
 | TEST(Base64UrlTest, DecodeDisallowPaddingPolicy) { | 
 |   std::string output; | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "aGVsbG8_d29ybGQ=", Base64UrlDecodePolicy::DISALLOW_PADDING, &output)); | 
 |  | 
 |   // The policy will allow the input when padding has been omitted. | 
 |   ASSERT_TRUE(Base64UrlDecode( | 
 |       "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::DISALLOW_PADDING, &output)); | 
 |  | 
 |   EXPECT_EQ("hello?world", output); | 
 | } | 
 |  | 
 | TEST(Base64UrlTest, DecodeDisallowsBase64Alphabet) { | 
 |   std::string output; | 
 |  | 
 |   // The "/" character is part of the conventional base64 alphabet, but has been | 
 |   // substituted with "_" in the base64url alphabet. | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "aGVsbG8/d29ybGQ=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); | 
 | } | 
 |  | 
 | TEST(Base64UrlTest, DecodeDisallowsPaddingOnly) { | 
 |   std::string output; | 
 |  | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "=", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "==", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "===", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); | 
 |   ASSERT_FALSE(Base64UrlDecode( | 
 |       "====", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | }  // namespace base |