base64url_unittest.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. #include "base/base64url.h"
  5. #include "testing/gtest/include/gtest/gtest.h"
  6. namespace base {
  7. namespace {
  8. TEST(Base64UrlTest, EncodeIncludePaddingPolicy) {
  9. std::string output;
  10. Base64UrlEncode("hello?world", Base64UrlEncodePolicy::INCLUDE_PADDING,
  11. &output);
  12. // Base64 version: aGVsbG8/d29ybGQ=
  13. EXPECT_EQ("aGVsbG8_d29ybGQ=", output);
  14. // Test for behavior for very short and empty strings.
  15. Base64UrlEncode("??", Base64UrlEncodePolicy::INCLUDE_PADDING, &output);
  16. EXPECT_EQ("Pz8=", output);
  17. Base64UrlEncode("", Base64UrlEncodePolicy::INCLUDE_PADDING, &output);
  18. EXPECT_EQ("", output);
  19. }
  20. TEST(Base64UrlTest, EncodeOmitPaddingPolicy) {
  21. std::string output;
  22. Base64UrlEncode("hello?world", Base64UrlEncodePolicy::OMIT_PADDING, &output);
  23. // base64 version: aGVsbG8/d29ybGQ=
  24. EXPECT_EQ("aGVsbG8_d29ybGQ", output);
  25. // Test for behavior for very short and empty strings.
  26. Base64UrlEncode("??", Base64UrlEncodePolicy::OMIT_PADDING, &output);
  27. EXPECT_EQ("Pz8", output);
  28. Base64UrlEncode("", Base64UrlEncodePolicy::OMIT_PADDING, &output);
  29. EXPECT_EQ("", output);
  30. }
  31. TEST(Base64UrlTest, DecodeRequirePaddingPolicy) {
  32. std::string output;
  33. ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=",
  34. Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
  35. EXPECT_EQ("hello?world", output);
  36. ASSERT_FALSE(Base64UrlDecode(
  37. "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
  38. // Test for behavior for very short and empty strings.
  39. ASSERT_TRUE(
  40. Base64UrlDecode("Pz8=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
  41. EXPECT_EQ("??", output);
  42. ASSERT_TRUE(
  43. Base64UrlDecode("", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
  44. EXPECT_EQ("", output);
  45. }
  46. TEST(Base64UrlTest, DecodeIgnorePaddingPolicy) {
  47. std::string output;
  48. ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ",
  49. Base64UrlDecodePolicy::IGNORE_PADDING, &output));
  50. EXPECT_EQ("hello?world", output);
  51. // Including the padding is accepted as well.
  52. ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=",
  53. Base64UrlDecodePolicy::IGNORE_PADDING, &output));
  54. EXPECT_EQ("hello?world", output);
  55. }
  56. TEST(Base64UrlTest, DecodeDisallowPaddingPolicy) {
  57. std::string output;
  58. ASSERT_FALSE(Base64UrlDecode(
  59. "aGVsbG8_d29ybGQ=", Base64UrlDecodePolicy::DISALLOW_PADDING, &output));
  60. // The policy will allow the input when padding has been omitted.
  61. ASSERT_TRUE(Base64UrlDecode(
  62. "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::DISALLOW_PADDING, &output));
  63. EXPECT_EQ("hello?world", output);
  64. }
  65. TEST(Base64UrlTest, DecodeDisallowsBase64Alphabet) {
  66. std::string output;
  67. // The "/" character is part of the conventional base64 alphabet, but has been
  68. // substituted with "_" in the base64url alphabet.
  69. ASSERT_FALSE(Base64UrlDecode(
  70. "aGVsbG8/d29ybGQ=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
  71. }
  72. TEST(Base64UrlTest, DecodeDisallowsPaddingOnly) {
  73. std::string output;
  74. ASSERT_FALSE(Base64UrlDecode(
  75. "=", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
  76. ASSERT_FALSE(Base64UrlDecode(
  77. "==", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
  78. ASSERT_FALSE(Base64UrlDecode(
  79. "===", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
  80. ASSERT_FALSE(Base64UrlDecode(
  81. "====", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
  82. }
  83. } // namespace
  84. } // namespace base