Home | History | Annotate | Download | only in dial
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/compiler_specific.h"
      6 #include "base/message_loop/message_loop.h"
      7 #include "chrome/browser/extensions/api/dial/dial_device_data.h"
      8 #include "chrome/browser/extensions/api/dial/dial_registry.h"
      9 #include "chrome/browser/extensions/api/dial/dial_service.h"
     10 #include "chrome/test/base/testing_profile.h"
     11 #include "testing/gmock/include/gmock/gmock.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 #include "url/gurl.h"
     14 
     15 using base::Time;
     16 using base::TimeDelta;
     17 using ::testing::A;
     18 using ::testing::AtLeast;
     19 using ::testing::Return;
     20 using ::testing::InSequence;
     21 
     22 namespace extensions {
     23 
     24 class MockDialObserver : public DialRegistry::Observer {
     25  public:
     26   MOCK_METHOD1(OnDialDeviceEvent,
     27                void(const DialRegistry::DeviceList& devices));
     28   MOCK_METHOD1(OnDialError, void(DialRegistry::DialErrorCode type));
     29 };
     30 
     31 class MockDialService : public DialService {
     32  public:
     33   virtual ~MockDialService() {}
     34 
     35   MOCK_METHOD0(Discover, bool());
     36   MOCK_METHOD1(AddObserver, void(DialService::Observer*));
     37   MOCK_METHOD1(RemoveObserver, void(DialService::Observer*));
     38   MOCK_METHOD1(HasObserver, bool(DialService::Observer*));
     39 };
     40 
     41 class MockDialRegistry : public DialRegistry {
     42  public:
     43   MockDialRegistry(Observer *dial_api,
     44                    const base::TimeDelta& refresh_interval,
     45                    const base::TimeDelta& expiration,
     46                    const size_t max_devices)
     47       : DialRegistry(dial_api, refresh_interval, expiration, max_devices) {
     48     time_ = Time::Now();
     49   }
     50 
     51   virtual ~MockDialRegistry() {
     52     // Don't let the DialRegistry delete this.
     53     DialService* tmp = dial_.release();
     54     if (tmp != NULL)
     55       CHECK_EQ(&mock_service_, tmp);
     56   }
     57 
     58   // Returns the mock Dial service.
     59   MockDialService& mock_service() {
     60     return mock_service_;
     61   }
     62 
     63   // Set to mock out the current time.
     64   Time time_;
     65 
     66  protected:
     67   virtual base::Time Now() const OVERRIDE {
     68     return time_;
     69   }
     70 
     71   virtual DialService* CreateDialService() OVERRIDE {
     72     return &mock_service_;
     73   }
     74 
     75   virtual void ClearDialService() OVERRIDE {
     76     // Release the pointer but don't delete the object because the test owns it.
     77     CHECK_EQ(&mock_service_, dial_.release());
     78   }
     79 
     80  private:
     81   MockDialService mock_service_;
     82 };
     83 
     84 class DialRegistryTest : public testing::Test {
     85  public:
     86   DialRegistryTest()
     87       : first_device_("first", GURL("http://127.0.0.1/dd.xml"), Time::Now()),
     88         second_device_("second", GURL("http://127.0.0.2/dd.xml"), Time::Now()),
     89         third_device_("third", GURL("http://127.0.0.3/dd.xml"), Time::Now()) {
     90     registry_.reset(new MockDialRegistry(&mock_observer_,
     91                                          TimeDelta::FromSeconds(1000),
     92                                          TimeDelta::FromSeconds(10),
     93                                          10));
     94     list_with_first_device_.push_back(first_device_);
     95     list_with_second_device_.push_back(second_device_);
     96   }
     97 
     98  protected:
     99   scoped_ptr<MockDialRegistry> registry_;
    100   MockDialObserver mock_observer_;
    101   const DialDeviceData first_device_;
    102   const DialDeviceData second_device_;
    103   const DialDeviceData third_device_;
    104 
    105   const DialRegistry::DeviceList empty_list_;
    106   DialRegistry::DeviceList list_with_first_device_;
    107   DialRegistry::DeviceList list_with_second_device_;
    108 
    109   // Must instantiate a MessageLoop for the thread, as the registry starts a
    110   // RepeatingTimer when there are listeners.
    111   base::MessageLoop message_loop_;
    112 
    113   void SetListenerExpectations() {
    114     EXPECT_CALL(registry_->mock_service(),
    115                 AddObserver(A<DialService::Observer*>()))
    116       .Times(1);
    117     EXPECT_CALL(registry_->mock_service(),
    118                 RemoveObserver(A<DialService::Observer*>()))
    119       .Times(1);
    120   }
    121 };
    122 
    123 TEST_F(DialRegistryTest, TestAddRemoveListeners) {
    124   SetListenerExpectations();
    125   EXPECT_CALL(registry_->mock_service(), Discover())
    126     .Times(1);
    127 
    128   EXPECT_FALSE(registry_->repeating_timer_.IsRunning());
    129   registry_->OnListenerAdded();
    130   EXPECT_TRUE(registry_->repeating_timer_.IsRunning());
    131   registry_->OnListenerAdded();
    132   EXPECT_TRUE(registry_->repeating_timer_.IsRunning());
    133   registry_->OnListenerRemoved();
    134   EXPECT_TRUE(registry_->repeating_timer_.IsRunning());
    135   registry_->OnListenerRemoved();
    136   EXPECT_FALSE(registry_->repeating_timer_.IsRunning());
    137 }
    138 
    139 TEST_F(DialRegistryTest, TestNoDevicesDiscovered) {
    140   SetListenerExpectations();
    141   EXPECT_CALL(registry_->mock_service(), Discover())
    142     .Times(1);
    143   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    144       .Times(1);
    145 
    146   registry_->OnListenerAdded();
    147   registry_->OnDiscoveryRequest(NULL);
    148   registry_->OnDiscoveryFinished(NULL);
    149   registry_->OnListenerRemoved();
    150 };
    151 
    152 TEST_F(DialRegistryTest, TestDevicesDiscovered) {
    153   DialRegistry::DeviceList expected_list2;
    154   expected_list2.push_back(first_device_);
    155   expected_list2.push_back(second_device_);
    156 
    157   SetListenerExpectations();
    158   EXPECT_CALL(registry_->mock_service(), Discover())
    159       .Times(2);
    160   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    161       .Times(1);
    162   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_))
    163       .Times(2);
    164   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(expected_list2))
    165       .Times(1);
    166 
    167   registry_->OnListenerAdded();
    168   registry_->OnDiscoveryRequest(NULL);
    169   registry_->OnDeviceDiscovered(NULL, first_device_);
    170   registry_->OnDiscoveryFinished(NULL);
    171 
    172   registry_->DoDiscovery();
    173   registry_->OnDiscoveryRequest(NULL);
    174   registry_->OnDeviceDiscovered(NULL, second_device_);
    175   registry_->OnDiscoveryFinished(NULL);
    176   registry_->OnListenerRemoved();
    177 }
    178 
    179 TEST_F(DialRegistryTest, TestDeviceExpires) {
    180   SetListenerExpectations();
    181   EXPECT_CALL(registry_->mock_service(), Discover())
    182       .Times(2);
    183   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    184       .Times(2);
    185   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_))
    186       .Times(2);
    187 
    188   registry_->OnListenerAdded();
    189   registry_->OnDiscoveryRequest(NULL);
    190   registry_->OnDeviceDiscovered(NULL, first_device_);
    191   registry_->OnDiscoveryFinished(NULL);
    192 
    193   registry_->time_ = Time::Now() + TimeDelta::FromSeconds(30);
    194 
    195   registry_->DoDiscovery();
    196   registry_->OnDiscoveryRequest(NULL);
    197   registry_->OnDiscoveryFinished(NULL);
    198   registry_->OnListenerRemoved();
    199 }
    200 
    201 TEST_F(DialRegistryTest, TestExpiredDeviceIsRediscovered) {
    202   std::vector<Time> discovery_times;
    203   discovery_times.push_back(Time::Now());
    204   discovery_times.push_back(discovery_times[0] + TimeDelta::FromSeconds(30));
    205   discovery_times.push_back(discovery_times[1] + TimeDelta::FromSeconds(30));
    206 
    207   DialDeviceData rediscovered_device("first",
    208                                      GURL("http://127.0.0.1/dd.xml"),
    209                                      discovery_times[2]);
    210 
    211   SetListenerExpectations();
    212 
    213   // TODO(mfoltz): Convert other tests to use InSequence to make expectations
    214   // more obvious.
    215   InSequence s;
    216 
    217   EXPECT_CALL(registry_->mock_service(), Discover());
    218   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_));
    219   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_));
    220 
    221   EXPECT_CALL(registry_->mock_service(), Discover());
    222   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_));
    223   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_));
    224 
    225   EXPECT_CALL(registry_->mock_service(), Discover());
    226   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_));
    227   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_));
    228 
    229   registry_->time_ = discovery_times[0];
    230   registry_->OnListenerAdded();
    231   registry_->OnDiscoveryRequest(NULL);
    232   registry_->OnDeviceDiscovered(NULL, first_device_);
    233   registry_->OnDiscoveryFinished(NULL);
    234 
    235   // Will expire "first" device as it is not discovered this time.
    236   registry_->time_ = discovery_times[1];
    237   registry_->DoDiscovery();
    238   registry_->OnDiscoveryRequest(NULL);
    239   registry_->OnDiscoveryFinished(NULL);
    240 
    241   // "first" device is rediscovered 30 seconds later.  We pass a device object
    242   // with a newer discovery time so it is not pruned immediately.
    243   registry_->time_ = discovery_times[2];
    244   registry_->DoDiscovery();
    245   registry_->OnDiscoveryRequest(NULL);
    246   registry_->OnDeviceDiscovered(NULL, rediscovered_device);
    247   registry_->OnDiscoveryFinished(NULL);
    248 
    249   registry_->OnListenerRemoved();
    250 }
    251 
    252 TEST_F(DialRegistryTest, TestRemovingListenerDoesNotClearList) {
    253   EXPECT_CALL(registry_->mock_service(),
    254               AddObserver(A<DialService::Observer*>()))
    255       .Times(2);
    256   EXPECT_CALL(registry_->mock_service(),
    257               RemoveObserver(A<DialService::Observer*>()))
    258       .Times(2);
    259 
    260   EXPECT_CALL(registry_->mock_service(), Discover())
    261       .Times(2);
    262 
    263   InSequence s;
    264   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    265       .Times(1);
    266   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_))
    267       .Times(2);
    268 
    269   registry_->OnListenerAdded();
    270   registry_->OnDiscoveryRequest(NULL);
    271   registry_->OnDeviceDiscovered(NULL, first_device_);
    272   registry_->OnDiscoveryFinished(NULL);
    273   registry_->OnListenerRemoved();
    274 
    275   registry_->OnListenerAdded();
    276   registry_->OnDiscoveryRequest(NULL);
    277   registry_->OnDiscoveryFinished(NULL);
    278   registry_->OnListenerRemoved();
    279 }
    280 
    281 TEST_F(DialRegistryTest, TestNetworkEventConnectionLost) {
    282   SetListenerExpectations();
    283 
    284   EXPECT_CALL(registry_->mock_service(), Discover())
    285       .Times(1);
    286 
    287   InSequence s;
    288   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    289       .Times(1);
    290   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_))
    291       .Times(1);
    292   EXPECT_CALL(mock_observer_, OnDialError(
    293       DialRegistry::DIAL_NETWORK_DISCONNECTED)).Times(1);
    294   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    295       .Times(1);
    296 
    297   registry_->OnListenerAdded();
    298   registry_->OnDiscoveryRequest(NULL);
    299   registry_->OnDeviceDiscovered(NULL, first_device_);
    300   registry_->OnDiscoveryFinished(NULL);
    301 
    302   registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_NONE);
    303 
    304   registry_->OnDiscoveryRequest(NULL);
    305   registry_->OnDiscoveryFinished(NULL);
    306   registry_->OnListenerRemoved();
    307 }
    308 
    309 TEST_F(DialRegistryTest, TestNetworkEventConnectionRestored) {
    310   DialRegistry::DeviceList expected_list3;
    311   expected_list3.push_back(second_device_);
    312   expected_list3.push_back(third_device_);
    313 
    314   // A disconnection should shutdown the DialService, so we expect the observer
    315   // to be added twice.
    316   EXPECT_CALL(registry_->mock_service(),
    317               AddObserver(A<DialService::Observer*>()))
    318     .Times(2);
    319   EXPECT_CALL(registry_->mock_service(),
    320               RemoveObserver(A<DialService::Observer*>()))
    321     .Times(2);
    322 
    323   EXPECT_CALL(registry_->mock_service(), Discover())
    324     .Times(2);
    325 
    326   InSequence s;
    327   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    328       .Times(1);
    329   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_first_device_))
    330       .Times(1);
    331   EXPECT_CALL(mock_observer_,
    332               OnDialError(DialRegistry::DIAL_NETWORK_DISCONNECTED))
    333       .Times(1);
    334   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(empty_list_))
    335       .Times(2);
    336   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(list_with_second_device_))
    337       .Times(1);
    338   EXPECT_CALL(mock_observer_, OnDialDeviceEvent(expected_list3))
    339       .Times(1);
    340 
    341   registry_->OnListenerAdded();
    342   registry_->OnDiscoveryRequest(NULL);
    343   registry_->OnDeviceDiscovered(NULL, first_device_);
    344   registry_->OnDiscoveryFinished(NULL);
    345 
    346   registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_NONE);
    347 
    348   registry_->OnDiscoveryRequest(NULL);
    349   registry_->OnDiscoveryFinished(NULL);
    350 
    351   registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_WIFI);
    352 
    353   registry_->OnDiscoveryRequest(NULL);
    354   registry_->OnDeviceDiscovered(NULL, second_device_);
    355   registry_->OnDiscoveryFinished(NULL);
    356 
    357   registry_->OnNetworkChanged(net::NetworkChangeNotifier::CONNECTION_ETHERNET);
    358 
    359   registry_->OnDiscoveryRequest(NULL);
    360   registry_->OnDeviceDiscovered(NULL, third_device_);
    361   registry_->OnDiscoveryFinished(NULL);
    362 
    363   registry_->OnListenerRemoved();
    364 }
    365 
    366 }  // namespace extensions
    367