libweave: Add enums CommandOrigin and CommandStatus

Enums are more convenient there.

BUG=brillo:1245
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: Idb69f3cd453802ae56a42b6952333e08af43d9dc
Reviewed-on: https://chromium-review.googlesource.com/288390
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/libweave/include/weave/command.h b/libweave/include/weave/command.h
index 3274664..58a63fe 100644
--- a/libweave/include/weave/command.h
+++ b/libweave/include/weave/command.h
@@ -12,6 +12,19 @@
 
 namespace weave {
 
+enum class CommandStatus {
+  kQueued,
+  kInProgress,
+  kPaused,
+  kError,
+  kDone,
+  kCancelled,
+  kAborted,
+  kExpired,
+};
+
+enum class CommandOrigin { kLocal, kCloud };
+
 class Command {
  public:
   // This interface lets the command to notify clients about changes.
@@ -39,11 +52,10 @@
   virtual const std::string& GetCategory() const = 0;
 
   // Returns the command status.
-  // TODO(vitalybuka): Status should be enum.
-  virtual const std::string& GetStatus() const = 0;
+  virtual CommandStatus GetStatus() const = 0;
 
   // Returns the origin of the command.
-  virtual const std::string& GetOrigin() const = 0;
+  virtual CommandOrigin GetOrigin() const = 0;
 
   // Returns the command parameters.
   virtual std::unique_ptr<base::DictionaryValue> GetParameters() const = 0;
diff --git a/libweave/src/base_api_handler.cc b/libweave/src/base_api_handler.cc
index feb1ab6..28be501 100644
--- a/libweave/src/base_api_handler.cc
+++ b/libweave/src/base_api_handler.cc
@@ -21,7 +21,7 @@
 }
 
 void BaseApiHandler::OnCommandAdded(Command* command) {
-  if (command->GetStatus() != CommandInstance::kStatusQueued)
+  if (command->GetStatus() != CommandStatus::kQueued)
     return;
 
   if (command->GetName() == "base.updateBaseConfiguration")
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc
index 8bc174a..3e35bd9 100644
--- a/libweave/src/base_api_handler_unittest.cc
+++ b/libweave/src/base_api_handler_unittest.cc
@@ -67,14 +67,14 @@
   void AddCommand(const std::string& command) {
     auto command_instance = CommandInstance::FromJson(
         unittests::CreateDictionaryValue(command.c_str()).get(),
-        commands::attributes::kCommand_Visibility_Local,
-        command_manager_->GetCommandDictionary(), nullptr, nullptr);
+        CommandOrigin::kLocal, command_manager_->GetCommandDictionary(),
+        nullptr, nullptr);
     EXPECT_TRUE(!!command_instance);
 
     std::string id{base::IntToString(++command_id_)};
     command_instance->SetID(id);
     command_manager_->AddCommand(std::move(command_instance));
-    EXPECT_EQ(CommandInstance::kStatusDone,
+    EXPECT_EQ(CommandStatus::kDone,
               command_manager_->FindCommand(id)->GetStatus());
   }
 
diff --git a/libweave/src/commands/cloud_command_proxy.cc b/libweave/src/commands/cloud_command_proxy.cc
index 70430c7..a6685fc 100644
--- a/libweave/src/commands/cloud_command_proxy.cc
+++ b/libweave/src/commands/cloud_command_proxy.cc
@@ -10,6 +10,7 @@
 #include "libweave/src/commands/prop_constraints.h"
 #include "libweave/src/commands/prop_types.h"
 #include "libweave/src/commands/schema_constants.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 
@@ -39,7 +40,7 @@
 void CloudCommandProxy::OnStatusChanged() {
   std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue};
   patch->SetString(commands::attributes::kCommand_State,
-                   command_instance_->GetStatus());
+                   EnumToString(command_instance_->GetStatus()));
   QueueCommandUpdate(std::move(patch));
 }
 
