factory_Start: support readning serial number from a local file

BUG=chrome-os-partner:12567
TEST=emerge-stout autotest-private-board, then test factory_test image

Change-Id: I3443d5164c7f348dce73da0586c395824ec14a96
Reviewed-on: https://gerrit.chromium.org/gerrit/33175
Tested-by: Bowgo Tsai <bowgotsai@chromium.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Commit-Ready: Bowgo Tsai <bowgotsai@chromium.org>
Reviewed-by: Shuo-Peng Liao <deanliao@chromium.org>
diff --git a/client/site_tests/factory_Start/factory_Start.py b/client/site_tests/factory_Start/factory_Start.py
index ab64c51..80269d4 100755
--- a/client/site_tests/factory_Start/factory_Start.py
+++ b/client/site_tests/factory_Start/factory_Start.py
@@ -46,6 +46,12 @@
 _MSG_TASK_SPACE = (
         'Hit SPACE to start testing...\n'
         '按 "空白键" 开始测试...')
+_MSG_TASK_SHOP_FLOOR = (
+        'Preparing to connect to shop floor server.\n'
+        'Please plug in network cable and hit SPACE\n'
+        'to start testing...\n'
+        '准备连线 shop floor 伺服器。 \n'
+        '请插上网路线后,按下"空白键"开始测试...')
 
 _MSG_NO_SHOP_FLOOR_SERVER_URL = (
         'No shop floor server URL. Auto-testing stopped.\n\n'
@@ -62,10 +68,12 @@
 
 
 class PressSpaceTask(task.FactoryTask):
+    def __init__(self, pop_up_message):
+        self.pop_up_message = pop_up_message
 
     def start(self):
         self.add_widget(
-                ui.make_label(_MSG_TASK_SPACE, font=ui.LABEL_LARGE_FONT))
+                ui.make_label(self.pop_up_message, font=ui.LABEL_LARGE_FONT))
         self.connect_window('key-press-event', self.window_key_press)
 
     def window_key_press(self, window, event):
@@ -75,7 +83,6 @@
             factory.log('PressSpaceTask: non-space hit: %d' % event.keyval)
         return True
 
-
 class ExternalPowerTask(task.FactoryTask):
 
     AC_CONNECTED = 1
@@ -120,8 +127,9 @@
 
 
 class ShopFloorTask(task.FactoryTask):
-    def __init__(self, server_url):
+    def __init__(self, server_url, serial_number):
         self.server_url = server_url or shopfloor.detect_default_server_url()
+        self.serial_number = serial_number
 
     def start(self):
         # Many developers will try to run factory test image directly without
@@ -133,10 +141,17 @@
             return
 
         shopfloor.set_server_url(self.server_url)
-        self.add_widget(ui.make_input_window(
-                prompt=_MSG_TASK_SERIAL,
-                on_validate=self.validate_serial_number,
-                on_complete=self.complete_serial_task))
+
+        # If no partner-specific serial number, pop-up a make_input window.
+        if self.serial_number is None:
+            self.add_widget(ui.make_input_window(
+                    prompt=_MSG_TASK_SERIAL,
+                    on_validate=self.validate_serial_number,
+                    on_complete=self.complete_serial_task))
+        else:
+            # Use partner-specific serial number.
+            if self.validate_serial_number(self.serial_number):
+                self.complete_serial_task(self.serial_number)
 
     def validate_serial_number(self, serial):
         # This is a callback function for widgets created by make_input_window.
@@ -180,7 +195,9 @@
                  press_to_continue=True,
                  require_external_power=False,
                  require_shop_floor=None,
-                 shop_floor_server_url=None):
+                 shop_floor_server_url=None,
+                 serial_number=None,
+                 press_to_start_shop_floor=False):
         factory.log('%s run_once' % self.__class__)
 
         self._task_list = []
@@ -188,16 +205,20 @@
         # Reset shop floor data only if require_shop_floor is explicitly
         # defined, for test lists using factory_Start multiple times between
         # groups (ex, to prompt for space or check power adapter).
+
         if require_shop_floor is not None:
             shopfloor.reset()
             shopfloor.set_enabled(require_shop_floor)
+            if press_to_start_shop_floor:
+                self._task_list.append(PressSpaceTask(_MSG_TASK_SHOP_FLOOR))
 
         if require_shop_floor:
-            self._task_list.append(ShopFloorTask(shop_floor_server_url))
+            self._task_list.append(
+                ShopFloorTask(shop_floor_server_url, serial_number))
         if require_external_power:
             self._task_list.append(ExternalPowerTask())
         if press_to_continue:
-            self._task_list.append(PressSpaceTask())
+            self._task_list.append(PressSpaceTask(_MSG_TASK_SPACE))
 
         if self._task_list:
             task.run_factory_tasks(self.job, self._task_list)