| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/files/file_path.h" |
| #include "base/path_service.h" |
| #include "base/test/scoped_task_environment.h" |
| #include "base/test/test_simple_task_runner.h" |
| #include "net/base/url_util.h" |
| #include "net/third_party/quic/platform/api/quic_test.h" |
| |
| #include "net/tools/quic/quic_http_proxy_backend.h" |
| #include "net/tools/quic/quic_http_proxy_backend_stream.h" |
| |
| namespace net { |
| namespace test { |
| |
| class TestQuicServerStream |
| : public quic::QuicSimpleServerBackend::RequestHandler { |
| public: |
| TestQuicServerStream() : did_complete_(false) {} |
| |
| ~TestQuicServerStream() override {} |
| |
| quic::QuicConnectionId connection_id() const override { return 123; }; |
| quic::QuicStreamId stream_id() const override { return 5; }; |
| std::string peer_host() const override { return "127.0.0.1"; }; |
| |
| void OnResponseBackendComplete( |
| const quic::QuicBackendResponse* response, |
| std::list<quic::QuicBackendResponse::ServerPushInfo> resources) override { |
| EXPECT_FALSE(did_complete_); |
| did_complete_ = true; |
| task_runner_->PostTask(FROM_HERE, run_loop_.QuitClosure()); |
| } |
| |
| base::RunLoop* run_loop() { return &run_loop_; } |
| |
| private: |
| bool did_complete_; |
| base::test::ScopedTaskEnvironment scoped_task_environment; |
| const scoped_refptr<base::SingleThreadTaskRunner> task_runner_ = |
| base::ThreadTaskRunnerHandle::Get(); |
| base::RunLoop run_loop_; |
| }; |
| |
| class QuicHttpProxyBackendTest : public QuicTest { |
| public: |
| QuicHttpProxyBackendTest() { |
| proxy_stream_map_ = http_proxy_.proxy_backend_streams_map(); |
| } |
| |
| ~QuicHttpProxyBackendTest() override { |
| EXPECT_EQ(true, proxy_stream_map_->empty()); |
| } |
| |
| void SendRequestOverBackend(TestQuicServerStream* quic_stream) { |
| quic_proxy_backend_url_ = "http://www.google.com:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| |
| spdy::SpdyHeaderBlock request_headers; |
| request_headers[":authority"] = "www.example.org"; |
| request_headers[":method"] = "GET"; |
| std::string body = "Test Body"; |
| http_proxy_.FetchResponseFromBackend(request_headers, body, quic_stream); |
| quic_stream->run_loop()->Run(); |
| } |
| |
| protected: |
| std::string quic_proxy_backend_url_; |
| QuicHttpProxyBackend http_proxy_; |
| const QuicHttpProxyBackend::ProxyBackendStreamMap* proxy_stream_map_; |
| }; |
| |
| TEST_F(QuicHttpProxyBackendTest, InitializeQuicHttpProxyBackend) { |
| // Test incorrect URLs |
| quic_proxy_backend_url_ = "http://www.google.com:80--"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_EQ(false, http_proxy_.IsBackendInitialized()); |
| EXPECT_EQ(nullptr, http_proxy_.GetProxyTaskRunner()); |
| |
| quic_proxy_backend_url_ = "http://192.168.239.257:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_EQ(false, http_proxy_.IsBackendInitialized()); |
| EXPECT_EQ(nullptr, http_proxy_.GetProxyTaskRunner()); |
| |
| quic_proxy_backend_url_ = "http://2555.168.239:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_EQ(false, http_proxy_.IsBackendInitialized()); |
| EXPECT_EQ(nullptr, http_proxy_.GetProxyTaskRunner()); |
| |
| quic_proxy_backend_url_ = "http://192.168.239.237:65537"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_EQ(false, http_proxy_.IsBackendInitialized()); |
| EXPECT_EQ(nullptr, http_proxy_.GetProxyTaskRunner()); |
| |
| quic_proxy_backend_url_ = "ftp://www.google.com:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_EQ(false, http_proxy_.IsBackendInitialized()); |
| EXPECT_EQ(nullptr, http_proxy_.GetProxyTaskRunner()); |
| |
| // Test initialization with correct URL |
| quic_proxy_backend_url_ = "http://www.google.com:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_NE(nullptr, http_proxy_.GetProxyTaskRunner()); |
| EXPECT_EQ("http://www.google.com/", http_proxy_.backend_url()); |
| EXPECT_EQ(true, http_proxy_.IsBackendInitialized()); |
| } |
| |
| TEST_F(QuicHttpProxyBackendTest, CheckProxyStreamManager) { |
| TestQuicServerStream quic_stream; |
| SendRequestOverBackend(&quic_stream); |
| auto it_find_success = proxy_stream_map_->find(&quic_stream); |
| EXPECT_NE(it_find_success, proxy_stream_map_->end()); |
| |
| http_proxy_.CloseBackendResponseStream(&quic_stream); |
| |
| /*EXPECT_EQ(true, proxy_stream_map_->empty()); |
| QuicHttpProxyBackend::ProxyBackendStreamMap::const_iterator it_find_fail = |
| proxy_stream_map_->find(&quic_stream); |
| EXPECT_EQ(it_find_fail, proxy_stream_map_->end());*/ |
| } |
| |
| TEST_F(QuicHttpProxyBackendTest, CheckIsOnBackendThread) { |
| quic_proxy_backend_url_ = "http://www.google.com:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_EQ(false, http_proxy_.GetProxyTaskRunner()->BelongsToCurrentThread()); |
| } |
| |
| TEST_F(QuicHttpProxyBackendTest, CheckGetBackendTaskRunner) { |
| EXPECT_EQ(nullptr, http_proxy_.GetProxyTaskRunner()); |
| quic_proxy_backend_url_ = "http://www.google.com:80"; |
| http_proxy_.InitializeBackend(quic_proxy_backend_url_); |
| EXPECT_NE(nullptr, http_proxy_.GetProxyTaskRunner()); |
| } |
| |
| } // namespace test |
| } // namespace net |