faft: Refactor the delay constants out to a new class FAFTDelayConstants

This refactoring helps the support of per-platform delay constants. Such
that we can use some short-delay-setting for high-speed devices to reduce
unnecessary waiting time.

BUG=chromium-os:35792
TEST=run_remote_tests.sh --board link --remote dut suite:faft

Change-Id: I1080cb6dcff767b0aef869b0f3c4dbf2a949e923
Reviewed-on: https://gerrit.chromium.org/gerrit/36763
Commit-Ready: Tom Wai-Hong Tam <waihong@chromium.org>
Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
Tested-by: Tom Wai-Hong Tam <waihong@chromium.org>
diff --git a/server/cros/faftsequence.py b/server/cros/faftsequence.py
index 60c2ead..107e3a6 100644
--- a/server/cros/faftsequence.py
+++ b/server/cros/faftsequence.py
@@ -15,6 +15,7 @@
 from autotest_lib.server.cros import vboot_constants as vboot
 from autotest_lib.server.cros.chrome_ec import ChromeEC
 from autotest_lib.server.cros.faft_client_attribute import FAFTClientAttribute
+from autotest_lib.server.cros.faft_delay_constants import FAFTDelayConstants
 from autotest_lib.server.cros.servo_test import ServoTest
 from autotest_lib.site_utils import lab_test
 from autotest_lib.site_utils.chromeos_test.common_util import ChromeOSTestError
@@ -86,38 +87,6 @@
     OTHER_KERNEL_MAP = {'a':'4', 'b':'2', '2':'4', '4':'2', '3':'4', '5':'2'}
     OTHER_ROOTFS_MAP = {'a':'5', 'b':'3', '2':'5', '4':'3', '3':'5', '5':'3'}
 
-    # Delay between power-on and firmware screen.
-    FIRMWARE_SCREEN_DELAY = 10
-    # Delay between passing firmware screen and text mode warning screen.
-    TEXT_SCREEN_DELAY = 20
-    # Delay for waiting beep done.
-    BEEP_DELAY = 1
-    # Delay of loading the USB kernel.
-    USB_LOAD_DELAY = 10
-    # Delay between USB plug-out and plug-in.
-    USB_PLUG_DELAY = 10
-    # Delay after running the 'sync' command.
-    SYNC_DELAY = 5
-    # Delay for waiting client to return before EC reboot
-    EC_REBOOT_DELAY = 1
-    # Delay for waiting client to full power off
-    FULL_POWER_OFF_DELAY = 30
-    # Delay between EC reboot and pressing power button
-    POWER_BTN_DELAY = 0.5
-    # Delay of EC software sync hash calculating time
-    SOFTWARE_SYNC_DELAY = 6
-    # Delay between EC boot and ChromeEC console functional
-    EC_BOOT_DELAY = 0.5
-    # Duration of holding cold_reset to reset device
-    COLD_RESET_DELAY = 0.1
-    # devserver startup time
-    DEVSERVER_DELAY = 10
-    # Delay of reseting TPM with factory install shim
-    RESET_TPM_WITH_INSTALL_SHIM_DELAY = 120
-
-    # The developer screen timeouts fit our spec.
-    DEV_SCREEN_TIMEOUT = 30
-
     CHROMEOS_MAGIC = "CHROMEOS"
     CORRUPTED_MAGIC = "CORRUPTD"
 
@@ -211,6 +180,8 @@
         if use_faft:
             self.client_attr = FAFTClientAttribute(
                     self.faft_client.get_platform_name())
+            self.delay = FAFTDelayConstants(
+                    self.faft_client.get_platform_name())
 
             if self.client_attr.chrome_ec:
                 self.ec = ChromeEC(self.servo)
@@ -471,7 +442,7 @@
                         image_base)
 
             # Wait devserver startup completely
-            time.sleep(self.DEVSERVER_DELAY)
+            time.sleep(self.delay.devserver)
             # devserver is a service running forever. If it is terminated,
             # some error does happen.
             if devserver.poll():
@@ -924,33 +895,33 @@
 
     def wait_fw_screen_and_ctrl_d(self):
         """Wait for firmware warning screen and press Ctrl-D."""
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         self.send_ctrl_d_to_dut()
 
 
     def wait_fw_screen_and_ctrl_u(self):
         """Wait for firmware warning screen and press Ctrl-U."""
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         self.send_ctrl_u_to_dut()
 
 
     def wait_fw_screen_and_trigger_recovery(self, need_dev_transition=False):
         """Wait for firmware warning screen and trigger recovery boot."""
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         self.send_enter_to_dut()
 
         # For Alex/ZGB, there is a dev warning screen in text mode.
         # Skip it by pressing Ctrl-D.
         if need_dev_transition:
-            time.sleep(self.TEXT_SCREEN_DELAY)
+            time.sleep(self.delay.legacy_text_screen)
             self.send_ctrl_d_to_dut()
 
 
     def wait_fw_screen_and_unplug_usb(self):
         """Wait for firmware warning screen and then unplug the servo USB."""
-        time.sleep(self.USB_LOAD_DELAY)
+        time.sleep(self.delay.load_usb)
         self.servo.set('usb_mux_sel1', 'servo_sees_usbkey')
-        time.sleep(self.USB_PLUG_DELAY)
+        time.sleep(self.delay.between_usb_plug)
 
 
     def wait_fw_screen_and_plug_usb(self):
@@ -961,7 +932,7 @@
 
     def wait_fw_screen_and_press_power(self):
         """Wait for firmware warning screen and press power button."""
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         # While the firmware screen, the power button probing loop sleeps
         # 0.25 second on every scan. Use the normal delay (1.2 second) for
         # power press.
