blob: 3f7e6a1882f35d26d16f6a0f85fd85ccac3884bf [file] [log] [blame]
QUICHE team82dee2f2019-01-18 12:35:12 -05001// Copyright 2017 The Chromium 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 "net/third_party/quiche/src/spdy/platform/api/spdy_string_utils.h"
6
7#include <cstdint>
8
9#include "testing/gtest/include/gtest/gtest.h"
10#include "net/third_party/quiche/src/spdy/platform/api/spdy_string_piece.h"
11
12namespace spdy {
13namespace test {
14namespace {
15
16TEST(SpdyStringUtilsTest, SpdyStrCat) {
17 // No arguments.
18 EXPECT_EQ("", SpdyStrCat());
19
20 // Single string-like argument.
21 const char kFoo[] = "foo";
22 const SpdyString string_foo(kFoo);
23 const SpdyStringPiece stringpiece_foo(string_foo);
24 EXPECT_EQ("foo", SpdyStrCat(kFoo));
25 EXPECT_EQ("foo", SpdyStrCat(string_foo));
26 EXPECT_EQ("foo", SpdyStrCat(stringpiece_foo));
27
28 // Two string-like arguments.
29 const char kBar[] = "bar";
30 const SpdyStringPiece stringpiece_bar(kBar);
31 const SpdyString string_bar(kBar);
32 EXPECT_EQ("foobar", SpdyStrCat(kFoo, kBar));
33 EXPECT_EQ("foobar", SpdyStrCat(kFoo, string_bar));
34 EXPECT_EQ("foobar", SpdyStrCat(kFoo, stringpiece_bar));
35 EXPECT_EQ("foobar", SpdyStrCat(string_foo, kBar));
36 EXPECT_EQ("foobar", SpdyStrCat(string_foo, string_bar));
37 EXPECT_EQ("foobar", SpdyStrCat(string_foo, stringpiece_bar));
38 EXPECT_EQ("foobar", SpdyStrCat(stringpiece_foo, kBar));
39 EXPECT_EQ("foobar", SpdyStrCat(stringpiece_foo, string_bar));
40 EXPECT_EQ("foobar", SpdyStrCat(stringpiece_foo, stringpiece_bar));
41
42 // Many-many arguments.
43 EXPECT_EQ(
44 "foobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
45 SpdyStrCat("foo", "bar", "baz", "qux", "quux", "quuz", "corge", "grault",
46 "garply", "waldo", "fred", "plugh", "xyzzy", "thud"));
47
48 // Numerical arguments.
49 const int16_t i = 1;
50 const uint64_t u = 8;
51 const double d = 3.1415;
52
53 EXPECT_EQ("1 8", SpdyStrCat(i, " ", u));
54 EXPECT_EQ("3.14151181", SpdyStrCat(d, i, i, u, i));
55 EXPECT_EQ("i: 1, u: 8, d: 3.1415",
56 SpdyStrCat("i: ", i, ", u: ", u, ", d: ", d));
57
58 // Boolean arguments.
59 const bool t = true;
60 const bool f = false;
61
62 EXPECT_EQ("1", SpdyStrCat(t));
63 EXPECT_EQ("0", SpdyStrCat(f));
64 EXPECT_EQ("0110", SpdyStrCat(f, t, t, f));
65
66 // Mixed string-like, numerical, and Boolean arguments.
67 EXPECT_EQ("foo1foo081bar3.14151",
68 SpdyStrCat(kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t));
69 EXPECT_EQ("3.141511bar18bar13.14150",
70 SpdyStrCat(d, t, t, string_bar, i, u, kBar, t, d, f));
71}
72
73TEST(SpdyStringUtilsTest, SpdyStrAppend) {
74 // No arguments on empty string.
75 SpdyString output;
76 SpdyStrAppend(&output);
77 EXPECT_TRUE(output.empty());
78
79 // Single string-like argument.
80 const char kFoo[] = "foo";
81 const SpdyString string_foo(kFoo);
82 const SpdyStringPiece stringpiece_foo(string_foo);
83 SpdyStrAppend(&output, kFoo);
84 EXPECT_EQ("foo", output);
85 SpdyStrAppend(&output, string_foo);
86 EXPECT_EQ("foofoo", output);
87 SpdyStrAppend(&output, stringpiece_foo);
88 EXPECT_EQ("foofoofoo", output);
89
90 // No arguments on non-empty string.
91 SpdyStrAppend(&output);
92 EXPECT_EQ("foofoofoo", output);
93
94 output.clear();
95
96 // Two string-like arguments.
97 const char kBar[] = "bar";
98 const SpdyStringPiece stringpiece_bar(kBar);
99 const SpdyString string_bar(kBar);
100 SpdyStrAppend(&output, kFoo, kBar);
101 EXPECT_EQ("foobar", output);
102 SpdyStrAppend(&output, kFoo, string_bar);
103 EXPECT_EQ("foobarfoobar", output);
104 SpdyStrAppend(&output, kFoo, stringpiece_bar);
105 EXPECT_EQ("foobarfoobarfoobar", output);
106 SpdyStrAppend(&output, string_foo, kBar);
107 EXPECT_EQ("foobarfoobarfoobarfoobar", output);
108
109 output.clear();
110
111 SpdyStrAppend(&output, string_foo, string_bar);
112 EXPECT_EQ("foobar", output);
113 SpdyStrAppend(&output, string_foo, stringpiece_bar);
114 EXPECT_EQ("foobarfoobar", output);
115 SpdyStrAppend(&output, stringpiece_foo, kBar);
116 EXPECT_EQ("foobarfoobarfoobar", output);
117 SpdyStrAppend(&output, stringpiece_foo, string_bar);
118 EXPECT_EQ("foobarfoobarfoobarfoobar", output);
119
120 output.clear();
121
122 SpdyStrAppend(&output, stringpiece_foo, stringpiece_bar);
123 EXPECT_EQ("foobar", output);
124
125 // Many-many arguments.
126 SpdyStrAppend(&output, "foo", "bar", "baz", "qux", "quux", "quuz", "corge",
127 "grault", "garply", "waldo", "fred", "plugh", "xyzzy", "thud");
128 EXPECT_EQ(
129 "foobarfoobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
130 output);
131
132 output.clear();
133
134 // Numerical arguments.
135 const int16_t i = 1;
136 const uint64_t u = 8;
137 const double d = 3.1415;
138
139 SpdyStrAppend(&output, i, " ", u);
140 EXPECT_EQ("1 8", output);
141 SpdyStrAppend(&output, d, i, i, u, i);
142 EXPECT_EQ("1 83.14151181", output);
143 SpdyStrAppend(&output, "i: ", i, ", u: ", u, ", d: ", d);
144 EXPECT_EQ("1 83.14151181i: 1, u: 8, d: 3.1415", output);
145
146 output.clear();
147
148 // Boolean arguments.
149 const bool t = true;
150 const bool f = false;
151
152 SpdyStrAppend(&output, t);
153 EXPECT_EQ("1", output);
154 SpdyStrAppend(&output, f);
155 EXPECT_EQ("10", output);
156 SpdyStrAppend(&output, f, t, t, f);
157 EXPECT_EQ("100110", output);
158
159 output.clear();
160
161 // Mixed string-like, numerical, and Boolean arguments.
162 SpdyStrAppend(&output, kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t);
163 EXPECT_EQ("foo1foo081bar3.14151", output);
164 SpdyStrAppend(&output, d, t, t, string_bar, i, u, kBar, t, d, f);
165 EXPECT_EQ("foo1foo081bar3.141513.141511bar18bar13.14150", output);
166}
167
168TEST(SpdyStringUtilsTest, SpdyHexDigitToInt) {
169 EXPECT_EQ(0, SpdyHexDigitToInt('0'));
170 EXPECT_EQ(1, SpdyHexDigitToInt('1'));
171 EXPECT_EQ(2, SpdyHexDigitToInt('2'));
172 EXPECT_EQ(3, SpdyHexDigitToInt('3'));
173 EXPECT_EQ(4, SpdyHexDigitToInt('4'));
174 EXPECT_EQ(5, SpdyHexDigitToInt('5'));
175 EXPECT_EQ(6, SpdyHexDigitToInt('6'));
176 EXPECT_EQ(7, SpdyHexDigitToInt('7'));
177 EXPECT_EQ(8, SpdyHexDigitToInt('8'));
178 EXPECT_EQ(9, SpdyHexDigitToInt('9'));
179
180 EXPECT_EQ(10, SpdyHexDigitToInt('a'));
181 EXPECT_EQ(11, SpdyHexDigitToInt('b'));
182 EXPECT_EQ(12, SpdyHexDigitToInt('c'));
183 EXPECT_EQ(13, SpdyHexDigitToInt('d'));
184 EXPECT_EQ(14, SpdyHexDigitToInt('e'));
185 EXPECT_EQ(15, SpdyHexDigitToInt('f'));
186
187 EXPECT_EQ(10, SpdyHexDigitToInt('A'));
188 EXPECT_EQ(11, SpdyHexDigitToInt('B'));
189 EXPECT_EQ(12, SpdyHexDigitToInt('C'));
190 EXPECT_EQ(13, SpdyHexDigitToInt('D'));
191 EXPECT_EQ(14, SpdyHexDigitToInt('E'));
192 EXPECT_EQ(15, SpdyHexDigitToInt('F'));
193}
194
195TEST(SpdyStringUtilsTest, SpdyHexDecodeToUInt32) {
196 uint32_t out;
197 EXPECT_TRUE(SpdyHexDecodeToUInt32("0", &out));
198 EXPECT_EQ(0u, out);
199 EXPECT_TRUE(SpdyHexDecodeToUInt32("00", &out));
200 EXPECT_EQ(0u, out);
201 EXPECT_TRUE(SpdyHexDecodeToUInt32("0000000", &out));
202 EXPECT_EQ(0u, out);
203 EXPECT_TRUE(SpdyHexDecodeToUInt32("00000000", &out));
204 EXPECT_EQ(0u, out);
205 EXPECT_TRUE(SpdyHexDecodeToUInt32("1", &out));
206 EXPECT_EQ(1u, out);
207 EXPECT_TRUE(SpdyHexDecodeToUInt32("ffffFFF", &out));
208 EXPECT_EQ(0xFFFFFFFu, out);
209 EXPECT_TRUE(SpdyHexDecodeToUInt32("fFfFffFf", &out));
210 EXPECT_EQ(0xFFFFFFFFu, out);
211 EXPECT_TRUE(SpdyHexDecodeToUInt32("01AEF", &out));
212 EXPECT_EQ(0x1AEFu, out);
213 EXPECT_TRUE(SpdyHexDecodeToUInt32("abcde", &out));
214 EXPECT_EQ(0xABCDEu, out);
215
216 EXPECT_FALSE(SpdyHexDecodeToUInt32("", &out));
217 EXPECT_FALSE(SpdyHexDecodeToUInt32("111111111", &out));
218 EXPECT_FALSE(SpdyHexDecodeToUInt32("1111111111", &out));
219 EXPECT_FALSE(SpdyHexDecodeToUInt32("0x1111", &out));
220}
221
222TEST(SpdyStringUtilsTest, SpdyHexEncode) {
223 unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81};
224 EXPECT_EQ("01ff02fe038081",
225 SpdyHexEncode(reinterpret_cast<char*>(bytes), sizeof(bytes)));
226}
227
228TEST(SpdyStringUtilsTest, SpdyHexEncodeUInt32AndTrim) {
229 EXPECT_EQ("0", SpdyHexEncodeUInt32AndTrim(0));
230 EXPECT_EQ("1", SpdyHexEncodeUInt32AndTrim(1));
231 EXPECT_EQ("a", SpdyHexEncodeUInt32AndTrim(0xA));
232 EXPECT_EQ("f", SpdyHexEncodeUInt32AndTrim(0xF));
233 EXPECT_EQ("a9", SpdyHexEncodeUInt32AndTrim(0xA9));
234 EXPECT_EQ("9abcdef", SpdyHexEncodeUInt32AndTrim(0x9ABCDEF));
235 EXPECT_EQ("12345678", SpdyHexEncodeUInt32AndTrim(0x12345678));
236 EXPECT_EQ("ffffffff", SpdyHexEncodeUInt32AndTrim(0xFFFFFFFF));
237 EXPECT_EQ("10000001", SpdyHexEncodeUInt32AndTrim(0x10000001));
238}
239
240} // namespace
241} // namespace test
242} // namespace spdy