BinToTextEncode.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/Component/ComponentApplication.h>
  9. #include <AzCore/Memory/PoolAllocator.h>
  10. #include <AzCore/UnitTest/TestTypes.h>
  11. #include <AzFramework/StringFunc/StringFunc.h>
  12. namespace UnitTest
  13. {
  14. using namespace AZ;
  15. using namespace AzFramework;
  16. //! Unit Test for testing Base64 Encode/Decode functions
  17. class Base64Test
  18. : public LeakDetectionFixture
  19. {
  20. void SetUp() override
  21. {
  22. LeakDetectionFixture::SetUp();
  23. ComponentApplication::Descriptor desc;
  24. desc.m_useExistingAllocator = true;
  25. m_app.reset(aznew ComponentApplication);
  26. AZ::ComponentApplication::StartupParameters startupParameters;
  27. startupParameters.m_loadSettingsRegistry = false;
  28. m_app->Create(desc, startupParameters);
  29. }
  30. void TearDown() override
  31. {
  32. m_app->Destroy();
  33. m_app.reset();
  34. LeakDetectionFixture::TearDown();
  35. }
  36. AZStd::unique_ptr<ComponentApplication> m_app;
  37. };
  38. TEST_F(Base64Test, EmptyStringEncodeTest)
  39. {
  40. AZStd::string value;
  41. AZStd::string encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  42. EXPECT_EQ("", encodedString);
  43. }
  44. //! Test vectors from the Base-N encodings rfc https://tools.ietf.org/html/rfc4648#section-10
  45. TEST_F(Base64Test, Rfc4648EncodeTest)
  46. {
  47. AZStd::string value = "f";
  48. AZStd::string encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  49. EXPECT_EQ("Zg==", encodedString);
  50. value = "fo";
  51. encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  52. EXPECT_EQ("Zm8=", encodedString);
  53. value = "foo";
  54. encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  55. EXPECT_EQ("Zm9v", encodedString);
  56. value = "foob";
  57. encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  58. EXPECT_EQ("Zm9vYg==", encodedString);
  59. value = "fooba";
  60. encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  61. EXPECT_EQ("Zm9vYmE=", encodedString);
  62. value = "foobar";
  63. encodedString = AzFramework::StringFunc::Base64::Encode(reinterpret_cast<AZ::u8*>(value.data()), value.size());
  64. EXPECT_EQ("Zm9vYmFy", encodedString);
  65. }
  66. //! Test vectors from the Base-N encodings rfc https://tools.ietf.org/html/rfc4648#section-10
  67. TEST_F(Base64Test, Rfc4648DecodeTest)
  68. {
  69. AZStd::vector<AZ::u8> decodedVector;
  70. AZStd::string value = "Zg==";
  71. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, value.data(), value.size()));
  72. size_t strLen = AZStd::min(AZ_ARRAY_SIZE("f") - 1, decodedVector.size());
  73. EXPECT_EQ(0, memcmp("f", decodedVector.data(), strLen));
  74. value = "Zm8=";
  75. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, value.data(), value.size()));
  76. strLen = AZStd::min(AZ_ARRAY_SIZE("fo") - 1, decodedVector.size());
  77. EXPECT_EQ(0, memcmp("fo", decodedVector.data(), strLen));
  78. value = "Zm9v";
  79. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, value.data(), value.size()));
  80. strLen = AZStd::min(AZ_ARRAY_SIZE("foo") - 1, decodedVector.size());
  81. EXPECT_EQ(0, memcmp("foo", decodedVector.data(), strLen));
  82. value = "Zm9vYg==";
  83. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, value.data(), value.size()));
  84. strLen = AZStd::min(AZ_ARRAY_SIZE("foob") - 1, decodedVector.size());
  85. EXPECT_EQ(0, memcmp("foob", decodedVector.data(), strLen));
  86. value = "Zm9vYmE=";
  87. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, value.data(), value.size()));
  88. strLen = AZStd::min(AZ_ARRAY_SIZE("fooba") - 1, decodedVector.size());
  89. EXPECT_EQ(0, memcmp("fooba", decodedVector.data(), strLen));
  90. value = "Zm9vYmFy";
  91. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, value.data(), value.size()));
  92. strLen = AZStd::min(AZ_ARRAY_SIZE("foobar") - 1, decodedVector.size());
  93. EXPECT_EQ(0, memcmp("foobar", decodedVector.data(), strLen));
  94. }
  95. //! Test RFC 4648 Binary https://tools.ietf.org/html/rfc4648#page-12
  96. TEST_F(Base64Test, Rfc4648BinaryEncodeTest)
  97. {
  98. const AZ::u8 binaryValue[] = { 0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e };
  99. AZStd::string encodedString = AzFramework::StringFunc::Base64::Encode(binaryValue, AZ_ARRAY_SIZE(binaryValue));
  100. EXPECT_EQ("FPucA9l+", encodedString);
  101. const AZ::u8 binaryValue2[] = { 0x14, 0xfb, 0x9c, 0x03, 0xd9 };
  102. encodedString = AzFramework::StringFunc::Base64::Encode(binaryValue2, AZ_ARRAY_SIZE(binaryValue2));
  103. EXPECT_EQ("FPucA9k=", encodedString);
  104. const AZ::u8 binaryValue3[] = { 0x14, 0xfb, 0x9c, 0x03 };
  105. encodedString = AzFramework::StringFunc::Base64::Encode(binaryValue3, AZ_ARRAY_SIZE(binaryValue3));
  106. EXPECT_EQ("FPucAw==", encodedString);
  107. EXPECT_EQ("TlVMAEluU3RyaW5n", AzFramework::StringFunc::Base64::Encode(reinterpret_cast<const AZ::u8*>("NUL\0InString"), AZ_ARRAY_SIZE("NUL\0InString") - 1));
  108. }
  109. //! Test RFC 4648 Binary https://tools.ietf.org/html/rfc4648#page-12
  110. TEST_F(Base64Test, Rfc4648BinaryDecodeTest)
  111. {
  112. const AZ::u8 expectedBinaryValue[] = { 0x14, 0xfb, 0x9c, 0x03, 0xd9, 0x7e };
  113. const AZ::u8 expectedBinaryValue2[] = { 0x14, 0xfb, 0x9c, 0x03, 0xd9 };
  114. const AZ::u8 expectedBinaryValue3[] = { 0x14, 0xfb, 0x9c, 0x03 };
  115. const AZ::u8 expectedBinaryValue4[] = { 'N','U', 'L', '\0', 'I', 'n', 'S', 't', 'r', 'i', 'n', 'g' };
  116. AZStd::vector<AZ::u8> decodedVector;
  117. const char textValue[] = "FPucA9l+";
  118. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, textValue, AZ_ARRAY_SIZE(textValue) - 1));
  119. size_t vecLen = AZStd::min(AZ_ARRAY_SIZE(expectedBinaryValue), decodedVector.size());
  120. EXPECT_EQ(0, memcmp(expectedBinaryValue, decodedVector.data(), vecLen));
  121. const char textValue2[] = "FPucA9k=";
  122. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, textValue2, AZ_ARRAY_SIZE(textValue2) - 1));
  123. vecLen = AZStd::min(AZ_ARRAY_SIZE(expectedBinaryValue2), decodedVector.size());
  124. EXPECT_EQ(0, memcmp(expectedBinaryValue2, decodedVector.data(), vecLen));
  125. const char textValue3[] = "FPucAw==";
  126. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, textValue3, AZ_ARRAY_SIZE(textValue3) - 1));
  127. vecLen = AZStd::min(AZ_ARRAY_SIZE(expectedBinaryValue3), decodedVector.size());
  128. EXPECT_EQ(0, memcmp(expectedBinaryValue3, decodedVector.data(), vecLen));
  129. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedVector, "TlVMAEluU3RyaW5n", strlen("TlVMAEluU3RyaW5n")));
  130. vecLen = AZStd::min(AZ_ARRAY_SIZE(expectedBinaryValue4), decodedVector.size());
  131. EXPECT_EQ(0, memcmp(expectedBinaryValue4, decodedVector.data(), vecLen));
  132. }
  133. TEST_F(Base64Test, EmptyStringDecodeTest)
  134. {
  135. AZStd::vector<AZ::u8> decodedString;
  136. const char value[] = "";
  137. EXPECT_TRUE(AzFramework::StringFunc::Base64::Decode(decodedString, value, AZ_ARRAY_SIZE(value) - 1));
  138. EXPECT_EQ(0, decodedString.size());
  139. }
  140. TEST_F(Base64Test, ErrorDecodeTest)
  141. {
  142. AZStd::vector<AZ::u8> expectedVector{ 'T', 'e', 'x', 't', 0xDF };
  143. AZStd::vector<AZ::u8> decodedString = expectedVector;
  144. const char value[] = "NotMultpleOf4";
  145. EXPECT_FALSE(AzFramework::StringFunc::Base64::Decode(decodedString, value, AZ_ARRAY_SIZE(value) - 1));
  146. EXPECT_EQ(expectedVector, decodedString);
  147. const char value2[] = "Bad" "\x00" "Data@^&=";
  148. EXPECT_FALSE(AzFramework::StringFunc::Base64::Decode(decodedString, value2, AZ_ARRAY_SIZE(value2) - 1));
  149. EXPECT_EQ(expectedVector, decodedString);
  150. }
  151. }