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

Side by Side Diff: base/observer_list_unittest.cc

Issue 2340583005: Base ObserverList: Add basic support for standard C++ iterators. (Closed)
Patch Set: Erase postfix ++ version. Add comments on deprecation. 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 EXPECT_EQ(1, a.total);
615 EXPECT_EQ(-1, b.total);
616 EXPECT_EQ(1, c.total);
617 EXPECT_EQ(-1, d.total);
618
619 // Check an iteration over a 'const view' for a given container.
620 const FooList& const_list = observer_list;
621 for (FooList::const_iterator i = const_list.begin(), e = const_list.end();
622 i != e; ++i) {
623 EXPECT_EQ(1, std::abs(i->GetValue()));
624 }
625
626 for (const auto& o : const_list)
627 EXPECT_EQ(1, std::abs(o.GetValue()));
628 }
629
630 TEST(ObserverListTest, StdIteratorRemoveItself) {
631 ObserverList<Foo> observer_list;
632 Adder a(1), b(-1), c(1), d(-1);
633 DisrupterSelf disrupter(&observer_list);
634
635 observer_list.AddObserver(&a);
636 observer_list.AddObserver(&b);
637 observer_list.AddObserver(&disrupter);
638 observer_list.AddObserver(&c);
639 observer_list.AddObserver(&d);
640
641 for (auto& o : observer_list)
642 o.Observe(1);
643
644 for (auto& o : observer_list)
645 o.Observe(10);
646
647 EXPECT_EQ(11, a.total);
648 EXPECT_EQ(-11, b.total);
649 EXPECT_EQ(11, c.total);
650 EXPECT_EQ(-11, d.total);
651 }
652
653 TEST(ObserverListTest, StdIteratorRemoveBefore) {
654 ObserverList<Foo> observer_list;
655 Adder a(1), b(-1), c(1), d(-1);
656 Disrupter disrupter(&observer_list, &b);
657
658 observer_list.AddObserver(&a);
659 observer_list.AddObserver(&b);
660 observer_list.AddObserver(&disrupter);
661 observer_list.AddObserver(&c);
662 observer_list.AddObserver(&d);
663
664 for (auto& o : observer_list)
665 o.Observe(1);
666
667 for (auto& o : observer_list)
668 o.Observe(10);
669
670 EXPECT_EQ(11, a.total);
671 EXPECT_EQ(-1, b.total);
672 EXPECT_EQ(11, c.total);
673 EXPECT_EQ(-11, d.total);
674 }
675
676 TEST(ObserverListTest, StdIteratorRemoveAfter) {
677 ObserverList<Foo> observer_list;
678 Adder a(1), b(-1), c(1), d(-1);
679 Disrupter disrupter(&observer_list, &c);
680
681 observer_list.AddObserver(&a);
682 observer_list.AddObserver(&b);
683 observer_list.AddObserver(&disrupter);
684 observer_list.AddObserver(&c);
685 observer_list.AddObserver(&d);
686
687 for (auto& o : observer_list)
688 o.Observe(1);
689
690 for (auto& o : observer_list)
691 o.Observe(10);
692
693 EXPECT_EQ(11, a.total);
694 EXPECT_EQ(-11, b.total);
695 EXPECT_EQ(0, c.total);
696 EXPECT_EQ(-11, d.total);
697 }
698
699 TEST(ObserverListTest, StdIteratorRemoveAfterFront) {
700 ObserverList<Foo> observer_list;
701 Adder a(1), b(-1), c(1), d(-1);
702 Disrupter disrupter(&observer_list, &a);
703
704 observer_list.AddObserver(&a);
705 observer_list.AddObserver(&disrupter);
706 observer_list.AddObserver(&b);
707 observer_list.AddObserver(&c);
708 observer_list.AddObserver(&d);
709
710 for (auto& o : observer_list)
711 o.Observe(1);
712
713 for (auto& o : observer_list)
714 o.Observe(10);
715
716 EXPECT_EQ(1, a.total);
717 EXPECT_EQ(-11, b.total);
718 EXPECT_EQ(11, c.total);
719 EXPECT_EQ(-11, d.total);
720 }
721
722 TEST(ObserverListTest, StdIteratorRemoveBeforeBack) {
723 ObserverList<Foo> observer_list;
724 Adder a(1), b(-1), c(1), d(-1);
725 Disrupter disrupter(&observer_list, &d);
726
727 observer_list.AddObserver(&a);
728 observer_list.AddObserver(&b);
729 observer_list.AddObserver(&c);
730 observer_list.AddObserver(&disrupter);
731 observer_list.AddObserver(&d);
732
733 for (auto& o : observer_list)
734 o.Observe(1);
735
736 for (auto& o : observer_list)
737 o.Observe(10);
738
739 EXPECT_EQ(11, a.total);
740 EXPECT_EQ(-11, b.total);
741 EXPECT_EQ(11, c.total);
742 EXPECT_EQ(0, d.total);
743 }
744
745 TEST(ObserverListTest, StdIteratorRemoveFront) {
746 ObserverList<Foo> observer_list;
747 Adder a(1), b(-1), c(1), d(-1);
748 DisrupterSelf disrupter(&observer_list);
749
750 observer_list.AddObserver(&disrupter);
751 observer_list.AddObserver(&a);
752 observer_list.AddObserver(&b);
753 observer_list.AddObserver(&c);
754 observer_list.AddObserver(&d);
755
756 for (auto& o : observer_list)
757 o.Observe(1);
758
759 for (auto& o : observer_list)
760 o.Observe(10);
761
762 EXPECT_EQ(11, a.total);
763 EXPECT_EQ(-11, b.total);
764 EXPECT_EQ(11, c.total);
765 EXPECT_EQ(-11, d.total);
766 }
767
768 TEST(ObserverListTest, StdIteratorRemoveBack) {
769 ObserverList<Foo> observer_list;
770 Adder a(1), b(-1), c(1), d(-1);
771 DisrupterSelf disrupter(&observer_list);
772
773 observer_list.AddObserver(&a);
774 observer_list.AddObserver(&b);
775 observer_list.AddObserver(&c);
776 observer_list.AddObserver(&d);
777 observer_list.AddObserver(&disrupter);
778
779 for (auto& o : observer_list)
780 o.Observe(1);
781
782 for (auto& o : observer_list)
783 o.Observe(10);
784
785 EXPECT_EQ(11, a.total);
786 EXPECT_EQ(-11, b.total);
787 EXPECT_EQ(11, c.total);
788 EXPECT_EQ(-11, d.total);
789 }
790
544 } // namespace 791 } // namespace
545 } // namespace base 792 } // 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