1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/base64url.h" 6 7 #include "base/macros.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace base { 11 12 namespace { 13 14 TEST(Base64UrlTest, EncodeIncludePaddingPolicy) { 15 std::string output; 16 Base64UrlEncode("hello?world", Base64UrlEncodePolicy::INCLUDE_PADDING, 17 &output); 18 19 // Base64 version: aGVsbG8/d29ybGQ= 20 EXPECT_EQ("aGVsbG8_d29ybGQ=", output); 21 22 // Test for behavior for very short and empty strings. 23 Base64UrlEncode("??", Base64UrlEncodePolicy::INCLUDE_PADDING, &output); 24 EXPECT_EQ("Pz8=", output); 25 26 Base64UrlEncode("", Base64UrlEncodePolicy::INCLUDE_PADDING, &output); 27 EXPECT_EQ("", output); 28 } 29 30 TEST(Base64UrlTest, EncodeOmitPaddingPolicy) { 31 std::string output; 32 Base64UrlEncode("hello?world", Base64UrlEncodePolicy::OMIT_PADDING, &output); 33 34 // base64 version: aGVsbG8/d29ybGQ= 35 EXPECT_EQ("aGVsbG8_d29ybGQ", output); 36 37 // Test for behavior for very short and empty strings. 38 Base64UrlEncode("??", Base64UrlEncodePolicy::OMIT_PADDING, &output); 39 EXPECT_EQ("Pz8", output); 40 41 Base64UrlEncode("", Base64UrlEncodePolicy::OMIT_PADDING, &output); 42 EXPECT_EQ("", output); 43 } 44 45 TEST(Base64UrlTest, DecodeRequirePaddingPolicy) { 46 std::string output; 47 ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=", 48 Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); 49 50 EXPECT_EQ("hello?world", output); 51 52 ASSERT_FALSE(Base64UrlDecode( 53 "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); 54 55 // Test for behavior for very short and empty strings. 56 ASSERT_TRUE( 57 Base64UrlDecode("Pz8=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); 58 EXPECT_EQ("??", output); 59 60 ASSERT_TRUE( 61 Base64UrlDecode("", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); 62 EXPECT_EQ("", output); 63 } 64 65 TEST(Base64UrlTest, DecodeIgnorePaddingPolicy) { 66 std::string output; 67 ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ", 68 Base64UrlDecodePolicy::IGNORE_PADDING, &output)); 69 70 EXPECT_EQ("hello?world", output); 71 72 // Including the padding is accepted as well. 73 ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=", 74 Base64UrlDecodePolicy::IGNORE_PADDING, &output)); 75 76 EXPECT_EQ("hello?world", output); 77 } 78 79 TEST(Base64UrlTest, DecodeDisallowPaddingPolicy) { 80 std::string output; 81 ASSERT_FALSE(Base64UrlDecode( 82 "aGVsbG8_d29ybGQ=", Base64UrlDecodePolicy::DISALLOW_PADDING, &output)); 83 84 // The policy will allow the input when padding has been omitted. 85 ASSERT_TRUE(Base64UrlDecode( 86 "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::DISALLOW_PADDING, &output)); 87 88 EXPECT_EQ("hello?world", output); 89 } 90 91 TEST(Base64UrlTest, DecodeDisallowsBase64Alphabet) { 92 std::string output; 93 94 // The "/" character is part of the conventional base64 alphabet, but has been 95 // substituted with "_" in the base64url alphabet. 96 ASSERT_FALSE(Base64UrlDecode( 97 "aGVsbG8/d29ybGQ=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output)); 98 } 99 100 TEST(Base64UrlTest, DecodeDisallowsPaddingOnly) { 101 std::string output; 102 103 ASSERT_FALSE(Base64UrlDecode( 104 "=", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); 105 ASSERT_FALSE(Base64UrlDecode( 106 "==", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); 107 ASSERT_FALSE(Base64UrlDecode( 108 "===", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); 109 ASSERT_FALSE(Base64UrlDecode( 110 "====", Base64UrlDecodePolicy::IGNORE_PADDING, &output)); 111 } 112 113 } // namespace 114 115 } // namespace base 116