update_engine: Add ChannelDowngradeBehavior

Add the ChannelDowngradeBehaviorPolicy to update_engine.
It will be used to decide whether to rollback and powerwash or wait
until the target channel catches up on a channel downgrade
(e.g. beta to stable).

BUG=chromium:1122531
TEST=FEATURES=test emerge-amd64-generic update_engine
TEST=manual test on device

Change-Id: Iad075e1019084fafec8509c23f2bd55e9755b39e
Reviewed-on: https://chromium-review.googlesource.com/c/aosp/platform/system/update_engine/+/2379690
Tested-by: Miriam Polzer <mpolzer@google.com>
Commit-Queue: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Amin Hassani <ahassani@chromium.org>
diff --git a/update_manager/boxed_value.cc b/update_manager/boxed_value.cc
index 4dff9ef..b499c30 100644
--- a/update_manager/boxed_value.cc
+++ b/update_manager/boxed_value.cc
@@ -232,4 +232,22 @@
   return retval;
 }
 
+template <>
+string BoxedValue::ValuePrinter<ChannelDowngradeBehavior>(const void* value) {
+  const ChannelDowngradeBehavior* val =
+      reinterpret_cast<const ChannelDowngradeBehavior*>(value);
+  switch (*val) {
+    case ChannelDowngradeBehavior::kUnspecified:
+      return "Unspecified";
+    case ChannelDowngradeBehavior::kWaitForVersionToCatchUp:
+      return "Wait for the target channel to catch up";
+    case ChannelDowngradeBehavior::kRollback:
+      return "Roll back and powerwash on channel downgrade";
+    case ChannelDowngradeBehavior::kAllowUserToConfigure:
+      return "User decides on channel downgrade behavior";
+  }
+  NOTREACHED();
+  return "Unknown";
+}
+
 }  // namespace chromeos_update_manager