Home | History | Annotate | Download | only in dbus
      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/bind.h"
      6 #include "base/values.h"
      7 #include "chromeos/dbus/shill_client_unittest_base.h"
      8 #include "chromeos/dbus/shill_service_client.h"
      9 #include "dbus/message.h"
     10 #include "dbus/object_path.h"
     11 #include "dbus/values_util.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 #include "third_party/cros_system_api/dbus/service_constants.h"
     14 
     15 using testing::_;
     16 using testing::ByRef;
     17 
     18 namespace chromeos {
     19 
     20 namespace {
     21 
     22 const char kExampleServicePath[] = "/foo/bar";
     23 
     24 }  // namespace
     25 
     26 class ShillServiceClientTest : public ShillClientUnittestBase {
     27  public:
     28   ShillServiceClientTest()
     29       : ShillClientUnittestBase(shill::kFlimflamServiceInterface,
     30                                    dbus::ObjectPath(kExampleServicePath)) {
     31   }
     32 
     33   virtual void SetUp() {
     34     ShillClientUnittestBase::SetUp();
     35     // Create a client with the mock bus.
     36     client_.reset(ShillServiceClient::Create());
     37     client_->Init(mock_bus_.get());
     38     // Run the message loop to run the signal connection result callback.
     39     message_loop_.RunUntilIdle();
     40   }
     41 
     42   virtual void TearDown() {
     43     ShillClientUnittestBase::TearDown();
     44   }
     45 
     46  protected:
     47   scoped_ptr<ShillServiceClient> client_;
     48 };
     49 
     50 TEST_F(ShillServiceClientTest, PropertyChanged) {
     51   const int kValue = 42;
     52   // Create a signal.
     53   dbus::Signal signal(shill::kFlimflamServiceInterface,
     54                       shill::kMonitorPropertyChanged);
     55   dbus::MessageWriter writer(&signal);
     56   writer.AppendString(shill::kSignalStrengthProperty);
     57   writer.AppendVariantOfByte(kValue);
     58 
     59   // Set expectations.
     60   const base::FundamentalValue value(kValue);
     61   MockPropertyChangeObserver observer;
     62   EXPECT_CALL(observer,
     63               OnPropertyChanged(
     64                   shill::kSignalStrengthProperty,
     65                   ValueEq(ByRef(value)))).Times(1);
     66 
     67   // Add the observer
     68   client_->AddPropertyChangedObserver(
     69       dbus::ObjectPath(kExampleServicePath),
     70       &observer);
     71 
     72   // Run the signal callback.
     73   SendPropertyChangedSignal(&signal);
     74 
     75   // Remove the observer.
     76   client_->RemovePropertyChangedObserver(
     77       dbus::ObjectPath(kExampleServicePath),
     78       &observer);
     79 
     80   EXPECT_CALL(observer, OnPropertyChanged(_, _)).Times(0);
     81 
     82   // Run the signal callback again and make sure the observer isn't called.
     83   SendPropertyChangedSignal(&signal);
     84 }
     85 
     86 TEST_F(ShillServiceClientTest, GetProperties) {
     87   const int kValue = 42;
     88   // Create response.
     89   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
     90   dbus::MessageWriter writer(response.get());
     91   dbus::MessageWriter array_writer(NULL);
     92   writer.OpenArray("{sv}", &array_writer);
     93   dbus::MessageWriter entry_writer(NULL);
     94   array_writer.OpenDictEntry(&entry_writer);
     95   entry_writer.AppendString(shill::kSignalStrengthProperty);
     96   entry_writer.AppendVariantOfByte(kValue);
     97   array_writer.CloseContainer(&entry_writer);
     98   writer.CloseContainer(&array_writer);
     99 
    100   // Set expectations.
    101   base::DictionaryValue value;
    102   value.SetWithoutPathExpansion(shill::kSignalStrengthProperty,
    103                                 base::Value::CreateIntegerValue(kValue));
    104   PrepareForMethodCall(shill::kGetPropertiesFunction,
    105                        base::Bind(&ExpectNoArgument),
    106                        response.get());
    107   // Call method.
    108   client_->GetProperties(dbus::ObjectPath(kExampleServicePath),
    109                          base::Bind(&ExpectDictionaryValueResult, &value));
    110   // Run the message loop.
    111   message_loop_.RunUntilIdle();
    112 }
    113 
    114 TEST_F(ShillServiceClientTest, SetProperty) {
    115   const char kValue[] = "passphrase";
    116   // Create response.
    117   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    118 
    119   // Set expectations.
    120   const base::StringValue value(kValue);
    121   PrepareForMethodCall(shill::kSetPropertyFunction,
    122                        base::Bind(&ExpectStringAndValueArguments,
    123                                   shill::kPassphraseProperty,
    124                                   &value),
    125                        response.get());
    126   // Call method.
    127   MockClosure mock_closure;
    128   MockErrorCallback mock_error_callback;
    129   client_->SetProperty(dbus::ObjectPath(kExampleServicePath),
    130                        shill::kPassphraseProperty,
    131                        value,
    132                        mock_closure.GetCallback(),
    133                        mock_error_callback.GetCallback());
    134   EXPECT_CALL(mock_closure, Run()).Times(1);
    135   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    136 
    137   // Run the message loop.
    138   message_loop_.RunUntilIdle();
    139 }
    140 
    141 TEST_F(ShillServiceClientTest, SetProperties) {
    142   // Create response.
    143   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    144 
    145   // Set expectations.
    146   scoped_ptr<base::DictionaryValue> arg(CreateExampleServiceProperties());
    147   PrepareForMethodCall(shill::kSetPropertiesFunction,
    148                        base::Bind(&ExpectDictionaryValueArgument, arg.get()),
    149                        response.get());
    150 
    151   // Call method.
    152   MockClosure mock_closure;
    153   MockErrorCallback mock_error_callback;
    154   client_->SetProperties(dbus::ObjectPath(kExampleServicePath),
    155                          *arg,
    156                          mock_closure.GetCallback(),
    157                          mock_error_callback.GetCallback());
    158   EXPECT_CALL(mock_closure, Run()).Times(1);
    159   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    160 
    161   // Run the message loop.
    162   message_loop_.RunUntilIdle();
    163 }
    164 
    165 TEST_F(ShillServiceClientTest, ClearProperty) {
    166   // Create response.
    167   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    168 
    169   // Set expectations.
    170   PrepareForMethodCall(shill::kClearPropertyFunction,
    171                        base::Bind(&ExpectStringArgument,
    172                                   shill::kPassphraseProperty),
    173                        response.get());
    174   // Call method.
    175   MockClosure mock_closure;
    176   MockErrorCallback mock_error_callback;
    177   client_->ClearProperty(dbus::ObjectPath(kExampleServicePath),
    178                          shill::kPassphraseProperty,
    179                          mock_closure.GetCallback(),
    180                          mock_error_callback.GetCallback());
    181   EXPECT_CALL(mock_closure, Run()).Times(1);
    182   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    183 
    184   // Run the message loop.
    185   message_loop_.RunUntilIdle();
    186 }
    187 
    188 TEST_F(ShillServiceClientTest, ClearProperties) {
    189   // Create response.
    190   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    191   dbus::MessageWriter writer(response.get());
    192   dbus::MessageWriter array_writer(NULL);
    193   writer.OpenArray("b", &array_writer);
    194   array_writer.AppendBool(true);
    195   array_writer.AppendBool(true);
    196   writer.CloseContainer(&array_writer);
    197 
    198   // Set expectations.
    199   std::vector<std::string> keys;
    200   keys.push_back(shill::kPassphraseProperty);
    201   keys.push_back(shill::kSignalStrengthProperty);
    202   PrepareForMethodCall(shill::kClearPropertiesFunction,
    203                        base::Bind(&ExpectArrayOfStringsArgument, keys),
    204                        response.get());
    205   // Call method.
    206   MockListValueCallback mock_list_value_callback;
    207   MockErrorCallback mock_error_callback;
    208   client_->ClearProperties(dbus::ObjectPath(kExampleServicePath),
    209                            keys,
    210                            mock_list_value_callback.GetCallback(),
    211                            mock_error_callback.GetCallback());
    212   EXPECT_CALL(mock_list_value_callback, Run(_)).Times(1);
    213   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    214 
    215   // Run the message loop.
    216   message_loop_.RunUntilIdle();
    217 }
    218 
    219 TEST_F(ShillServiceClientTest, Connect) {
    220   // Create response.
    221   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    222 
    223   // Set expectations.
    224   MockClosure mock_closure;
    225   MockErrorCallback mock_error_callback;
    226   PrepareForMethodCall(shill::kConnectFunction,
    227                        base::Bind(&ExpectNoArgument),
    228                        response.get());
    229   EXPECT_CALL(mock_closure, Run()).Times(1);
    230   // Call method.
    231   client_->Connect(dbus::ObjectPath(kExampleServicePath),
    232                    mock_closure.GetCallback(),
    233                    mock_error_callback.GetCallback());
    234 
    235   // Run the message loop.
    236   message_loop_.RunUntilIdle();
    237 }
    238 
    239 TEST_F(ShillServiceClientTest, Disconnect) {
    240   // Create response.
    241   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    242 
    243   // Set expectations.
    244   PrepareForMethodCall(shill::kDisconnectFunction,
    245                        base::Bind(&ExpectNoArgument),
    246                        response.get());
    247   // Call method.
    248   MockClosure mock_closure;
    249   MockErrorCallback mock_error_callback;
    250   client_->Disconnect(dbus::ObjectPath(kExampleServicePath),
    251                       mock_closure.GetCallback(),
    252                       mock_error_callback.GetCallback());
    253   EXPECT_CALL(mock_closure, Run()).Times(1);
    254   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    255 
    256   // Run the message loop.
    257   message_loop_.RunUntilIdle();
    258 }
    259 
    260 TEST_F(ShillServiceClientTest, Remove) {
    261   // Create response.
    262   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    263 
    264   // Set expectations.
    265   PrepareForMethodCall(shill::kRemoveServiceFunction,
    266                        base::Bind(&ExpectNoArgument),
    267                        response.get());
    268   // Call method.
    269   MockClosure mock_closure;
    270   MockErrorCallback mock_error_callback;
    271   client_->Remove(dbus::ObjectPath(kExampleServicePath),
    272                   mock_closure.GetCallback(),
    273                   mock_error_callback.GetCallback());
    274   EXPECT_CALL(mock_closure, Run()).Times(1);
    275   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    276 
    277   // Run the message loop.
    278   message_loop_.RunUntilIdle();
    279 }
    280 
    281 TEST_F(ShillServiceClientTest, ActivateCellularModem) {
    282   const char kCarrier[] = "carrier";
    283   // Create response.
    284   scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
    285 
    286   // Set expectations.
    287   PrepareForMethodCall(shill::kActivateCellularModemFunction,
    288                        base::Bind(&ExpectStringArgument, kCarrier),
    289                        response.get());
    290   // Call method.
    291   MockClosure mock_closure;
    292   MockErrorCallback mock_error_callback;
    293   client_->ActivateCellularModem(dbus::ObjectPath(kExampleServicePath),
    294                                  kCarrier,
    295                                  mock_closure.GetCallback(),
    296                                  mock_error_callback.GetCallback());
    297   EXPECT_CALL(mock_closure, Run()).Times(1);
    298   EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
    299 
    300   // Run the message loop.
    301   message_loop_.RunUntilIdle();
    302 }
    303 
    304 }  // namespace chromeos
    305