Home | History | Annotate | Download | only in dbus
      1 // Copyright 2014 The Chromium OS 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 <brillo/dbus/dbus_param_writer.h>
      6 
      7 #include <string>
      8 
      9 #include <brillo/any.h>
     10 #include <gtest/gtest.h>
     11 
     12 using dbus::MessageReader;
     13 using dbus::MessageWriter;
     14 using dbus::ObjectPath;
     15 using dbus::Response;
     16 
     17 namespace brillo {
     18 namespace dbus_utils {
     19 
     20 TEST(DBusParamWriter, Append_NoArgs) {
     21   std::unique_ptr<Response> message = Response::CreateEmpty();
     22   MessageWriter writer(message.get());
     23   DBusParamWriter::Append(&writer);
     24   EXPECT_EQ("", message->GetSignature());
     25 }
     26 
     27 TEST(DBusParamWriter, Append_OneArg) {
     28   std::unique_ptr<Response> message = Response::CreateEmpty();
     29   MessageWriter writer(message.get());
     30   DBusParamWriter::Append(&writer, int32_t{2});
     31   EXPECT_EQ("i", message->GetSignature());
     32   DBusParamWriter::Append(&writer, std::string{"foo"});
     33   EXPECT_EQ("is", message->GetSignature());
     34   DBusParamWriter::Append(&writer, ObjectPath{"/o"});
     35   EXPECT_EQ("iso", message->GetSignature());
     36 
     37   int32_t int_value = 0;
     38   std::string string_value;
     39   ObjectPath path_value;
     40 
     41   MessageReader reader(message.get());
     42   EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
     43   EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
     44   EXPECT_TRUE(PopValueFromReader(&reader, &path_value));
     45 
     46   EXPECT_EQ(2, int_value);
     47   EXPECT_EQ("foo", string_value);
     48   EXPECT_EQ(ObjectPath{"/o"}, path_value);
     49 }
     50 
     51 TEST(DBusParamWriter, Append_ManyArgs) {
     52   std::unique_ptr<Response> message = Response::CreateEmpty();
     53   MessageWriter writer(message.get());
     54   DBusParamWriter::Append(&writer, int32_t{9}, Any{7.5}, true);
     55   EXPECT_EQ("ivb", message->GetSignature());
     56 
     57   int32_t int_value = 0;
     58   Any variant_value;
     59   bool bool_value = false;
     60 
     61   MessageReader reader(message.get());
     62   EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
     63   EXPECT_TRUE(PopValueFromReader(&reader, &variant_value));
     64   EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
     65 
     66   EXPECT_EQ(9, int_value);
     67   EXPECT_DOUBLE_EQ(7.5, variant_value.Get<double>());
     68   EXPECT_TRUE(bool_value);
     69 }
     70 
     71 TEST(DBusParamWriter, AppendDBusOutParams_NoArgs) {
     72   std::unique_ptr<Response> message = Response::CreateEmpty();
     73   MessageWriter writer(message.get());
     74   DBusParamWriter::AppendDBusOutParams(&writer);
     75   EXPECT_EQ("", message->GetSignature());
     76 }
     77 
     78 TEST(DBusParamWriter, AppendDBusOutParams_OneArg) {
     79   std::unique_ptr<Response> message = Response::CreateEmpty();
     80   MessageWriter writer(message.get());
     81   int32_t int_value_in{5};
     82   std::string string_value_in{"bar"};
     83   ObjectPath path_value_in{"/obj/path"};
     84 
     85   DBusParamWriter::AppendDBusOutParams(&writer, &int_value_in);
     86   EXPECT_EQ("i", message->GetSignature());
     87   DBusParamWriter::AppendDBusOutParams(&writer, &string_value_in);
     88   EXPECT_EQ("is", message->GetSignature());
     89   DBusParamWriter::AppendDBusOutParams(&writer, &path_value_in);
     90   EXPECT_EQ("iso", message->GetSignature());
     91 
     92   int32_t int_value = 0;
     93   std::string string_value;
     94   ObjectPath path_value;
     95 
     96   MessageReader reader(message.get());
     97   EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
     98   EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
     99   EXPECT_TRUE(PopValueFromReader(&reader, &path_value));
    100 
    101   EXPECT_EQ(5, int_value);
    102   EXPECT_EQ("bar", string_value);
    103   EXPECT_EQ(ObjectPath{"/obj/path"}, path_value);
    104 }
    105 
    106 TEST(DBusParamWriter, AppendDBusOutParams_ManyArgs) {
    107   std::unique_ptr<Response> message = Response::CreateEmpty();
    108   MessageWriter writer(message.get());
    109   int32_t int_value_in{8};
    110   Any variant_value_in{8.5};
    111   bool bool_value_in{true};
    112   DBusParamWriter::AppendDBusOutParams(
    113       &writer, &int_value_in, &variant_value_in, &bool_value_in);
    114   EXPECT_EQ("ivb", message->GetSignature());
    115 
    116   int32_t int_value = 0;
    117   Any variant_value;
    118   bool bool_value = false;
    119 
    120   MessageReader reader(message.get());
    121   EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
    122   EXPECT_TRUE(PopValueFromReader(&reader, &variant_value));
    123   EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
    124 
    125   EXPECT_EQ(8, int_value);
    126   EXPECT_DOUBLE_EQ(8.5, variant_value.Get<double>());
    127   EXPECT_TRUE(bool_value);
    128 }
    129 
    130 TEST(DBusParamWriter, AppendDBusOutParams_Mixed_NoArgs) {
    131   std::unique_ptr<Response> message = Response::CreateEmpty();
    132   MessageWriter writer(message.get());
    133   DBusParamWriter::AppendDBusOutParams(&writer, 3, 5);
    134   EXPECT_EQ("", message->GetSignature());
    135 }
    136 
    137 TEST(DBusParamWriter, AppendDBusOutParams_Mixed_OneArg) {
    138   std::unique_ptr<Response> message = Response::CreateEmpty();
    139   MessageWriter writer(message.get());
    140   int32_t int_value_in{5};
    141   std::string str_value_in{"bar"};
    142   ObjectPath path_value_in{"/obj"};
    143 
    144   DBusParamWriter::AppendDBusOutParams(&writer, 2, &int_value_in);
    145   EXPECT_EQ("i", message->GetSignature());
    146   DBusParamWriter::AppendDBusOutParams(&writer, &str_value_in, 0);
    147   EXPECT_EQ("is", message->GetSignature());
    148   DBusParamWriter::AppendDBusOutParams(&writer, 1, &path_value_in, 2);
    149   EXPECT_EQ("iso", message->GetSignature());
    150 
    151   int32_t int_value = 0;
    152   std::string string_value;
    153   ObjectPath path_value;
    154 
    155   MessageReader reader(message.get());
    156   EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
    157   EXPECT_TRUE(PopValueFromReader(&reader, &string_value));
    158   EXPECT_TRUE(PopValueFromReader(&reader, &path_value));
    159 
    160   EXPECT_EQ(5, int_value);
    161   EXPECT_EQ("bar", string_value);
    162   EXPECT_EQ(ObjectPath{"/obj"}, path_value);
    163 }
    164 
    165 TEST(DBusParamWriter, AppendDBusOutParams_Mixed_ManyArgs) {
    166   std::unique_ptr<Response> message = Response::CreateEmpty();
    167   MessageWriter writer(message.get());
    168   int32_t int_value_in{8};
    169   Any variant_value_in{7.5};
    170   bool bool_value_in{true};
    171   DBusParamWriter::AppendDBusOutParams(
    172       &writer, 0, &int_value_in, 1, &variant_value_in, 2, &bool_value_in, 3);
    173   EXPECT_EQ("ivb", message->GetSignature());
    174 
    175   int32_t int_value = 0;
    176   Any variant_value;
    177   bool bool_value = false;
    178 
    179   MessageReader reader(message.get());
    180   EXPECT_TRUE(PopValueFromReader(&reader, &int_value));
    181   EXPECT_TRUE(PopValueFromReader(&reader, &variant_value));
    182   EXPECT_TRUE(PopValueFromReader(&reader, &bool_value));
    183 
    184   EXPECT_EQ(8, int_value);
    185   EXPECT_DOUBLE_EQ(7.5, variant_value.Get<double>());
    186   EXPECT_TRUE(bool_value);
    187 }
    188 }  // namespace dbus_utils
    189 }  // namespace brillo
    190