test_base64.cpp
Go to the documentation of this file.
1 /*
2  * Unit tests for XmlRpc++
3  *
4  * Copyright (C) 2017, Zoox Inc
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  * Author: Austin Hendrix <austin@zoox.com>
21  *
22  */
23 
24 #include <b64/encode.h>
25 #include <b64/decode.h>
26 
27 #include <gtest/gtest.h>
28 
29 // Test Data for a Base64 encode/decode test
31 public:
32  Base64TestData(std::vector<char> raw, std::string encoded)
33  : raw(raw), encoded(encoded) {}
34 
35  std::vector<char> raw;
36  std::string encoded;
37 };
38 
39 class Base64Test : public ::testing::TestWithParam<Base64TestData> {};
40 
41 TEST_P(Base64Test, Encode) {
42  const std::vector<char> & data = GetParam().raw;
43 
44  std::stringstream is;
45  is.write(&data[0], data.size());
46  std::stringstream os;
47  base64::encoder encoder;
48  encoder.encode(is, os);
49 
50  std::string expected = GetParam().encoded;
51 
52  EXPECT_EQ(expected, os.str());
53 }
54 
55 TEST_P(Base64Test, Decode) {
56  const std::string& in = GetParam().encoded;
57  const int encoded_size = in.length();
58 
59  // oversize our output vector (same method used by XmlRpcValue)
60  std::vector<char> out;
61  out.resize(encoded_size);
62 
63  base64::decoder decoder;
64  const int size = decoder.decode(in.c_str(), encoded_size, out.data());
65  ASSERT_LE(0, size);
66  out.resize(size);
67 
68  const std::vector<char> & expected = GetParam().raw;
69 
70  EXPECT_EQ(expected, out);
71 }
72 
74  Multiline,
75  Base64Test,
76  ::testing::Values(
77  Base64TestData({0}, "AA==\n"),
78  Base64TestData({1, 2}, "AQI=\n"),
79  Base64TestData({1, 2, 3}, "AQID\n"),
81  // clang-format off
82  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
83  19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
84  35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
85  51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
86  67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
87  83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
88  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
89  112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
90  125, 126, 127, -128, -127, -126, -125, -124, -123, -122, -121,
91  -120, -119, -118, -117, -116, -115, -114, -113, -112, -111, -110,
92  -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99,
93  -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86,
94  -85, -84, -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73,
95  -72, -71, -70, -69, -68, -67, -66, -65, -64, -63, -62, -61, -60,
96  -59, -58, -57, -56, -55, -54, -53, -52, -51, -50, -49, -48, -47,
97  -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34,
98  -33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21,
99  -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7,
100  -6, -5, -4, -3, -2, -1},
101  // clang-format on
102  "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMD"
103  "EyMzQ1\nNjc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYG"
104  "FiY2RlZmdoaWpr\nbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJ"
105  "GSk5SVlpeYmZqbnJ2en6Ch\noqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wM"
106  "HCw8TFxsfIycrLzM3Oz9DR0tPU1dbX\n2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8P"
107  "Hy8/T19vf4+fr7/P3+/w==\n")));
108 
110 public:
111  // TODO(future work): add error code representation here and check that error
112  // codes are reported correctly.
114  : encoded(encoded) {}
115 
116  std::string encoded;
117 };
118 
119 class Base64ErrorTest : public ::testing::TestWithParam<Base64ErrorData> {};
120 
121 TEST_P(Base64ErrorTest, DecodeErrors) {
122  const std::string& in = GetParam().encoded;
123  const int encoded_size = in.length();
124 
125  // oversize our output vector (same method used by XmlRpcValue)
126  std::vector<char> out;
127  out.resize(encoded_size);
128 
129  base64::decoder decoder;
130  const int size = decoder.decode(in.c_str(), encoded_size, out.data());
131  // Assert that size is greater or equal to 0, to make sure that the follow-up
132  // resize will always succeed.
133  ASSERT_LE(0, size);
134  out.resize(size);
135 
136  // FIXME(future work): decode does not report error on garbage input
137 }
138 
140  Multiline,
142  ::testing::Values(// Tests on incomplete data.
143  Base64ErrorData("="),
144  Base64ErrorData("A="),
145  Base64ErrorData("A"),
146  Base64ErrorData("AA"),
147  Base64ErrorData("AAA"),
148  Base64ErrorData("AA="),
149  // Tests with 4 bytes of good data but which does not
150  // terminate on the correct boundary.
151  Base64ErrorData("BBBBA="),
152  Base64ErrorData("BBBBA"),
153  Base64ErrorData("BBBBAA"),
154  Base64ErrorData("BBBBAAA"),
155  Base64ErrorData("BBBBAA="),
156  // Decode should succeed and do nothing on empty string.
157  Base64ErrorData(""),
158  // Character out of bounds for base64 encoding.
159  Base64ErrorData("<")));
160 
161 int main(int argc, char **argv)
162 {
163  ::testing::InitGoogleTest(&argc, argv);
164  return RUN_ALL_TESTS();
165 }
INSTANTIATE_TEST_CASE_P(Multiline, Base64Test, ::testing::Values(Base64TestData({0}, "AA==\), Base64TestData({1, 2}, "AQI=\"), Base64TestData({1, 2, 3}, "AQID\"), Base64TestData( {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, -128, -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, -116, -115, -114, -113, -112, -111, -110, -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99, -98, -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, -86, -85, -84, -83, -82, -81, -80, -79, -78, -77, -76, -75, -74, -73, -72, -71, -70, -69, -68, -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, -46, -45, -44, -43, -42, -41, -40, -39, -38, -37, -36, -35, -34, -33, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1}, "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMD" "EyMzQ1\Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYG" "FiY2RlZmdoaWpr\bG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJ" "GSk5SVlpeYmZqbnJ2en6Ch\oqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wM" "HCw8TFxsfIycrLzM3Oz9DR0tPU1dbX\2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8P" "Hy8/T19vf4+fr7/P3+/w==\")))
Base64TestData(std::vector< char > raw, std::string encoded)
Definition: test_base64.cpp:32
int decode(char value_in)
Definition: decode.h:33
std::string encoded
int encode(char value_in)
Definition: encode.h:33
Base64ErrorData(std::string encoded)
std::string encoded
Definition: test_base64.cpp:36
std::vector< char > raw
Definition: test_base64.cpp:35
int main(int argc, char **argv)
TEST_P(Base64Test, Encode)
Definition: test_base64.cpp:41


xmlrpcpp
Author(s): Chris Morley, Konstantin Pilipchuk, Morgan Quigley, Austin Hendrix, Dirk Thomas
autogenerated on Mon Feb 28 2022 23:33:22