Index: extensions/browser/load_monitoring_extension_host_queue_unittest.cc |
diff --git a/extensions/browser/load_monitoring_extension_host_queue_unittest.cc b/extensions/browser/load_monitoring_extension_host_queue_unittest.cc |
index 1157ecda46825b09a3f0b19c3abd2eea71850201..ef1a1c1c92e62af480d9f4ebef7ccc9c57ebc64e 100644 |
--- a/extensions/browser/load_monitoring_extension_host_queue_unittest.cc |
+++ b/extensions/browser/load_monitoring_extension_host_queue_unittest.cc |
@@ -16,12 +16,25 @@ namespace extensions { |
namespace { |
class StubDeferredStartRenderHost : public DeferredStartRenderHost { |
+ public: |
+ // Returns true if this host is being observed by |observer|. |
+ bool IsObservedBy(DeferredStartRenderHostObserver* observer) { |
+ return observers_.count(observer) > 0; |
+ } |
+ |
private: |
+ // DeferredStartRenderHost: |
void AddDeferredStartRenderHostObserver( |
- DeferredStartRenderHostObserver* observer) override {} |
+ DeferredStartRenderHostObserver* observer) override { |
+ observers_.insert(observer); |
+ } |
void RemoveDeferredStartRenderHostObserver( |
- DeferredStartRenderHostObserver* observer) override {} |
+ DeferredStartRenderHostObserver* observer) override { |
+ observers_.erase(observer); |
+ } |
void CreateRenderViewNow() override {} |
+ |
+ std::set<DeferredStartRenderHostObserver*> observers_; |
}; |
const size_t g_invalid_size_t = std::numeric_limits<size_t>::max(); |
@@ -35,7 +48,7 @@ class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { |
// Arbitrary choice of an invalid size_t. |
num_queued_(g_invalid_size_t), |
num_loaded_(g_invalid_size_t), |
- max_in_queue_(g_invalid_size_t), |
+ max_awaiting_loading_(g_invalid_size_t), |
max_active_loading_(g_invalid_size_t) {} |
void SetUp() override { |
@@ -50,7 +63,7 @@ class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { |
protected: |
// Creates a new DeferredStartRenderHost. Ownership is held by this class, |
// not passed to caller. |
- DeferredStartRenderHost* CreateHost() { |
+ StubDeferredStartRenderHost* CreateHost() { |
StubDeferredStartRenderHost* stub = new StubDeferredStartRenderHost(); |
stubs_.push_back(stub); |
return stub; |
@@ -60,25 +73,26 @@ class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { |
LoadMonitoringExtensionHostQueue* queue() { return queue_.get(); } |
// Returns true if the queue has finished monitoring. |
- bool finished() { return finished_; } |
+ bool finished() const { return finished_; } |
// These are available after the queue has finished (in which case finished() |
// will return true). |
size_t num_queued() { return num_queued_; } |
size_t num_loaded() { return num_loaded_; } |
- size_t max_in_queue() { return max_in_queue_; } |
+ size_t max_awaiting_loading() { return max_awaiting_loading_; } |
size_t max_active_loading() { return max_active_loading_; } |
private: |
// Callback when queue has finished monitoring. |
void Finished(size_t num_queued, |
size_t num_loaded, |
- size_t max_in_queue, |
+ size_t max_awaiting_loading, |
size_t max_active_loading) { |
+ CHECK(!finished_); |
finished_ = true; |
num_queued_ = num_queued; |
num_loaded_ = num_loaded; |
- max_in_queue_ = max_in_queue; |
+ max_awaiting_loading_ = max_awaiting_loading; |
max_active_loading_ = max_active_loading; |
} |
@@ -90,7 +104,7 @@ class LoadMonitoringExtensionHostQueueTest : public ExtensionsTest { |
bool finished_; |
size_t num_queued_; |
size_t num_loaded_; |
- size_t max_in_queue_; |
+ size_t max_awaiting_loading_; |
size_t max_active_loading_; |
}; |
@@ -109,7 +123,7 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, NoHosts) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(0u, num_queued()); |
EXPECT_EQ(0u, num_loaded()); |
- EXPECT_EQ(0u, max_in_queue()); |
+ EXPECT_EQ(0u, max_awaiting_loading()); |
EXPECT_EQ(0u, max_active_loading()); |
} |
@@ -121,7 +135,7 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(0u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(0u, max_active_loading()); |
} |
@@ -136,7 +150,7 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndRemoveOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(0u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(0u, max_active_loading()); |
} |
@@ -150,12 +164,8 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(0u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(1u, max_active_loading()); |
- |
- // Sanity check: stopping/destroying at this point doesn't crash. |
- queue()->OnDeferredStartRenderHostDidStopLoading(host); |
- queue()->OnDeferredStartRenderHostDestroyed(host); |
} |
// Tests adding and destroying a single host without starting it. |
@@ -168,12 +178,8 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndDestroyOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(0u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(0u, max_active_loading()); |
- |
- // Sanity check: stopping/destroying at this point doesn't crash. |
- queue()->OnDeferredStartRenderHostDidStopLoading(host); |
- queue()->OnDeferredStartRenderHostDestroyed(host); |
} |
// Tests adding, starting, and stopping a single host. |
@@ -187,11 +193,28 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(1u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(1u, max_active_loading()); |
+} |
- // Sanity check: destroying at this point doesn't crash. |
- queue()->OnDeferredStartRenderHostDestroyed(host); |
+// Tests adding, starting, and stopping a single host - twice. |
+TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndStopOneHostTwice) { |
+ DeferredStartRenderHost* host = CreateHost(); |
+ queue()->Add(host); |
+ queue()->OnDeferredStartRenderHostDidStartLoading(host); |
+ queue()->OnDeferredStartRenderHostDidStopLoading(host); |
+ |
+ // Re-starting loading should also be recorded fine (e.g. navigations could |
+ // trigger this). |
+ queue()->OnDeferredStartRenderHostDidStartLoading(host); |
+ queue()->OnDeferredStartRenderHostDidStopLoading(host); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ ASSERT_TRUE(finished()); |
+ EXPECT_EQ(1u, num_queued()); |
+ EXPECT_EQ(2u, num_loaded()); // 2 loaded this time, because we ran twice |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
+ EXPECT_EQ(1u, max_active_loading()); |
} |
// Tests adding, starting, and destroying (i.e. an implicit stop) a single host. |
@@ -205,7 +228,7 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndDestroyOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(1u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(1u, max_active_loading()); |
} |
@@ -220,7 +243,7 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, AddAndStartAndRemoveOneHost) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(1u, num_queued()); |
EXPECT_EQ(0u, num_loaded()); |
- EXPECT_EQ(1u, max_in_queue()); |
+ EXPECT_EQ(1u, max_awaiting_loading()); |
EXPECT_EQ(1u, max_active_loading()); |
} |
@@ -258,11 +281,10 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { |
ASSERT_TRUE(finished()); |
EXPECT_EQ(6u, num_queued()); |
EXPECT_EQ(2u, num_loaded()); |
- EXPECT_EQ(4u, max_in_queue()); |
+ EXPECT_EQ(4u, max_awaiting_loading()); |
EXPECT_EQ(3u, max_active_loading()); |
- // Sanity check: complete a realistic sequence by stopping and/or destroying |
- // all of the hosts. It shouldn't crash. |
+ // Complete a realistic sequence by stopping and/or destroying all hosts. |
queue()->OnDeferredStartRenderHostDestroyed(host1); |
queue()->OnDeferredStartRenderHostDidStopLoading(host2); |
queue()->OnDeferredStartRenderHostDestroyed(host2); |
@@ -273,4 +295,58 @@ TEST_F(LoadMonitoringExtensionHostQueueTest, Sequence) { |
queue()->OnDeferredStartRenderHostDestroyed(host6); // never started/stopped |
} |
+// Tests that the queue is observing Hosts from adding them through to being |
+// removed - that the load sequence itself is irrelevant. |
+// |
+// This is an unfortunate implementation-style test, but it used to be a bug |
+// and difficult to catch outside of a proper test framework - one in which we |
+// don't have to trigger events by hand. |
+TEST_F(LoadMonitoringExtensionHostQueueTest, ObserverLifetime) { |
+ StubDeferredStartRenderHost* host1 = CreateHost(); |
+ StubDeferredStartRenderHost* host2 = CreateHost(); |
+ StubDeferredStartRenderHost* host3 = CreateHost(); |
+ StubDeferredStartRenderHost* host4 = CreateHost(); |
+ |
+ EXPECT_FALSE(host1->IsObservedBy(queue())); |
+ EXPECT_FALSE(host2->IsObservedBy(queue())); |
+ EXPECT_FALSE(host3->IsObservedBy(queue())); |
+ EXPECT_FALSE(host4->IsObservedBy(queue())); |
+ |
+ queue()->Add(host1); |
+ queue()->Add(host2); |
+ queue()->Add(host3); |
+ queue()->Add(host4); |
+ |
+ EXPECT_TRUE(host1->IsObservedBy(queue())); |
+ EXPECT_TRUE(host2->IsObservedBy(queue())); |
+ EXPECT_TRUE(host3->IsObservedBy(queue())); |
+ EXPECT_TRUE(host4->IsObservedBy(queue())); |
+ |
+ queue()->OnDeferredStartRenderHostDidStartLoading(host1); |
+ queue()->OnDeferredStartRenderHostDidStartLoading(host2); |
+ queue()->OnDeferredStartRenderHostDidStartLoading(host3); |
+ // host4 will test that we Remove before Starting - so don't start. |
+ |
+ EXPECT_TRUE(host1->IsObservedBy(queue())); |
+ EXPECT_TRUE(host2->IsObservedBy(queue())); |
+ EXPECT_TRUE(host3->IsObservedBy(queue())); |
+ EXPECT_TRUE(host4->IsObservedBy(queue())); |
+ |
+ queue()->OnDeferredStartRenderHostDidStopLoading(host1); |
+ queue()->OnDeferredStartRenderHostDestroyed(host2); |
+ |
+ EXPECT_TRUE(host1->IsObservedBy(queue())); |
+ EXPECT_TRUE(host2->IsObservedBy(queue())); |
+ |
+ queue()->Remove(host1); |
+ queue()->Remove(host2); |
+ queue()->Remove(host3); |
+ queue()->Remove(host4); |
+ |
+ EXPECT_FALSE(host1->IsObservedBy(queue())); |
+ EXPECT_FALSE(host2->IsObservedBy(queue())); |
+ EXPECT_FALSE(host3->IsObservedBy(queue())); |
+ EXPECT_FALSE(host4->IsObservedBy(queue())); |
+} |
+ |
} // namespace extensions |