update_engine: Test update_engine printouts

These tests are added to enforce sensitive variables stay invariant
with no room or future mistakes to occur again on breaking autotest
and cros flash process.

BUG=chromium:871340
TEST=FEATURES="test" emerge-$BOARD update_engine update_engine-client
TEST=/usr/bin/update_engine_client --status
TEST=cros flash $TEST_IP ../build/image/... # works

Change-Id: Ibcce5c1dee56cf5bca201a86a143a87b033605bc
Reviewed-on: https://chromium-review.googlesource.com/c/aosp/platform/system/update_engine/+/1732410
Tested-by: Jae Hoon Kim <kimjae@chromium.org>
Auto-Submit: Jae Hoon Kim <kimjae@chromium.org>
Reviewed-by: Amin Hassani <ahassani@chromium.org>
Commit-Queue: Jae Hoon Kim <kimjae@chromium.org>
diff --git a/Android.bp b/Android.bp
index e9b7b13..2e215c5 100644
--- a/Android.bp
+++ b/Android.bp
@@ -661,6 +661,7 @@
         "payload_generator/zip_unittest.cc",
         "testrunner.cc",
         "update_attempter_android_unittest.cc",
+        "update_status_utils_unittest.cc",
     ],
 }
 
diff --git a/BUILD.gn b/BUILD.gn
index 5e76bfb..5f5aa54 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -537,6 +537,7 @@
       "update_manager/update_time_restrictions_policy_impl_unittest.cc",
       "update_manager/variable_unittest.cc",
       "update_manager/weekly_time_unittest.cc",
+      "update_status_utils_unittest.cc",
     ]
 
     # //common-mk:test should be on the top.
diff --git a/update_status_utils.cc b/update_status_utils.cc
index a0aa2ed..0758314 100644
--- a/update_status_utils.cc
+++ b/update_status_utils.cc
@@ -27,6 +27,19 @@
 
 namespace chromeos_update_engine {
 
+namespace {
+
+// Note: Do not change these, autotest depends on these string variables being
+// exactly these matches.
+const char kCurrentOp[] = "CURRENT_OP";
+const char kIsInstall[] = "IS_INSTALL";
+const char kLastCheckedTime[] = "LAST_CHECKED_TIME";
+const char kNewSize[] = "NEW_SIZE";
+const char kNewVersion[] = "NEW_VERSION";
+const char kProgress[] = "PROGRESS";
+
+}  // namespace
+
 const char* UpdateStatusToString(const UpdateStatus& status) {
   switch (status) {
     case UpdateStatus::IDLE:
@@ -61,21 +74,21 @@
   KeyValueStore key_value_store;
 
 #if BASE_VER < 576279
-  key_value_store.SetString("LAST_CHECKED_TIME",
+  key_value_store.SetString(kLastCheckedTime,
                             base::Int64ToString(status.last_checked_time));
-  key_value_store.SetString("PROGRESS", base::DoubleToString(status.progress));
-  key_value_store.SetString("NEW_SIZE",
+  key_value_store.SetString(kProgress, base::DoubleToString(status.progress));
+  key_value_store.SetString(kNewSize,
                             base::Uint64ToString(status.new_size_bytes));
 #else
-  key_value_store.SetString("LAST_CHECKED_TIME",
+  key_value_store.SetString(kLastCheckedTime,
                             base::NumberToString(status.last_checked_time));
-  key_value_store.SetString("PROGRESS", base::NumberToString(status.progress));
-  key_value_store.SetString("NEW_SIZE",
+  key_value_store.SetString(kProgress, base::NumberToString(status.progress));
+  key_value_store.SetString(kNewSize,
                             base::NumberToString(status.new_size_bytes));
 #endif
-  key_value_store.SetString("CURRENT_OP", UpdateStatusToString(status.status));
-  key_value_store.SetString("NEW_VERSION", status.new_version);
-  key_value_store.SetBoolean("IS_INSTALL", status.is_install);
+  key_value_store.SetString(kCurrentOp, UpdateStatusToString(status.status));
+  key_value_store.SetString(kNewVersion, status.new_version);
+  key_value_store.SetBoolean(kIsInstall, status.is_install);
 
   return key_value_store.SaveToString();
 }
diff --git a/update_status_utils_unittest.cc b/update_status_utils_unittest.cc
new file mode 100644
index 0000000..dbd80d7
--- /dev/null
+++ b/update_status_utils_unittest.cc
@@ -0,0 +1,59 @@
+//
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "update_engine/update_status_utils.h"
+
+#include <string>
+
+#include <gtest/gtest.h>
+
+using std::string;
+
+namespace chromeos_update_engine {
+
+TEST(UpdateStatusUtilsTest, UpdateEngineStatusToStringDefaultTest) {
+  string print =
+      R"(CURRENT_OP=UPDATE_STATUS_IDLE
+IS_INSTALL=false
+LAST_CHECKED_TIME=0
+NEW_SIZE=0
+NEW_VERSION=
+PROGRESS=0.0
+)";
+  EXPECT_EQ(print, UpdateEngineStatusToString({}));
+}
+
+TEST(UpdateStatusUtilsTest, UpdateEngineStatusToStringTest) {
+  update_engine::UpdateEngineStatus update_engine_status = {
+      .status = update_engine::UpdateStatus::CHECKING_FOR_UPDATE,
+      .is_install = true,
+      .last_checked_time = 156000000,
+      .new_size_bytes = 888,
+      .new_version = "12345.0.0",
+      .progress = 0.5,
+  };
+  string print =
+      R"(CURRENT_OP=UPDATE_STATUS_CHECKING_FOR_UPDATE
+IS_INSTALL=true
+LAST_CHECKED_TIME=156000000
+NEW_SIZE=888
+NEW_VERSION=12345.0.0
+PROGRESS=0.5
+)";
+  EXPECT_EQ(print, UpdateEngineStatusToString(update_engine_status));
+}
+
+}  // namespace chromeos_update_engine