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(&notifier_)));
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