blob: 254f9d7d4603a3d0f3234cfe9eac2c8764882ef4 [file] [log] [blame]
QUICHE teamfd50a402018-12-07 22:54:05 -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/http2/platform/api/http2_string_utils.h"
6
7#include <cstdint>
8
9#include "testing/gtest/include/gtest/gtest.h"
10#include "net/third_party/quiche/src/http2/platform/api/http2_string_piece.h"
11
12namespace http2 {
13namespace test {
14namespace {
15
16TEST(Http2StringUtilsTest, Http2StrCat) {
17 // No arguments.
18 EXPECT_EQ("", Http2StrCat());
19
20 // Single string-like argument.
21 const char kFoo[] = "foo";
22 const Http2String string_foo(kFoo);
23 const Http2StringPiece stringpiece_foo(string_foo);
24 EXPECT_EQ("foo", Http2StrCat(kFoo));
25 EXPECT_EQ("foo", Http2StrCat(string_foo));
26 EXPECT_EQ("foo", Http2StrCat(stringpiece_foo));
27
28 // Two string-like arguments.
29 const char kBar[] = "bar";
30 const Http2StringPiece stringpiece_bar(kBar);
31 const Http2String string_bar(kBar);
32 EXPECT_EQ("foobar", Http2StrCat(kFoo, kBar));
33 EXPECT_EQ("foobar", Http2StrCat(kFoo, string_bar));
34 EXPECT_EQ("foobar", Http2StrCat(kFoo, stringpiece_bar));
35 EXPECT_EQ("foobar", Http2StrCat(string_foo, kBar));
36 EXPECT_EQ("foobar", Http2StrCat(string_foo, string_bar));
37 EXPECT_EQ("foobar", Http2StrCat(string_foo, stringpiece_bar));
38 EXPECT_EQ("foobar", Http2StrCat(stringpiece_foo, kBar));
39 EXPECT_EQ("foobar", Http2StrCat(stringpiece_foo, string_bar));
40 EXPECT_EQ("foobar", Http2StrCat(stringpiece_foo, stringpiece_bar));
41
42 // Many-many arguments.
43 EXPECT_EQ(
44 "foobarbazquxquuxquuzcorgegraultgarplywaldofredplughxyzzythud",
45 Http2StrCat("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", Http2StrCat(i, " ", u));
54 EXPECT_EQ("3.14151181", Http2StrCat(d, i, i, u, i));
55 EXPECT_EQ("i: 1, u: 8, d: 3.1415",
56 Http2StrCat("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", Http2StrCat(t));
63 EXPECT_EQ("0", Http2StrCat(f));
64 EXPECT_EQ("0110", Http2StrCat(f, t, t, f));
65
66 // Mixed string-like, numerical, and Boolean arguments.
67 EXPECT_EQ("foo1foo081bar3.14151",
68 Http2StrCat(kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t));
69 EXPECT_EQ("3.141511bar18bar13.14150",
70 Http2StrCat(d, t, t, string_bar, i, u, kBar, t, d, f));
71}
72
73TEST(Http2StringUtilsTest, Http2StrAppend) {
74 // No arguments on empty string.
75 Http2String output;
76 Http2StrAppend(&output);
77 EXPECT_TRUE(output.empty());
78
79 // Single string-like argument.
80 const char kFoo[] = "foo";
81 const Http2String string_foo(kFoo);
82 const Http2StringPiece stringpiece_foo(string_foo);
83 Http2StrAppend(&output, kFoo);
84 EXPECT_EQ("foo", output);
85 Http2StrAppend(&output, string_foo);
86 EXPECT_EQ("foofoo", output);
87 Http2StrAppend(&output, stringpiece_foo);
88 EXPECT_EQ("foofoofoo", output);
89
90 // No arguments on non-empty string.
91 Http2StrAppend(&output);
92 EXPECT_EQ("foofoofoo", output);
93
94 output.clear();
95
96 // Two string-like arguments.
97 const char kBar[] = "bar";
98 const Http2StringPiece stringpiece_bar(kBar);
99 const Http2String string_bar(kBar);
100 Http2StrAppend(&output, kFoo, kBar);
101 EXPECT_EQ("foobar", output);
102 Http2StrAppend(&output, kFoo, string_bar);
103 EXPECT_EQ("foobarfoobar", output);
104 Http2StrAppend(&output, kFoo, stringpiece_bar);
105 EXPECT_EQ("foobarfoobarfoobar", output);
106 Http2StrAppend(&output, string_foo, kBar);
107 EXPECT_EQ("foobarfoobarfoobarfoobar", output);
108
109 output.clear();
110
111 Http2StrAppend(&output, string_foo, string_bar);
112 EXPECT_EQ("foobar", output);
113 Http2StrAppend(&output, string_foo, stringpiece_bar);
114 EXPECT_EQ("foobarfoobar", output);
115 Http2StrAppend(&output, stringpiece_foo, kBar);
116 EXPECT_EQ("foobarfoobarfoobar", output);
117 Http2StrAppend(&output, stringpiece_foo, string_bar);
118 EXPECT_EQ("foobarfoobarfoobarfoobar", output);
119
120 output.clear();
121
122 Http2StrAppend(&output, stringpiece_foo, stringpiece_bar);
123 EXPECT_EQ("foobar", output);
124
125 // Many-many arguments.
126 Http2StrAppend(&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 Http2StrAppend(&output, i, " ", u);
140 EXPECT_EQ("1 8", output);
141 Http2StrAppend(&output, d, i, i, u, i);
142 EXPECT_EQ("1 83.14151181", output);
143 Http2StrAppend(&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 Http2StrAppend(&output, t);
153 EXPECT_EQ("1", output);
154 Http2StrAppend(&output, f);
155 EXPECT_EQ("10", output);
156 Http2StrAppend(&output, f, t, t, f);
157 EXPECT_EQ("100110", output);
158
159 output.clear();
160
161 // Mixed string-like, numerical, and Boolean arguments.
162 Http2StrAppend(&output, kFoo, i, string_foo, f, u, t, stringpiece_bar, d, t);
163 EXPECT_EQ("foo1foo081bar3.14151", output);
164 Http2StrAppend(&output, d, t, t, string_bar, i, u, kBar, t, d, f);
165 EXPECT_EQ("foo1foo081bar3.141513.141511bar18bar13.14150", output);
166}
167
168TEST(Http2StringUtilsTest, Http2StringPrintf) {
169 EXPECT_EQ("", Http2StringPrintf("%s", ""));
170 EXPECT_EQ("foobar", Http2StringPrintf("%sbar", "foo"));
171 EXPECT_EQ("foobar", Http2StringPrintf("%s%s", "foo", "bar"));
172 EXPECT_EQ("foo: 1, bar: 2.0",
173 Http2StringPrintf("foo: %d, bar: %.1f", 1, 2.0));
174}
175
176} // namespace
177} // namespace test
178} // namespace http2