| Index: base/observer_list_unittest.cc
|
| ===================================================================
|
| --- base/observer_list_unittest.cc (revision 4210)
|
| +++ base/observer_list_unittest.cc (working copy)
|
| @@ -60,6 +60,26 @@
|
| Foo* doomed_;
|
| };
|
|
|
| +class AddInObserve : public Foo {
|
| + public:
|
| + AddInObserve(ObserverList<Foo>* observer_list)
|
| + : added(false),
|
| + observer_list(observer_list),
|
| + adder(1) {
|
| + }
|
| + virtual void Observe(int x) {
|
| + if (!added) {
|
| + added = true;
|
| + observer_list->AddObserver(&adder);
|
| + }
|
| + }
|
| +
|
| + bool added;
|
| + ObserverList<Foo>* observer_list;
|
| + Adder adder;
|
| +};
|
| +
|
| +
|
| class ObserverListThreadSafeTest : public testing::Test {
|
| };
|
|
|
| @@ -262,3 +282,23 @@
|
| // the main thread and all 3 observer threads.
|
| ThreadSafeObserverHarness(3, true);
|
| }
|
| +
|
| +TEST(ObserverListTest, Existing) {
|
| + ObserverList<Foo> observer_list(ObserverList<Foo>::NOTIFY_EXISTING_ONLY);
|
| + Adder a(1);
|
| + AddInObserve b(&observer_list);
|
| +
|
| + observer_list.AddObserver(&a);
|
| + observer_list.AddObserver(&b);
|
| +
|
| + FOR_EACH_OBSERVER(Foo, observer_list, Observe(1));
|
| +
|
| + 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.
|
| + FOR_EACH_OBSERVER(Foo, observer_list, Observe(1));
|
| + EXPECT_EQ(1, b.adder.total);
|
| +}
|
|
|