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

Side by Side Diff: chrome/common/net/fake_network_change_notifier_thread_unittest.cc

Issue 2802015: Massively simplify the NetworkChangeNotifier infrastructure:... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 6 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/common/net/fake_network_change_notifier_thread.h"
6
7 #include "base/basictypes.h"
8 #include "base/logging.h"
9 #include "base/message_loop.h"
10 #include "base/task.h"
11 #include "net/base/network_change_notifier.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace chrome_common_net {
15 class FlagToggler;
16 } // namespace chrome_common_net
17
18 // We manage the lifetime of chrome_common_net::FlagToggler ourselves.
19 DISABLE_RUNNABLE_METHOD_REFCOUNT(chrome_common_net::FlagToggler);
20
21 namespace chrome_common_net {
22
23 // Utility class that toggles a flag every time it receives an IP
24 // address change notification.
25 class FlagToggler : public net::NetworkChangeNotifier::Observer {
26 public:
27 FlagToggler() : flag_(false) {}
28
29 virtual ~FlagToggler() {}
30
31 bool flag() const { return flag_; }
32
33 void ToggleFlag() {
34 flag_ = !flag_;
35 }
36
37 void Observe(NetworkChangeNotifierThread* thread) {
38 thread->GetNetworkChangeNotifier()->AddObserver(this);
39 }
40
41 void Unobserve(NetworkChangeNotifierThread* thread) {
42 thread->GetNetworkChangeNotifier()->RemoveObserver(this);
43 }
44
45 // net::NetworkChangeNotifier::Observer implementation.
46 virtual void OnIPAddressChanged() {
47 ToggleFlag();
48 }
49
50 private:
51 bool flag_;
52
53 DISALLOW_COPY_AND_ASSIGN(FlagToggler);
54 };
55
56 // Utility class that sanity-checks a
57 // FakeNetworkChangeNotifierThread's member variables right before its
58 // message loop gets destroyed (used in DestructionRace test).
59 class FakeNetworkChangeNotifierThreadDestructionObserver
60 : public MessageLoop::DestructionObserver {
61 public:
62 explicit FakeNetworkChangeNotifierThreadDestructionObserver(
63 const FakeNetworkChangeNotifierThread& thread)
64 : thread_(thread) {}
65
66 virtual ~FakeNetworkChangeNotifierThreadDestructionObserver() {}
67
68 virtual void WillDestroyCurrentMessageLoop() {
69 EXPECT_FALSE(thread_.thread_blocker_.get());
70 // We can't use
71 // FakeNetworkChangeNotifierThread::GetNetworkChangeNotifier() as
72 // it would CHECK-fail on the current thread's message loop being
73 // NULL.
74 EXPECT_TRUE(thread_.network_change_notifier_.get());
75 delete this;
76 }
77
78 private:
79 const FakeNetworkChangeNotifierThread& thread_;
80
81 DISALLOW_COPY_AND_ASSIGN(
82 FakeNetworkChangeNotifierThreadDestructionObserver);
83 };
84
85 // Utility function to add the
86 // FakeNetworkChangeNotifierThreadDestructionObserver from the
87 // FakeNetworkChangeNotifierThread's thread.
88 void AddFakeNetworkChangeNotifierThreadDestructionObserver(
89 const FakeNetworkChangeNotifierThread* thread) {
90 CHECK_EQ(MessageLoop::current(), thread->GetMessageLoop());
91 thread->GetMessageLoop()->AddDestructionObserver(
92 new FakeNetworkChangeNotifierThreadDestructionObserver(*thread));
93 }
94
95 namespace {
96
97 class FakeNetworkChangeNotifierThreadTest : public testing::Test {
98 protected:
99 FakeNetworkChangeNotifierThreadTest() {}
100
101 virtual ~FakeNetworkChangeNotifierThreadTest() {}
102
103 virtual void SetUp() {
104 thread_.Start();
105 }
106
107 virtual void TearDown() {
108 thread_.Stop();
109 }
110
111 FakeNetworkChangeNotifierThread thread_;
112 FlagToggler flag_toggler_;
113
114 private:
115 DISALLOW_COPY_AND_ASSIGN(FakeNetworkChangeNotifierThreadTest);
116 };
117
118 TEST_F(FakeNetworkChangeNotifierThreadTest, Pump) {
119 thread_.GetMessageLoop()->PostTask(
120 FROM_HERE, NewRunnableMethod(&flag_toggler_, &FlagToggler::ToggleFlag));
121 EXPECT_FALSE(flag_toggler_.flag());
122 thread_.Pump();
123 EXPECT_TRUE(flag_toggler_.flag());
124 }
125
126 TEST_F(FakeNetworkChangeNotifierThreadTest, Basic) {
127 thread_.GetMessageLoop()->PostTask(
128 FROM_HERE,
129 NewRunnableMethod(&flag_toggler_, &FlagToggler::Observe, &thread_));
130 thread_.NotifyIPAddressChange();
131 thread_.GetMessageLoop()->PostTask(
132 FROM_HERE,
133 NewRunnableMethod(&flag_toggler_, &FlagToggler::Unobserve, &thread_));
134 EXPECT_FALSE(flag_toggler_.flag());
135 thread_.Pump();
136 EXPECT_TRUE(flag_toggler_.flag());
137 }
138
139 TEST_F(FakeNetworkChangeNotifierThreadTest, Multiple) {
140 FlagToggler observer;
141 thread_.GetMessageLoop()->PostTask(
142 FROM_HERE,
143 NewRunnableMethod(&flag_toggler_, &FlagToggler::Observe, &thread_));
144 thread_.NotifyIPAddressChange();
145 thread_.NotifyIPAddressChange();
146 thread_.GetMessageLoop()->PostTask(
147 FROM_HERE,
148 NewRunnableMethod(&flag_toggler_, &FlagToggler::Unobserve, &thread_));
149 EXPECT_FALSE(flag_toggler_.flag());
150 thread_.Pump();
151 EXPECT_FALSE(flag_toggler_.flag());
152 }
153
154 TEST_F(FakeNetworkChangeNotifierThreadTest, DestructionRace) {
155 thread_.GetMessageLoop()->PostTask(
156 FROM_HERE,
157 NewRunnableFunction(
158 &AddFakeNetworkChangeNotifierThreadDestructionObserver,
159 &thread_));
160 }
161
162 } // namespace
163
164 } // namespace chrome_common_net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698