Only prevent boot image downgrade if sysprop set.

Only return timestamp error if ro.build.ab_update.gki.prevent_downgrade_version is set.
Otherwise, log warning message and continue the update.

This allows devices that does not support GKI updates to install OTA packages where
the boot image has a lower version than the existing, which is supported before.

Bug: 162623577
Test: apply OTA on devices with and without sysprop set
Change-Id: Ie98fb49ffaae1aa60fc94766f53a6fbbae519a5b
diff --git a/hardware_android_unittest.cc b/hardware_android_unittest.cc
index 9a491f3..679356c 100644
--- a/hardware_android_unittest.cc
+++ b/hardware_android_unittest.cc
@@ -14,54 +14,70 @@
 // limitations under the License.
 //
 
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
 #include "update_engine/common/error_code.h"
-#include "update_engine/common/test_utils.h"
 #include "update_engine/hardware_android.h"
 
+using ::testing::NiceMock;
+using ::testing::Return;
+
 namespace chromeos_update_engine {
 
 TEST(HardwareAndroidTest, IsKernelUpdateValid) {
   EXPECT_EQ(ErrorCode::kSuccess,
-            HardwareAndroid::IsKernelUpdateValid("5.4.42-not-gki", ""))
+            HardwareAndroid::IsKernelUpdateValid(
+                "5.4.42-not-gki", "", true /*prevent_downgrade*/))
       << "Legacy update should be fine";
 
-  EXPECT_EQ(ErrorCode::kSuccess,
-            HardwareAndroid::IsKernelUpdateValid("5.4.42-not-gki",
-                                                 "5.4.42-android12-0"))
+  EXPECT_EQ(
+      ErrorCode::kSuccess,
+      HardwareAndroid::IsKernelUpdateValid(
+          "5.4.42-not-gki", "5.4.42-android12-0", true /*prevent_downgrade*/))
       << "Update to GKI should be fine";
 
-  EXPECT_EQ(
-      ErrorCode::kDownloadManifestParseError,
-      HardwareAndroid::IsKernelUpdateValid("5.4.42-not-gki", "5.4.42-not-gki"))
+  EXPECT_EQ(ErrorCode::kDownloadManifestParseError,
+            HardwareAndroid::IsKernelUpdateValid(
+                "5.4.42-not-gki", "5.4.42-not-gki", true /*prevent_downgrade*/))
       << "Should report parse error for invalid version field";
 
   EXPECT_EQ(ErrorCode::kSuccess,
-            HardwareAndroid::IsKernelUpdateValid(
-                "5.4.42-android12-0-something", "5.4.42-android12-0-something"))
+            HardwareAndroid::IsKernelUpdateValid("5.4.42-android12-0-something",
+                                                 "5.4.42-android12-0-something",
+                                                 true /*prevent_downgrade*/))
       << "Self update should be fine";
 
   EXPECT_EQ(ErrorCode::kSuccess,
-            HardwareAndroid::IsKernelUpdateValid(
-                "5.4.42-android12-0-something", "5.4.43-android12-0-something"))
+            HardwareAndroid::IsKernelUpdateValid("5.4.42-android12-0-something",
+                                                 "5.4.43-android12-0-something",
+                                                 true /*prevent_downgrade*/))
       << "Sub-level update should be fine";
 
   EXPECT_EQ(
       ErrorCode::kSuccess,
       HardwareAndroid::IsKernelUpdateValid("5.4.42-android12-0-something",
-                                           "5.10.10-android12-0-something"))
+                                           "5.10.10-android12-0-something",
+                                           true /*prevent_downgrade*/))
       << "KMI version update should be fine";
 
   EXPECT_EQ(ErrorCode::kPayloadTimestampError,
             HardwareAndroid::IsKernelUpdateValid("5.4.42-android12-0-something",
-                                                 "5.4.5-android12-0-something"))
+                                                 "5.4.5-android12-0-something",
+                                                 true /*prevent_downgrade*/))
       << "Should detect sub-level downgrade";
 
   EXPECT_EQ(ErrorCode::kPayloadTimestampError,
             HardwareAndroid::IsKernelUpdateValid("5.4.42-android12-0-something",
-                                                 "5.1.5-android12-0-something"))
+                                                 "5.1.5-android12-0-something",
+                                                 true /*prevent_downgrade*/))
       << "Should detect KMI version downgrade";
+
+  EXPECT_EQ(ErrorCode::kSuccess,
+            HardwareAndroid::IsKernelUpdateValid("5.4.42-android12-0-something",
+                                                 "5.4.5-android12-0-something",
+                                                 false /*prevent_downgrade*/))
+      << "Should suppress sub-level downgrade";
 }
 
 }  // namespace chromeos_update_engine