| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/flip_server/http_interface.h" | 5 #include "net/tools/flip_server/http_interface.h" |
| 6 | 6 |
| 7 #include <list> | 7 #include <list> |
| 8 | 8 |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 MemoryCache* memory_cache, | 33 MemoryCache* memory_cache, |
| 34 FlipAcceptor* acceptor, | 34 FlipAcceptor* acceptor, |
| 35 std::string log_prefix) | 35 std::string log_prefix) |
| 36 : SMConnection(epoll_server, | 36 : SMConnection(epoll_server, |
| 37 ssl_state, | 37 ssl_state, |
| 38 memory_cache, | 38 memory_cache, |
| 39 acceptor, | 39 acceptor, |
| 40 log_prefix) {} | 40 log_prefix) {} |
| 41 | 41 |
| 42 MOCK_METHOD0(Cleanup, void()); | 42 MOCK_METHOD0(Cleanup, void()); |
| 43 MOCK_METHOD8(InitSMConnection, void(SMConnectionPoolInterface*, | 43 MOCK_METHOD8(InitSMConnection, |
| 44 SMInterface*, | 44 void(SMConnectionPoolInterface*, |
| 45 EpollServer*, | 45 SMInterface*, |
| 46 int, | 46 EpollServer*, |
| 47 std::string, | 47 int, |
| 48 std::string, | 48 std::string, |
| 49 std::string, | 49 std::string, |
| 50 bool)); | 50 std::string, |
| 51 bool)); |
| 51 }; | 52 }; |
| 52 | 53 |
| 53 class FlipHttpSMTest : public ::testing::Test { | 54 class FlipHttpSMTest : public ::testing::Test { |
| 54 public: | 55 public: |
| 55 explicit FlipHttpSMTest(FlipHandlerType type = FLIP_HANDLER_PROXY) { | 56 explicit FlipHttpSMTest(FlipHandlerType type = FLIP_HANDLER_PROXY) { |
| 56 SSLState* ssl_state = NULL; | 57 SSLState* ssl_state = NULL; |
| 57 mock_another_interface_.reset(new MockSMInterface); | 58 mock_another_interface_.reset(new MockSMInterface); |
| 58 memory_cache_.reset(new MemoryCache); | 59 memory_cache_.reset(new MemoryCache); |
| 59 acceptor_.reset(new FlipAcceptor(type, | 60 acceptor_.reset(new FlipAcceptor(type, |
| 60 "127.0.0.1", | 61 "127.0.0.1", |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 interface_->ResetForNewConnection(); | 161 interface_->ResetForNewConnection(); |
| 161 } | 162 } |
| 162 | 163 |
| 163 TEST_F(FlipHttpSMTest, InitSMConnection) { | 164 TEST_F(FlipHttpSMTest, InitSMConnection) { |
| 164 EXPECT_CALL(*connection_, InitSMConnection(_, _, _, _, _, _, _, _)); | 165 EXPECT_CALL(*connection_, InitSMConnection(_, _, _, _, _, _, _, _)); |
| 165 | 166 |
| 166 interface_->InitSMConnection(NULL, NULL, NULL, 0, "", "", "", false); | 167 interface_->InitSMConnection(NULL, NULL, NULL, 0, "", "", "", false); |
| 167 } | 168 } |
| 168 | 169 |
| 169 TEST_F(FlipHttpSMTest, ProcessReadInput) { | 170 TEST_F(FlipHttpSMTest, ProcessReadInput) { |
| 170 std::string data = "HTTP/1.1 200 OK\r\n" | 171 std::string data = |
| 172 "HTTP/1.1 200 OK\r\n" |
| 171 "Content-Length: 14\r\n\r\n" | 173 "Content-Length: 14\r\n\r\n" |
| 172 "hello, world\r\n"; | 174 "hello, world\r\n"; |
| 173 testing::MockFunction<void(int)> checkpoint; | 175 testing::MockFunction<void(int)> checkpoint; // NOLINT |
| 174 { | 176 { |
| 175 InSequence s; | 177 InSequence s; |
| 176 EXPECT_CALL(*mock_another_interface_, SendSynReply(_, _)); | 178 EXPECT_CALL(*mock_another_interface_, SendSynReply(_, _)); |
| 177 EXPECT_CALL(checkpoint, Call(0)); | 179 EXPECT_CALL(checkpoint, Call(0)); |
| 178 EXPECT_CALL(*mock_another_interface_, SendDataFrame(_, _, _, _, _)); | 180 EXPECT_CALL(*mock_another_interface_, SendDataFrame(_, _, _, _, _)); |
| 179 EXPECT_CALL(*mock_another_interface_, SendEOF(_)); | 181 EXPECT_CALL(*mock_another_interface_, SendEOF(_)); |
| 180 } | 182 } |
| 181 | 183 |
| 182 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, | 184 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, |
| 183 interface_->spdy_framer()->ParseState()); | 185 interface_->spdy_framer()->ParseState()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 198 | 200 |
| 199 ASSERT_EQ(1u, connection_->output_list()->size()); | 201 ASSERT_EQ(1u, connection_->output_list()->size()); |
| 200 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 202 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 201 DataFrame* df = *i++; | 203 DataFrame* df = *i++; |
| 202 ASSERT_EQ(data, StringPiece(df->data, df->size)); | 204 ASSERT_EQ(data, StringPiece(df->data, df->size)); |
| 203 ASSERT_EQ(connection_->output_list()->end(), i); | 205 ASSERT_EQ(connection_->output_list()->end(), i); |
| 204 } | 206 } |
| 205 | 207 |
| 206 TEST_F(FlipHttpSMTest, Reset) { | 208 TEST_F(FlipHttpSMTest, Reset) { |
| 207 std::string data = "HTTP/1.1 200 OK\r\n\r\n"; | 209 std::string data = "HTTP/1.1 200 OK\r\n\r\n"; |
| 208 testing::MockFunction<void(int)> checkpoint; | 210 testing::MockFunction<void(int)> checkpoint; // NOLINT |
| 209 { | 211 { |
| 210 InSequence s; | 212 InSequence s; |
| 211 EXPECT_CALL(*mock_another_interface_, SendSynReply(_, _)); | 213 EXPECT_CALL(*mock_another_interface_, SendSynReply(_, _)); |
| 212 EXPECT_CALL(checkpoint, Call(0)); | 214 EXPECT_CALL(checkpoint, Call(0)); |
| 213 } | 215 } |
| 214 | 216 |
| 215 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, | 217 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, |
| 216 interface_->spdy_framer()->ParseState()); | 218 interface_->spdy_framer()->ParseState()); |
| 217 | 219 |
| 218 interface_->ProcessReadInput(data.data(), data.size()); | 220 interface_->ProcessReadInput(data.data(), data.size()); |
| 219 checkpoint.Call(0); | 221 checkpoint.Call(0); |
| 220 ASSERT_FALSE(interface_->MessageFullyRead()); | 222 ASSERT_FALSE(interface_->MessageFullyRead()); |
| 221 ASSERT_EQ(BalsaFrameEnums::READING_UNTIL_CLOSE, | 223 ASSERT_EQ(BalsaFrameEnums::READING_UNTIL_CLOSE, |
| 222 interface_->spdy_framer()->ParseState()); | 224 interface_->spdy_framer()->ParseState()); |
| 223 | 225 |
| 224 interface_->Reset(); | 226 interface_->Reset(); |
| 225 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, | 227 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, |
| 226 interface_->spdy_framer()->ParseState()); | 228 interface_->spdy_framer()->ParseState()); |
| 227 } | 229 } |
| 228 | 230 |
| 229 TEST_F(FlipHttpSMTest, ResetForNewConnection) { | 231 TEST_F(FlipHttpSMTest, ResetForNewConnection) { |
| 230 std::string data = "HTTP/1.1 200 OK\r\n\r\n"; | 232 std::string data = "HTTP/1.1 200 OK\r\n\r\n"; |
| 231 testing::MockFunction<void(int)> checkpoint; | 233 testing::MockFunction<void(int)> checkpoint; // NOLINT |
| 232 { | 234 { |
| 233 InSequence s; | 235 InSequence s; |
| 234 EXPECT_CALL(*mock_another_interface_, SendSynReply(_, _)); | 236 EXPECT_CALL(*mock_another_interface_, SendSynReply(_, _)); |
| 235 EXPECT_CALL(checkpoint, Call(0)); | 237 EXPECT_CALL(checkpoint, Call(0)); |
| 236 EXPECT_CALL(*mock_another_interface_, SendEOF(_)); | 238 EXPECT_CALL(*mock_another_interface_, SendEOF(_)); |
| 237 EXPECT_CALL(*mock_another_interface_, ResetForNewInterface(_)); | 239 EXPECT_CALL(*mock_another_interface_, ResetForNewInterface(_)); |
| 238 } | 240 } |
| 239 | 241 |
| 240 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, | 242 ASSERT_EQ(BalsaFrameEnums::READING_HEADER_AND_FIRSTLINE, |
| 241 interface_->spdy_framer()->ParseState()); | 243 interface_->spdy_framer()->ParseState()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 257 BalsaHeaders headers; | 259 BalsaHeaders headers; |
| 258 std::string filename = "foobar"; | 260 std::string filename = "foobar"; |
| 259 memory_cache_->InsertFile(&headers, filename, ""); | 261 memory_cache_->InsertFile(&headers, filename, ""); |
| 260 } | 262 } |
| 261 | 263 |
| 262 interface_->NewStream(stream_id, 1, "foobar"); | 264 interface_->NewStream(stream_id, 1, "foobar"); |
| 263 ASSERT_TRUE(HasStream(stream_id)); | 265 ASSERT_TRUE(HasStream(stream_id)); |
| 264 } | 266 } |
| 265 | 267 |
| 266 TEST_F(FlipHttpSMTest, NewStreamError) { | 268 TEST_F(FlipHttpSMTest, NewStreamError) { |
| 267 std::string syn_reply = "HTTP/1.1 404 Not Found\r\n" | 269 std::string syn_reply = |
| 270 "HTTP/1.1 404 Not Found\r\n" |
| 268 "transfer-encoding: chunked\r\n\r\n"; | 271 "transfer-encoding: chunked\r\n\r\n"; |
| 269 std::string body = "e\r\npage not found\r\n"; | 272 std::string body = "e\r\npage not found\r\n"; |
| 270 uint32 stream_id = 4; | 273 uint32 stream_id = 4; |
| 271 | 274 |
| 272 ASSERT_FALSE(HasStream(stream_id)); | 275 ASSERT_FALSE(HasStream(stream_id)); |
| 273 interface_->NewStream(stream_id, 1, "foobar"); | 276 interface_->NewStream(stream_id, 1, "foobar"); |
| 274 | 277 |
| 275 ASSERT_EQ(3u, connection_->output_list()->size()); | 278 ASSERT_EQ(3u, connection_->output_list()->size()); |
| 276 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 279 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 277 DataFrame* df = *i++; | 280 DataFrame* df = *i++; |
| 278 ASSERT_EQ(syn_reply, StringPiece(df->data, df->size)); | 281 ASSERT_EQ(syn_reply, StringPiece(df->data, df->size)); |
| 279 df = *i++; | 282 df = *i++; |
| 280 ASSERT_EQ(body, StringPiece(df->data, df->size)); | 283 ASSERT_EQ(body, StringPiece(df->data, df->size)); |
| 281 df = *i++; | 284 df = *i++; |
| 282 ASSERT_EQ("0\r\n\r\n", StringPiece(df->data, df->size)); | 285 ASSERT_EQ("0\r\n\r\n", StringPiece(df->data, df->size)); |
| 283 ASSERT_FALSE(HasStream(stream_id)); | 286 ASSERT_FALSE(HasStream(stream_id)); |
| 284 } | 287 } |
| 285 | 288 |
| 286 TEST_F(FlipHttpSMTest, SendErrorNotFound) { | 289 TEST_F(FlipHttpSMTest, SendErrorNotFound) { |
| 287 std::string syn_reply = "HTTP/1.1 404 Not Found\r\n" | 290 std::string syn_reply = |
| 291 "HTTP/1.1 404 Not Found\r\n" |
| 288 "transfer-encoding: chunked\r\n\r\n"; | 292 "transfer-encoding: chunked\r\n\r\n"; |
| 289 std::string body = "e\r\npage not found\r\n"; | 293 std::string body = "e\r\npage not found\r\n"; |
| 290 uint32 stream_id = 13; | 294 uint32 stream_id = 13; |
| 291 MemCacheIter mci; | 295 MemCacheIter mci; |
| 292 mci.stream_id = stream_id; | 296 mci.stream_id = stream_id; |
| 293 | 297 |
| 294 { | 298 { |
| 295 BalsaHeaders headers; | 299 BalsaHeaders headers; |
| 296 std::string filename = "foobar"; | 300 std::string filename = "foobar"; |
| 297 memory_cache_->InsertFile(&headers, filename, ""); | 301 memory_cache_->InsertFile(&headers, filename, ""); |
| 298 mci.file_data = memory_cache_->GetFileData(filename); | 302 mci.file_data = memory_cache_->GetFileData(filename); |
| 299 } | 303 } |
| 300 | 304 |
| 301 interface_->AddToOutputOrder(mci); | 305 interface_->AddToOutputOrder(mci); |
| 302 ASSERT_TRUE(HasStream(stream_id)); | 306 ASSERT_TRUE(HasStream(stream_id)); |
| 303 interface_->SendErrorNotFound(stream_id); | 307 interface_->SendErrorNotFound(stream_id); |
| 304 | 308 |
| 305 ASSERT_EQ(3u, connection_->output_list()->size()); | 309 ASSERT_EQ(3u, connection_->output_list()->size()); |
| 306 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); | 310 std::list<DataFrame*>::const_iterator i = connection_->output_list()->begin(); |
| 307 DataFrame* df = *i++; | 311 DataFrame* df = *i++; |
| 308 ASSERT_EQ(syn_reply, StringPiece(df->data, df->size)); | 312 ASSERT_EQ(syn_reply, StringPiece(df->data, df->size)); |
| 309 df = *i++; | 313 df = *i++; |
| 310 ASSERT_EQ(body, StringPiece(df->data, df->size)); | 314 ASSERT_EQ(body, StringPiece(df->data, df->size)); |
| 311 df = *i++; | 315 df = *i++; |
| 312 ASSERT_EQ("0\r\n\r\n", StringPiece(df->data, df->size)); | 316 ASSERT_EQ("0\r\n\r\n", StringPiece(df->data, df->size)); |
| 313 ASSERT_FALSE(HasStream(stream_id)); | 317 ASSERT_FALSE(HasStream(stream_id)); |
| 314 } | 318 } |
| 315 | 319 |
| 316 TEST_F(FlipHttpSMTest, SendSynStream) { | 320 TEST_F(FlipHttpSMTest, SendSynStream) { |
| 317 std::string expected = "GET / HTTP/1.0\r\n" | 321 std::string expected = |
| 322 "GET / HTTP/1.0\r\n" |
| 318 "key1: value1\r\n\r\n"; | 323 "key1: value1\r\n\r\n"; |
| 319 BalsaHeaders headers; | 324 BalsaHeaders headers; |
| 320 headers.SetResponseFirstlineFromStringPieces("GET", "/path", "HTTP/1.0"); | 325 headers.SetResponseFirstlineFromStringPieces("GET", "/path", "HTTP/1.0"); |
| 321 headers.AppendHeader("key1", "value1"); | 326 headers.AppendHeader("key1", "value1"); |
| 322 interface_->SendSynStream(18, headers); | 327 interface_->SendSynStream(18, headers); |
| 323 | 328 |
| 324 // TODO(yhirano): Is this behavior correct? | 329 // TODO(yhirano): Is this behavior correct? |
| 325 ASSERT_EQ(0u, connection_->output_list()->size()); | 330 ASSERT_EQ(0u, connection_->output_list()->size()); |
| 326 } | 331 } |
| 327 | 332 |
| 328 TEST_F(FlipHttpSMTest, SendSynReply) { | 333 TEST_F(FlipHttpSMTest, SendSynReply) { |
| 329 std::string expected = "HTTP/1.1 200 OK\r\n" | 334 std::string expected = |
| 335 "HTTP/1.1 200 OK\r\n" |
| 330 "key1: value1\r\n\r\n"; | 336 "key1: value1\r\n\r\n"; |
| 331 BalsaHeaders headers; | 337 BalsaHeaders headers; |
| 332 headers.SetResponseFirstlineFromStringPieces("HTTP/1.1", "200", "OK"); | 338 headers.SetResponseFirstlineFromStringPieces("HTTP/1.1", "200", "OK"); |
| 333 headers.AppendHeader("key1", "value1"); | 339 headers.AppendHeader("key1", "value1"); |
| 334 interface_->SendSynReply(18, headers); | 340 interface_->SendSynReply(18, headers); |
| 335 | 341 |
| 336 ASSERT_EQ(1u, connection_->output_list()->size()); | 342 ASSERT_EQ(1u, connection_->output_list()->size()); |
| 337 DataFrame* df = connection_->output_list()->front(); | 343 DataFrame* df = connection_->output_list()->front(); |
| 338 ASSERT_EQ(expected, StringPiece(df->data, df->size)); | 344 ASSERT_EQ(expected, StringPiece(df->data, df->size)); |
| 339 } | 345 } |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 TEST_F(FlipHttpSMHttpTest, ProcessHeaders) { | 408 TEST_F(FlipHttpSMHttpTest, ProcessHeaders) { |
| 403 BalsaVisitorInterface* visitor = interface_.get(); | 409 BalsaVisitorInterface* visitor = interface_.get(); |
| 404 { | 410 { |
| 405 BalsaHeaders headers; | 411 BalsaHeaders headers; |
| 406 std::string filename = "GET_/path/file"; | 412 std::string filename = "GET_/path/file"; |
| 407 memory_cache_->InsertFile(&headers, filename, ""); | 413 memory_cache_->InsertFile(&headers, filename, ""); |
| 408 } | 414 } |
| 409 | 415 |
| 410 BalsaHeaders headers; | 416 BalsaHeaders headers; |
| 411 headers.AppendHeader("Host", "example.com"); | 417 headers.AppendHeader("Host", "example.com"); |
| 412 headers.SetRequestFirstlineFromStringPieces("GET", | 418 headers.SetRequestFirstlineFromStringPieces("GET", "/path/file", "HTTP/1.0"); |
| 413 "/path/file", | |
| 414 "HTTP/1.0"); | |
| 415 uint32 stream_id = 133; | 419 uint32 stream_id = 133; |
| 416 interface_->SetStreamID(stream_id); | 420 interface_->SetStreamID(stream_id); |
| 417 ASSERT_FALSE(HasStream(stream_id)); | 421 ASSERT_FALSE(HasStream(stream_id)); |
| 418 visitor->ProcessHeaders(headers); | 422 visitor->ProcessHeaders(headers); |
| 419 ASSERT_TRUE(HasStream(stream_id)); | 423 ASSERT_TRUE(HasStream(stream_id)); |
| 420 } | 424 } |
| 421 | 425 |
| 422 TEST_F(FlipHttpSMHttpTest, MessageDone) { | 426 TEST_F(FlipHttpSMHttpTest, MessageDone) { |
| 423 BalsaVisitorInterface* visitor = interface_.get(); | 427 BalsaVisitorInterface* visitor = interface_.get(); |
| 424 { | 428 { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 } | 482 } |
| 479 interface_->SendEOF(32); | 483 interface_->SendEOF(32); |
| 480 ASSERT_EQ(1u, connection_->output_list()->size()); | 484 ASSERT_EQ(1u, connection_->output_list()->size()); |
| 481 DataFrame* df = connection_->output_list()->front(); | 485 DataFrame* df = connection_->output_list()->front(); |
| 482 ASSERT_EQ("0\r\n\r\n", StringPiece(df->data, df->size)); | 486 ASSERT_EQ("0\r\n\r\n", StringPiece(df->data, df->size)); |
| 483 } | 487 } |
| 484 | 488 |
| 485 } // namespace | 489 } // namespace |
| 486 | 490 |
| 487 } // namespace net | 491 } // namespace net |
| OLD | NEW |