diff --git a/libweave/src/commands/cloud_command_proxy_unittest.cc b/libweave/src/commands/cloud_command_proxy_unittest.cc
index bd45e25..7cc054e 100644
--- a/libweave/src/commands/cloud_command_proxy_unittest.cc
+++ b/libweave/src/commands/cloud_command_proxy_unittest.cc
@@ -139,8 +139,9 @@
     })");
     CHECK(command_json.get());
 
-    command_instance_ = CommandInstance::FromJson(
-        command_json.get(), "cloud", command_dictionary_, nullptr, nullptr);
+    command_instance_ =
+        CommandInstance::FromJson(command_json.get(), CommandOrigin::kCloud,
+                                  command_dictionary_, nullptr, nullptr);
     CHECK(command_instance_.get());
 
     // Backoff - start at 1s and double with each backoff attempt and no jitter.
diff --git a/libweave/src/commands/command_instance.cc b/libweave/src/commands/command_instance.cc
index 34ed8dc..d2efcb4 100644
--- a/libweave/src/commands/command_instance.cc
+++ b/libweave/src/commands/command_instance.cc
@@ -14,20 +14,40 @@
 #include "libweave/src/commands/prop_types.h"
 #include "libweave/src/commands/schema_constants.h"
 #include "libweave/src/commands/schema_utils.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 
-const char CommandInstance::kStatusQueued[] = "queued";
-const char CommandInstance::kStatusInProgress[] = "inProgress";
-const char CommandInstance::kStatusPaused[] = "paused";
-const char CommandInstance::kStatusError[] = "error";
-const char CommandInstance::kStatusDone[] = "done";
-const char CommandInstance::kStatusCancelled[] = "cancelled";
-const char CommandInstance::kStatusAborted[] = "aborted";
-const char CommandInstance::kStatusExpired[] = "expired";
+namespace {
+
+const EnumToStringMap<CommandStatus>::Map kMapStatus[] = {
+    {CommandStatus::kQueued, "queued"},
+    {CommandStatus::kInProgress, "inProgress"},
+    {CommandStatus::kPaused, "paused"},
+    {CommandStatus::kError, "error"},
+    {CommandStatus::kDone, "done"},
+    {CommandStatus::kCancelled, "cancelled"},
+    {CommandStatus::kAborted, "aborted"},
+    {CommandStatus::kExpired, "expired"},
+};
+
+const EnumToStringMap<CommandOrigin>::Map kMapOrigin[] = {
+    {CommandOrigin::kLocal, "local"},
+    {CommandOrigin::kCloud, "cloud"},
+};
+
+}  // namespace
+
+template <>
+EnumToStringMap<CommandStatus>::EnumToStringMap()
+    : EnumToStringMap(kMapStatus) {}
+
+template <>
+EnumToStringMap<CommandOrigin>::EnumToStringMap()
+    : EnumToStringMap(kMapOrigin) {}
 
 CommandInstance::CommandInstance(const std::string& name,
-                                 const std::string& origin,
+                                 CommandOrigin origin,
                                  const CommandDefinition* command_definition,
                                  const ValueMap& parameters)
     : name_{name},
@@ -54,11 +74,11 @@
   return command_definition_->GetCategory();
 }
 
