network_change_notifier_win_unittest.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier_factory.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/network_change_notifier_win.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::AtLeast;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass of NetworkChangeNotifierWin that overrides functions so that no
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Windows API networking functions are ever called.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNetworkChangeNotifierWin : public NetworkChangeNotifierWin {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestNetworkChangeNotifierWin() {}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestNetworkChangeNotifierWin() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is needed so we don't try to stop watching for IP address changes,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // as we never actually started.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_is_watching(false);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // From NetworkChangeNotifierWin.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual NetworkChangeNotifier::ConnectionType
35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      RecomputeCurrentConnectionType() const OVERRIDE {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NetworkChangeNotifier::CONNECTION_UNKNOWN;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // From NetworkChangeNotifierWin.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(WatchForAddressChangeInternal, bool());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestNetworkChangeNotifierWin);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestIPAddressObserver
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public net::NetworkChangeNotifier::IPAddressObserver {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestIPAddressObserver() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkChangeNotifier::AddIPAddressObserver(this);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~TestIPAddressObserver() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NetworkChangeNotifier::RemoveIPAddressObserver(this);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD0(OnIPAddressChanged, void());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestIPAddressObserver);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExitMessageLoopAndReturnFalse() {
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->Quit();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NetworkChangeNotifierWinTest : public testing::Test {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls WatchForAddressChange, and simulates a WatchForAddressChangeInternal
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success.  Expects that |network_change_notifier_| has just been created, so
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it's not watching anything yet, and there have been no previous
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WatchForAddressChangeInternal failures.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartWatchingAndSucceed() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(test_ip_address_observer_, OnIPAddressChanged()).Times(0);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(network_change_notifier_, WatchForAddressChangeInternal())
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(true));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_change_notifier_.WatchForAddressChange();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_change_notifier_.is_watching());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If a task to notify observers of the IP address change event was
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // incorrectly posted, make sure it gets run to trigger a failure.
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calls WatchForAddressChange, and simulates a WatchForAddressChangeInternal
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // failure.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartWatchingAndFail() {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(test_ip_address_observer_, OnIPAddressChanged()).Times(0);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(network_change_notifier_, WatchForAddressChangeInternal())
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Due to an expected race, it's theoretically possible for more than
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // one call to occur, though unlikely.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(AtLeast(1))
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_change_notifier_.WatchForAddressChange();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(0, network_change_notifier_.sequential_failures());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If a task to notify observers of the IP address change event was
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // incorrectly posted, make sure it gets run.
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a network change event, resulting in a call to OnObjectSignaled.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The resulting call to WatchForAddressChangeInternal then succeeds.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SignalAndSucceed() {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_change_notifier_.is_watching());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(test_ip_address_observer_, OnIPAddressChanged()).Times(1);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(network_change_notifier_, WatchForAddressChangeInternal())
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(1)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillOnce(Return(true));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_change_notifier_.OnObjectSignaled(INVALID_HANDLE_VALUE);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_change_notifier_.is_watching());
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the task to notify observers of the IP address change event.
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a network change event, resulting in a call to OnObjectSignaled.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The resulting call to WatchForAddressChangeInternal then fails.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SignalAndFail() {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_change_notifier_.is_watching());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(test_ip_address_observer_, OnIPAddressChanged()).Times(1);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(network_change_notifier_, WatchForAddressChangeInternal())
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Due to an expected race, it's theoretically possible for more than
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // one call to occur, though unlikely.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(AtLeast(1))
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(false));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    network_change_notifier_.OnObjectSignaled(INVALID_HANDLE_VALUE);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(0, network_change_notifier_.sequential_failures());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the task to notify observers of the IP address change event.
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the message loop until WatchForAddressChange is called again, as a
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result of the already posted task after a WatchForAddressChangeInternal
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // failure.  Simulates a success on the resulting call to
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WatchForAddressChangeInternal.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RetryAndSucceed() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(0, network_change_notifier_.sequential_failures());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_CALL(test_ip_address_observer_, OnIPAddressChanged()).Times(1)
16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        .WillOnce(
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            Invoke(base::MessageLoop::current(), &base::MessageLoop::Quit));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(network_change_notifier_, WatchForAddressChangeInternal())
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        .Times(1).WillOnce(Return(true));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(network_change_notifier_.is_watching());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, network_change_notifier_.sequential_failures());
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the message loop until WatchForAddressChange is called again, as a
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // result of the already posted task after a WatchForAddressChangeInternal
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // failure.  Simulates a failure on the resulting call to
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WatchForAddressChangeInternal.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RetryAndFail() {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(0, network_change_notifier_.sequential_failures());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int initial_sequential_failures =
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        network_change_notifier_.sequential_failures();
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(test_ip_address_observer_, OnIPAddressChanged()).Times(0);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(network_change_notifier_, WatchForAddressChangeInternal())
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Due to an expected race, it's theoretically possible for more than
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // one call to occur, though unlikely.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .Times(AtLeast(1))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Invoke(ExitMessageLoopAndReturnFalse));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->Run();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(network_change_notifier_.is_watching());
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(initial_sequential_failures,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              network_change_notifier_.sequential_failures());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If a task to notify observers of the IP address change event was
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // incorrectly posted, make sure it gets run.
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note that the order of declaration here is important.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allows creating a new NetworkChangeNotifier.  Must be created before
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |network_change_notifier_| and destroyed after it to avoid DCHECK failures.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkChangeNotifier::DisableForTest disable_for_test_;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<TestNetworkChangeNotifierWin> network_change_notifier_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be created after |network_change_notifier_|, so it can add itself as
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an IPAddressObserver.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<TestIPAddressObserver> test_ip_address_observer_;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinBasic) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndSucceed();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailStart) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndFail();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// https://code.google.com/p/chromium/issues/detail?id=356401
232effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailStartOnce) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndFail();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryAndSucceed();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// https://code.google.com/p/chromium/issues/detail?id=356401
238effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailStartTwice) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndFail();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryAndFail();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryAndSucceed();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinSignal) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndSucceed();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalAndSucceed();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// https://code.google.com/p/chromium/issues/detail?id=356401
250effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailSignalOnce) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndSucceed();
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalAndFail();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryAndSucceed();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// https://code.google.com/p/chromium/issues/detail?id=356401
257effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(NetworkChangeNotifierWinTest, FLAKY_NetChangeWinFailSignalTwice) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StartWatchingAndSucceed();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SignalAndFail();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryAndFail();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RetryAndSucceed();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
265