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_reader.h> 6 7 #include <string> 8 9 #include <brillo/variant_dictionary.h> 10 #include <gtest/gtest.h> 11 12 using dbus::MessageReader; 13 using dbus::MessageWriter; 14 using dbus::Response; 15 16 namespace brillo { 17 namespace dbus_utils { 18 19 TEST(DBusParamReader, NoArgs) { 20 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 21 MessageReader reader(message.get()); 22 bool called = false; 23 auto callback = [&called]() { called = true; }; 24 EXPECT_TRUE(DBusParamReader<false>::Invoke(callback, &reader, nullptr)); 25 EXPECT_TRUE(called); 26 } 27 28 TEST(DBusParamReader, OneArg) { 29 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 30 MessageWriter writer(message.get()); 31 AppendValueToWriter(&writer, 123); 32 MessageReader reader(message.get()); 33 bool called = false; 34 auto callback = [&called](int param1) { 35 EXPECT_EQ(123, param1); 36 called = true; 37 }; 38 EXPECT_TRUE( 39 (DBusParamReader<false, int>::Invoke(callback, &reader, nullptr))); 40 EXPECT_TRUE(called); 41 } 42 43 TEST(DBusParamReader, ManyArgs) { 44 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 45 MessageWriter writer(message.get()); 46 AppendValueToWriter(&writer, true); 47 AppendValueToWriter(&writer, 1972); 48 AppendValueToWriter(&writer, 49 VariantDictionary{{"key", std::string{"value"}}}); 50 MessageReader reader(message.get()); 51 bool called = false; 52 auto callback = [&called](bool p1, int p2, const VariantDictionary& p3) { 53 EXPECT_TRUE(p1); 54 EXPECT_EQ(1972, p2); 55 EXPECT_EQ(1, p3.size()); 56 EXPECT_EQ("value", p3.find("key")->second.Get<std::string>()); 57 called = true; 58 }; 59 EXPECT_TRUE((DBusParamReader<false, bool, int, VariantDictionary>::Invoke( 60 callback, &reader, nullptr))); 61 EXPECT_TRUE(called); 62 } 63 64 TEST(DBusParamReader, TooManyArgs) { 65 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 66 MessageWriter writer(message.get()); 67 AppendValueToWriter(&writer, true); 68 AppendValueToWriter(&writer, 1972); 69 AppendValueToWriter(&writer, 70 VariantDictionary{{"key", std::string{"value"}}}); 71 MessageReader reader(message.get()); 72 bool called = false; 73 auto callback = [&called](bool param1, int param2) { 74 EXPECT_TRUE(param1); 75 EXPECT_EQ(1972, param2); 76 called = true; 77 }; 78 ErrorPtr error; 79 EXPECT_FALSE( 80 (DBusParamReader<false, bool, int>::Invoke(callback, &reader, &error))); 81 EXPECT_FALSE(called); 82 EXPECT_EQ(errors::dbus::kDomain, error->GetDomain()); 83 EXPECT_EQ(DBUS_ERROR_INVALID_ARGS, error->GetCode()); 84 EXPECT_EQ("Too many parameters in a method call", error->GetMessage()); 85 } 86 87 TEST(DBusParamReader, TooFewArgs) { 88 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 89 MessageWriter writer(message.get()); 90 AppendValueToWriter(&writer, true); 91 MessageReader reader(message.get()); 92 bool called = false; 93 auto callback = [&called](bool param1, int param2) { 94 EXPECT_TRUE(param1); 95 EXPECT_EQ(1972, param2); 96 called = true; 97 }; 98 ErrorPtr error; 99 EXPECT_FALSE( 100 (DBusParamReader<false, bool, int>::Invoke(callback, &reader, &error))); 101 EXPECT_FALSE(called); 102 EXPECT_EQ(errors::dbus::kDomain, error->GetDomain()); 103 EXPECT_EQ(DBUS_ERROR_INVALID_ARGS, error->GetCode()); 104 EXPECT_EQ("Too few parameters in a method call", error->GetMessage()); 105 } 106 107 TEST(DBusParamReader, TypeMismatch) { 108 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 109 MessageWriter writer(message.get()); 110 AppendValueToWriter(&writer, true); 111 AppendValueToWriter(&writer, 1972); 112 MessageReader reader(message.get()); 113 bool called = false; 114 auto callback = [&called](bool param1, double param2) { 115 EXPECT_TRUE(param1); 116 EXPECT_DOUBLE_EQ(1972.0, param2); 117 called = true; 118 }; 119 ErrorPtr error; 120 EXPECT_FALSE(( 121 DBusParamReader<false, bool, double>::Invoke(callback, &reader, &error))); 122 EXPECT_FALSE(called); 123 EXPECT_EQ(errors::dbus::kDomain, error->GetDomain()); 124 EXPECT_EQ(DBUS_ERROR_INVALID_ARGS, error->GetCode()); 125 EXPECT_EQ("Method parameter type mismatch", error->GetMessage()); 126 } 127 128 TEST(DBusParamReader, NoArgs_With_OUT) { 129 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 130 MessageReader reader(message.get()); 131 bool called = false; 132 auto callback = [&called](int* param1) { 133 EXPECT_EQ(0, *param1); 134 called = true; 135 }; 136 EXPECT_TRUE( 137 (DBusParamReader<true, int*>::Invoke(callback, &reader, nullptr))); 138 EXPECT_TRUE(called); 139 } 140 141 TEST(DBusParamReader, OneArg_Before_OUT) { 142 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 143 MessageWriter writer(message.get()); 144 AppendValueToWriter(&writer, 123); 145 MessageReader reader(message.get()); 146 bool called = false; 147 auto callback = [&called](int param1, double* param2) { 148 EXPECT_EQ(123, param1); 149 EXPECT_DOUBLE_EQ(0.0, *param2); 150 called = true; 151 }; 152 EXPECT_TRUE(( 153 DBusParamReader<true, int, double*>::Invoke(callback, &reader, nullptr))); 154 EXPECT_TRUE(called); 155 } 156 157 TEST(DBusParamReader, OneArg_After_OUT) { 158 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 159 MessageWriter writer(message.get()); 160 AppendValueToWriter(&writer, 123); 161 MessageReader reader(message.get()); 162 bool called = false; 163 auto callback = [&called](double* param1, int param2) { 164 EXPECT_DOUBLE_EQ(0.0, *param1); 165 EXPECT_EQ(123, param2); 166 called = true; 167 }; 168 EXPECT_TRUE(( 169 DBusParamReader<true, double*, int>::Invoke(callback, &reader, nullptr))); 170 EXPECT_TRUE(called); 171 } 172 173 TEST(DBusParamReader, ManyArgs_With_OUT) { 174 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 175 MessageWriter writer(message.get()); 176 AppendValueToWriter(&writer, true); 177 AppendValueToWriter(&writer, 1972); 178 AppendValueToWriter(&writer, 179 VariantDictionary{{"key", std::string{"value"}}}); 180 MessageReader reader(message.get()); 181 bool called = false; 182 auto callback = [&called](bool p1, 183 std::string* p2, 184 int p3, 185 int* p4, 186 const VariantDictionary& p5, 187 bool* p6) { 188 EXPECT_TRUE(p1); 189 EXPECT_EQ("", *p2); 190 EXPECT_EQ(1972, p3); 191 EXPECT_EQ(0, *p4); 192 EXPECT_EQ(1, p5.size()); 193 EXPECT_EQ("value", p5.find("key")->second.Get<std::string>()); 194 EXPECT_FALSE(*p6); 195 called = true; 196 }; 197 EXPECT_TRUE((DBusParamReader<true, 198 bool, 199 std::string*, 200 int, 201 int*, 202 VariantDictionary, 203 bool*>::Invoke(callback, &reader, nullptr))); 204 EXPECT_TRUE(called); 205 } 206 207 TEST(DBusParamReader, TooManyArgs_With_OUT) { 208 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 209 MessageWriter writer(message.get()); 210 AppendValueToWriter(&writer, true); 211 AppendValueToWriter(&writer, 1972); 212 AppendValueToWriter(&writer, 213 VariantDictionary{{"key", std::string{"value"}}}); 214 MessageReader reader(message.get()); 215 bool called = false; 216 auto callback = [&called](bool param1, int param2, int* param3) { 217 EXPECT_TRUE(param1); 218 EXPECT_EQ(1972, param2); 219 EXPECT_EQ(0, *param3); 220 called = true; 221 }; 222 ErrorPtr error; 223 EXPECT_FALSE((DBusParamReader<true, bool, int, int*>::Invoke( 224 callback, &reader, &error))); 225 EXPECT_FALSE(called); 226 EXPECT_EQ(errors::dbus::kDomain, error->GetDomain()); 227 EXPECT_EQ(DBUS_ERROR_INVALID_ARGS, error->GetCode()); 228 EXPECT_EQ("Too many parameters in a method call", error->GetMessage()); 229 } 230 231 TEST(DBusParamReader, TooFewArgs_With_OUT) { 232 std::unique_ptr<Response> message(Response::CreateEmpty().release()); 233 MessageWriter writer(message.get()); 234 AppendValueToWriter(&writer, true); 235 MessageReader reader(message.get()); 236 bool called = false; 237 auto callback = [&called](bool param1, int param2, int* param3) { 238 EXPECT_TRUE(param1); 239 EXPECT_EQ(1972, param2); 240 EXPECT_EQ(0, *param3); 241 called = true; 242 }; 243 ErrorPtr error; 244 EXPECT_FALSE((DBusParamReader<true, bool, int, int*>::Invoke( 245 callback, &reader, &error))); 246 EXPECT_FALSE(called); 247 EXPECT_EQ(errors::dbus::kDomain, error->GetDomain()); 248 EXPECT_EQ(DBUS_ERROR_INVALID_ARGS, error->GetCode()); 249 EXPECT_EQ("Too few parameters in a method call", error->GetMessage()); 250 } 251 252 } // namespace dbus_utils 253 } // namespace brillo 254