@@ -970,19 +941,19 @@
 
     def wait_longer_fw_screen_and_press_power(self):
         """Wait for firmware screen without timeout and press power button."""
-        time.sleep(self.DEV_SCREEN_TIMEOUT)
+        time.sleep(self.delay.dev_screen_timeout)
         self.wait_fw_screen_and_press_power()
 
 
     def wait_fw_screen_and_close_lid(self):
         """Wait for firmware warning screen and close lid."""
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         self.servo.lid_close()
 
 
     def wait_longer_fw_screen_and_close_lid(self):
         """Wait for firmware screen without timeout and close lid."""
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         self.wait_fw_screen_and_close_lid()
 
 
@@ -1036,17 +1007,17 @@
         elif self.client_attr.chrome_ec:
             # Cold reset to clear EC_IN_RW signal
             self.servo.set('cold_reset', 'on')
-            time.sleep(self.COLD_RESET_DELAY)
+            time.sleep(self.delay.hold_cold_reset)
             self.servo.set('cold_reset', 'off')
-            time.sleep(self.EC_BOOT_DELAY)
+            time.sleep(self.delay.ec_boot_to_console)
             self.ec.send_command("reboot ap-off")
-            time.sleep(self.EC_BOOT_DELAY)
+            time.sleep(self.delay.ec_boot_to_console)
             self.ec.send_command("hostevent set 0x4000")
             self.servo.power_short_press()
         else:
             self.servo.enable_recovery_mode()
             self.cold_reboot()
-            time.sleep(self.EC_REBOOT_DELAY)
+            time.sleep(self.delay.ec_reboot_cmd)
             self.servo.disable_recovery_mode()
 
 
@@ -1076,12 +1047,12 @@
         Args:
           dev: True if switching into dev mode. Otherwise, False.
         """
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         if dev:
             self.send_ctrl_d_to_dut()
         else:
             self.send_enter_to_dut()
-        time.sleep(self.FIRMWARE_SCREEN_DELAY)
+        time.sleep(self.delay.firmware_screen)
         self.send_enter_to_dut()
 
 
@@ -1185,7 +1156,7 @@
                 (self.KERNEL_MAP[part], root_dev))
         # Safer to sync and wait until the cgpt status written to the disk.
         self.faft_client.run_shell_command('sync')
-        time.sleep(self.SYNC_DELAY)
+        time.sleep(self.delay.sync)
 
 
     def warm_reboot(self):
@@ -1210,7 +1181,7 @@
             self.servo.set('pwr_button', 'press')
             self.servo.set('cold_reset', 'on')
             self.servo.set('cold_reset', 'off')
-            time.sleep(self.POWER_BTN_DELAY)
+            time.sleep(self.delay.ec_boot_to_pwr_button)
             self.servo.set('pwr_button', 'release')
         elif self.check_ec_capability(suppress_warning=True):
             # We don't use servo.cold_reset() here because software sync is
@@ -1226,7 +1197,7 @@
             #    press.
             self.servo.set('cold_reset', 'on')
             self.servo.set('cold_reset', 'off')
-            time.sleep(self.POWER_BTN_DELAY)
+            time.sleep(self.delay.ec_boot_to_pwr_button)
             self.servo.power_short_press()
         else:
             self.servo.cold_reset()
@@ -1238,7 +1209,7 @@
         This is the default reboot action on FAFT.
         """
         self.faft_client.run_shell_command('sync')
-        time.sleep(self.SYNC_DELAY)
+        time.sleep(self.delay.sync)
         self.warm_reboot()
 
 
@@ -1248,7 +1219,7 @@
         This reboot action is used to reset EC for recovery mode.
         """
         self.faft_client.run_shell_command('sync')
-        time.sleep(self.SYNC_DELAY)
+        time.sleep(self.delay.sync)
         self.cold_reboot()
 
 
@@ -1262,12 +1233,12 @@
                   cold: Cold/hard reboot.
         """
         self.faft_client.run_shell_command('sync')
-        time.sleep(self.SYNC_DELAY)
+        time.sleep(self.delay.sync)
         # Since EC reboot happens immediately, delay before actual reboot to
         # allow FAFT client returning.
         self.faft_client.run_shell_command('(sleep %d; ectool reboot_ec %s)&' %
-                                           (self.EC_REBOOT_DELAY, args))
-        time.sleep(self.EC_REBOOT_DELAY)
+                                           (self.delay.ec_reboot_cmd, args))
+        time.sleep(self.delay.ec_reboot_cmd)
         self.check_lid_and_power_on()
 
 
@@ -1283,7 +1254,7 @@
             self.enable_dev_mode_and_reboot()
         time.sleep(self.SYNC_DELAY)
         self.enable_rec_mode_and_reboot()
-        time.sleep(self.RESET_TPM_WITH_INSTALL_SHIM_DELAY)
+        time.sleep(self.delay.install_shim_done)
         self.warm_reboot()
 
 
@@ -1291,7 +1262,7 @@
         """Shutdown the device by pressing power button and power on again."""
         # Press power button to trigger Chrome OS normal shutdown process.
         self.servo.power_normal_press()
-        time.sleep(self.FULL_POWER_OFF_DELAY)
+        time.sleep(self.delay.shutdown)
         # Short press power button to boot DUT again.
         self.servo.power_short_press()
 
@@ -1304,7 +1275,7 @@
         necessary.
         """
         if self.servo.get("lid_open") == "no":
-            time.sleep(self.SOFTWARE_SYNC_DELAY)
+            time.sleep(self.delay.software_sync)
             self.servo.power_short_press()