Index: net/http/http_network_transaction_unittest.cc |
=================================================================== |
--- net/http/http_network_transaction_unittest.cc (revision 18421) |
+++ net/http/http_network_transaction_unittest.cc (working copy) |
@@ -3031,4 +3031,77 @@ |
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 |