-const std::string& CommandInstance::GetStatus() const {
+CommandStatus CommandInstance::GetStatus() const {
   return status_;
 }
 
-const std::string& CommandInstance::GetOrigin() const {
+CommandOrigin CommandInstance::GetOrigin() const {
   return origin_;
 }
 
@@ -84,7 +104,7 @@
     return false;
 
   // Change status even if progress unchanged, e.g. 0% -> 0%.
-  SetStatus(kStatusInProgress);
+  SetStatus(CommandStatus::kInProgress);
   if (obj != progress_) {
     progress_ = obj;
     for (auto observer : observers_)
@@ -155,7 +175,7 @@
 
 std::unique_ptr<CommandInstance> CommandInstance::FromJson(
     const base::Value* value,
-    const std::string& origin,
+    CommandOrigin origin,
     const CommandDictionary& dictionary,
     std::string* command_id,
     chromeos::ErrorPtr* error) {
@@ -225,7 +245,7 @@
             TypedValueToJson(progress_, nullptr).release());
   json->Set(commands::attributes::kCommand_Results,
             TypedValueToJson(results_, nullptr).release());
-  json->SetString(commands::attributes::kCommand_State, status_);
+  json->SetString(commands::attributes::kCommand_State, EnumToString(status_));
 
   return json;
 }
@@ -235,24 +255,24 @@
 }
 
 void CommandInstance::Abort() {
-  SetStatus(kStatusAborted);
+  SetStatus(CommandStatus::kAborted);
   RemoveFromQueue();
   // The command will be destroyed after that, so do not access any members.
 }
 
 void CommandInstance::Cancel() {
-  SetStatus(kStatusCancelled);
+  SetStatus(CommandStatus::kCancelled);
   RemoveFromQueue();
   // The command will be destroyed after that, so do not access any members.
 }
 
 void CommandInstance::Done() {
-  SetStatus(kStatusDone);
+  SetStatus(CommandStatus::kDone);
   RemoveFromQueue();
   // The command will be destroyed after that, so do not access any members.
 }
 
-void CommandInstance::SetStatus(const std::string& status) {
+void CommandInstance::SetStatus(CommandStatus status) {
   if (status != status_) {
     status_ = status;
     for (auto observer : observers_)
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index e911ede..ee70065 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -34,7 +34,7 @@
   // be in format "<package_name>.<command_name>", a command |category| and
   // a list of parameters and their values specified in |parameters|.
   CommandInstance(const std::string& name,
-                  const std::string& origin,
+                  CommandOrigin origin,
                   const CommandDefinition* command_definition,
                   const ValueMap& parameters);
   ~CommandInstance() override;
@@ -45,8 +45,8 @@
   const std::string& GetID() const override;
   const std::string& GetName() const override;
   const std::string& GetCategory() const override;
-  const std::string& GetStatus() const override;
-  const std::string& GetOrigin() const override;
+  CommandStatus GetStatus() const override;
+  CommandOrigin GetOrigin() const override;
   std::unique_ptr<base::DictionaryValue> GetParameters() const override;
   std::unique_ptr<base::DictionaryValue> GetProgress() const override;
   std::unique_ptr<base::DictionaryValue> GetResults() const override;
@@ -73,7 +73,7 @@
   // This is used to report parse failures back to the server.
   static std::unique_ptr<CommandInstance> FromJson(
       const base::Value* value,
-      const std::string& origin,
+      CommandOrigin origin,
       const CommandDictionary& dictionary,
       std::string* command_id,
       chromeos::ErrorPtr* error);
@@ -84,20 +84,10 @@
   // Sets the pointer to queue this command is part of.
   void SetCommandQueue(CommandQueue* queue) { queue_ = queue; }
 
-  // Values for command execution status.
-  static const char kStatusQueued[];
-  static const char kStatusInProgress[];
-  static const char kStatusPaused[];
-  static const char kStatusError[];
-  static const char kStatusDone[];
-  static const char kStatusCancelled[];
-  static const char kStatusAborted[];
-  static const char kStatusExpired[];
-
  private:
   // Helper function to update the command status.
   // Used by Abort(), Cancel(), Done() methods.
-  void SetStatus(const std::string& status);
+  void SetStatus(CommandStatus status);
   // Helper method that removes this command from the command queue.
   // Note that since the command queue owns the lifetime of the command instance
   // object, removing a command from the queue will also destroy it.
@@ -108,7 +98,7 @@
   // Full command name as "<package_name>.<command_name>".
   std::string name_;
   // The origin of the command, either "local" or "cloud".
-  std::string origin_;
+  CommandOrigin origin_ = CommandOrigin::kLocal;
   // Command definition.
   const CommandDefinition* command_definition_;
   // Command parameters and their values.
@@ -118,7 +108,7 @@
   // Command results.
   ValueMap results_;
   // Current command status.
-  std::string status_ = kStatusQueued;
+  CommandStatus status_ = CommandStatus::kQueued;
   // Command observer for the command.
   std::vector<Observer*> observers_;
   // Pointer to the command queue this command instance is added to.
diff --git a/libweave/src/commands/command_instance_unittest.cc b/libweave/src/commands/command_instance_unittest.cc
index 4a7972a..43465c3 100644
--- a/libweave/src/commands/command_instance_unittest.cc
+++ b/libweave/src/commands/command_instance_unittest.cc
@@ -75,8 +75,8 @@
   ValueMap params;
   params["phrase"] = str_prop.CreateValue(std::string("iPityDaFool"), nullptr);
   params["volume"] = int_prop.CreateValue(5, nullptr);
-  CommandInstance instance{
-      "robot.speak", "cloud", dict_.FindCommand("robot.speak"), params};
+  CommandInstance instance{"robot.speak", CommandOrigin::kCloud,
+                           dict_.FindCommand("robot.speak"), params};
 
   EXPECT_TRUE(
       instance.SetResults(*CreateDictionaryValue("{'foo': 239}"), nullptr));
@@ -84,19 +84,23 @@
   EXPECT_EQ("", instance.GetID());
   EXPECT_EQ("robot.speak", instance.GetName());
   EXPECT_EQ("robotd", instance.GetCategory());
-  EXPECT_EQ("cloud", instance.GetOrigin());
+  EXPECT_EQ(CommandOrigin::kCloud, instance.GetOrigin());
   EXPECT_JSON_EQ("{'phrase': 'iPityDaFool', 'volume': 5}",
                  *instance.GetParameters());
   EXPECT_JSON_EQ("{'foo': 239}", *instance.GetResults());
 
-  CommandInstance instance2{
-      "base.reboot", "local", dict_.FindCommand("base.reboot"), {}};
-  EXPECT_EQ("local", instance2.GetOrigin());
+  CommandInstance instance2{"base.reboot",
+                            CommandOrigin::kLocal,
+                            dict_.FindCommand("base.reboot"),
+                            {}};
+  EXPECT_EQ(CommandOrigin::kLocal, instance2.GetOrigin());
 }
 
 TEST_F(CommandInstanceTest, SetID) {
-  CommandInstance instance{
-      "base.reboot", "local", dict_.FindCommand("base.reboot"), {}};
+  CommandInstance instance{"base.reboot",
+                           CommandOrigin::kLocal,
+                           dict_.FindCommand("base.reboot"),
+                           {}};
   instance.SetID("command_id");
   EXPECT_EQ("command_id", instance.GetID());
 }
@@ -112,8 +116,8 @@
     'results': {}
   })");
   std::string id;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, &id, nullptr);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, &id, nullptr);
   EXPECT_EQ("abcd", id);
   EXPECT_EQ("abcd", instance->GetID());
   EXPECT_EQ("robot.jump", instance->GetName());
