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 
36 namespace nghttp2 {
37 
test_base64_encode(void)38 void 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 
test_base64_decode(void)61 void 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