| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 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/tools/balsa/balsa_headers.h" | |
| 6 | |
| 7 #include <iterator> | |
| 8 #include <string> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "base/memory/scoped_ptr.h" | |
| 12 #include "base/strings/string_piece.h" | |
| 13 #include "net/tools/balsa/balsa_enums.h" | |
| 14 #include "testing/gtest/include/gtest/gtest.h" | |
| 15 | |
| 16 namespace net { | |
| 17 | |
| 18 using ::base::StringPiece; | |
| 19 | |
| 20 class BalsaBufferTest : public ::testing::Test { | |
| 21 public: | |
| 22 void SetUp() override { | |
| 23 buffer_.reset(new BalsaBuffer); | |
| 24 anotherBuffer_.reset(new BalsaBuffer); | |
| 25 } | |
| 26 | |
| 27 protected: | |
| 28 scoped_ptr<BalsaBuffer> buffer_; | |
| 29 scoped_ptr<BalsaBuffer> anotherBuffer_; | |
| 30 }; | |
| 31 | |
| 32 namespace { | |
| 33 | |
| 34 class BalsaHeadersTest: public ::testing::Test { | |
| 35 public: | |
| 36 void SetUp() override { headers_.reset(new BalsaHeaders); } | |
| 37 | |
| 38 protected: | |
| 39 scoped_ptr<BalsaHeaders> headers_; | |
| 40 }; | |
| 41 | |
| 42 class StringBuffer { | |
| 43 public: | |
| 44 void Write(const char* p, size_t size) { | |
| 45 string_ += std::string(p, size); | |
| 46 } | |
| 47 const std::string& string() {return string_;} | |
| 48 | |
| 49 private: | |
| 50 std::string string_; | |
| 51 }; | |
| 52 | |
| 53 TEST_F(BalsaBufferTest, EmptyBuffer) { | |
| 54 ASSERT_EQ(1u, buffer_->num_blocks()); | |
| 55 } | |
| 56 | |
| 57 TEST_F(BalsaBufferTest, Write) { | |
| 58 size_t index1, index2; | |
| 59 StringPiece sp1 = buffer_->Write(StringPiece("hello"), &index1); | |
| 60 StringPiece sp2 = buffer_->Write(StringPiece(", world"), &index2); | |
| 61 | |
| 62 ASSERT_EQ(2u, buffer_->num_blocks()); | |
| 63 ASSERT_EQ("hello", sp1); | |
| 64 ASSERT_EQ(", world", sp2); | |
| 65 ASSERT_EQ(1u, index1); | |
| 66 ASSERT_EQ(1u, index2); | |
| 67 ASSERT_EQ("hello, world", | |
| 68 StringPiece(buffer_->GetPtr(1), buffer_->bytes_used(1))); | |
| 69 } | |
| 70 | |
| 71 TEST_F(BalsaBufferTest, WriteLongData) { | |
| 72 size_t index1, index2, index3; | |
| 73 std::string as(2, 'a'); | |
| 74 std::string bs(BalsaBuffer::kDefaultBlocksize + 1, 'b'); | |
| 75 std::string cs(4, 'c'); | |
| 76 | |
| 77 StringPiece sp1 = buffer_->Write(as, &index1); | |
| 78 StringPiece sp2 = buffer_->Write(bs, &index2); | |
| 79 StringPiece sp3 = buffer_->Write(cs, &index3); | |
| 80 | |
| 81 ASSERT_EQ(3u, buffer_->num_blocks()); | |
| 82 ASSERT_EQ(as, sp1); | |
| 83 ASSERT_EQ(bs, sp2); | |
| 84 ASSERT_EQ(cs, sp3); | |
| 85 ASSERT_EQ(1u, index1); | |
| 86 ASSERT_EQ(2u, index2); | |
| 87 ASSERT_EQ(1u, index3); | |
| 88 ASSERT_EQ("aacccc", StringPiece(buffer_->GetPtr(1), buffer_->bytes_used(1))); | |
| 89 ASSERT_EQ(sp2, StringPiece(buffer_->GetPtr(2), buffer_->bytes_used(2))); | |
| 90 } | |
| 91 | |
| 92 TEST_F(BalsaBufferTest, WriteToContiguousBuffer) { | |
| 93 std::string as(2, 'a'); | |
| 94 std::string bs(BalsaBuffer::kDefaultBlocksize + 1, 'b'); | |
| 95 std::string cs(4, 'c'); | |
| 96 | |
| 97 buffer_->WriteToContiguousBuffer(as); | |
| 98 buffer_->WriteToContiguousBuffer(bs); | |
| 99 buffer_->WriteToContiguousBuffer(cs); | |
| 100 | |
| 101 ASSERT_EQ(1u, buffer_->num_blocks()); | |
| 102 ASSERT_EQ(as + bs + cs, | |
| 103 StringPiece(buffer_->GetPtr(0), buffer_->bytes_used(0))); | |
| 104 } | |
| 105 | |
| 106 TEST_F(BalsaBufferTest, NoMoreWriteToContiguousBuffer) { | |
| 107 size_t index1, index2; | |
| 108 StringPiece sp1 = buffer_->Write(StringPiece("hello"), &index1); | |
| 109 buffer_->NoMoreWriteToContiguousBuffer(); | |
| 110 StringPiece sp2 = buffer_->Write(StringPiece(", world"), &index2); | |
| 111 | |
| 112 ASSERT_EQ(2u, buffer_->num_blocks()); | |
| 113 ASSERT_EQ("hello", sp1); | |
| 114 ASSERT_EQ(", world", sp2); | |
| 115 ASSERT_EQ(1u, index1); | |
| 116 ASSERT_EQ(0u, index2); | |
| 117 ASSERT_EQ(sp1, StringPiece(buffer_->GetPtr(1), buffer_->bytes_used(1))); | |
| 118 ASSERT_EQ(sp2, StringPiece(buffer_->GetPtr(0), buffer_->bytes_used(0))); | |
| 119 } | |
| 120 | |
| 121 TEST_F(BalsaBufferTest, Clear) { | |
| 122 buffer_->Write("hello", NULL); | |
| 123 ASSERT_EQ(2u, buffer_->num_blocks()); | |
| 124 buffer_->Clear(); | |
| 125 ASSERT_EQ(1u, buffer_->num_blocks()); | |
| 126 } | |
| 127 | |
| 128 TEST_F(BalsaBufferTest, Swap) { | |
| 129 buffer_->Write("hello", NULL); | |
| 130 | |
| 131 ASSERT_EQ(2u, buffer_->num_blocks()); | |
| 132 ASSERT_EQ(1u, anotherBuffer_->num_blocks()); | |
| 133 | |
| 134 buffer_->Swap(anotherBuffer_.get()); | |
| 135 | |
| 136 ASSERT_EQ(1u, buffer_->num_blocks()); | |
| 137 ASSERT_EQ(2u, anotherBuffer_->num_blocks()); | |
| 138 ASSERT_EQ("hello", | |
| 139 StringPiece(anotherBuffer_->GetPtr(1), | |
| 140 anotherBuffer_->bytes_used(1))); | |
| 141 } | |
| 142 | |
| 143 TEST_F(BalsaBufferTest, CopyFrom) { | |
| 144 buffer_->Write("hello", NULL); | |
| 145 | |
| 146 ASSERT_EQ(2u, buffer_->num_blocks()); | |
| 147 ASSERT_EQ(1u, anotherBuffer_->num_blocks()); | |
| 148 | |
| 149 anotherBuffer_->CopyFrom(*buffer_); | |
| 150 | |
| 151 ASSERT_EQ(2u, buffer_->num_blocks()); | |
| 152 ASSERT_EQ(2u, anotherBuffer_->num_blocks()); | |
| 153 ASSERT_EQ("hello", StringPiece(buffer_->GetPtr(1), buffer_->bytes_used(1))); | |
| 154 ASSERT_EQ("hello", | |
| 155 StringPiece(anotherBuffer_->GetPtr(1), | |
| 156 anotherBuffer_->bytes_used(1))); | |
| 157 } | |
| 158 | |
| 159 TEST_F(BalsaHeadersTest, AppendHeader) { | |
| 160 headers_->AppendHeader("key1", "value1"); | |
| 161 headers_->AppendHeader("key2", "value2"); | |
| 162 headers_->AppendHeader("key3", "value3"); | |
| 163 headers_->AppendHeader("key3", "value3.1"); | |
| 164 headers_->AppendHeader("key3", "value3.2"); | |
| 165 | |
| 166 ASSERT_EQ(5, std::distance(headers_->header_lines_begin(), | |
| 167 headers_->header_lines_end())); | |
| 168 ASSERT_EQ("value1", headers_->GetHeader("key1")); | |
| 169 ASSERT_EQ("value2", headers_->GetHeader("key2")); | |
| 170 ASSERT_EQ("value3", headers_->GetHeader("key3")); | |
| 171 | |
| 172 std::vector<base::StringPiece> v1, v2, v3; | |
| 173 std::string s1, s2, s3; | |
| 174 headers_->GetAllOfHeader("key1", &v1); | |
| 175 headers_->GetAllOfHeader("key2", &v2); | |
| 176 headers_->GetAllOfHeader("key3", &v3); | |
| 177 headers_->GetAllOfHeaderAsString("key1", &s1); | |
| 178 headers_->GetAllOfHeaderAsString("key2", &s2); | |
| 179 headers_->GetAllOfHeaderAsString("key3", &s3); | |
| 180 | |
| 181 ASSERT_EQ(1u, v1.size()); | |
| 182 ASSERT_EQ(1u, v2.size()); | |
| 183 ASSERT_EQ(3u, v3.size()); | |
| 184 ASSERT_EQ("value1", v1[0]); | |
| 185 ASSERT_EQ("value2", v2[0]); | |
| 186 ASSERT_EQ("value3", v3[0]); | |
| 187 ASSERT_EQ("value3.1", v3[1]); | |
| 188 ASSERT_EQ("value3.2", v3[2]); | |
| 189 ASSERT_EQ("value1", s1); | |
| 190 ASSERT_EQ("value2", s2); | |
| 191 ASSERT_EQ("value3,value3.1,value3.2", s3); | |
| 192 } | |
| 193 | |
| 194 TEST_F(BalsaHeadersTest, ReplaceOrAppendHeader) { | |
| 195 headers_->ReplaceOrAppendHeader("key1", "value1"); | |
| 196 headers_->ReplaceOrAppendHeader("key1", "value2"); | |
| 197 | |
| 198 ASSERT_EQ(1, std::distance(headers_->header_lines_begin(), | |
| 199 headers_->header_lines_end())); | |
| 200 ASSERT_EQ("value2", headers_->GetHeader("key1")); | |
| 201 | |
| 202 std::vector<base::StringPiece> v; | |
| 203 headers_->GetAllOfHeader("key1", &v); | |
| 204 | |
| 205 ASSERT_EQ(1u, v.size()); | |
| 206 ASSERT_EQ("value2", v[0]); | |
| 207 } | |
| 208 | |
| 209 TEST_F(BalsaHeadersTest, AppendToHeader) { | |
| 210 headers_->AppendToHeader("key1", "value1"); | |
| 211 headers_->AppendToHeader("keY1", "value2"); | |
| 212 | |
| 213 ASSERT_EQ(1, std::distance(headers_->header_lines_begin(), | |
| 214 headers_->header_lines_end())); | |
| 215 ASSERT_EQ("value1,value2", headers_->GetHeader("key1")); | |
| 216 | |
| 217 std::vector<base::StringPiece> v; | |
| 218 std::string s; | |
| 219 headers_->GetAllOfHeader("key1", &v); | |
| 220 headers_->GetAllOfHeaderAsString("keY1", &s); | |
| 221 | |
| 222 ASSERT_EQ(1u, v.size()); | |
| 223 ASSERT_EQ("value1,value2", v[0]); | |
| 224 ASSERT_EQ("value1,value2", s); | |
| 225 } | |
| 226 | |
| 227 TEST_F(BalsaHeadersTest, PrepentToHeader) { | |
| 228 headers_->PrependToHeader("key1", "value1"); | |
| 229 headers_->PrependToHeader("key1", "value2"); | |
| 230 | |
| 231 ASSERT_EQ(1, std::distance(headers_->header_lines_begin(), | |
| 232 headers_->header_lines_end())); | |
| 233 ASSERT_EQ("value2,value1", headers_->GetHeader("key1")); | |
| 234 | |
| 235 std::vector<base::StringPiece> v; | |
| 236 std::string s; | |
| 237 headers_->GetAllOfHeader("key1", &v); | |
| 238 headers_->GetAllOfHeaderAsString("key1", &s); | |
| 239 | |
| 240 ASSERT_EQ(1u, v.size()); | |
| 241 ASSERT_EQ("value2,value1", v[0]); | |
| 242 ASSERT_EQ("value2,value1", s); | |
| 243 } | |
| 244 | |
| 245 TEST_F(BalsaHeadersTest, HasHeader) { | |
| 246 headers_->AppendHeader("key1", "value1"); | |
| 247 | |
| 248 ASSERT_TRUE(headers_->HasHeader("key1")); | |
| 249 ASSERT_FALSE(headers_->HasHeader("value1")); | |
| 250 ASSERT_FALSE(headers_->HasHeader("key2")); | |
| 251 } | |
| 252 | |
| 253 TEST_F(BalsaHeadersTest, HasNonEmptyHeader) { | |
| 254 headers_->AppendHeader("key1", "value1"); | |
| 255 headers_->AppendHeader("key2", ""); | |
| 256 | |
| 257 ASSERT_TRUE(headers_->HasNonEmptyHeader("key1")); | |
| 258 ASSERT_FALSE(headers_->HasNonEmptyHeader("key2")); | |
| 259 ASSERT_FALSE(headers_->HasNonEmptyHeader("key3")); | |
| 260 } | |
| 261 | |
| 262 TEST_F(BalsaHeadersTest, GetHeaderPosition) { | |
| 263 headers_->AppendHeader("key1", "value1"); | |
| 264 headers_->AppendHeader("key2", "value2"); | |
| 265 headers_->AppendHeader("key3", "value3"); | |
| 266 | |
| 267 BalsaHeaders::const_header_lines_iterator i = | |
| 268 headers_->GetHeaderPosition("key2"); | |
| 269 | |
| 270 ASSERT_EQ(headers_->header_lines_end(), | |
| 271 headers_->GetHeaderPosition("foobar")); | |
| 272 ASSERT_EQ(headers_->header_lines_begin(), | |
| 273 headers_->GetHeaderPosition("key1")); | |
| 274 ASSERT_NE(headers_->header_lines_end(), i); | |
| 275 ASSERT_EQ("key2", i->first); | |
| 276 ASSERT_EQ("value2", i->second); | |
| 277 ++i; | |
| 278 ASSERT_EQ("key3", i->first); | |
| 279 ASSERT_EQ("value3", i->second); | |
| 280 ++i; | |
| 281 ASSERT_EQ(headers_->header_lines_end(), i); | |
| 282 } | |
| 283 | |
| 284 TEST_F(BalsaHeadersTest, GetIteratorForKey) { | |
| 285 headers_->AppendHeader("key1", "value1"); | |
| 286 headers_->AppendHeader("key2", "value2"); | |
| 287 headers_->AppendHeader("key1", "value1.1"); | |
| 288 headers_->AppendHeader("key3", "value3"); | |
| 289 headers_->AppendHeader("KEY1", "value1.2"); | |
| 290 | |
| 291 BalsaHeaders::const_header_lines_key_iterator i = | |
| 292 headers_->GetIteratorForKey("key1"); | |
| 293 | |
| 294 ASSERT_EQ(headers_->header_lines_key_end(), | |
| 295 headers_->GetIteratorForKey("foobar")); | |
| 296 ASSERT_NE(headers_->header_lines_key_end(), i); | |
| 297 ASSERT_EQ("key1", i->first); | |
| 298 ASSERT_EQ("value1", i->second); | |
| 299 ++i; | |
| 300 ASSERT_EQ("key1", i->first); | |
| 301 ASSERT_EQ("value1.1", i->second); | |
| 302 ++i; | |
| 303 ASSERT_EQ("KEY1", i->first); | |
| 304 ASSERT_EQ("value1.2", i->second); | |
| 305 ++i; | |
| 306 ASSERT_EQ(headers_->header_lines_key_end(), i); | |
| 307 } | |
| 308 | |
| 309 TEST_F(BalsaHeadersTest, RemoveAllOfHeader) { | |
| 310 headers_->AppendHeader("key1", "value1"); | |
| 311 headers_->AppendHeader("key2", "value2"); | |
| 312 headers_->AppendHeader("key1", "value1.1"); | |
| 313 headers_->AppendHeader("key3", "value3"); | |
| 314 headers_->AppendHeader("key1", "value1.2"); | |
| 315 headers_->AppendHeader("kEY1", "value1.3"); | |
| 316 | |
| 317 ASSERT_EQ(6, std::distance(headers_->header_lines_begin(), | |
| 318 headers_->header_lines_end())); | |
| 319 headers_->RemoveAllOfHeader("key1"); | |
| 320 ASSERT_EQ(2, std::distance(headers_->header_lines_begin(), | |
| 321 headers_->header_lines_end())); | |
| 322 } | |
| 323 | |
| 324 TEST_F(BalsaHeadersTest, RemoveAllHeadersWithPrefix) { | |
| 325 headers_->AppendHeader("1key", "value1"); | |
| 326 headers_->AppendHeader("2key", "value2"); | |
| 327 headers_->AppendHeader("1kEz", "value1.1"); | |
| 328 headers_->AppendHeader("key3", "value3"); | |
| 329 headers_->AppendHeader("1KEEjkladf", "value1.2"); | |
| 330 | |
| 331 ASSERT_EQ(5, std::distance(headers_->header_lines_begin(), | |
| 332 headers_->header_lines_end())); | |
| 333 headers_->RemoveAllHeadersWithPrefix("1ke"); | |
| 334 ASSERT_EQ(2, std::distance(headers_->header_lines_begin(), | |
| 335 headers_->header_lines_end())); | |
| 336 } | |
| 337 | |
| 338 TEST_F(BalsaHeadersTest, WriteRequestHeaderAndEndingToBuffer) { | |
| 339 headers_->AppendHeader("key1", "value1"); | |
| 340 headers_->AppendHeader("key2", "value2"); | |
| 341 headers_->AppendHeader("key1", "value1.1"); | |
| 342 | |
| 343 headers_->SetRequestFirstlineFromStringPieces("GET", "/", "HTTP/1.0"); | |
| 344 | |
| 345 std::string expected = "GET / HTTP/1.0\r\n" | |
| 346 "key1: value1\r\n" | |
| 347 "key2: value2\r\n" | |
| 348 "key1: value1.1\r\n\r\n"; | |
| 349 StringBuffer buffer; | |
| 350 headers_->WriteHeaderAndEndingToBuffer(&buffer); | |
| 351 ASSERT_EQ(expected, buffer.string()); | |
| 352 } | |
| 353 | |
| 354 TEST_F(BalsaHeadersTest, WriteResponseHeaderAndEndingToBuffer) { | |
| 355 headers_->AppendHeader("key1", "value1"); | |
| 356 headers_->AppendHeader("key2", "value2"); | |
| 357 headers_->AppendHeader("key1", "value1.1"); | |
| 358 | |
| 359 headers_->SetResponseFirstlineFromStringPieces("HTTP/1.0", "200", "OK"); | |
| 360 | |
| 361 std::string expected = "HTTP/1.0 200 OK\r\n" | |
| 362 "key1: value1\r\n" | |
| 363 "key2: value2\r\n" | |
| 364 "key1: value1.1\r\n\r\n"; | |
| 365 StringBuffer buffer; | |
| 366 headers_->WriteHeaderAndEndingToBuffer(&buffer); | |
| 367 ASSERT_EQ(expected, buffer.string()); | |
| 368 } | |
| 369 | |
| 370 TEST_F(BalsaHeadersTest, RequestFirstLine) { | |
| 371 headers_->SetRequestFirstlineFromStringPieces("HEAD", "/path", "HTTP/1.1"); | |
| 372 | |
| 373 ASSERT_EQ("HEAD /path HTTP/1.1", headers_->first_line()); | |
| 374 ASSERT_EQ("HEAD", headers_->request_method()); | |
| 375 ASSERT_EQ("/path", headers_->request_uri()); | |
| 376 ASSERT_EQ("HTTP/1.1", headers_->request_version()); | |
| 377 } | |
| 378 | |
| 379 TEST_F(BalsaHeadersTest, ResponseFirstLine) { | |
| 380 headers_->SetRequestFirstlineFromStringPieces("HTTP/1.0", "403", "FORBIDDEN"); | |
| 381 | |
| 382 ASSERT_EQ("HTTP/1.0 403 FORBIDDEN", headers_->first_line()); | |
| 383 ASSERT_EQ("HTTP/1.0", headers_->response_version()); | |
| 384 ASSERT_EQ("403", headers_->response_code()); | |
| 385 ASSERT_EQ("FORBIDDEN", headers_->response_reason_phrase()); | |
| 386 } | |
| 387 | |
| 388 } // namespace | |
| 389 | |
| 390 } // namespace net | |
| OLD | NEW |