OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "sky/engine/platform/network/HTTPParsers.h" | |
6 | |
7 #include "sky/engine/wtf/MathExtras.h" | |
8 #include "sky/engine/wtf/text/AtomicString.h" | |
9 #include "wtf/testing/WTFTestHelpers.h" | |
10 | |
11 #include <gtest/gtest.h> | |
12 | |
13 namespace blink { | |
14 | |
15 namespace { | |
16 | |
17 size_t parseHTTPHeader(const char* data, String& failureReason, AtomicString& na
meStr, AtomicString& valueStr) | |
18 { | |
19 return blink::parseHTTPHeader(data, strlen(data), failureReason, nameStr, va
lueStr); | |
20 } | |
21 | |
22 } // namespace | |
23 | |
24 TEST(HTTPParsersTest, ParseCacheControl) | |
25 { | |
26 CacheControlHeader header; | |
27 | |
28 header = parseCacheControlDirectives("no-cache", AtomicString()); | |
29 EXPECT_TRUE(header.parsed); | |
30 EXPECT_TRUE(header.containsNoCache); | |
31 EXPECT_FALSE(header.containsNoStore); | |
32 EXPECT_FALSE(header.containsMustRevalidate); | |
33 EXPECT_TRUE(std::isnan(header.maxAge)); | |
34 | |
35 header = parseCacheControlDirectives("no-cache no-store", AtomicString()); | |
36 EXPECT_TRUE(header.parsed); | |
37 EXPECT_TRUE(header.containsNoCache); | |
38 EXPECT_FALSE(header.containsNoStore); | |
39 EXPECT_FALSE(header.containsMustRevalidate); | |
40 EXPECT_TRUE(std::isnan(header.maxAge)); | |
41 | |
42 header = parseCacheControlDirectives("no-store must-revalidate", AtomicStrin
g()); | |
43 EXPECT_TRUE(header.parsed); | |
44 EXPECT_FALSE(header.containsNoCache); | |
45 EXPECT_TRUE(header.containsNoStore); | |
46 EXPECT_FALSE(header.containsMustRevalidate); | |
47 EXPECT_TRUE(std::isnan(header.maxAge)); | |
48 | |
49 header = parseCacheControlDirectives("max-age=0", AtomicString()); | |
50 EXPECT_TRUE(header.parsed); | |
51 EXPECT_FALSE(header.containsNoCache); | |
52 EXPECT_FALSE(header.containsNoStore); | |
53 EXPECT_FALSE(header.containsMustRevalidate); | |
54 EXPECT_EQ(0.0, header.maxAge); | |
55 | |
56 header = parseCacheControlDirectives("max-age", AtomicString()); | |
57 EXPECT_TRUE(header.parsed); | |
58 EXPECT_FALSE(header.containsNoCache); | |
59 EXPECT_FALSE(header.containsNoStore); | |
60 EXPECT_FALSE(header.containsMustRevalidate); | |
61 EXPECT_TRUE(std::isnan(header.maxAge)); | |
62 | |
63 header = parseCacheControlDirectives("max-age=0 no-cache", AtomicString()); | |
64 EXPECT_TRUE(header.parsed); | |
65 EXPECT_FALSE(header.containsNoCache); | |
66 EXPECT_FALSE(header.containsNoStore); | |
67 EXPECT_FALSE(header.containsMustRevalidate); | |
68 EXPECT_EQ(0.0, header.maxAge); | |
69 | |
70 header = parseCacheControlDirectives("no-cache=foo", AtomicString()); | |
71 EXPECT_TRUE(header.parsed); | |
72 EXPECT_FALSE(header.containsNoCache); | |
73 EXPECT_FALSE(header.containsNoStore); | |
74 EXPECT_FALSE(header.containsMustRevalidate); | |
75 EXPECT_TRUE(std::isnan(header.maxAge)); | |
76 | |
77 header = parseCacheControlDirectives("nonsense", AtomicString()); | |
78 EXPECT_TRUE(header.parsed); | |
79 EXPECT_FALSE(header.containsNoCache); | |
80 EXPECT_FALSE(header.containsNoStore); | |
81 EXPECT_FALSE(header.containsMustRevalidate); | |
82 EXPECT_TRUE(std::isnan(header.maxAge)); | |
83 | |
84 header = parseCacheControlDirectives("\rno-cache\n\t\v\0\b", AtomicString())
; | |
85 EXPECT_TRUE(header.parsed); | |
86 EXPECT_TRUE(header.containsNoCache); | |
87 EXPECT_FALSE(header.containsNoStore); | |
88 EXPECT_FALSE(header.containsMustRevalidate); | |
89 EXPECT_TRUE(std::isnan(header.maxAge)); | |
90 | |
91 header = parseCacheControlDirectives(" no-cache ", AtomicString()
); | |
92 EXPECT_TRUE(header.parsed); | |
93 EXPECT_TRUE(header.containsNoCache); | |
94 EXPECT_FALSE(header.containsNoStore); | |
95 EXPECT_FALSE(header.containsMustRevalidate); | |
96 EXPECT_TRUE(std::isnan(header.maxAge)); | |
97 | |
98 header = parseCacheControlDirectives(AtomicString(), "no-cache"); | |
99 EXPECT_TRUE(header.parsed); | |
100 EXPECT_TRUE(header.containsNoCache); | |
101 EXPECT_FALSE(header.containsNoStore); | |
102 EXPECT_FALSE(header.containsMustRevalidate); | |
103 EXPECT_TRUE(std::isnan(header.maxAge)); | |
104 } | |
105 | |
106 TEST(HTTPParsersTest, parseHTTPHeaderSimple) | |
107 { | |
108 String failureReason; | |
109 AtomicString name, value; | |
110 EXPECT_EQ(12u, parseHTTPHeader("foo: bar\r\notherdata", failureReason, nam
e, value)); | |
111 EXPECT_TRUE(failureReason.isEmpty()); | |
112 EXPECT_EQ("foo", name.string()); | |
113 EXPECT_EQ("bar", value.string()); | |
114 } | |
115 | |
116 TEST(HTTPParsersTest, parseHTTPHeaderEmptyName) | |
117 { | |
118 String failureReason; | |
119 AtomicString name, value; | |
120 EXPECT_EQ(0u, parseHTTPHeader(": bar\r\notherdata", failureReason, name, val
ue)); | |
121 EXPECT_EQ("Header name is missing", failureReason); | |
122 } | |
123 | |
124 TEST(HTTPParsersTest, parseHTTPHeaderEmptyValue) | |
125 { | |
126 String failureReason; | |
127 AtomicString name, value; | |
128 EXPECT_EQ(7u, parseHTTPHeader("foo: \r\notherdata", failureReason, name, val
ue)); | |
129 EXPECT_TRUE(failureReason.isEmpty()); | |
130 EXPECT_EQ("foo", name.string()); | |
131 EXPECT_TRUE(value.isEmpty()); | |
132 } | |
133 | |
134 TEST(HTTPParsersTest, parseHTTPHeaderInvalidName) | |
135 { | |
136 String failureReason; | |
137 AtomicString name, value; | |
138 EXPECT_EQ(0u, parseHTTPHeader("\xfa: \r\notherdata", failureReason, name, va
lue)); | |
139 EXPECT_EQ("Invalid UTF-8 sequence in header name", failureReason); | |
140 } | |
141 | |
142 TEST(HTTPParsersTest, parseHTTPHeaderInvalidValue) | |
143 { | |
144 String failureReason; | |
145 AtomicString name, value; | |
146 EXPECT_EQ(0u, parseHTTPHeader("foo: \xfa\r\notherdata", failureReason, name,
value)); | |
147 EXPECT_EQ("Invalid UTF-8 sequence in header value", failureReason); | |
148 } | |
149 | |
150 TEST(HTTPParsersTest, parseHTTPHeaderEmpty) | |
151 { | |
152 String failureReason; | |
153 AtomicString name, value; | |
154 EXPECT_EQ(0u, parseHTTPHeader("", failureReason, name, value)); | |
155 EXPECT_EQ("Unterminated header name", failureReason); | |
156 } | |
157 | |
158 TEST(HTTPParsersTest, parseHTTPHeaderEmptyLine) | |
159 { | |
160 String failureReason; | |
161 AtomicString name, value; | |
162 EXPECT_EQ(2u, parseHTTPHeader("\r\notherdata", failureReason, name, value)); | |
163 EXPECT_TRUE(failureReason.isEmpty()); | |
164 EXPECT_TRUE(name.isNull()); | |
165 EXPECT_TRUE(value.isNull()); | |
166 } | |
167 | |
168 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedCRinName) | |
169 { | |
170 String failureReason; | |
171 AtomicString name, value; | |
172 EXPECT_EQ(0u, parseHTTPHeader("foo\rotherdata\n", failureReason, name, value
)); | |
173 EXPECT_EQ("Unexpected CR in name at foo", failureReason); | |
174 } | |
175 | |
176 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedLFinName) | |
177 { | |
178 String failureReason; | |
179 AtomicString name, value; | |
180 EXPECT_EQ(0u, parseHTTPHeader("foo\notherdata\n", failureReason, name, value
)); | |
181 EXPECT_EQ("Unexpected LF in name at foo", failureReason); | |
182 } | |
183 | |
184 TEST(HTTPParsersTest, parseHTTPHeaderUnexpectedLFinValue) | |
185 { | |
186 String failureReason; | |
187 AtomicString name, value; | |
188 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\notherdata\n", failureReason, name,
value)); | |
189 EXPECT_EQ("Unexpected LF in value at bar", failureReason); | |
190 } | |
191 | |
192 TEST(HTTPParsersTest, parseHTTPHeaderNoLFAtEndOfLine) | |
193 { | |
194 String failureReason; | |
195 AtomicString name, value; | |
196 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\r", failureReason, name, value)); | |
197 EXPECT_EQ("LF doesn't follow CR after value at ", failureReason); | |
198 } | |
199 | |
200 TEST(HTTPParsersTest, parseHTTPHeaderNoLF) | |
201 { | |
202 String failureReason; | |
203 AtomicString name, value; | |
204 EXPECT_EQ(0u, parseHTTPHeader("foo: bar\rhoge\r\n", failureReason, name, val
ue)); | |
205 EXPECT_EQ("LF doesn't follow CR after value at hoge\r\n", failureReason); | |
206 } | |
207 | |
208 TEST(HTTPParsersTest, parseHTTPHeaderTwoLines) | |
209 { | |
210 const char data[] = "foo: bar\r\nhoge: fuga\r\nxxx"; | |
211 String failureReason; | |
212 AtomicString name, value; | |
213 | |
214 EXPECT_EQ(10u, parseHTTPHeader(data, failureReason, name, value)); | |
215 EXPECT_TRUE(failureReason.isEmpty()); | |
216 EXPECT_EQ("foo", name.string()); | |
217 EXPECT_EQ("bar", value.string()); | |
218 | |
219 EXPECT_EQ(12u, parseHTTPHeader(data + 10, failureReason, name, value)); | |
220 EXPECT_TRUE(failureReason.isEmpty()); | |
221 EXPECT_EQ("hoge", name.string()); | |
222 EXPECT_EQ("fuga", value.string()); | |
223 } | |
224 | |
225 } // namespace blink | |
226 | |
OLD | NEW |