Home | History | Annotate | Download | only in brillo
      1 // Copyright (c) 2011 The Chromium OS 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 <brillo/data_encoding.h>
      6 
      7 #include <algorithm>
      8 #include <numeric>
      9 
     10 #include <gtest/gtest.h>
     11 
     12 namespace brillo {
     13 namespace data_encoding {
     14 
     15 TEST(data_encoding, UrlEncoding) {
     16   std::string test = "\"http://sample/path/0014.html \"";
     17   std::string encoded = UrlEncode(test.c_str());
     18   EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html+%22", encoded);
     19   EXPECT_EQ(test, UrlDecode(encoded.c_str()));
     20 
     21   test = "\"http://sample/path/0014.html \"";
     22   encoded = UrlEncode(test.c_str(), false);
     23   EXPECT_EQ("%22http%3A%2F%2Fsample%2Fpath%2F0014.html%20%22", encoded);
     24   EXPECT_EQ(test, UrlDecode(encoded.c_str()));
     25 }
     26 
     27 TEST(data_encoding, WebParamsEncoding) {
     28   std::string encoded =
     29       WebParamsEncode({{"q", "test"}, {"path", "/usr/bin"}, {"#", "%"}});
     30   EXPECT_EQ("q=test&path=%2Fusr%2Fbin&%23=%25", encoded);
     31 
     32   auto params = WebParamsDecode(encoded);
     33   EXPECT_EQ(3, params.size());
     34   EXPECT_EQ("q", params[0].first);
     35   EXPECT_EQ("test", params[0].second);
     36   EXPECT_EQ("path", params[1].first);
     37   EXPECT_EQ("/usr/bin", params[1].second);
     38   EXPECT_EQ("#", params[2].first);
     39   EXPECT_EQ("%", params[2].second);
     40 }
     41 
     42 TEST(data_encoding, Base64Encode) {
     43   const std::string text1 = "hello world";
     44   const std::string encoded1 = "aGVsbG8gd29ybGQ=";
     45 
     46   const std::string text2 =
     47       "Lorem ipsum dolor sit amet, facilisis erat nec aliquam, scelerisque "
     48       "molestie commodo. Viverra tincidunt integer erat ipsum, integer "
     49       "molestie, arcu in, sit mauris ac a sed sit etiam.";
     50   const std::string encoded2 =
     51       "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGZhY2lsaXNpcyBlcmF0IG5lYyBhbGlxdWF"
     52       "tLCBzY2VsZXJpc3F1ZSBtb2xlc3RpZSBjb21tb2RvLiBWaXZlcnJhIHRpbmNpZHVudCBpbn"
     53       "RlZ2VyIGVyYXQgaXBzdW0sIGludGVnZXIgbW9sZXN0aWUsIGFyY3UgaW4sIHNpdCBtYXVya"
     54       "XMgYWMgYSBzZWQgc2l0IGV0aWFtLg==";
     55 
     56   brillo::Blob data3(256);
     57   std::iota(data3.begin(), data3.end(), 0);  // Fills the buffer with 0x00-0xFF.
     58   const std::string encoded3 =
     59       "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ"
     60       "1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaW"
     61       "prbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en"
     62       "6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU"
     63       "1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";
     64 
     65   EXPECT_EQ(encoded1, Base64Encode(text1));
     66   EXPECT_EQ(encoded2, Base64Encode(text2));
     67   EXPECT_EQ(encoded3, Base64Encode(data3));
     68 }
     69 
     70 TEST(data_encoding, Base64EncodeWrapLines) {
     71   const std::string text1 = "hello world";
     72   const std::string encoded1 = "aGVsbG8gd29ybGQ=\n";
     73 
     74   const std::string text2 =
     75       "Lorem ipsum dolor sit amet, facilisis erat nec aliquam, scelerisque "
     76       "molestie commodo. Viverra tincidunt integer erat ipsum, integer "
     77       "molestie, arcu in, sit mauris ac a sed sit etiam.";
     78   const std::string encoded2 =
     79       "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGZhY2lsaXNpcyBlcmF0IG5lYyBh\n"
     80       "bGlxdWFtLCBzY2VsZXJpc3F1ZSBtb2xlc3RpZSBjb21tb2RvLiBWaXZlcnJhIHRp\n"
     81       "bmNpZHVudCBpbnRlZ2VyIGVyYXQgaXBzdW0sIGludGVnZXIgbW9sZXN0aWUsIGFy\n"
     82       "Y3UgaW4sIHNpdCBtYXVyaXMgYWMgYSBzZWQgc2l0IGV0aWFtLg==\n";
     83 
     84   brillo::Blob data3(256);
     85   std::iota(data3.begin(), data3.end(), 0);  // Fills the buffer with 0x00-0xFF.
     86   const std::string encoded3 =
     87       "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v\n"
     88       "MDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5f\n"
     89       "YGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6P\n"
     90       "kJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/\n"
     91       "wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v\n"
     92       "8PHy8/T19vf4+fr7/P3+/w==\n";
     93 
     94   EXPECT_EQ(encoded1, Base64EncodeWrapLines(text1));
     95   EXPECT_EQ(encoded2, Base64EncodeWrapLines(text2));
     96   EXPECT_EQ(encoded3, Base64EncodeWrapLines(data3));
     97 }
     98 
     99 TEST(data_encoding, Base64Decode) {
    100   const std::string encoded1 = "dGVzdCBzdHJpbmc=";
    101 
    102   const std::string encoded2 =
    103       "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGZhY2lsaXNpcyBlcmF0IG5lYyBh\n"
    104       "bGlxdWFtLCBzY2VsZXJpc3F1ZSBtb2xlc3RpZSBjb21tb2RvLiBWaXZlcnJhIHRp\r\n"
    105       "bmNpZHVudCBpbnRlZ2VyIGVyYXQgaXBzdW0sIGludGVnZXIgbW9sZXN0aWUsIGFy\r"
    106       "Y3UgaW4sIHNpdCBtYXVyaXMgYWMgYSBzZWQgc2l0IGV0aWFt\n"
    107       "Lg==\n\n\n";
    108   const std::string decoded2 =
    109       "Lorem ipsum dolor sit amet, facilisis erat nec aliquam, scelerisque "
    110       "molestie commodo. Viverra tincidunt integer erat ipsum, integer "
    111       "molestie, arcu in, sit mauris ac a sed sit etiam.";
    112 
    113   const std::string encoded3 =
    114       "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ"
    115       "1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaW"
    116       "prbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en"
    117       "6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU"
    118       "1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";
    119   brillo::Blob decoded3(256);
    120   std::iota(decoded3.begin(), decoded3.end(), 0);  // Fill with 0x00..0xFF.
    121 
    122   std::string decoded;
    123   EXPECT_TRUE(Base64Decode(encoded1, &decoded));
    124   EXPECT_EQ("test string", decoded);
    125 
    126   EXPECT_TRUE(Base64Decode(encoded2, &decoded));
    127   EXPECT_EQ(decoded2, decoded);
    128 
    129   brillo::Blob decoded_blob;
    130   EXPECT_TRUE(Base64Decode(encoded3, &decoded_blob));
    131   EXPECT_EQ(decoded3, decoded_blob);
    132 
    133   EXPECT_FALSE(Base64Decode("A", &decoded_blob));
    134   EXPECT_TRUE(decoded_blob.empty());
    135 
    136   EXPECT_TRUE(Base64Decode("/w==", &decoded_blob));
    137   EXPECT_EQ((brillo::Blob{0xFF}), decoded_blob);
    138 
    139   EXPECT_TRUE(Base64Decode("//8=", &decoded_blob));
    140   EXPECT_EQ((brillo::Blob{0xFF, 0xFF}), decoded_blob);
    141 
    142   EXPECT_FALSE(Base64Decode("AAECAwQFB,cI", &decoded_blob));
    143   EXPECT_TRUE(decoded_blob.empty());
    144 }
    145 
    146 }  // namespace data_encoding
    147 }  // namespace brillo
    148