Home | History | Annotate | Download | only in network
      1 // Copyright 2013 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/bind.h"
      6 #include "base/memory/scoped_ptr.h"
      7 #include "base/message_loop/message_loop.h"
      8 #include "base/values.h"
      9 #include "chromeos/dbus/dbus_thread_manager.h"
     10 #include "chromeos/dbus/fake_shill_device_client.h"
     11 #include "chromeos/dbus/fake_shill_manager_client.h"
     12 #include "chromeos/network/network_device_handler_impl.h"
     13 #include "chromeos/network/network_state_handler.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 #include "third_party/cros_system_api/dbus/service_constants.h"
     16 
     17 namespace chromeos {
     18 
     19 namespace {
     20 
     21 const char kDefaultCellularDevicePath[] = "stub_cellular_device";
     22 const char kUnknownCellularDevicePath[] = "unknown_cellular_device";
     23 const char kDefaultWifiDevicePath[] = "stub_wifi_device";
     24 const char kResultSuccess[] = "success";
     25 const char kDefaultPin[] = "1111";
     26 
     27 }  // namespace
     28 
     29 class NetworkDeviceHandlerTest : public testing::Test {
     30  public:
     31   NetworkDeviceHandlerTest() : fake_device_client_(NULL) {}
     32   virtual ~NetworkDeviceHandlerTest() {}
     33 
     34   virtual void SetUp() OVERRIDE {
     35     fake_device_client_ = new FakeShillDeviceClient;
     36     DBusThreadManager::GetSetterForTesting()->SetShillDeviceClient(
     37         scoped_ptr<ShillDeviceClient>(fake_device_client_));
     38 
     39     success_callback_ = base::Bind(&NetworkDeviceHandlerTest::SuccessCallback,
     40                                    base::Unretained(this));
     41     properties_success_callback_ =
     42         base::Bind(&NetworkDeviceHandlerTest::PropertiesSuccessCallback,
     43                    base::Unretained(this));
     44     string_success_callback_ =
     45         base::Bind(&NetworkDeviceHandlerTest::StringSuccessCallback,
     46                    base::Unretained(this));
     47     error_callback_ = base::Bind(&NetworkDeviceHandlerTest::ErrorCallback,
     48                                  base::Unretained(this));
     49 
     50     network_state_handler_.reset(NetworkStateHandler::InitializeForTest());
     51     NetworkDeviceHandlerImpl* device_handler = new NetworkDeviceHandlerImpl;
     52     device_handler->Init(network_state_handler_.get());
     53     network_device_handler_.reset(device_handler);
     54 
     55     // Add devices after handlers have been initialized.
     56     ShillDeviceClient::TestInterface* device_test =
     57         fake_device_client_->GetTestInterface();
     58     device_test->AddDevice(
     59         kDefaultCellularDevicePath, shill::kTypeCellular, "cellular1");
     60     device_test->AddDevice(kDefaultWifiDevicePath, shill::kTypeWifi, "wifi1");
     61 
     62     base::ListValue test_ip_configs;
     63     test_ip_configs.AppendString("ip_config1");
     64     device_test->SetDeviceProperty(
     65         kDefaultWifiDevicePath, shill::kIPConfigsProperty, test_ip_configs);
     66 
     67     message_loop_.RunUntilIdle();
     68   }
     69 
     70   virtual void TearDown() OVERRIDE {
     71     network_device_handler_.reset();
     72     network_state_handler_.reset();
     73     DBusThreadManager::Shutdown();
     74   }
     75 
     76   void ErrorCallback(const std::string& error_name,
     77                      scoped_ptr<base::DictionaryValue> error_data) {
     78     LOG(ERROR) << "ErrorCallback: " << error_name;
     79     result_ = error_name;
     80   }
     81 
     82   void SuccessCallback() {
     83     result_ = kResultSuccess;
     84   }
     85 
     86   void PropertiesSuccessCallback(const std::string& device_path,
     87                                  const base::DictionaryValue& properties) {
     88     result_ = kResultSuccess;
     89     properties_.reset(properties.DeepCopy());
     90   }
     91 
     92   void StringSuccessCallback(const std::string& result) {
     93     LOG(ERROR) << "StringSuccessCallback: " << result;
     94     result_ = kResultSuccess;
     95   }
     96 
     97  protected:
     98   std::string result_;
     99 
    100   FakeShillDeviceClient* fake_device_client_;
    101   scoped_ptr<NetworkDeviceHandler> network_device_handler_;
    102   scoped_ptr<NetworkStateHandler> network_state_handler_;
    103   base::MessageLoopForUI message_loop_;
    104   base::Closure success_callback_;
    105   network_handler::DictionaryResultCallback properties_success_callback_;
    106   network_handler::StringResultCallback string_success_callback_;
    107   network_handler::ErrorCallback error_callback_;
    108   scoped_ptr<base::DictionaryValue> properties_;
    109 
    110  private:
    111   DISALLOW_COPY_AND_ASSIGN(NetworkDeviceHandlerTest);
    112 };
    113 
    114 TEST_F(NetworkDeviceHandlerTest, GetDeviceProperties) {
    115   network_device_handler_->GetDeviceProperties(
    116       kDefaultWifiDevicePath, properties_success_callback_, error_callback_);
    117   message_loop_.RunUntilIdle();
    118   EXPECT_EQ(kResultSuccess, result_);
    119   std::string type;
    120   properties_->GetString(shill::kTypeProperty, &type);
    121   EXPECT_EQ(shill::kTypeWifi, type);
    122 }
    123 
    124 TEST_F(NetworkDeviceHandlerTest, SetDeviceProperty) {
    125   // Set the shill::kScanIntervalProperty to true. The call
    126   // should succeed and the value should be set.
    127   network_device_handler_->SetDeviceProperty(kDefaultCellularDevicePath,
    128                                              shill::kScanIntervalProperty,
    129                                              base::FundamentalValue(1),
    130                                              success_callback_,
    131                                              error_callback_);
    132   message_loop_.RunUntilIdle();
    133   EXPECT_EQ(kResultSuccess, result_);
    134 
    135   // GetDeviceProperties should return the value set by SetDeviceProperty.
    136   network_device_handler_->GetDeviceProperties(kDefaultCellularDevicePath,
    137                                                properties_success_callback_,
    138                                                error_callback_);
    139   message_loop_.RunUntilIdle();
    140   EXPECT_EQ(kResultSuccess, result_);
    141   int interval = 0;
    142   EXPECT_TRUE(properties_->GetIntegerWithoutPathExpansion(
    143       shill::kScanIntervalProperty, &interval));
    144   EXPECT_EQ(1, interval);
    145 
    146   // Repeat the same with value false.
    147   network_device_handler_->SetDeviceProperty(kDefaultCellularDevicePath,
    148                                              shill::kScanIntervalProperty,
    149                                              base::FundamentalValue(2),
    150                                              success_callback_,
    151                                              error_callback_);
    152   message_loop_.RunUntilIdle();
    153   EXPECT_EQ(kResultSuccess, result_);
    154 
    155   network_device_handler_->GetDeviceProperties(kDefaultCellularDevicePath,
    156                                                properties_success_callback_,
    157                                                error_callback_);
    158   message_loop_.RunUntilIdle();
    159   EXPECT_EQ(kResultSuccess, result_);
    160   EXPECT_TRUE(properties_->GetIntegerWithoutPathExpansion(
    161       shill::kScanIntervalProperty, &interval));
    162   EXPECT_EQ(2, interval);
    163 
    164   // Set property on an invalid path.
    165   network_device_handler_->SetDeviceProperty(kUnknownCellularDevicePath,
    166                                              shill::kScanIntervalProperty,
    167                                              base::FundamentalValue(1),
    168                                              success_callback_,
    169                                              error_callback_);
    170   message_loop_.RunUntilIdle();
    171   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    172 
    173   // Setting a owner-protected device property through SetDeviceProperty must
    174   // fail.
    175   network_device_handler_->SetDeviceProperty(
    176       kDefaultCellularDevicePath,
    177       shill::kCellularAllowRoamingProperty,
    178       base::FundamentalValue(true),
    179       success_callback_,
    180       error_callback_);
    181   message_loop_.RunUntilIdle();
    182   EXPECT_NE(kResultSuccess, result_);
    183 
    184 }
    185 
    186 TEST_F(NetworkDeviceHandlerTest, CellularAllowRoaming) {
    187   // Start with disabled data roaming.
    188   ShillDeviceClient::TestInterface* device_test =
    189       fake_device_client_->GetTestInterface();
    190   device_test->SetDeviceProperty(kDefaultCellularDevicePath,
    191                                  shill::kCellularAllowRoamingProperty,
    192                                  base::FundamentalValue(false));
    193 
    194   network_device_handler_->SetCellularAllowRoaming(true);
    195   message_loop_.RunUntilIdle();
    196 
    197   // Roaming should be enabled now.
    198   network_device_handler_->GetDeviceProperties(kDefaultCellularDevicePath,
    199                                                properties_success_callback_,
    200                                                error_callback_);
    201   message_loop_.RunUntilIdle();
    202   EXPECT_EQ(kResultSuccess, result_);
    203   bool allow_roaming;
    204   EXPECT_TRUE(properties_->GetBooleanWithoutPathExpansion(
    205       shill::kCellularAllowRoamingProperty, &allow_roaming));
    206   EXPECT_TRUE(allow_roaming);
    207 
    208   network_device_handler_->SetCellularAllowRoaming(false);
    209   message_loop_.RunUntilIdle();
    210 
    211   // Roaming should be disable again.
    212   network_device_handler_->GetDeviceProperties(kDefaultCellularDevicePath,
    213                                                properties_success_callback_,
    214                                                error_callback_);
    215   message_loop_.RunUntilIdle();
    216   EXPECT_EQ(kResultSuccess, result_);
    217   EXPECT_TRUE(properties_->GetBooleanWithoutPathExpansion(
    218       shill::kCellularAllowRoamingProperty, &allow_roaming));
    219   EXPECT_FALSE(allow_roaming);
    220 }
    221 
    222 TEST_F(NetworkDeviceHandlerTest, SetWifiTDLSEnabled) {
    223   // We add a wifi device by default, initial call should succeed.
    224   network_device_handler_->SetWifiTDLSEnabled(
    225       "fake_ip_address", true, string_success_callback_, error_callback_);
    226   message_loop_.RunUntilIdle();
    227   EXPECT_EQ(kResultSuccess, result_);
    228 }
    229 
    230 TEST_F(NetworkDeviceHandlerTest, SetWifiTDLSEnabledMissing) {
    231   // Remove the wifi device. Call should fail with "device missing" error.
    232   fake_device_client_->GetTestInterface()->RemoveDevice(kDefaultWifiDevicePath);
    233   message_loop_.RunUntilIdle();
    234   network_device_handler_->SetWifiTDLSEnabled(
    235       "fake_ip_address", true, string_success_callback_, error_callback_);
    236   message_loop_.RunUntilIdle();
    237   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    238 }
    239 
    240 TEST_F(NetworkDeviceHandlerTest, SetWifiTDLSEnabledBusy) {
    241   // Set the busy count, call should succeed after repeat attempt.
    242   fake_device_client_->set_tdls_busy_count(1);
    243   network_device_handler_->SetWifiTDLSEnabled(
    244       "fake_ip_address", true, string_success_callback_, error_callback_);
    245   message_loop_.RunUntilIdle();
    246   EXPECT_EQ(kResultSuccess, result_);
    247 
    248   // Set the busy count to a large number, call should fail after max number
    249   // of repeat attempt.
    250   fake_device_client_->set_tdls_busy_count(100000);
    251   network_device_handler_->SetWifiTDLSEnabled(
    252       "fake_ip_address", true, string_success_callback_, error_callback_);
    253   message_loop_.RunUntilIdle();
    254   EXPECT_EQ(NetworkDeviceHandler::kErrorTimeout, result_);
    255 }
    256 
    257 TEST_F(NetworkDeviceHandlerTest, GetWifiTDLSStatus) {
    258   // We add a wifi device by default, initial call should succeed.
    259   network_device_handler_->GetWifiTDLSStatus(
    260       "fake_ip_address", string_success_callback_, error_callback_);
    261   message_loop_.RunUntilIdle();
    262   EXPECT_EQ(kResultSuccess, result_);
    263 
    264   // Remove the wifi device. Call should fail with "device missing" error.
    265   fake_device_client_->GetTestInterface()->RemoveDevice(kDefaultWifiDevicePath);
    266   message_loop_.RunUntilIdle();
    267   network_device_handler_->GetWifiTDLSStatus(
    268       "fake_ip_address", string_success_callback_, error_callback_);
    269   message_loop_.RunUntilIdle();
    270   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    271 }
    272 
    273 TEST_F(NetworkDeviceHandlerTest, RequestRefreshIPConfigs) {
    274   network_device_handler_->RequestRefreshIPConfigs(
    275       kDefaultWifiDevicePath, success_callback_, error_callback_);
    276   message_loop_.RunUntilIdle();
    277   EXPECT_EQ(kResultSuccess, result_);
    278   // TODO(stevenjb): Add test interface to ShillIPConfigClient and test
    279   // refresh calls.
    280 }
    281 
    282 TEST_F(NetworkDeviceHandlerTest, SetCarrier) {
    283   const char kCarrier[] = "carrier";
    284 
    285   // Test that the success callback gets called.
    286   network_device_handler_->SetCarrier(
    287       kDefaultCellularDevicePath, kCarrier, success_callback_, error_callback_);
    288   message_loop_.RunUntilIdle();
    289   EXPECT_EQ(kResultSuccess, result_);
    290 
    291   // Test that the shill error propagates to the error callback.
    292   network_device_handler_->SetCarrier(
    293       kUnknownCellularDevicePath, kCarrier, success_callback_, error_callback_);
    294   message_loop_.RunUntilIdle();
    295   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    296 }
    297 
    298 TEST_F(NetworkDeviceHandlerTest, RequirePin) {
    299   // Test that the success callback gets called.
    300   network_device_handler_->RequirePin(kDefaultCellularDevicePath,
    301                                       true,
    302                                       kDefaultPin,
    303                                       success_callback_,
    304                                       error_callback_);
    305   message_loop_.RunUntilIdle();
    306   EXPECT_EQ(kResultSuccess, result_);
    307 
    308   // Test that the shill error propagates to the error callback.
    309   network_device_handler_->RequirePin(kUnknownCellularDevicePath,
    310                                       true,
    311                                       kDefaultPin,
    312                                       success_callback_,
    313                                       error_callback_);
    314   message_loop_.RunUntilIdle();
    315   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    316 }
    317 
    318 TEST_F(NetworkDeviceHandlerTest, EnterPin) {
    319   // Test that the success callback gets called.
    320   network_device_handler_->EnterPin(kDefaultCellularDevicePath,
    321                                     kDefaultPin,
    322                                     success_callback_,
    323                                     error_callback_);
    324   message_loop_.RunUntilIdle();
    325   EXPECT_EQ(kResultSuccess, result_);
    326 
    327   // Test that the shill error propagates to the error callback.
    328   network_device_handler_->EnterPin(kUnknownCellularDevicePath,
    329                                     kDefaultPin,
    330                                     success_callback_,
    331                                     error_callback_);
    332   message_loop_.RunUntilIdle();
    333   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    334 }
    335 
    336 TEST_F(NetworkDeviceHandlerTest, UnblockPin) {
    337   const char kPuk[] = "12345678";
    338   const char kPin[] = "1234";
    339 
    340   // Test that the success callback gets called.
    341   network_device_handler_->UnblockPin(kDefaultCellularDevicePath,
    342                                       kPin,
    343                                       kPuk,
    344                                       success_callback_,
    345                                       error_callback_);
    346   message_loop_.RunUntilIdle();
    347   EXPECT_EQ(kResultSuccess, result_);
    348 
    349   // Test that the shill error propagates to the error callback.
    350   network_device_handler_->UnblockPin(kUnknownCellularDevicePath,
    351                                       kPin,
    352                                       kPuk,
    353                                       success_callback_,
    354                                       error_callback_);
    355   message_loop_.RunUntilIdle();
    356   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    357 }
    358 
    359 TEST_F(NetworkDeviceHandlerTest, ChangePin) {
    360   const char kOldPin[] = "4321";
    361   const char kNewPin[] = "1234";
    362 
    363   // Test that the success callback gets called.
    364   network_device_handler_->ChangePin(kDefaultCellularDevicePath,
    365                                      kOldPin,
    366                                      kNewPin,
    367                                      success_callback_,
    368                                      error_callback_);
    369   message_loop_.RunUntilIdle();
    370   EXPECT_EQ(kResultSuccess, result_);
    371 
    372   // Test that the shill error propagates to the error callback.
    373   network_device_handler_->ChangePin(kUnknownCellularDevicePath,
    374                                      kOldPin,
    375                                      kNewPin,
    376                                      success_callback_,
    377                                      error_callback_);
    378   message_loop_.RunUntilIdle();
    379   EXPECT_EQ(NetworkDeviceHandler::kErrorDeviceMissing, result_);
    380 }
    381 
    382 }  // namespace chromeos
    383