buffet: Add CommandInstance::ToJson
Method is needed to implement commands status requests from
privetd. Current implementation generates JSON on request.
BUG=brillo:430
TEST=unittest
Change-Id: Iee4a788792a33278c997ad535abe11f26fa7f422
Reviewed-on: https://chromium-review.googlesource.com/262215
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/commands/cloud_command_proxy.cc b/buffet/commands/cloud_command_proxy.cc
index 8aa27ba..d3cd5a6 100644
--- a/buffet/commands/cloud_command_proxy.cc
+++ b/buffet/commands/cloud_command_proxy.cc
@@ -7,6 +7,7 @@
#include "buffet/commands/command_instance.h"
#include "buffet/commands/prop_constraints.h"
#include "buffet/commands/prop_types.h"
+#include "buffet/commands/schema_constants.h"
#include "buffet/device_registration_info.h"
namespace buffet {
@@ -20,20 +21,21 @@
void CloudCommandProxy::OnResultsChanged(const native_types::Object& results) {
base::DictionaryValue patch;
- patch.Set("results", TypedValueToJson(results, nullptr).get());
+ patch.Set(commands::attributes::kCommand_Results,
+ TypedValueToJson(results, nullptr).get());
device_registration_info_->UpdateCommand(command_instance_->GetID(), patch);
}
void CloudCommandProxy::OnStatusChanged(const std::string& status) {
base::DictionaryValue patch;
// TODO(antonm): Change status to state.
- patch.SetString("state", status);
+ patch.SetString(commands::attributes::kCommand_State, status);
device_registration_info_->UpdateCommand(command_instance_->GetID(), patch);
}
void CloudCommandProxy::OnProgressChanged(int progress) {
base::DictionaryValue patch;
- patch.SetInteger("progress", progress);
+ patch.SetInteger(commands::attributes::kCommand_Progress, progress);
// TODO(antonm): Consider batching progress change updates.
device_registration_info_->UpdateCommand(command_instance_->GetID(), patch);
}
diff --git a/buffet/commands/command_instance.cc b/buffet/commands/command_instance.cc
index 4b13448..926dcf5 100644
--- a/buffet/commands/command_instance.cc
+++ b/buffet/commands/command_instance.cc
@@ -134,7 +134,6 @@
}
instance.reset(new CommandInstance(command_name, command_def, parameters));
- // TODO(antonm): Move command_id to ctor and remove setter.
std::string command_id;
if (json->GetStringWithoutPathExpansion(commands::attributes::kCommand_Id,
&command_id)) {
@@ -144,6 +143,21 @@
return instance;
}
+std::unique_ptr<base::DictionaryValue> CommandInstance::ToJson() const {
+ std::unique_ptr<base::DictionaryValue> json{new base::DictionaryValue};
+
+ json->SetString(commands::attributes::kCommand_Id, id_);
+ json->SetString(commands::attributes::kCommand_Name, name_);
+ json->Set(commands::attributes::kCommand_Parameters,
+ TypedValueToJson(parameters_, nullptr).release());
+ json->Set(commands::attributes::kCommand_Results,
+ TypedValueToJson(results_, nullptr).release());
+ json->SetInteger(commands::attributes::kCommand_Progress, progress_);
+ json->SetString(commands::attributes::kCommand_State, status_);
+
+ return json;
+}
+
void CommandInstance::AddProxy(std::unique_ptr<CommandProxyInterface> proxy) {
proxies_.push_back(std::move(proxy));
}
diff --git a/buffet/commands/command_instance.h b/buffet/commands/command_instance.h
index c925b6c..2b09829 100644
--- a/buffet/commands/command_instance.h
+++ b/buffet/commands/command_instance.h
@@ -65,6 +65,9 @@
const CommandDictionary& dictionary,
chromeos::ErrorPtr* error);
+ // Returns JSON representation of the command.
+ std::unique_ptr<base::DictionaryValue> ToJson() const;
+
// Sets the command ID (normally done by CommandQueue when the command
// instance is added to it).
void SetID(const std::string& id) { id_ = id; }
diff --git a/buffet/commands/command_instance_unittest.cc b/buffet/commands/command_instance_unittest.cc
index 98c23e5..48d54b9 100644
--- a/buffet/commands/command_instance_unittest.cc
+++ b/buffet/commands/command_instance_unittest.cc
@@ -189,3 +189,33 @@
EXPECT_EQ("command_failed", error->GetCode());
EXPECT_EQ("Failed to validate command 'robot.speak'", error->GetMessage());
}
+
+TEST_F(CommandInstanceTest, ToJson) {
+ auto json = CreateDictionaryValue(R"({
+ 'name': 'robot.jump',
+ 'parameters': {
+ 'height': 53,
+ '_jumpType': '_withKick'
+ },
+ 'results': {}
+ })");
+ auto instance = buffet::CommandInstance::FromJson(json.get(), dict_, nullptr);
+ instance->SetProgress(15);
+ instance->SetID("testId");
+ buffet::native_types::Object results;
+ buffet::IntPropType int_prop;
+ results["testResult"] = int_prop.CreateValue(17, nullptr);
+ instance->SetResults(results);
+
+ json->MergeDictionary(CreateDictionaryValue(R"({
+ 'id': 'testId',
+ 'progress': 15,
+ 'state': 'inProgress',
+ 'results': {'testResult': 17}
+ })").get());
+
+ auto converted = instance->ToJson();
+ EXPECT_PRED2([](const base::Value& val1, const base::Value& val2) {
+ return val1.Equals(&val2);
+ }, *json, *converted);
+}
diff --git a/buffet/commands/schema_constants.cc b/buffet/commands/schema_constants.cc
index 12cc6b6..3854278 100644
--- a/buffet/commands/schema_constants.cc
+++ b/buffet/commands/schema_constants.cc
@@ -48,6 +48,8 @@
const char kCommand_Name[] = "name";
const char kCommand_Parameters[] = "parameters";
const char kCommand_Results[] = "results";
+const char kCommand_State[] = "state";
+const char kCommand_Progress[] = "progress";
} // namespace attributes
} // namespace commands
diff --git a/buffet/commands/schema_constants.h b/buffet/commands/schema_constants.h
index a686271..450ad37 100644
--- a/buffet/commands/schema_constants.h
+++ b/buffet/commands/schema_constants.h
@@ -52,6 +52,8 @@
extern const char kCommand_Name[];
extern const char kCommand_Parameters[];
extern const char kCommand_Results[];
+extern const char kCommand_State[];
+extern const char kCommand_Progress[];
} // namespace attributes
} // namespace commands