Index: chrome/browser/net/passive_log_collector_unittest.cc |
=================================================================== |
--- chrome/browser/net/passive_log_collector_unittest.cc (revision 65117) |
+++ chrome/browser/net/passive_log_collector_unittest.cc (working copy) |
@@ -438,3 +438,57 @@ |
GetDeadSources(log.url_request_tracker_).size()); |
} |
+// Regression test for http://crbug.com/58847 |
+TEST(PassiveLogCollectorTest, ReleaseDependencyToUnreferencedSource) { |
+ PassiveLogCollector x; |
mmenke
2010/11/15 16:21:52
nit: You're undoubtedly more familiar with Google
eroman
2010/11/15 19:28:10
Done.
You are right, |x| is a bad name. (carry ov
|
+ |
+ // If these constants are weird, the test won't be testing the right thing. |
+ EXPECT_LT(PassiveLogCollector::RequestTracker::kMaxGraveyardSize, |
+ PassiveLogCollector::RequestTracker::kMaxNumSources); |
+ |
+ // Add a "reference" to a non-existant source (sourceID=1706 does not exist). |
+ scoped_refptr<net::NetLog::EventParameters> params = |
+ new net::NetLogSourceParameter( |
+ "source_dependency", |
+ net::NetLog::Source(net::NetLog::SOURCE_SOCKET, 1263)); |
+ x.OnAddEntry(net::NetLog::TYPE_SOCKET_POOL_BOUND_TO_SOCKET, |
+ base::TimeTicks(), |
+ net::NetLog::Source(net::NetLog::SOURCE_URL_REQUEST, 1706), |
+ net::NetLog::PHASE_NONE, |
+ params); |
+ |
+ // At this point source 1706 has noted 1263 as a dependency. However the |
+ // reference count for 1263 was not adjusted since it doesn't actually exist. |
+ |
+ // Move source 1706 to the graveyard. |
+ x.OnAddEntry(net::NetLog::TYPE_REQUEST_ALIVE, |
+ base::TimeTicks(), |
+ net::NetLog::Source(net::NetLog::SOURCE_URL_REQUEST, 1706), |
+ net::NetLog::PHASE_END, |
+ NULL); |
+ |
+ // Now create a source entry for 1263, such that it is unreferenced and |
+ // waiting to be garbage collected. |
+ x.OnAddEntry(net::NetLog::TYPE_SOCKET_ALIVE, |
+ base::TimeTicks(), |
+ net::NetLog::Source(net::NetLog::SOURCE_SOCKET, 1263), |
+ net::NetLog::PHASE_END, NULL); |
+ |
+ // Add kMaxGraveyardSize unreferenced URL_REQUESTS, so the circular buffer |
+ // containing source 1706. After adding kMaxGraveyardSize - 1 the buffer |
+ // will be full. Now when we add one more more source it will now evict the |
+ // oldest item, which is 1706. In doing so, 1706 will try to release the |
+ // reference it *thinks* it has on 1263. However 1263 has a reference count |
+ // of 0 and is already in a graveyard. |
+ for (size_t i = 0; |
+ i < PassiveLogCollector::RequestTracker::kMaxGraveyardSize; ++i) { |
+ x.OnAddEntry(net::NetLog::TYPE_REQUEST_ALIVE, |
+ base::TimeTicks(), |
+ net::NetLog::Source(net::NetLog::SOURCE_URL_REQUEST, i), |
+ net::NetLog::PHASE_END, |
+ NULL); |
+ } |
+ |
+ // To pass, this should simply not have DCHECK-ed above. |
+} |
+ |