@@ -124,8 +128,8 @@
 
 TEST_F(CommandInstanceTest, FromJson_ParamsOmitted) {
   auto json = CreateDictionaryValue("{'name': 'base.reboot'}");
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, nullptr);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, nullptr);
   EXPECT_EQ("base.reboot", instance->GetName());
   EXPECT_EQ("robotd", instance->GetCategory());
   EXPECT_JSON_EQ("{}", *instance->GetParameters());
@@ -134,8 +138,8 @@
 TEST_F(CommandInstanceTest, FromJson_NotObject) {
   auto json = CreateValue("'string'");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   EXPECT_EQ("json_object_expected", error->GetCode());
   EXPECT_EQ("Command instance is not a JSON object", error->GetMessage());
@@ -144,8 +148,8 @@
 TEST_F(CommandInstanceTest, FromJson_NameMissing) {
   auto json = CreateDictionaryValue("{'param': 'value'}");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   EXPECT_EQ("parameter_missing", error->GetCode());
   EXPECT_EQ("Command name is missing", error->GetMessage());
@@ -154,8 +158,8 @@
 TEST_F(CommandInstanceTest, FromJson_UnknownCommand) {
   auto json = CreateDictionaryValue("{'name': 'robot.scream'}");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   EXPECT_EQ("invalid_command_name", error->GetCode());
   EXPECT_EQ("Unknown command received: robot.scream", error->GetMessage());
@@ -167,8 +171,8 @@
     'parameters': 'hello'
   })");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   auto inner = error->GetInnerError();
   EXPECT_EQ("json_object_expected", inner->GetCode());
@@ -186,8 +190,8 @@
     }
   })");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   auto first = error->GetFirstError();
   EXPECT_EQ("out_of_range", first->GetCode());
