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