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