Home | History | Annotate | Download | only in base
      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