buffet: Use DBus utilities in buffet_client Use chromeos::dbus_utils::AppendValueToWriter to send a dictionary over DBus instead of writing it out manually. Also added a parameter to TestMethod for more testing of DBus communication between Buffet and buffet_client. Buffet replies with the same string parameters (like an 'echo' service). BUG=chromium:374864 TEST=USE=buffet P2_TEST_FILTER="buffet::*" FEATURES=test emerge-link platform2 Change-Id: Ib9d5a8e5173fac894e742cfda5f3fb52ea96f15b Reviewed-on: https://chromium-review.googlesource.com/212683 Reviewed-by: Christopher Wiley <wiley@chromium.org> Tested-by: Alex Vakulenko <avakulenko@chromium.org> Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc index 1b61a83..ce8a928 100644 --- a/buffet/buffet_client.cc +++ b/buffet/buffet_client.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include <iostream> // NOLINT(readability/streams) +#include <memory> #include <string> #include <sysexits.h> @@ -11,6 +12,7 @@ #include <base/memory/ref_counted.h> #include <base/memory/scoped_ptr.h> #include <base/values.h> +#include <chromeos/dbus_utils.h> #include <dbus/bus.h> #include <dbus/message.h> #include <dbus/object_proxy.h> @@ -27,7 +29,7 @@ void usage() { std::cerr << "Possible commands:" << std::endl; - std::cerr << " " << kManagerTestMethod << std::endl; + std::cerr << " " << kManagerTestMethod << " <message>" << std::endl; std::cerr << " " << kManagerCheckDeviceRegistered << std::endl; std::cerr << " " << kManagerGetDeviceInfo << std::endl; std::cerr << " " << kManagerStartRegisterDevice @@ -54,14 +56,26 @@ } int CallTestMethod(const CommandLine::StringVector& args) { + std::string message; + if (!args.empty()) + message = args.front(); + dbus::MethodCall method_call(kManagerInterface, kManagerTestMethod); + dbus::MessageWriter writer(&method_call); + writer.AppendString(message); scoped_ptr<dbus::Response> response( manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms)); if (!response) { std::cout << "Failed to receive a response." << std::endl; return EX_UNAVAILABLE; } - std::cout << "Received a response." << std::endl; + dbus::MessageReader reader(response.get()); + std::string response_message; + if (!reader.PopString(&response_message)) { + std::cout << "No valid response." << std::endl; + return EX_SOFTWARE; + } + std::cout << "Received a response: " << response_message << std::endl; return EX_OK; } @@ -132,31 +146,21 @@ usage(); return EX_USAGE; } - std::map<std::string, std::shared_ptr<base::Value>> params; + chromeos::dbus_utils::Dictionary params; if (!args.empty()) { auto key_values = buffet::data_encoding::WebParamsDecode(args.front()); for (const auto& pair : key_values) { params.insert(std::make_pair( - pair.first, std::shared_ptr<base::Value>( - base::Value::CreateStringValue(pair.second)))); + pair.first, std::unique_ptr<base::Value>( + base::Value::CreateStringValue(pair.second)))); } } dbus::MethodCall method_call( kManagerInterface, kManagerStartRegisterDevice); dbus::MessageWriter writer(&method_call); - dbus::MessageWriter dict_writer(nullptr); - writer.OpenArray("{sv}", &dict_writer); - for (const auto& pair : params) { - dbus::MessageWriter dict_entry_writer(nullptr); - dict_writer.OpenDictEntry(&dict_entry_writer); - dict_entry_writer.AppendString(pair.first); - dbus::AppendBasicTypeValueDataAsVariant(&dict_entry_writer, - *pair.second.get()); - dict_writer.CloseContainer(&dict_entry_writer); - } - writer.CloseContainer(&dict_writer); + chromeos::dbus_utils::AppendValueToWriter(&writer, params); static const int timeout_ms = 3000; scoped_ptr<dbus::Response> response(
diff --git a/buffet/manager.cc b/buffet/manager.cc index 749e84a..9a11040 100644 --- a/buffet/manager.cc +++ b/buffet/manager.cc
@@ -119,8 +119,10 @@ state_.SetValue(json_state_fragment); } -void Manager::HandleTestMethod(chromeos::ErrorPtr* error) { - LOG(INFO) << "Received call to test method"; +std::string Manager::HandleTestMethod(chromeos::ErrorPtr* error, + const std::string& message) { + LOG(INFO) << "Received call to test method: " << message; + return message; } } // namespace buffet
diff --git a/buffet/manager.h b/buffet/manager.h index 73ed8aa..ba7190d 100644 --- a/buffet/manager.h +++ b/buffet/manager.h
@@ -59,7 +59,8 @@ void HandleUpdateState(chromeos::ErrorPtr* error, const std::string& json_state_fragment); // Handles calls to org.chromium.Buffet.Manager.Test() - void HandleTestMethod(chromeos::ErrorPtr* error); + std::string HandleTestMethod(chromeos::ErrorPtr* error, + const std::string& message); chromeos::dbus_utils::DBusObject dbus_object_;