Chromium Code Reviews

Side by Side Diff: net/base/network_change_notifier_linux_unittest.cc

Issue 8249008: Offline state detection for linux, using new D-Bus library. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added comment Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | Annotate | Revision Log
« no previous file with comments | « net/base/network_change_notifier_linux.cc ('k') | net/net.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 "base/bind.h"
6 #include "base/message_loop_proxy.h"
7 #include "base/synchronization/waitable_event.h"
8 #include "dbus/mock_bus.h"
9 #include "dbus/mock_object_proxy.h"
10 #include "dbus/message.h"
11 #include "net/base/network_change_notifier_linux.h"
willchan no longer on Chromium 2011/11/16 19:39:03 This should go first
adamk 2011/11/16 19:46:36 Done.
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace net {
16
17 using testing::_;
18 using testing::DoAll;
19 using testing::InvokeWithoutArgs;
20 using testing::Return;
21 using testing::SaveArg;
22
23 class NetworkChangeNotifierLinuxTest : public testing::Test {
24 protected:
25 // A subset of the NetworkManager-defined constants used in
26 // the tests below. See network_change_notifier_linux.cc
27 // for the full list.
28 enum {
29 NM_STATE_DISCONNECTED = 20,
30 NM_STATE_DISCONNECTING = 30,
31 NM_STATE_CONNECTED_SITE = 70,
32 NM_STATE_CONNECTED_GLOBAL = 70
33 };
34
35 NetworkChangeNotifierLinuxTest()
36 : initialized_(false, false) {}
37
38 virtual void SetUp() {
39 dbus::Bus::Options options;
40 options.bus_type = dbus::Bus::SYSTEM;
41 mock_bus_ = new dbus::MockBus(options);
42
43 mock_object_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(),
44 "service_name",
45 "service_path");
46 EXPECT_CALL(*mock_bus_, GetObjectProxy(_, _))
47 .WillOnce(Return(mock_object_proxy_.get()));
48
49 EXPECT_CALL(*mock_object_proxy_, CallMethod(_, _, _))
50 .WillOnce(SaveArg<2>(&response_callback_));
51 EXPECT_CALL(*mock_object_proxy_, ConnectToSignal(_, _, _, _))
52 .WillOnce(
53 DoAll(
54 SaveArg<2>(&signal_callback_),
55 InvokeWithoutArgs(
56 this,
57 &NetworkChangeNotifierLinuxTest::Initialize)));
58
59 notifier_.reset(NetworkChangeNotifierLinux::CreateForTest(mock_bus_.get()));
60
61 initialized_.Wait();
62 }
63
64 void Initialize() {
65 notifier_thread_proxy_ = base::MessageLoopProxy::current();
66 initialized_.Signal();
67 }
68
69 void RunOnNotifierThread(const base::Closure& callback) {
70 base::WaitableEvent event(false, false);
71 notifier_thread_proxy_->PostTask(FROM_HERE, base::Bind(
72 &RunOnNotifierThreadHelper, callback, &event));
73 event.Wait();
74 // Run any tasks queued on the main thread, e.g. by
75 // ObserverListThreadSafe.
76 MessageLoop::current()->RunAllPending();
77 }
78
79 void SendResponse(uint32 state) {
80 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
81 dbus::MessageWriter writer(response.get());
82 writer.AppendUint32(state);
83 RunOnNotifierThread(base::Bind(response_callback_, response.get()));
84 }
85
86 void SendSignal(uint32 state) {
87 dbus::Signal signal("org.freedesktop.NetworkManager", "StateChanged");
88 dbus::MessageWriter writer(&signal);
89 writer.AppendUint32(state);
90 RunOnNotifierThread(base::Bind(signal_callback_, &signal));
91 }
92
93 dbus::ObjectProxy::ResponseCallback response_callback_;
94 dbus::ObjectProxy::SignalCallback signal_callback_;
95
96 // Allows creating a new NetworkChangeNotifier. Must be created before
97 // |notifier_| and destroyed after it to avoid DCHECK failures.
98 NetworkChangeNotifier::DisableForTest disable_for_test_;
99 scoped_ptr<NetworkChangeNotifier> notifier_;
100
101 private:
102 static void RunOnNotifierThreadHelper(const base::Closure& callback,
103 base::WaitableEvent* event) {
104 callback.Run();
105 event->Signal();
106 }
107
108 base::WaitableEvent initialized_;
109
110 // Valid only after initialized_ is signaled.
111 scoped_refptr<base::MessageLoopProxy> notifier_thread_proxy_;
112
113 scoped_refptr<dbus::MockBus> mock_bus_;
114 scoped_refptr<dbus::MockObjectProxy> mock_object_proxy_;
115 };
116
117 namespace {
118
119 class OfflineObserver : public NetworkChangeNotifier::OnlineStateObserver {
120 public:
121 OfflineObserver()
122 : notification_count(0),
123 last_online_value(true) {
124 NetworkChangeNotifier::AddOnlineStateObserver(this);
125 }
126
127 ~OfflineObserver() {
128 NetworkChangeNotifier::RemoveOnlineStateObserver(this);
129 }
130
131 virtual void OnOnlineStateChanged(bool online) OVERRIDE {
132 notification_count++;
133 last_online_value = online;
134 }
135
136 int notification_count;
137 bool last_online_value;
138 };
139
140 TEST_F(NetworkChangeNotifierLinuxTest, Offline) {
141 SendResponse(NM_STATE_DISCONNECTED);
142 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
143 }
144
145 TEST_F(NetworkChangeNotifierLinuxTest, Online) {
146 SendResponse(NM_STATE_CONNECTED_GLOBAL);
147 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
148 }
149
150 TEST_F(NetworkChangeNotifierLinuxTest, OfflineThenOnline) {
151 OfflineObserver observer;
152
153 SendResponse(NM_STATE_DISCONNECTED);
154 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
155 EXPECT_EQ(0, observer.notification_count);
156
157 SendSignal(NM_STATE_CONNECTED_GLOBAL);
158 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
159 EXPECT_EQ(1, observer.notification_count);
160 EXPECT_TRUE(observer.last_online_value);
161 }
162
163 TEST_F(NetworkChangeNotifierLinuxTest, MultipleStateChanges) {
164 OfflineObserver observer;
165
166 SendResponse(NM_STATE_CONNECTED_GLOBAL);
167 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
168 EXPECT_EQ(0, observer.notification_count);
169
170 SendSignal(NM_STATE_DISCONNECTED);
171 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
172 EXPECT_EQ(1, observer.notification_count);
173 EXPECT_FALSE(observer.last_online_value);
174
175 SendSignal(NM_STATE_CONNECTED_GLOBAL);
176 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
177 EXPECT_EQ(2, observer.notification_count);
178 EXPECT_TRUE(observer.last_online_value);
179 }
180
181 TEST_F(NetworkChangeNotifierLinuxTest, IgnoreContinuedOnlineState) {
182 OfflineObserver observer;
183
184 SendResponse(NM_STATE_CONNECTED_SITE);
185 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
186 EXPECT_EQ(0, observer.notification_count);
187
188 SendSignal(NM_STATE_CONNECTED_GLOBAL);
189 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
190 EXPECT_EQ(0, observer.notification_count);
191 }
192
193 TEST_F(NetworkChangeNotifierLinuxTest, IgnoreContinuedOfflineState) {
194 OfflineObserver observer;
195
196 SendResponse(NM_STATE_DISCONNECTING);
197 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
198 EXPECT_EQ(0, observer.notification_count);
199
200 SendSignal(NM_STATE_DISCONNECTED);
201 EXPECT_TRUE(NetworkChangeNotifier::IsOffline());
202 EXPECT_EQ(0, observer.notification_count);
203 }
204
205 TEST_F(NetworkChangeNotifierLinuxTest, NullResponse) {
206 RunOnNotifierThread(base::Bind(
207 response_callback_, static_cast<dbus::Response*>(NULL)));
208 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
209 }
210
211 TEST_F(NetworkChangeNotifierLinuxTest, EmptyResponse) {
212 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
213 RunOnNotifierThread(base::Bind(response_callback_, response.get()));
214 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
215 }
216
217 TEST_F(NetworkChangeNotifierLinuxTest, InvalidResponse) {
218 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
219 dbus::MessageWriter writer(response.get());
220 writer.AppendUint16(20); // Uint16 instead of the expected Uint32
221 RunOnNotifierThread(base::Bind(response_callback_, response.get()));
222 EXPECT_FALSE(NetworkChangeNotifier::IsOffline());
223 }
224
225 } // namespace
226 } // namespace net
OLDNEW
« no previous file with comments | « net/base/network_change_notifier_linux.cc ('k') | net/net.gyp » ('j') | no next file with comments »

Powered by Google App Engine