Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 // See network_change_notifier_android.h for design explanations. | 5 // See network_change_notifier_android.h for design explanations. |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "net/android/network_change_notifier_android.h" | 12 #include "net/android/network_change_notifier_android.h" |
| 13 #include "net/android/network_change_notifier_delegate_android.h" | 13 #include "net/android/network_change_notifier_delegate_android.h" |
| 14 #include "net/base/network_change_notifier.h" | 14 #include "net/base/network_change_notifier.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 | 16 |
| 17 namespace net { | 17 namespace net { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 // Template used to generate both the NetworkChangeNotifierDelegateAndroid and | 21 class NetworkChangeNotifierDelegateAndroidObserver |
| 22 // NetworkChangeNotifier::ConnectionTypeObserver implementations which have the | 22 : public NetworkChangeNotifierDelegateAndroid::Observer { |
| 23 // same interface. | |
| 24 template <typename BaseObserver> | |
| 25 class ObserverImpl : public BaseObserver { | |
| 26 public: | 23 public: |
| 27 ObserverImpl() | 24 NetworkChangeNotifierDelegateAndroidObserver() : notifications_count_(0) {} |
| 28 : times_connection_type_changed_(0), | 25 |
| 29 current_connection_(NetworkChangeNotifier::CONNECTION_UNKNOWN) { | 26 // NetworkChangeNotifierDelegateAndroid::Observer: |
| 27 virtual void OnConnectionTypeChanged() OVERRIDE { | |
| 28 notifications_count_++; | |
| 30 } | 29 } |
| 31 | 30 |
| 32 // BaseObserver: | 31 int notifications_count() const { |
| 33 virtual void OnConnectionTypeChanged( | 32 return notifications_count_; |
| 34 NetworkChangeNotifier::ConnectionType type) OVERRIDE { | |
| 35 times_connection_type_changed_++; | |
| 36 current_connection_ = type; | |
| 37 } | |
| 38 | |
| 39 int times_connection_type_changed() const { | |
| 40 return times_connection_type_changed_; | |
| 41 } | |
| 42 | |
| 43 NetworkChangeNotifier::ConnectionType current_connection() const { | |
| 44 return current_connection_; | |
| 45 } | 33 } |
| 46 | 34 |
| 47 private: | 35 private: |
| 48 int times_connection_type_changed_; | 36 int notifications_count_; |
| 49 NetworkChangeNotifier::ConnectionType current_connection_; | 37 }; |
| 50 | 38 |
| 51 DISALLOW_COPY_AND_ASSIGN(ObserverImpl); | 39 class NetworkChangeNotifierObserver |
| 40 : public NetworkChangeNotifier::ConnectionTypeObserver { | |
| 41 public: | |
| 42 NetworkChangeNotifierObserver() : notifications_count_(0) {} | |
| 43 | |
| 44 // NetworkChangeNotifier::Observer: | |
| 45 virtual void OnConnectionTypeChanged( | |
| 46 NetworkChangeNotifier::ConnectionType connection_type) OVERRIDE { | |
| 47 notifications_count_++; | |
| 48 } | |
| 49 | |
| 50 int notifications_count() const { | |
| 51 return notifications_count_; | |
| 52 } | |
| 53 | |
| 54 private: | |
| 55 int notifications_count_; | |
| 52 }; | 56 }; |
| 53 | 57 |
| 54 } // namespace | 58 } // namespace |
| 55 | 59 |
| 56 class BaseNetworkChangeNotifierAndroidTest : public testing::Test { | 60 class BaseNetworkChangeNotifierAndroidTest : public testing::Test { |
| 57 protected: | 61 protected: |
| 58 typedef NetworkChangeNotifier::ConnectionType ConnectionType; | 62 typedef NetworkChangeNotifier::ConnectionType ConnectionType; |
| 59 | 63 |
| 60 virtual ~BaseNetworkChangeNotifierAndroidTest() {} | 64 virtual ~BaseNetworkChangeNotifierAndroidTest() {} |
| 61 | 65 |
| 62 void RunTest( | 66 void RunTest( |
| 63 const base::Callback<int(void)>& times_connection_type_changed_callback, | 67 const base::Callback<int(void)>& notifications_count_getter, |
| 64 const base::Callback<ConnectionType(void)>& connection_type_getter) { | 68 const base::Callback<ConnectionType(void)>& connection_type_getter) { |
| 65 EXPECT_EQ(0, times_connection_type_changed_callback.Run()); | 69 EXPECT_EQ(0, notifications_count_getter.Run()); |
| 66 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, | 70 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| 67 connection_type_getter.Run()); | 71 connection_type_getter.Run()); |
| 68 | 72 |
| 69 ForceConnectivityState(NetworkChangeNotifierDelegateAndroid::OFFLINE); | 73 SetOffline(); |
|
Ryan Sleevi
2013/01/03 18:28:25
nit: Add some comments (*above* line 73/78/83)
//
Philippe
2013/01/04 10:13:01
Thanks.
| |
| 70 EXPECT_EQ(1, times_connection_type_changed_callback.Run()); | 74 EXPECT_EQ(1, notifications_count_getter.Run()); |
| 71 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, | 75 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, |
| 72 connection_type_getter.Run()); | 76 connection_type_getter.Run()); |
| 73 | 77 |
| 74 ForceConnectivityState(NetworkChangeNotifierDelegateAndroid::OFFLINE); | 78 SetOffline(); |
|
Ryan Sleevi
2013/01/03 18:28:25
// No notification should be triggered when the of
Philippe
2013/01/04 10:13:01
Done.
| |
| 75 EXPECT_EQ(1, times_connection_type_changed_callback.Run()); | 79 EXPECT_EQ(1, notifications_count_getter.Run()); |
| 76 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, | 80 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, |
| 77 connection_type_getter.Run()); | 81 connection_type_getter.Run()); |
| 78 | 82 |
| 79 ForceConnectivityState(NetworkChangeNotifierDelegateAndroid::ONLINE); | 83 SetOnline(); |
|
Ryan Sleevi
2013/01/03 18:28:25
// Going from offline to online should trigger a n
Philippe
2013/01/04 10:13:01
Done.
| |
| 80 EXPECT_EQ(2, times_connection_type_changed_callback.Run()); | 84 EXPECT_EQ(2, notifications_count_getter.Run()); |
| 81 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, | 85 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, |
| 82 connection_type_getter.Run()); | 86 connection_type_getter.Run()); |
| 83 } | 87 } |
| 84 | 88 |
| 85 void ForceConnectivityState( | 89 void SetOnline() { |
| 86 NetworkChangeNotifierDelegateAndroid::ConnectivityState state) { | 90 delegate_.SetOnline(); |
| 87 delegate_.ForceConnectivityState(state); | |
| 88 // Note that this is needed because ObserverListThreadSafe uses PostTask(). | 91 // Note that this is needed because ObserverListThreadSafe uses PostTask(). |
| 89 MessageLoop::current()->RunUntilIdle(); | 92 MessageLoop::current()->RunUntilIdle(); |
| 90 } | 93 } |
| 91 | 94 |
| 95 void SetOffline() { | |
| 96 delegate_.SetOffline(); | |
| 97 // See comment above. | |
| 98 MessageLoop::current()->RunUntilIdle(); | |
| 99 } | |
| 100 | |
| 92 NetworkChangeNotifierDelegateAndroid delegate_; | 101 NetworkChangeNotifierDelegateAndroid delegate_; |
| 93 }; | 102 }; |
| 94 | 103 |
| 104 // Tests that NetworkChangeNotifierDelegateAndroid is initialized with the | |
| 105 // actual connection type rather than a hardcoded one (e.g. | |
| 106 // CONNECTION_UNKNOWN). Initializing the connection type to CONNECTION_UNKNOWN | |
| 107 // and relying on the first network change notification to set it correctly can | |
| 108 // be problematic in case there is a long delay between the delegate's | |
| 109 // construction and the notification. | |
| 110 TEST_F(BaseNetworkChangeNotifierAndroidTest, | |
| 111 DelegateIsInitializedWithCurrentConnectionType) { | |
| 112 SetOffline(); | |
| 113 ASSERT_EQ(NetworkChangeNotifier::CONNECTION_NONE, | |
| 114 delegate_.GetCurrentConnectionType()); | |
| 115 // Instantiate another delegate to validate that it uses the actual | |
| 116 // connection type at construction. | |
| 117 scoped_ptr<NetworkChangeNotifierDelegateAndroid> other_delegate( | |
| 118 new NetworkChangeNotifierDelegateAndroid()); | |
| 119 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, | |
| 120 other_delegate->GetCurrentConnectionType()); | |
| 121 | |
| 122 // Toggle the global connectivity state and instantiate another delegate | |
| 123 // again. | |
| 124 SetOnline(); | |
| 125 ASSERT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, | |
| 126 delegate_.GetCurrentConnectionType()); | |
| 127 other_delegate.reset(new NetworkChangeNotifierDelegateAndroid()); | |
| 128 EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, | |
| 129 other_delegate->GetCurrentConnectionType()); | |
| 130 } | |
| 131 | |
| 95 class NetworkChangeNotifierDelegateAndroidTest | 132 class NetworkChangeNotifierDelegateAndroidTest |
| 96 : public BaseNetworkChangeNotifierAndroidTest { | 133 : public BaseNetworkChangeNotifierAndroidTest { |
| 97 protected: | 134 protected: |
| 98 typedef ObserverImpl< | |
| 99 NetworkChangeNotifierDelegateAndroid::Observer> TestDelegateObserver; | |
| 100 | |
| 101 NetworkChangeNotifierDelegateAndroidTest() { | 135 NetworkChangeNotifierDelegateAndroidTest() { |
| 102 delegate_.AddObserver(&delegate_observer_); | 136 delegate_.AddObserver(&delegate_observer_); |
| 103 delegate_.AddObserver(&other_delegate_observer_); | 137 delegate_.AddObserver(&other_delegate_observer_); |
| 104 } | 138 } |
| 105 | 139 |
| 106 virtual ~NetworkChangeNotifierDelegateAndroidTest() { | 140 virtual ~NetworkChangeNotifierDelegateAndroidTest() { |
| 107 delegate_.RemoveObserver(&delegate_observer_); | 141 delegate_.RemoveObserver(&delegate_observer_); |
| 108 delegate_.RemoveObserver(&other_delegate_observer_); | 142 delegate_.RemoveObserver(&other_delegate_observer_); |
| 109 } | 143 } |
| 110 | 144 |
| 111 TestDelegateObserver delegate_observer_; | 145 NetworkChangeNotifierDelegateAndroidObserver delegate_observer_; |
| 112 TestDelegateObserver other_delegate_observer_; | 146 NetworkChangeNotifierDelegateAndroidObserver other_delegate_observer_; |
| 113 }; | 147 }; |
| 114 | 148 |
| 115 // Tests that the NetworkChangeNotifierDelegateAndroid's observers are notified. | 149 // Tests that the NetworkChangeNotifierDelegateAndroid's observers are notified. |
| 116 // A testing-only observer is used here for testing. In production the | 150 // A testing-only observer is used here for testing. In production the |
| 117 // delegate's observers are instances of NetworkChangeNotifierAndroid. | 151 // delegate's observers are instances of NetworkChangeNotifierAndroid. |
| 118 TEST_F(NetworkChangeNotifierDelegateAndroidTest, DelegateObserverNotified) { | 152 TEST_F(NetworkChangeNotifierDelegateAndroidTest, DelegateObserverNotified) { |
| 119 // Test the logic with a single observer. | 153 // Test the logic with a single observer. |
| 120 RunTest( | 154 RunTest( |
| 121 base::Bind( | 155 base::Bind( |
| 122 &TestDelegateObserver::times_connection_type_changed, | 156 &NetworkChangeNotifierDelegateAndroidObserver::notifications_count, |
| 123 base::Unretained(&delegate_observer_)), | 157 base::Unretained(&delegate_observer_)), |
| 124 base::Bind( | 158 base::Bind( |
| 125 &TestDelegateObserver::current_connection, | 159 &NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType, |
| 126 base::Unretained(&delegate_observer_))); | 160 base::Unretained(&delegate_))); |
| 127 // Check that *all* the observers are notified. Both observers should have the | 161 // Check that *all* the observers are notified. Both observers should have the |
| 128 // same state. | 162 // same state. |
| 129 EXPECT_EQ(delegate_observer_.times_connection_type_changed(), | 163 EXPECT_EQ(delegate_observer_.notifications_count(), |
| 130 other_delegate_observer_.times_connection_type_changed()); | 164 other_delegate_observer_.notifications_count()); |
| 131 EXPECT_EQ(delegate_observer_.current_connection(), | |
| 132 other_delegate_observer_.current_connection()); | |
| 133 } | 165 } |
| 134 | 166 |
| 135 class NetworkChangeNotifierAndroidTest | 167 class NetworkChangeNotifierAndroidTest |
| 136 : public BaseNetworkChangeNotifierAndroidTest { | 168 : public BaseNetworkChangeNotifierAndroidTest { |
| 137 protected: | 169 protected: |
| 138 typedef ObserverImpl< | |
| 139 NetworkChangeNotifier::ConnectionTypeObserver> TestConnectionTypeObserver; | |
| 140 | |
| 141 NetworkChangeNotifierAndroidTest() : notifier_(&delegate_) { | 170 NetworkChangeNotifierAndroidTest() : notifier_(&delegate_) { |
| 142 NetworkChangeNotifier::AddConnectionTypeObserver( | 171 NetworkChangeNotifier::AddConnectionTypeObserver( |
| 143 &connection_type_observer_); | 172 &connection_type_observer_); |
| 144 NetworkChangeNotifier::AddConnectionTypeObserver( | 173 NetworkChangeNotifier::AddConnectionTypeObserver( |
| 145 &other_connection_type_observer_); | 174 &other_connection_type_observer_); |
| 146 } | 175 } |
| 147 | 176 |
| 148 TestConnectionTypeObserver connection_type_observer_; | 177 NetworkChangeNotifierObserver connection_type_observer_; |
| 149 TestConnectionTypeObserver other_connection_type_observer_; | 178 NetworkChangeNotifierObserver other_connection_type_observer_; |
| 150 NetworkChangeNotifier::DisableForTest disable_for_test_; | 179 NetworkChangeNotifier::DisableForTest disable_for_test_; |
| 151 NetworkChangeNotifierAndroid notifier_; | 180 NetworkChangeNotifierAndroid notifier_; |
| 152 }; | 181 }; |
| 153 | 182 |
| 154 // When a NetworkChangeNotifierAndroid is observing a | 183 // When a NetworkChangeNotifierAndroid is observing a |
| 155 // NetworkChangeNotifierDelegateAndroid for network state changes, and the | 184 // NetworkChangeNotifierDelegateAndroid for network state changes, and the |
| 156 // NetworkChangeNotifierDelegateAndroid's connectivity state changes, the | 185 // NetworkChangeNotifierDelegateAndroid's connectivity state changes, the |
| 157 // NetworkChangeNotifierAndroid should reflect that state. | 186 // NetworkChangeNotifierAndroid should reflect that state. |
| 158 TEST_F(NetworkChangeNotifierAndroidTest, | 187 TEST_F(NetworkChangeNotifierAndroidTest, |
| 159 NotificationsSentToNetworkChangeNotifierAndroid) { | 188 NotificationsSentToNetworkChangeNotifierAndroid) { |
| 160 RunTest( | 189 RunTest( |
| 161 base::Bind( | 190 base::Bind( |
| 162 &TestConnectionTypeObserver::times_connection_type_changed, | 191 &NetworkChangeNotifierObserver::notifications_count, |
| 163 base::Unretained(&connection_type_observer_)), | 192 base::Unretained(&connection_type_observer_)), |
| 164 base::Bind( | 193 base::Bind( |
| 165 &NetworkChangeNotifierAndroid::GetCurrentConnectionType, | 194 &NetworkChangeNotifierAndroid::GetCurrentConnectionType, |
| 166 base::Unretained(¬ifier_))); | 195 base::Unretained(¬ifier_))); |
| 167 } | 196 } |
| 168 | 197 |
| 169 // When a NetworkChangeNotifierAndroid's connection state changes, it should | 198 // When a NetworkChangeNotifierAndroid's connection state changes, it should |
| 170 // notify all of its observers. | 199 // notify all of its observers. |
| 171 TEST_F(NetworkChangeNotifierAndroidTest, | 200 TEST_F(NetworkChangeNotifierAndroidTest, |
| 172 NotificationsSentToClientsOfNetworkChangeNotifier) { | 201 NotificationsSentToClientsOfNetworkChangeNotifier) { |
| 173 RunTest( | 202 RunTest( |
| 174 base::Bind( | 203 base::Bind( |
| 175 &TestConnectionTypeObserver::times_connection_type_changed, | 204 &NetworkChangeNotifierObserver::notifications_count, |
| 176 base::Unretained(&connection_type_observer_)), | 205 base::Unretained(&connection_type_observer_)), |
| 177 base::Bind( | 206 base::Bind(&NetworkChangeNotifier::GetConnectionType)); |
| 178 &TestConnectionTypeObserver::current_connection, | |
| 179 base::Unretained(&connection_type_observer_))); | |
| 180 // Check that *all* the observers are notified. | 207 // Check that *all* the observers are notified. |
| 181 EXPECT_EQ(connection_type_observer_.times_connection_type_changed(), | 208 EXPECT_EQ(connection_type_observer_.notifications_count(), |
| 182 other_connection_type_observer_.times_connection_type_changed()); | 209 other_connection_type_observer_.notifications_count()); |
| 183 EXPECT_EQ(connection_type_observer_.current_connection(), | |
| 184 other_connection_type_observer_.current_connection()); | |
| 185 } | 210 } |
| 186 | 211 |
| 187 } // namespace net | 212 } // namespace net |
| OLD | NEW |