diff options
author | ericroman@google.com <ericroman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-15 20:52:12 +0000 |
---|---|---|
committer | ericroman@google.com <ericroman@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-15 20:52:12 +0000 |
commit | f3e6c1ec2715aabcad214157802a7971ec4c628b (patch) | |
tree | a7df6b9173d3d50eea3973d623c2a3ec5f83cf9e | |
parent | 9ad79bec5625c9b9492379f2aefd7ec23cf6cccd (diff) | |
download | chromium_src-f3e6c1ec2715aabcad214157802a7971ec4c628b.zip chromium_src-f3e6c1ec2715aabcad214157802a7971ec4c628b.tar.gz chromium_src-f3e6c1ec2715aabcad214157802a7971ec4c628b.tar.bz2 |
Add a regression test for 14056. This verifies that HttpNetworkTransaction sets the "referrer" field expected by the DNS prefetch observer.
BUG=14056
Review URL: http://codereview.chromium.org/126112
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18434 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | net/http/http_network_transaction_unittest.cc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index b42b693..59bfffc 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -3031,4 +3031,77 @@ TEST_F(HttpNetworkTransactionTest, ReconsiderProxyAfterFailedConnection) { EXPECT_EQ(ERR_NAME_NOT_RESOLVED, rv); } +// Host resolution observer used by +// HttpNetworkTransactionTest.ResolveMadeWithReferrer to check that host +// resovle requests are issued with a referrer of |expected_referrer|. +class ResolutionReferrerObserver : public HostResolver::Observer { + public: + explicit ResolutionReferrerObserver(const GURL& expected_referrer) + : expected_referrer_(expected_referrer), + called_start_with_referrer_(false), + called_finish_with_referrer_(false) { + } + + virtual void OnStartResolution(int id, + const HostResolver::RequestInfo& info) { + if (info.referrer() == expected_referrer_) + called_start_with_referrer_ = true; + } + + virtual void OnFinishResolutionWithStatus( + int id, bool was_resolved, const HostResolver::RequestInfo& info ) { + if (info.referrer() == expected_referrer_) + called_finish_with_referrer_ = true; + } + + bool did_complete_with_expected_referrer() const { + return called_start_with_referrer_ && called_finish_with_referrer_; + } + + private: + GURL expected_referrer_; + bool called_start_with_referrer_; + bool called_finish_with_referrer_; + + DISALLOW_COPY_AND_ASSIGN(ResolutionReferrerObserver); +}; + +// Make sure that when HostResolver::Resolve() is invoked, it passes through +// the "referrer". This is depended on by the DNS prefetch observer. +TEST_F(HttpNetworkTransactionTest, ResolveMadeWithReferrer) { + GURL referrer = GURL("http://expected-referrer/"); + EXPECT_TRUE(referrer.is_valid()); + ResolutionReferrerObserver resolution_observer(referrer); + + SessionDependencies session_deps; + scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction( + CreateSession(&session_deps), &session_deps.socket_factory)); + + // Attach an observer to watch the host resolutions being made. + session_deps.host_resolver.AddObserver(&resolution_observer); + + // Connect up a mock socket which will fail when reading. + MockRead data_reads[] = { + MockRead(false, ERR_FAILED), + }; + StaticMockSocket data(data_reads, NULL); + session_deps.socket_factory.AddMockSocket(&data); + + // Issue a request, containing an HTTP referrer. + HttpRequestInfo request; + request.method = "GET"; + request.referrer = referrer; + request.url = GURL("http://www.google.com/"); + + // Run the request until it fails reading from the socket. + TestCompletionCallback callback; + int rv = trans->Start(&request, &callback); + EXPECT_EQ(ERR_IO_PENDING, rv); + rv = callback.WaitForResult(); + EXPECT_EQ(ERR_FAILED, rv); + + // Check that the host resolution observer saw |referrer|. + EXPECT_TRUE(resolution_observer.did_complete_with_expected_referrer()); +} + } // namespace net |