@@ -209,8 +213,8 @@
     },
     'results': {}
   })");
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, nullptr);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, nullptr);
   EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
                                     nullptr));
   EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index 8f85647..6baab68 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -107,8 +107,7 @@
                                 std::string* id,
                                 chromeos::ErrorPtr* error) {
   auto command_instance = CommandInstance::FromJson(
-      &command, commands::attributes::kCommand_Visibility_Local,
-      GetCommandDictionary(), nullptr, error);
+      &command, CommandOrigin::kLocal, GetCommandDictionary(), nullptr, error);
   if (!command_instance)
     return false;
 
diff --git a/libweave/src/commands/command_queue_unittest.cc b/libweave/src/commands/command_queue_unittest.cc
index dd644ac..cd91c3d 100644
--- a/libweave/src/commands/command_queue_unittest.cc
+++ b/libweave/src/commands/command_queue_unittest.cc
@@ -23,8 +23,8 @@
   std::unique_ptr<CommandInstance> CreateDummyCommandInstance(
       const std::string& name,
       const std::string& id) {
-    std::unique_ptr<CommandInstance> cmd{
-        new CommandInstance{name, "local", &command_definition_, {}}};
+    std::unique_ptr<CommandInstance> cmd{new CommandInstance{
+        name, CommandOrigin::kLocal, &command_definition_, {}}};
     cmd->SetID(id);
     return cmd;
   }
diff --git a/libweave/src/commands/dbus_command_proxy.cc b/libweave/src/commands/dbus_command_proxy.cc
index 86450e2..1ad5d59 100644
--- a/libweave/src/commands/dbus_command_proxy.cc
+++ b/libweave/src/commands/dbus_command_proxy.cc
@@ -8,6 +8,7 @@
 #include <chromeos/dbus/exported_object_manager.h>
 
 #include "libweave/src/commands/dbus_conversion.h"
+#include "weave/enum_to_string.h"
 
 using chromeos::dbus_utils::AsyncEventSequencer;
 using chromeos::dbus_utils::ExportedObjectManager;
@@ -29,10 +30,10 @@
   dbus_adaptor_.SetName(command_->GetName());
   dbus_adaptor_.SetCategory(command_->GetCategory());
   dbus_adaptor_.SetId(command_->GetID());
-  dbus_adaptor_.SetStatus(command_->GetStatus());
+  dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus()));
   dbus_adaptor_.SetProgress(
       DictionaryToDBusVariantDictionary(*command_->GetProgress()));
-  dbus_adaptor_.SetOrigin(command_->GetOrigin());
+  dbus_adaptor_.SetOrigin(EnumToString(command_->GetOrigin()));
   dbus_adaptor_.SetParameters(
       DictionaryToDBusVariantDictionary(*command_->GetParameters()));
   dbus_adaptor_.SetResults(
@@ -48,7 +49,7 @@
 }
 
 void DBusCommandProxy::OnStatusChanged() {
-  dbus_adaptor_.SetStatus(command_->GetStatus());
+  dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus()));
 }
 
 void DBusCommandProxy::OnProgressChanged() {
diff --git a/libweave/src/commands/dbus_command_proxy_unittest.cc b/libweave/src/commands/dbus_command_proxy_unittest.cc
index a289cad..7ae2b32 100644
--- a/libweave/src/commands/dbus_command_proxy_unittest.cc
+++ b/libweave/src/commands/dbus_command_proxy_unittest.cc
@@ -20,6 +20,8 @@
 #include "libweave/src/commands/command_instance.h"
 #include "libweave/src/commands/unittest_utils.h"
 
+#include "weave/enum_to_string.h"
+
 namespace weave {
 
 using ::testing::AnyNumber;
@@ -99,8 +101,8 @@
         '_jumpType': '_withKick'
       }
     })");
