Index: base/observer_list_unittest.cc |
diff --git a/base/observer_list_unittest.cc b/base/observer_list_unittest.cc |
index d0d2001e3f8dc0465b0236a702b56b192227ba3f..9e8edf68387658d84e8b5c5109d5db52176e6493 100644 |
--- a/base/observer_list_unittest.cc |
+++ b/base/observer_list_unittest.cc |
@@ -61,9 +61,10 @@ class ThreadSafeDisrupter : public Foo { |
Foo* doomed_; |
}; |
+template <typename ObserverListType> |
class AddInObserve : public Foo { |
public: |
- explicit AddInObserve(ObserverList<Foo>* observer_list) |
+ explicit AddInObserve(ObserverListType* observer_list) |
: added(false), |
observer_list(observer_list), |
adder(1) { |
@@ -76,14 +77,11 @@ class AddInObserve : public Foo { |
} |
bool added; |
- ObserverList<Foo>* observer_list; |
+ ObserverListType* observer_list; |
Adder adder; |
}; |
-class ObserverListThreadSafeTest : public testing::Test { |
-}; |
- |
static const int kThreadRunTime = 2000; // ms to run the multi-threaded test. |
// A thread for use in the ThreadSafeObserver test |
@@ -357,10 +355,22 @@ TEST(ObserverListThreadSafeTest, CrossThreadNotifications) { |
ThreadSafeObserverHarness(3, true); |
} |
+TEST(ObserverListThreadSafeTest, OutlivesMessageLoop) { |
+ MessageLoop* loop = new MessageLoop; |
+ scoped_refptr<ObserverListThreadSafe<Foo> > observer_list( |
+ new ObserverListThreadSafe<Foo>); |
+ |
+ Adder a(1); |
+ observer_list->AddObserver(&a); |
+ delete loop; |
+ // Test passes if we don't crash here. |
+ observer_list->Notify(&Foo::Observe, 1); |
+} |
+ |
TEST(ObserverListTest, Existing) { |
ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY); |
Adder a(1); |
- AddInObserve b(&observer_list); |
+ AddInObserve<ObserverList<Foo> > b(&observer_list); |
observer_list.AddObserver(&a); |
observer_list.AddObserver(&b); |
@@ -377,6 +387,31 @@ TEST(ObserverListTest, Existing) { |
EXPECT_EQ(1, b.adder.total); |
} |
+// Same as above, but for ObserverListThreadSafe |
+TEST(ObserverListThreadSafeTest, Existing) { |
+ MessageLoop loop; |
+ scoped_refptr<ObserverListThreadSafe<Foo> > observer_list( |
+ new ObserverListThreadSafe<Foo>(ObserverList<Foo>::NOTIFY_EXISTING_ONLY)); |
+ Adder a(1); |
+ AddInObserve<ObserverListThreadSafe<Foo> > b(observer_list.get()); |
+ |
+ observer_list->AddObserver(&a); |
+ observer_list->AddObserver(&b); |
+ |
+ observer_list->Notify(&Foo::Observe, 1); |
+ loop.RunAllPending(); |
+ |
+ EXPECT_TRUE(b.added); |
+ // B's adder should not have been notified because it was added during |
+ // notificaiton. |
+ EXPECT_EQ(0, b.adder.total); |
+ |
+ // Notify again to make sure b's adder is notified. |
+ observer_list->Notify(&Foo::Observe, 1); |
+ loop.RunAllPending(); |
+ EXPECT_EQ(1, b.adder.total); |
+} |
+ |
class AddInClearObserve : public Foo { |
public: |
explicit AddInClearObserve(ObserverList<Foo>* list) |