network_change_notifier_win_unittest.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
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) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // From NetworkChangeNotifier. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual NetworkChangeNotifier::ConnectionType 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCurrentConnectionType() 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) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailStartOnce) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartWatchingAndFail(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetryAndSucceed(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailStartTwice) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartWatchingAndFail(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetryAndFail(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetryAndSucceed(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinSignal) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartWatchingAndSucceed(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalAndSucceed(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailSignalOnce) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartWatchingAndSucceed(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalAndFail(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetryAndSucceed(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NetworkChangeNotifierWinTest, NetChangeWinFailSignalTwice) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartWatchingAndSucceed(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SignalAndFail(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetryAndFail(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RetryAndSucceed(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 261