15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// See network_change_notifier_android.h for design explanations. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/android/network_change_notifier_android.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/android/network_change_notifier_delegate_android.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkChangeNotifierDelegateAndroidObserver 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public NetworkChangeNotifierDelegateAndroid::Observer { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierDelegateAndroidObserver() : notifications_count_(0) {} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NetworkChangeNotifierDelegateAndroid::Observer: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnConnectionTypeChanged() OVERRIDE { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notifications_count_++; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int notifications_count() const { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notifications_count_; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int notifications_count_; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkChangeNotifierObserver 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public NetworkChangeNotifier::ConnectionTypeObserver { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierObserver() : notifications_count_(0) {} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NetworkChangeNotifier::Observer: 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnConnectionTypeChanged( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifier::ConnectionType connection_type) OVERRIDE { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) notifications_count_++; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int notifications_count() const { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return notifications_count_; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int notifications_count_; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BaseNetworkChangeNotifierAndroidTest : public testing::Test { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef NetworkChangeNotifier::ConnectionType ConnectionType; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~BaseNetworkChangeNotifierAndroidTest() {} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RunTest( 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<int(void)>& notifications_count_getter, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<ConnectionType(void)>& connection_type_getter) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, notifications_count_getter.Run()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_type_getter.Run()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Changing from online to offline should trigger a notification. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetOffline(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, notifications_count_getter.Run()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_type_getter.Run()); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No notification should be triggered when the offline state hasn't 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetOffline(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, notifications_count_getter.Run()); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_type_getter.Run()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Going from offline to online should trigger a notification. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetOnline(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, notifications_count_getter.Run()); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_type_getter.Run()); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetOnline() { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.SetOnline(); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that this is needed because ObserverListThreadSafe uses PostTask(). 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetOffline() { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.SetOffline(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See comment above. 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierDelegateAndroid delegate_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that NetworkChangeNotifierDelegateAndroid is initialized with the 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// actual connection type rather than a hardcoded one (e.g. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CONNECTION_UNKNOWN). Initializing the connection type to CONNECTION_UNKNOWN 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and relying on the first network change notification to set it correctly can 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// be problematic in case there is a long delay between the delegate's 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// construction and the notification. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(BaseNetworkChangeNotifierAndroidTest, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DelegateIsInitializedWithCurrentConnectionType) { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetOffline(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(NetworkChangeNotifier::CONNECTION_NONE, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.GetCurrentConnectionType()); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Instantiate another delegate to validate that it uses the actual 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // connection type at construction. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<NetworkChangeNotifierDelegateAndroid> other_delegate( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new NetworkChangeNotifierDelegateAndroid()); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(NetworkChangeNotifier::CONNECTION_NONE, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_delegate->GetCurrentConnectionType()); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Toggle the global connectivity state and instantiate another delegate 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // again. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetOnline(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.GetCurrentConnectionType()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_delegate.reset(new NetworkChangeNotifierDelegateAndroid()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NetworkChangeNotifier::CONNECTION_UNKNOWN, 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_delegate->GetCurrentConnectionType()); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkChangeNotifierDelegateAndroidTest 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public BaseNetworkChangeNotifierAndroidTest { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierDelegateAndroidTest() { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.AddObserver(&delegate_observer_); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.AddObserver(&other_delegate_observer_); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~NetworkChangeNotifierDelegateAndroidTest() { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.RemoveObserver(&delegate_observer_); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_.RemoveObserver(&other_delegate_observer_); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierDelegateAndroidObserver delegate_observer_; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierDelegateAndroidObserver other_delegate_observer_; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the NetworkChangeNotifierDelegateAndroid's observers are notified. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A testing-only observer is used here for testing. In production the 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// delegate's observers are instances of NetworkChangeNotifierAndroid. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkChangeNotifierDelegateAndroidTest, DelegateObserverNotified) { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test the logic with a single observer. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunTest( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &NetworkChangeNotifierDelegateAndroidObserver::notifications_count, 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(&delegate_observer_)), 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &NetworkChangeNotifierDelegateAndroid::GetCurrentConnectionType, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(&delegate_))); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that *all* the observers are notified. Both observers should have the 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // same state. 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(delegate_observer_.notifications_count(), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_delegate_observer_.notifications_count()); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetworkChangeNotifierAndroidTest 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public BaseNetworkChangeNotifierAndroidTest { 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierAndroidTest() : notifier_(&delegate_) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifier::AddConnectionTypeObserver( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &connection_type_observer_); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifier::AddConnectionTypeObserver( 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &other_connection_type_observer_); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierObserver connection_type_observer_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierObserver other_connection_type_observer_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifier::DisableForTest disable_for_test_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetworkChangeNotifierAndroid notifier_; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a NetworkChangeNotifierAndroid is observing a 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkChangeNotifierDelegateAndroid for network state changes, and the 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkChangeNotifierDelegateAndroid's connectivity state changes, the 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NetworkChangeNotifierAndroid should reflect that state. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkChangeNotifierAndroidTest, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationsSentToNetworkChangeNotifierAndroid) { 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunTest( 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &NetworkChangeNotifierObserver::notifications_count, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(&connection_type_observer_)), 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &NetworkChangeNotifierAndroid::GetCurrentConnectionType, 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(¬ifier_))); 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a NetworkChangeNotifierAndroid's connection state changes, it should 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// notify all of its observers. 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetworkChangeNotifierAndroidTest, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationsSentToClientsOfNetworkChangeNotifier) { 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunTest( 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &NetworkChangeNotifierObserver::notifications_count, 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(&connection_type_observer_)), 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&NetworkChangeNotifier::GetConnectionType)); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that *all* the observers are notified. 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(connection_type_observer_.notifications_count(), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_connection_type_observer_.notifications_count()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 217