xref: /third_party/nghttp2/src/base64_test.cc (revision 2c593315)
1/*
2 * nghttp2 - HTTP/2 C Library
3 *
4 * Copyright (c) 2016 Tatsuhiro Tsujikawa
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sublicense, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25#include "base64_test.h"
26
27#include <cstring>
28#include <iostream>
29
30#include <CUnit/CUnit.h>
31
32#include <nghttp2/nghttp2.h>
33
34#include "base64.h"
35
36namespace nghttp2 {
37
38void test_base64_encode(void) {
39  {
40    std::string in = "\xff";
41    auto out = base64::encode(std::begin(in), std::end(in));
42    CU_ASSERT("/w==" == out);
43  }
44  {
45    std::string in = "\xff\xfe";
46    auto out = base64::encode(std::begin(in), std::end(in));
47    CU_ASSERT("//4=" == out);
48  }
49  {
50    std::string in = "\xff\xfe\xfd";
51    auto out = base64::encode(std::begin(in), std::end(in));
52    CU_ASSERT("//79" == out);
53  }
54  {
55    std::string in = "\xff\xfe\xfd\xfc";
56    auto out = base64::encode(std::begin(in), std::end(in));
57    CU_ASSERT("//79/A==" == out);
58  }
59}
60
61void test_base64_decode(void) {
62  BlockAllocator balloc(4096, 4096);
63  {
64    std::string in = "/w==";
65    auto out = base64::decode(std::begin(in), std::end(in));
66    CU_ASSERT("\xff" == out);
67    CU_ASSERT("\xff" == base64::decode(balloc, std::begin(in), std::end(in)));
68  }
69  {
70    std::string in = "//4=";
71    auto out = base64::decode(std::begin(in), std::end(in));
72    CU_ASSERT("\xff\xfe" == out);
73    CU_ASSERT("\xff\xfe" ==
74              base64::decode(balloc, std::begin(in), std::end(in)));
75  }
76  {
77    std::string in = "//79";
78    auto out = base64::decode(std::begin(in), std::end(in));
79    CU_ASSERT("\xff\xfe\xfd" == out);
80    CU_ASSERT("\xff\xfe\xfd" ==
81              base64::decode(balloc, std::begin(in), std::end(in)));
82  }
83  {
84    std::string in = "//79/A==";
85    auto out = base64::decode(std::begin(in), std::end(in));
86    CU_ASSERT("\xff\xfe\xfd\xfc" == out);
87    CU_ASSERT("\xff\xfe\xfd\xfc" ==
88              base64::decode(balloc, std::begin(in), std::end(in)));
89  }
90  {
91    // we check the number of valid input must be multiples of 4
92    std::string in = "//79=";
93    auto out = base64::decode(std::begin(in), std::end(in));
94    CU_ASSERT("" == out);
95    CU_ASSERT("" == base64::decode(balloc, std::begin(in), std::end(in)));
96  }
97  {
98    // ending invalid character at the boundary of multiples of 4 is
99    // bad
100    std::string in = "bmdodHRw\n";
101    auto out = base64::decode(std::begin(in), std::end(in));
102    CU_ASSERT("" == out);
103    CU_ASSERT("" == base64::decode(balloc, std::begin(in), std::end(in)));
104  }
105  {
106    // after seeing '=', subsequent input must be also '='.
107    std::string in = "//79/A=A";
108    auto out = base64::decode(std::begin(in), std::end(in));
109    CU_ASSERT("" == out);
110    CU_ASSERT("" == base64::decode(balloc, std::begin(in), std::end(in)));
111  }
112  {
113    // additional '=' at the end is bad
114    std::string in = "//79/A======";
115    auto out = base64::decode(std::begin(in), std::end(in));
116    CU_ASSERT("" == out);
117    CU_ASSERT("" == base64::decode(balloc, std::begin(in), std::end(in)));
118  }
119}
120
121} // namespace nghttp2
122