| 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 |