Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: base/observer_list_unittest.cc

Issue 2340583005: Base ObserverList: Add basic support for standard C++ iterators. (Closed)
Patch Set: Fix gcc and msvc. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« base/observer_list.h ('K') | « base/observer_list.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/observer_list.h" 5 #include "base/observer_list.h"
6 #include "base/observer_list_threadsafe.h" 6 #include "base/observer_list_threadsafe.h"
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/memory/weak_ptr.h" 12 #include "base/memory/weak_ptr.h"
13 #include "base/run_loop.h" 13 #include "base/run_loop.h"
14 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
15 #include "base/threading/platform_thread.h" 15 #include "base/threading/platform_thread.h"
16 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
17 17
18 namespace base { 18 namespace base {
19 namespace { 19 namespace {
20 20
21 class Foo { 21 class Foo {
22 public: 22 public:
23 virtual void Observe(int x) = 0; 23 virtual void Observe(int x) = 0;
24 virtual ~Foo() {} 24 virtual ~Foo() {}
25 virtual int GetValue() const { return 0; }
25 }; 26 };
26 27
27 class Adder : public Foo { 28 class Adder : public Foo {
28 public: 29 public:
29 explicit Adder(int scaler) : total(0), scaler_(scaler) {} 30 explicit Adder(int scaler) : total(0), scaler_(scaler) {}
31 ~Adder() override {}
32
30 void Observe(int x) override { total += x * scaler_; } 33 void Observe(int x) override { total += x * scaler_; }
31 ~Adder() override {} 34 int GetValue() const override { return total; }
35
32 int total; 36 int total;
33 37
34 private: 38 private:
35 int scaler_; 39 int scaler_;
36 }; 40 };
37 41
38 class Disrupter : public Foo { 42 class Disrupter : public Foo {
39 public: 43 public:
40 Disrupter(ObserverList<Foo>* list, Foo* doomed) 44 Disrupter(ObserverList<Foo>* list, Foo* doomed)
41 : list_(list), 45 : list_(list),
42 doomed_(doomed) { 46 doomed_(doomed) {
43 } 47 }
44 ~Disrupter() override {} 48 ~Disrupter() override {}
45 void Observe(int x) override { list_->RemoveObserver(doomed_); } 49 void Observe(int x) override { list_->RemoveObserver(doomed_); }
46 50
47 private: 51 private:
48 ObserverList<Foo>* list_; 52 ObserverList<Foo>* list_;
49 Foo* doomed_; 53 Foo* doomed_;
50 }; 54 };
51 55
56 class DisrupterSelf : public Foo {
57 public:
58 DisrupterSelf(ObserverList<Foo>* list) : list_(list) {}
59 ~DisrupterSelf() override {}
60 void Observe(int x) override { list_->RemoveObserver(this); }
61
62 private:
63 ObserverList<Foo>* list_;
64 };
65
52 class ThreadSafeDisrupter : public Foo { 66 class ThreadSafeDisrupter : public Foo {
53 public: 67 public:
54 ThreadSafeDisrupter(ObserverListThreadSafe<Foo>* list, Foo* doomed) 68 ThreadSafeDisrupter(ObserverListThreadSafe<Foo>* list, Foo* doomed)
55 : list_(list), 69 : list_(list),
56 doomed_(doomed) { 70 doomed_(doomed) {
57 } 71 }
58 ~ThreadSafeDisrupter() override {} 72 ~ThreadSafeDisrupter() override {}
59 void Observe(int x) override { list_->RemoveObserver(doomed_); } 73 void Observe(int x) override { list_->RemoveObserver(doomed_); }
60 74
61 private: 75 private:
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
198 212
199 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10)); 213 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10));
200 214
201 EXPECT_EQ(20, a.total); 215 EXPECT_EQ(20, a.total);
202 EXPECT_EQ(-20, b.total); 216 EXPECT_EQ(-20, b.total);
203 EXPECT_EQ(0, c.total); 217 EXPECT_EQ(0, c.total);
204 EXPECT_EQ(-10, d.total); 218 EXPECT_EQ(-10, d.total);
205 EXPECT_EQ(0, e.total); 219 EXPECT_EQ(0, e.total);
206 } 220 }
207 221
222 TEST(ObserverListTest, DesruptSelf) {
223 ObserverList<Foo> observer_list;
224 Adder a(1), b(-1), c(1), d(-1);
225 DisrupterSelf evil(&observer_list);
226
227 observer_list.AddObserver(&a);
228 observer_list.AddObserver(&b);
229
230 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10));
231
232 observer_list.AddObserver(&evil);
233 observer_list.AddObserver(&c);
234 observer_list.AddObserver(&d);
235
236 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10));
237
238 EXPECT_EQ(20, a.total);
239 EXPECT_EQ(-20, b.total);
240 EXPECT_EQ(10, c.total);
241 EXPECT_EQ(-10, d.total);
242 }
243
244 TEST(ObserverListTest, DesruptBefore) {
245 ObserverList<Foo> observer_list;
246 Adder a(1), b(-1), c(1), d(-1);
247 Disrupter evil(&observer_list, &b);
248
249 observer_list.AddObserver(&a);
250 observer_list.AddObserver(&b);
251 observer_list.AddObserver(&evil);
252 observer_list.AddObserver(&c);
253 observer_list.AddObserver(&d);
254
255 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10));
256 FOR_EACH_OBSERVER(Foo, observer_list, Observe(10));
257
258 EXPECT_EQ(20, a.total);
259 EXPECT_EQ(-10, b.total);
260 EXPECT_EQ(20, c.total);
261 EXPECT_EQ(-20, d.total);
262 }
263
208 TEST(ObserverListThreadSafeTest, BasicTest) { 264 TEST(ObserverListThreadSafeTest, BasicTest) {
209 MessageLoop loop; 265 MessageLoop loop;
210 266
211 scoped_refptr<ObserverListThreadSafe<Foo> > observer_list( 267 scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
212 new ObserverListThreadSafe<Foo>); 268 new ObserverListThreadSafe<Foo>);
213 Adder a(1); 269 Adder a(1);
214 Adder b(-1); 270 Adder b(-1);
215 Adder c(1); 271 Adder c(1);
216 Adder d(-1); 272 Adder d(-1);
217 ThreadSafeDisrupter evil(observer_list.get(), &c); 273 ThreadSafeDisrupter evil(observer_list.get(), &c);
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 TEST(ObserverListTest, IteratorOutlivesList) { 590 TEST(ObserverListTest, IteratorOutlivesList) {
535 ObserverList<Foo>* observer_list = new ObserverList<Foo>; 591 ObserverList<Foo>* observer_list = new ObserverList<Foo>;
536 ListDestructor a(observer_list); 592 ListDestructor a(observer_list);
537 observer_list->AddObserver(&a); 593 observer_list->AddObserver(&a);
538 594
539 FOR_EACH_OBSERVER(Foo, *observer_list, Observe(0)); 595 FOR_EACH_OBSERVER(Foo, *observer_list, Observe(0));
540 // If this test fails, there'll be Valgrind errors when this function goes out 596 // If this test fails, there'll be Valgrind errors when this function goes out
541 // of scope. 597 // of scope.
542 } 598 }
543 599
600 TEST(ObserverListTest, BasicStdIterator) {
601 using FooList = ObserverList<Foo>;
602 FooList observer_list;
603 Adder a(1), b(-1), c(1), d(-1);
604
605 observer_list.AddObserver(&a);
606 observer_list.AddObserver(&b);
607 observer_list.AddObserver(&c);
608 observer_list.AddObserver(&d);
609
610 for (FooList::iterator i = observer_list.begin(), e = observer_list.end();
611 i != e; ++i)
612 i->Observe(1);
613
614 for (FooList::iterator i = observer_list.begin(), e = observer_list.end();
615 i != e; i++)
616 i->Observe(10);
617
618 EXPECT_EQ(11, a.total);
619 EXPECT_EQ(-11, b.total);
620 EXPECT_EQ(11, c.total);
621 EXPECT_EQ(-11, d.total);
622
623 // Check an iteration over a 'const view' for a given container.
624 const FooList& const_list = observer_list;
625 for (FooList::const_iterator i = const_list.begin(), e = const_list.end();
626 i != e; i++) {
627 EXPECT_EQ(11, std::abs(i->GetValue()));
628 }
629
630 for (const auto& o : const_list)
631 EXPECT_EQ(11, std::abs(o.GetValue()));
632 }
633
634 TEST(ObserverListTest, StdIteratorRemoveItself) {
635 ObserverList<Foo> observer_list;
636 Adder a(1), b(-1), c(1), d(-1);
637 DisrupterSelf disrupter(&observer_list);
638
639 observer_list.AddObserver(&a);
640 observer_list.AddObserver(&b);
641 observer_list.AddObserver(&disrupter);
642 observer_list.AddObserver(&c);
643 observer_list.AddObserver(&d);
644
645 for (auto& o : observer_list)
646 o.Observe(1);
647
648 for (auto& o : observer_list)
649 o.Observe(10);
650
651 EXPECT_EQ(11, a.total);
652 EXPECT_EQ(-11, b.total);
653 EXPECT_EQ(11, c.total);
654 EXPECT_EQ(-11, d.total);
655 }
656
657 TEST(ObserverListTest, StdIteratorRemoveBefore) {
658 ObserverList<Foo> observer_list;
659 Adder a(1), b(-1), c(1), d(-1);
660 Disrupter disrupter(&observer_list, &b);
661
662 observer_list.AddObserver(&a);
663 observer_list.AddObserver(&b);
664 observer_list.AddObserver(&disrupter);
665 observer_list.AddObserver(&c);
666 observer_list.AddObserver(&d);
667
668 for (auto& o : observer_list)
669 o.Observe(1);
670
671 for (auto& o : observer_list)
672 o.Observe(10);
673
674 EXPECT_EQ(11, a.total);
675 EXPECT_EQ(-1, b.total);
676 EXPECT_EQ(11, c.total);
677 EXPECT_EQ(-11, d.total);
678 }
679
680 TEST(ObserverListTest, StdIteratorRemoveAfter) {
681 ObserverList<Foo> observer_list;
682 Adder a(1), b(-1), c(1), d(-1);
683 Disrupter disrupter(&observer_list, &c);
684
685 observer_list.AddObserver(&a);
686 observer_list.AddObserver(&b);
687 observer_list.AddObserver(&disrupter);
688 observer_list.AddObserver(&c);
689 observer_list.AddObserver(&d);
690
691 for (auto& o : observer_list)
692 o.Observe(1);
693
694 for (auto& o : observer_list)
695 o.Observe(10);
696
697 EXPECT_EQ(11, a.total);
698 EXPECT_EQ(-11, b.total);
699 EXPECT_EQ(0, c.total);
700 EXPECT_EQ(-11, d.total);
701 }
702
703 TEST(ObserverListTest, StdIteratorRemoveAfterFront) {
704 ObserverList<Foo> observer_list;
705 Adder a(1), b(-1), c(1), d(-1);
706 Disrupter disrupter(&observer_list, &a);
707
708 observer_list.AddObserver(&a);
709 observer_list.AddObserver(&disrupter);
710 observer_list.AddObserver(&b);
711 observer_list.AddObserver(&c);
712 observer_list.AddObserver(&d);
713
714 for (auto& o : observer_list)
715 o.Observe(1);
716
717 for (auto& o : observer_list)
718 o.Observe(10);
719
720 EXPECT_EQ(1, a.total);
721 EXPECT_EQ(-11, b.total);
722 EXPECT_EQ(11, c.total);
723 EXPECT_EQ(-11, d.total);
724 }
725
726 TEST(ObserverListTest, StdIteratorRemoveBeforeBack) {
727 ObserverList<Foo> observer_list;
728 Adder a(1), b(-1), c(1), d(-1);
729 Disrupter disrupter(&observer_list, &d);
730
731 observer_list.AddObserver(&a);
732 observer_list.AddObserver(&b);
733 observer_list.AddObserver(&c);
734 observer_list.AddObserver(&disrupter);
735 observer_list.AddObserver(&d);
736
737 for (auto& o : observer_list)
738 o.Observe(1);
739
740 for (auto& o : observer_list)
741 o.Observe(10);
742
743 EXPECT_EQ(11, a.total);
744 EXPECT_EQ(-11, b.total);
745 EXPECT_EQ(11, c.total);
746 EXPECT_EQ(0, d.total);
747 }
748
749 TEST(ObserverListTest, StdIteratorRemoveFront) {
750 ObserverList<Foo> observer_list;
751 Adder a(1), b(-1), c(1), d(-1);
752 DisrupterSelf disrupter(&observer_list);
753
754 observer_list.AddObserver(&disrupter);
755 observer_list.AddObserver(&a);
756 observer_list.AddObserver(&b);
757 observer_list.AddObserver(&c);
758 observer_list.AddObserver(&d);
759
760 for (auto& o : observer_list)
761 o.Observe(1);
762
763 for (auto& o : observer_list)
764 o.Observe(10);
765
766 EXPECT_EQ(11, a.total);
767 EXPECT_EQ(-11, b.total);
768 EXPECT_EQ(11, c.total);
769 EXPECT_EQ(-11, d.total);
770 }
771
772 TEST(ObserverListTest, StdIteratorRemoveBack) {
773 ObserverList<Foo> observer_list;
774 Adder a(1), b(-1), c(1), d(-1);
775 DisrupterSelf disrupter(&observer_list);
776
777 observer_list.AddObserver(&a);
778 observer_list.AddObserver(&b);
779 observer_list.AddObserver(&c);
780 observer_list.AddObserver(&d);
781 observer_list.AddObserver(&disrupter);
782
783 for (auto& o : observer_list)
784 o.Observe(1);
785
786 for (auto& o : observer_list)
787 o.Observe(10);
788
789 EXPECT_EQ(11, a.total);
790 EXPECT_EQ(-11, b.total);
791 EXPECT_EQ(11, c.total);
792 EXPECT_EQ(-11, d.total);
793 }
794
544 } // namespace 795 } // namespace
545 } // namespace base 796 } // namespace base
OLDNEW
« base/observer_list.h ('K') | « base/observer_list.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698