12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/dial/dial_device_data.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/dial/dial_registry.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/api/dial/dial_service.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::Time; 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::TimeDelta; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::A; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::AtLeast; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::InSequence; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockDialObserver : public DialRegistry::Observer { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(OnDialDeviceEvent, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(const DialRegistry::DeviceList& devices)); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(OnDialError, void(DialRegistry::DialErrorCode type)); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockDialService : public DialService { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockDialService() {} 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD0(Discover, bool()); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(AddObserver, void(DialService::Observer*)); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(RemoveObserver, void(DialService::Observer*)); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(HasObserver, bool(DialService::Observer*)); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockDialRegistry : public DialRegistry { 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockDialRegistry(Observer *dial_api, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta& refresh_interval, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::TimeDelta& expiration, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const size_t max_devices) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : DialRegistry(dial_api, refresh_interval, expiration, max_devices) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_ = Time::Now(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockDialRegistry() { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't let the DialRegistry delete this. 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialService* tmp = dial_.release(); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tmp != NULL) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(&mock_service_, tmp); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the mock Dial service. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockDialService& mock_service() { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mock_service_; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set to mock out the current time. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time time_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual base::Time Now() const OVERRIDE { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return time_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual DialService* CreateDialService() OVERRIDE { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &mock_service_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ClearDialService() OVERRIDE { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Release the pointer but don't delete the object because the test owns it. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(&mock_service_, dial_.release()); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockDialService mock_service_; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DialRegistryTest : public testing::Test { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialRegistryTest() 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : first_device_("first", GURL("http://127.0.0.1/dd.xml"), Time::Now()), 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) second_device_("second", GURL("http://127.0.0.2/dd.xml"), Time::Now()), 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) third_device_("third", GURL("http://127.0.0.3/dd.xml"), Time::Now()) { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_.reset(new MockDialRegistry(&mock_observer_, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(1000), 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta::FromSeconds(10), 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10)); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list_with_first_device_.push_back(first_device_); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) list_with_second_device_.push_back(second_device_); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<MockDialRegistry> registry_; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockDialObserver mock_observer_; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DialDeviceData first_device_; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DialDeviceData second_device_; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DialDeviceData third_device_; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DialRegistry::DeviceList empty_list_; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialRegistry::DeviceList list_with_first_device_; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialRegistry::DeviceList list_with_second_device_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Must instantiate a MessageLoop for the thread, as the registry starts a 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // RepeatingTimer when there are listeners. 11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetListenerExpectations() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddObserver(A<DialService::Observer*>())) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveObserver(A<DialService::Observer*>())) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestAddRemoveListeners) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetListenerExpectations(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(registry_->repeating_timer_.IsRunning()); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(registry_->repeating_timer_.IsRunning()); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(registry_->repeating_timer_.IsRunning()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(registry_->repeating_timer_.IsRunning()); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(registry_->repeating_timer_.IsRunning()); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestNoDevicesDiscovered) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetListenerExpectations(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestDevicesDiscovered) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialRegistry::DeviceList expected_list2; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_list2.push_back(first_device_); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_list2.push_back(second_device_); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetListenerExpectations(); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(expected_list2)) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, first_device_); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->DoDiscovery(); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, second_device_); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestDeviceExpires) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetListenerExpectations(); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, first_device_); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->time_ = Time::Now() + TimeDelta::FromSeconds(30); 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->DoDiscovery(); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(DialRegistryTest, TestExpiredDeviceIsRediscovered) { 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<Time> discovery_times; 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) discovery_times.push_back(Time::Now()); 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) discovery_times.push_back(discovery_times[0] + TimeDelta::FromSeconds(30)); 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) discovery_times.push_back(discovery_times[1] + TimeDelta::FromSeconds(30)); 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DialDeviceData rediscovered_device("first", 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GURL("http://127.0.0.1/dd.xml"), 20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) discovery_times[2]); 21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SetListenerExpectations(); 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(mfoltz): Convert other tests to use InSequence to make expectations 21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // more obvious. 21590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InSequence s; 21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()); 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)); 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)); 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)); 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)); 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()); 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)); 22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)); 22890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->time_ = discovery_times[0]; 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnListenerAdded(); 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, first_device_); 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Will expire "first" device as it is not discovered this time. 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->time_ = discovery_times[1]; 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->DoDiscovery(); 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // "first" device is rediscovered 30 seconds later. We pass a device object 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // with a newer discovery time so it is not pruned immediately. 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->time_ = discovery_times[2]; 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->DoDiscovery(); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, rediscovered_device); 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) registry_->OnListenerRemoved(); 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestRemovingListenerDoesNotClearList) { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddObserver(A<DialService::Observer*>())) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveObserver(A<DialService::Observer*>())) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InSequence s; 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, first_device_); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestNetworkEventConnectionLost) { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetListenerExpectations(); 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InSequence s; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialError( 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialRegistry::DIAL_NETWORK_DISCONNECTED)).Times(1); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, first_device_); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_NONE); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DialRegistryTest, TestNetworkEventConnectionRestored) { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DialRegistry::DeviceList expected_list3; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_list3.push_back(second_device_); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_list3.push_back(third_device_); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A disconnection should shutdown the DialService, so we expect the observer 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to be added twice. 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddObserver(A<DialService::Observer*>())) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemoveObserver(A<DialService::Observer*>())) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(registry_->mock_service(), Discover()) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InSequence s; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_)) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_CALL(mock_observer_, 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch OnDialError(DialRegistry::DIAL_NETWORK_DISCONNECTED)) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_)) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(2); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_second_device_)) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(mock_observer_, OnDialDeviceEvent(expected_list3)) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerAdded(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, first_device_); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 346eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_NONE); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_WIFI); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, second_device_); 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryRequest(NULL); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDeviceDiscovered(NULL, third_device_); 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnDiscoveryFinished(NULL); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry_->OnListenerRemoved(); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 367