diff options
author | adamk@chromium.org <adamk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-09 17:51:54 +0000 |
---|---|---|
committer | adamk@chromium.org <adamk@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-09 17:51:54 +0000 |
commit | 381455c05cb4f766d36cd99bb3fabde3e0d5246b (patch) | |
tree | af4d6e8bd3c7ff27a32ed18dd02714ed292530b3 /base/observer_list_unittest.cc | |
parent | 274096bfd5881e4a378177c4b16fd956a5e3e7c3 (diff) | |
download | chromium_src-381455c05cb4f766d36cd99bb3fabde3e0d5246b.zip chromium_src-381455c05cb4f766d36cd99bb3fabde3e0d5246b.tar.gz chromium_src-381455c05cb4f766d36cd99bb3fabde3e0d5246b.tar.bz2 |
Use MessageLoopProxy instead of MessageLoop to dispatch notifications in ObserverListThreadsafe.
BUG=91589
Review URL: http://codereview.chromium.org/7584016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96013 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/observer_list_unittest.cc')
-rw-r--r-- | base/observer_list_unittest.cc | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/base/observer_list_unittest.cc b/base/observer_list_unittest.cc index d0d2001..9e8edf6 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) |