2020-06-12 23:09:31 -03:00
/*
* Copyright ( c ) 2020 , Tom Lebreux < tomlebreux @ hotmail . com >
*
2021-04-22 05:24:48 -03:00
* SPDX - License - Identifier : BSD - 2 - Clause
2020-06-12 23:09:31 -03:00
*/
2021-04-25 02:53:23 -03:00
# include <LibTest/TestCase.h>
2020-06-12 23:09:31 -03:00
# include <AK/Base64.h>
2021-01-12 15:21:59 -03:00
# include <string.h>
2020-06-12 23:09:31 -03:00
2020-06-12 23:12:59 -03:00
TEST_CASE ( test_decode )
{
2022-07-11 17:30:25 -03:00
auto decode_equal = [ & ] ( StringView input , StringView expected ) {
2023-05-07 15:14:06 -03:00
auto decoded = TRY_OR_FAIL ( decode_base64 ( input ) ) ;
2024-07-15 16:25:08 -03:00
EXPECT_EQ ( StringView { decoded } , expected ) ;
2020-06-12 23:12:59 -03:00
} ;
2022-07-11 17:30:25 -03:00
decode_equal ( " " sv , " " sv ) ;
decode_equal ( " Zg== " sv , " f " sv ) ;
decode_equal ( " Zm8= " sv , " fo " sv ) ;
decode_equal ( " Zm9v " sv , " foo " sv ) ;
decode_equal ( " Zm9vYg== " sv , " foob " sv ) ;
decode_equal ( " Zm9vYmE= " sv , " fooba " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
2024-03-24 09:51:44 -03:00
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
2024-07-15 16:25:08 -03:00
decode_equal ( " \n \r \t Zm 9v \t YmFy \n " sv , " foobar " sv ) ;
2024-03-20 09:21:59 -03:00
decode_equal ( " aGVsbG8/d29ybGQ= " sv , " hello?world " sv ) ;
2020-06-12 23:12:59 -03:00
}
2024-09-01 18:41:57 -03:00
TEST_CASE ( test_decode_into )
{
ByteBuffer buffer ;
auto decode_equal = [ & ] ( StringView input , StringView expected , Optional < size_t > buffer_size = { } ) {
buffer . resize ( buffer_size . value_or_lazy_evaluated ( [ & ] ( ) {
return AK : : size_required_to_decode_base64 ( input ) ;
} ) ) ;
auto result = AK : : decode_base64_into ( input , buffer ) ;
VERIFY ( ! result . is_error ( ) ) ;
EXPECT_EQ ( StringView { buffer } , expected ) ;
} ;
decode_equal ( " " sv , " " sv ) ;
decode_equal ( " Zg== " sv , " f " sv ) ;
decode_equal ( " Zm8= " sv , " fo " sv ) ;
decode_equal ( " Zm9v " sv , " foo " sv ) ;
decode_equal ( " Zm9vYg== " sv , " foob " sv ) ;
decode_equal ( " Zm9vYmE= " sv , " fooba " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
decode_equal ( " \n \r \t Zm 9v \t YmFy \n " sv , " foobar " sv ) ;
decode_equal ( " aGVsbG8/d29ybGQ= " sv , " hello?world " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " " sv , 0 ) ;
decode_equal ( " Zm9vYmFy " sv , " " sv , 1 ) ;
decode_equal ( " Zm9vYmFy " sv , " " sv , 2 ) ;
decode_equal ( " Zm9vYmFy " sv , " foo " sv , 3 ) ;
decode_equal ( " Zm9vYmFy " sv , " foo " sv , 4 ) ;
decode_equal ( " Zm9vYmFy " sv , " foo " sv , 5 ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv , 6 ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv , 7 ) ;
}
2021-10-23 10:43:59 -03:00
TEST_CASE ( test_decode_invalid )
2021-10-22 18:17:54 -03:00
{
2022-07-11 17:30:25 -03:00
EXPECT ( decode_base64 ( ( " asdf \xff qwe " sv ) ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( ( " asdf \x80 qwe " sv ) ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( ( " asdf:qwe " sv ) ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( ( " asdf=qwe " sv ) ) . is_error ( ) ) ;
2024-03-20 09:21:59 -03:00
EXPECT ( decode_base64 ( " aGVsbG8_d29ybGQ= " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " aGVsbG8/d29ybGQ= " sv ) . is_error ( ) ) ;
2024-03-24 09:59:00 -03:00
EXPECT ( decode_base64 ( " Y " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " YQ= " sv ) . is_error ( ) ) ;
2024-03-20 09:21:59 -03:00
}
TEST_CASE ( test_decode_only_padding )
{
// Only padding is not allowed
EXPECT ( decode_base64 ( " = " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " == " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " === " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64 ( " ==== " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " = " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " == " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " === " sv ) . is_error ( ) ) ;
EXPECT ( decode_base64url ( " ==== " sv ) . is_error ( ) ) ;
2021-10-22 18:17:54 -03:00
}
2020-06-12 23:09:31 -03:00
TEST_CASE ( test_encode )
{
2022-07-11 17:30:25 -03:00
auto encode_equal = [ & ] ( StringView input , StringView expected ) {
2022-12-18 20:23:47 -03:00
auto encoded = MUST ( encode_base64 ( input . bytes ( ) ) ) ;
2024-07-15 16:25:08 -03:00
EXPECT_EQ ( encoded , expected ) ;
2020-06-12 23:09:31 -03:00
} ;
2022-07-11 17:30:25 -03:00
encode_equal ( " " sv , " " sv ) ;
encode_equal ( " f " sv , " Zg== " sv ) ;
encode_equal ( " fo " sv , " Zm8= " sv ) ;
encode_equal ( " foo " sv , " Zm9v " sv ) ;
encode_equal ( " foob " sv , " Zm9vYg== " sv ) ;
encode_equal ( " fooba " sv , " Zm9vYmE= " sv ) ;
encode_equal ( " foobar " sv , " Zm9vYmFy " sv ) ;
2020-06-12 23:09:31 -03:00
}
2024-03-20 09:21:59 -03:00
2024-07-15 17:12:21 -03:00
TEST_CASE ( test_encode_omit_padding )
{
auto encode_equal = [ & ] ( StringView input , StringView expected ) {
auto encoded = MUST ( encode_base64 ( input . bytes ( ) , AK : : OmitPadding : : Yes ) ) ;
EXPECT_EQ ( encoded , expected ) ;
} ;
encode_equal ( " " sv , " " sv ) ;
encode_equal ( " f " sv , " Zg " sv ) ;
encode_equal ( " fo " sv , " Zm8 " sv ) ;
encode_equal ( " foo " sv , " Zm9v " sv ) ;
encode_equal ( " foob " sv , " Zm9vYg " sv ) ;
encode_equal ( " fooba " sv , " Zm9vYmE " sv ) ;
encode_equal ( " foobar " sv , " Zm9vYmFy " sv ) ;
}
2024-03-20 09:21:59 -03:00
TEST_CASE ( test_urldecode )
{
auto decode_equal = [ & ] ( StringView input , StringView expected ) {
auto decoded = TRY_OR_FAIL ( decode_base64url ( input ) ) ;
2024-07-15 16:25:08 -03:00
EXPECT_EQ ( StringView { decoded } , expected ) ;
2024-03-20 09:21:59 -03:00
} ;
decode_equal ( " " sv , " " sv ) ;
decode_equal ( " Zg== " sv , " f " sv ) ;
decode_equal ( " Zm8= " sv , " fo " sv ) ;
decode_equal ( " Zm9v " sv , " foo " sv ) ;
decode_equal ( " Zm9vYg== " sv , " foob " sv ) ;
decode_equal ( " Zm9vYmE= " sv , " fooba " sv ) ;
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
2024-03-24 09:51:44 -03:00
decode_equal ( " Zm9vYmFy " sv , " foobar " sv ) ;
decode_equal ( " \n \r \t Zm9vYmFy \n " sv , " foobar " sv ) ;
2024-03-20 09:21:59 -03:00
decode_equal ( " TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEu " sv , " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " sv ) ;
decode_equal ( " aGVsbG8_d29ybGQ= " sv , " hello?world " sv ) ;
}
TEST_CASE ( test_urlencode )
{
auto encode_equal = [ & ] ( StringView input , StringView expected ) {
auto encoded = MUST ( encode_base64url ( input . bytes ( ) ) ) ;
2024-07-15 16:25:08 -03:00
EXPECT_EQ ( encoded , expected ) ;
2024-03-20 09:21:59 -03:00
} ;
encode_equal ( " " sv , " " sv ) ;
encode_equal ( " f " sv , " Zg== " sv ) ;
encode_equal ( " fo " sv , " Zm8= " sv ) ;
encode_equal ( " foo " sv , " Zm9v " sv ) ;
encode_equal ( " foob " sv , " Zm9vYg== " sv ) ;
encode_equal ( " fooba " sv , " Zm9vYmE= " sv ) ;
encode_equal ( " foobar " sv , " Zm9vYmFy " sv ) ;
encode_equal ( " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " sv , " TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEu " sv ) ;
encode_equal ( " hello?world " sv , " aGVsbG8_d29ybGQ= " sv ) ;
encode_equal ( " hello!!world " sv , " aGVsbG8hIXdvcmxk " sv ) ;
}
2024-07-15 17:12:21 -03:00
TEST_CASE ( test_urlencode_omit_padding )
{
auto encode_equal = [ & ] ( StringView input , StringView expected ) {
auto encoded = MUST ( encode_base64url ( input . bytes ( ) , AK : : OmitPadding : : Yes ) ) ;
EXPECT_EQ ( encoded , expected ) ;
} ;
encode_equal ( " " sv , " " sv ) ;
encode_equal ( " f " sv , " Zg " sv ) ;
encode_equal ( " fo " sv , " Zm8 " sv ) ;
encode_equal ( " foo " sv , " Zm9v " sv ) ;
encode_equal ( " foob " sv , " Zm9vYg " sv ) ;
encode_equal ( " fooba " sv , " Zm9vYmE " sv ) ;
encode_equal ( " foobar " sv , " Zm9vYmFy " sv ) ;
encode_equal ( " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " sv , " TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEu " sv ) ;
encode_equal ( " hello?world " sv , " aGVsbG8_d29ybGQ " sv ) ;
encode_equal ( " hello!!world " sv , " aGVsbG8hIXdvcmxk " sv ) ;
}