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