power_BatteryDrain: Use percent_display_charge()

Changes logic to use percent_display_charge() instead of
percent_current_charge() for battery percentage calculations. This is
important since this test is used in the context of device policies
which are written using display battery percentage calculation.

BUG=b:139201701, b:138940522, b:143173004
TEST=test_that -b sarien \
--args='drain_to_percent=90 drain_timeout=300' $DUT power_BatteryDrain

Change-Id: I5f7ca1a6f4aaffea17807133fe37bd08b75340f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/1968748
Reviewed-by: Derek Beckett <dbeckett@chromium.org>
Reviewed-by: Oleh Lamzin <lamzin@google.com>
Tested-by: Daniel Campello <campello@chromium.org>
Commit-Queue: Daniel Campello <campello@chromium.org>
diff --git a/client/cros/power/power_status.py b/client/cros/power/power_status.py
index 1f221e9..ef8ae36 100644
--- a/client/cros/power/power_status.py
+++ b/client/cros/power/power_status.py
@@ -538,6 +538,13 @@
                self.battery.charge_full_design
 
 
+    def percent_display_charge(self):
+        """Returns current display charge in percent.
+        """
+        keyvals = parse_power_supply_info()
+        return float(keyvals['Battery']['display percentage'])
+
+
     def assert_battery_state(self, percent_initial_charge_min):
         """Check initial power configuration state is battery.
 
@@ -562,7 +569,7 @@
 
     def assert_battery_in_range(self, min_level, max_level):
         """Raise a error.TestFail if the battery level is not in range."""
-        current_percent = self.percent_current_charge()
+        current_percent = self.percent_display_charge()
         if not (min_level <= current_percent <= max_level):
             raise error.TestFail('battery must be in range [{}, {}]'.format(
                                  min_level, max_level))
diff --git a/client/site_tests/power_BatteryDrain/power_BatteryDrain.py b/client/site_tests/power_BatteryDrain/power_BatteryDrain.py
index aeb3e66..09e3f6a 100644
--- a/client/site_tests/power_BatteryDrain/power_BatteryDrain.py
+++ b/client/site_tests/power_BatteryDrain/power_BatteryDrain.py
@@ -85,7 +85,7 @@
                 status = power_status.get_status()
                 if status.on_ac():
                     raise ac_error
-                return status.percent_current_charge() <= drain_to_percent
+                return status.percent_display_charge() <= drain_to_percent
 
             err = error.TestFail(
                 "Battery did not drain to {} percent in {} seconds".format(
diff --git a/server/cros/power/utils.py b/server/cros/power/utils.py
index 253c8a8..c9179e8 100644
--- a/server/cros/power/utils.py
+++ b/server/cros/power/utils.py
@@ -21,7 +21,7 @@
     @throws: A TestFail error if getting the current battery level, setting the
              servo's charge state, or running either of the client tests fails.
     """
-    current_level = host.get_battery_percentage()
+    current_level = host.get_battery_display_percentage()
     if current_level >= min_level and current_level <= max_level:
         return
 
diff --git a/server/hosts/cros_host.py b/server/hosts/cros_host.py
index 343465b..13a9cd8 100644
--- a/server/hosts/cros_host.py
+++ b/server/hosts/cros_host.py
@@ -852,6 +852,20 @@
             return None
 
 
+    def get_battery_display_percentage(self):
+        """Get the battery display percentage.
+
+        @return: The display percentage of battery level, value range from
+                 0-100. Return None if the battery info cannot be retrieved.
+        """
+        try:
+            info = self.get_power_supply_info()
+            logging.info(info)
+            return float(info['Battery']['display percentage'])
+        except (KeyError, ValueError, error.AutoservRunError):
+            return None
+
+
     def is_ac_connected(self):
         """Check if the dut has power adapter connected and charging.