-    command_instance_ =
-        CommandInstance::FromJson(json.get(), "local", dict_, nullptr, nullptr);
+    command_instance_ = CommandInstance::FromJson(
+        json.get(), CommandOrigin::kLocal, dict_, nullptr, nullptr);
     command_instance_->SetID(kTestCommandId);
 
     // Set up a mock ExportedObject to be used with the DBus command proxy.
@@ -144,6 +146,12 @@
     return GetCommandProxy();
   }
 
+  CommandStatus GetCommandStatus() const {
+    CommandStatus status;
+    EXPECT_TRUE(StringToEnum(GetCommandAdaptor()->GetStatus(), &status));
+    return status;
+  }
+
   std::unique_ptr<CommandInstance> command_instance_;
   CommandDictionary dict_;
 
@@ -155,7 +163,7 @@
   VariantDictionary params = {
       {"height", int32_t{53}}, {"_jumpType", std::string{"_withKick"}},
   };
-  EXPECT_EQ(CommandInstance::kStatusQueued, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kQueued, GetCommandStatus());
   EXPECT_EQ(params, GetCommandAdaptor()->GetParameters());
   EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress());
   EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetResults());
@@ -168,8 +176,7 @@
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(2);
   EXPECT_TRUE(
       GetCommandInterface()->SetProgress(nullptr, {{"progress", int32_t{10}}}));
-  EXPECT_EQ(CommandInstance::kStatusInProgress,
-            GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kInProgress, GetCommandStatus());
 
   VariantDictionary progress{{"progress", int32_t{10}}};
   EXPECT_EQ(progress, GetCommandAdaptor()->GetProgress());
@@ -178,7 +185,7 @@
 TEST_F(DBusCommandProxyTest, SetProgress_OutOfRange) {
   EXPECT_FALSE(GetCommandInterface()->SetProgress(
       nullptr, {{"progress", int32_t{110}}}));
-  EXPECT_EQ(CommandInstance::kStatusQueued, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kQueued, GetCommandStatus());
   EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress());
 }
 
@@ -216,14 +223,13 @@
 TEST_F(DBusCommandProxyTest, Abort) {
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
   GetCommandInterface()->Abort();
-  EXPECT_EQ(CommandInstance::kStatusAborted, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kAborted, GetCommandStatus());
 }
 
 TEST_F(DBusCommandProxyTest, Cancel) {
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
   GetCommandInterface()->Cancel();
-  EXPECT_EQ(CommandInstance::kStatusCancelled,
-            GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kCancelled, GetCommandStatus());
 }
 
 TEST_F(DBusCommandProxyTest, Done) {
@@ -231,7 +237,7 @@
   // status: queued -> done
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
   GetCommandInterface()->Done();
-  EXPECT_EQ(CommandInstance::kStatusDone, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kDone, GetCommandStatus());
 }
 
 }  // namespace weave
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index 500761c..e733d1b 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -786,7 +786,7 @@
                                                   chromeos::ErrorPtr error) {
   base::DictionaryValue command_patch;
   command_patch.SetString(commands::attributes::kCommand_State,
-                          CommandInstance::kStatusAborted);
+                          EnumToString(CommandStatus::kAborted));
   if (error) {
     command_patch.SetString(commands::attributes::kCommand_ErrorCode,
                             chromeos::string_utils::Join(
@@ -997,8 +997,8 @@
   std::string command_id;
   chromeos::ErrorPtr error;
   auto command_instance = CommandInstance::FromJson(
-      &command, commands::attributes::kCommand_Visibility_Cloud,
-      command_manager_->GetCommandDictionary(), &command_id, &error);
+      &command, CommandOrigin::kCloud, command_manager_->GetCommandDictionary(),
+      &command_id, &error);
   if (!command_instance) {
     LOG(WARNING) << "Failed to parse a command instance: " << command;
     if (!command_id.empty())