Index: net/android/network_change_notifier_android_unittest.cc |
diff --git a/net/android/network_change_notifier_android_unittest.cc b/net/android/network_change_notifier_android_unittest.cc |
index b66d6474c025720fb9996e0a86d2eefad9ba0407..7fb8e6b57147207907c899bc7e325e6e8b16338b 100644 |
--- a/net/android/network_change_notifier_android_unittest.cc |
+++ b/net/android/network_change_notifier_android_unittest.cc |
@@ -18,37 +18,41 @@ namespace net { |
namespace { |
-// Template used to generate both the NetworkChangeNotifierDelegateAndroid and |
-// NetworkChangeNotifier::ConnectionTypeObserver implementations which have the |
-// same interface. |
-template <typename BaseObserver> |
-class ObserverImpl : public BaseObserver { |
+class NetworkChangeNotifierDelegateAndroidObserver |
+ : public NetworkChangeNotifierDelegateAndroid::Observer { |
public: |
- ObserverImpl() |
- : times_connection_type_changed_(0), |
- current_connection_(NetworkChangeNotifier::CONNECTION_UNKNOWN) { |
+ NetworkChangeNotifierDelegateAndroidObserver() : notifications_count_(0) {} |
+ |
+ // NetworkChangeNotifierDelegateAndroid::Observer: |
+ virtual void OnConnectionTypeChanged() OVERRIDE { |
+ notifications_count_++; |
} |
- // BaseObserver: |
- virtual void OnConnectionTypeChanged( |
- NetworkChangeNotifier::ConnectionType type) OVERRIDE { |
- times_connection_type_changed_++; |
- current_connection_ = type; |
+ int notifications_count() const { |
+ return notifications_count_; |
} |
- int times_connection_type_changed() const { |
- return times_connection_type_changed_; |
+ private: |
+ int notifications_count_; |
+}; |
+ |
+class NetworkChangeNotifierObserver |
+ : public NetworkChangeNotifier::ConnectionTypeObserver { |
+ public: |
+ NetworkChangeNotifierObserver() : notifications_count_(0) {} |
+ |
+ // NetworkChangeNotifier::Observer: |
+ virtual void OnConnectionTypeChanged( |
+ NetworkChangeNotifier::ConnectionType connection_type) OVERRIDE { |
+ notifications_count_++; |
} |
- NetworkChangeNotifier::ConnectionType current_connection() const { |
- return current_connection_; |
+ int notifications_count() const { |
+ return notifications_count_; |
} |
private: |
- int times_connection_type_changed_; |
- NetworkChangeNotifier::ConnectionType current_connection_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ObserverImpl); |
+ int notifications_count_; |
}; |
} // namespace |
@@ -60,44 +64,78 @@ class BaseNetworkChangeNotifierAndroidTest : public testing::Test { |
virtual ~BaseNetworkChangeNotifierAndroidTest() {} |
void RunTest( |
- const base::Callback<int(void)>& times_connection_type_changed_callback, |
+ const base::Callback<int(void)>& notifications_count_getter, |
const base::Callback<ConnectionType(void)>& connection_type_getter) { |
- EXPECT_EQ(0, times_connection_type_changed_callback.Run()); |
+ EXPECT_EQ(0, notifications_count_getter.Run()); |
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, |
connection_type_getter.Run()); |
- ForceConnectivityState(NetworkChangeNotifierDelegateAndroid::OFFLINE); |
- EXPECT_EQ(1, times_connection_type_changed_callback.Run()); |
+ // Changing from online to offline should trigger a notification. |
+ SetOffline(); |
+ EXPECT_EQ(1, notifications_count_getter.Run()); |
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, |
connection_type_getter.Run()); |
- ForceConnectivityState(NetworkChangeNotifierDelegateAndroid::OFFLINE); |
- EXPECT_EQ(1, times_connection_type_changed_callback.Run()); |
+ // No notification should be triggered when the offline state hasn't |
+ // changed. |
+ SetOffline(); |
+ EXPECT_EQ(1, notifications_count_getter.Run()); |
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, |
connection_type_getter.Run()); |
- ForceConnectivityState(NetworkChangeNotifierDelegateAndroid::ONLINE); |
- EXPECT_EQ(2, times_connection_type_changed_callback.Run()); |
+ // Going from offline to online should trigger a notification. |
+ SetOnline(); |
+ EXPECT_EQ(2, notifications_count_getter.Run()); |
EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, |
connection_type_getter.Run()); |
} |
- void ForceConnectivityState( |
- NetworkChangeNotifierDelegateAndroid::ConnectivityState state) { |
- delegate_.ForceConnectivityState(state); |
+ void SetOnline() { |
+ delegate_.SetOnline(); |
// Note that this is needed because ObserverListThreadSafe uses PostTask(). |
MessageLoop::current()->RunUntilIdle(); |
} |
+ void SetOffline() { |
+ delegate_.SetOffline(); |
+ // See comment above. |
+ MessageLoop::current()->RunUntilIdle(); |
+ } |
+ |
NetworkChangeNotifierDelegateAndroid delegate_; |
}; |
+// Tests that NetworkChangeNotifierDelegateAndroid is initialized with the |
+// actual connection type rather than a hardcoded one (e.g. |
+// CONNECTION_UNKNOWN). Initializing the connection type to CONNECTION_UNKNOWN |
+// and relying on the first network change notification to set it correctly can |
+// be problematic in case there is a long delay between the delegate's |
+// construction and the notification. |
+TEST_F(BaseNetworkChangeNotifierAndroidTest, |
+ DelegateIsInitializedWithCurrentConnectionType) { |
+ SetOffline(); |
+ ASSERT_EQ(NetworkChangeNotifier::CONNECTION_NONE, |
+ delegate_.GetCurrentConnectionType()); |
+ // Instantiate another delegate to validate that it uses the actual |
+ // connection type at construction. |
+ scoped_ptr<NetworkChangeNotifierDelegateAndroid> other_delegate( |
+ new NetworkChangeNotifierDelegateAndroid()); |
+ EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, |
+ other_delegate->GetCurrentConnectionType()); |
+ |
+ // Toggle the global connectivity state and instantiate another delegate |
+ // again. |
+ SetOnline(); |
+ ASSERT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, |
+ delegate_.GetCurrentConnectionType()); |
+ other_delegate.reset(new NetworkChangeNotifierDelegateAndroid()); |
+ EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, |
+ other_delegate->GetCurrentConnectionType()); |
+} |
+ |
class NetworkChangeNotifierDelegateAndroidTest |
: public BaseNetworkChangeNotifierAndroidTest { |
protected: |
- typedef ObserverImpl< |
- NetworkChangeNotifierDelegateAndroid::Observer> TestDelegateObserver; |
- |
NetworkChangeNotifierDelegateAndroidTest() { |
delegate_.AddObserver(&delegate_observer_); |
delegate_.AddObserver(&other_delegate_observer_); |
@@ -108,8 +146,8 @@ class NetworkChangeNotifierDelegateAndroidTest |
delegate_.RemoveObserver(&other_delegate_observer_); |
} |
- TestDelegateObserver delegate_observer_; |
- TestDelegateObserver other_delegate_observer_; |
+ NetworkChangeNotifierDelegateAndroidObserver delegate_observer_; |
+ NetworkChangeNotifierDelegateAndroidObserver other_delegate_observer_; |
}; |
// Tests that the NetworkChangeNotifierDelegateAndroid's observers are notified. |
@@ -119,25 +157,20 @@ TEST_F(NetworkChangeNotifierDelegateAndroidTest, DelegateObserverNotified) { |
// Test the logic with a single observer. |
RunTest( |
base::Bind( |
- &TestDelegateObserver::times_connection_type_changed, |
+ &NetworkChangeNotifierDelegateAndroidObserver::notifications_count, |
base::Unretained(&delegate_observer_)), |
base::Bind( |
- &TestDelegateObserver::current_connection, |
- base::Unretained(&delegate_observer_))); |
+ &NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType, |
+ base::Unretained(&delegate_))); |
// Check that *all* the observers are notified. Both observers should have the |
// same state. |
- EXPECT_EQ(delegate_observer_.times_connection_type_changed(), |
- other_delegate_observer_.times_connection_type_changed()); |
- EXPECT_EQ(delegate_observer_.current_connection(), |
- other_delegate_observer_.current_connection()); |
+ EXPECT_EQ(delegate_observer_.notifications_count(), |
+ other_delegate_observer_.notifications_count()); |
} |
class NetworkChangeNotifierAndroidTest |
: public BaseNetworkChangeNotifierAndroidTest { |
protected: |
- typedef ObserverImpl< |
- NetworkChangeNotifier::ConnectionTypeObserver> TestConnectionTypeObserver; |
- |
NetworkChangeNotifierAndroidTest() : notifier_(&delegate_) { |
NetworkChangeNotifier::AddConnectionTypeObserver( |
&connection_type_observer_); |
@@ -145,8 +178,8 @@ class NetworkChangeNotifierAndroidTest |
&other_connection_type_observer_); |
} |
- TestConnectionTypeObserver connection_type_observer_; |
- TestConnectionTypeObserver other_connection_type_observer_; |
+ NetworkChangeNotifierObserver connection_type_observer_; |
+ NetworkChangeNotifierObserver other_connection_type_observer_; |
NetworkChangeNotifier::DisableForTest disable_for_test_; |
NetworkChangeNotifierAndroid notifier_; |
}; |
@@ -159,7 +192,7 @@ TEST_F(NetworkChangeNotifierAndroidTest, |
NotificationsSentToNetworkChangeNotifierAndroid) { |
RunTest( |
base::Bind( |
- &TestConnectionTypeObserver::times_connection_type_changed, |
+ &NetworkChangeNotifierObserver::notifications_count, |
base::Unretained(&connection_type_observer_)), |
base::Bind( |
&NetworkChangeNotifierAndroid::GetCurrentConnectionType, |
@@ -172,16 +205,12 @@ TEST_F(NetworkChangeNotifierAndroidTest, |
NotificationsSentToClientsOfNetworkChangeNotifier) { |
RunTest( |
base::Bind( |
- &TestConnectionTypeObserver::times_connection_type_changed, |
+ &NetworkChangeNotifierObserver::notifications_count, |
base::Unretained(&connection_type_observer_)), |
- base::Bind( |
- &TestConnectionTypeObserver::current_connection, |
- base::Unretained(&connection_type_observer_))); |
+ base::Bind(&NetworkChangeNotifier::GetConnectionType)); |
// Check that *all* the observers are notified. |
- EXPECT_EQ(connection_type_observer_.times_connection_type_changed(), |
- other_connection_type_observer_.times_connection_type_changed()); |
- EXPECT_EQ(connection_type_observer_.current_connection(), |
- other_connection_type_observer_.current_connection()); |
+ EXPECT_EQ(connection_type_observer_.notifications_count(), |
+ other_connection_type_observer_.notifications_count()); |
} |
} // namespace net |