| Index: client/site_tests/suite_Factory/control
|
| diff --git a/client/site_tests/suite_Factory/control b/client/site_tests/suite_Factory/control
|
| index a91060ead98d6e5a4206ee452b7a0cba6e81ce8c..07f069b65f3107338dd84aeccbc07a442d72aeaf 100644
|
| --- a/client/site_tests/suite_Factory/control
|
| +++ b/client/site_tests/suite_Factory/control
|
| @@ -23,19 +23,20 @@ control, the UI, and the tests (which are forked children of this
|
| control process). """
|
|
|
|
|
| +import imp
|
| import subprocess
|
| import sys
|
| import time
|
|
|
| +imp.load_source('common', job.autodir + '/bin/common.py')
|
| +from autotest_lib.client.bin import factory
|
|
|
| -_FACTORY_LOG_PATH = '/var/log/factory.log'
|
| -_RESULT_FILE_PATH = '/var/run/factory_test_result'
|
|
|
| -_REBOOT_SEQ_ITERATIONS = 2
|
| +_STATUS_FILE_PATH = job.autodir + '/results/default/status'
|
| +_FACTORY_UI_PATH = job.autodir + '/bin/factory_ui'
|
|
|
|
|
| -def XXX_log(s):
|
| - print >> sys.stderr, 'FACTORY: ' + s
|
| +_REBOOT_SEQ_ITERATIONS = 2
|
|
|
|
|
| # Hack to work around autotest's obsession with GRUB.
|
| @@ -43,102 +44,122 @@ job.bootloader.set_default = lambda x: None
|
| job.bootloader.boot_once = lambda x: None
|
|
|
|
|
| -# This is the definition of the test_data class, which holds
|
| -# factory-specific information on the tests to be run. Specifically,
|
| -# the order of items in the list reflect the order they are to be run
|
| -# on the line. The label and trigger fields contain the description
|
| -# strings to be shown in the test control list of the UI. The trigger
|
| -# field specifies the keyboard shortcut to allow on-demain
|
| -# out-of-order test activation. The dargs field allows test specific
|
| -# extra arguments. Note: this datastructure is defined as a string
|
| -# and exec()ed to allow it to be defined once here, but to be also
|
| -# used by the factory_ui process.
|
| -
|
| -test_data_class_def = '''
|
| -class test_data:
|
| -
|
| - def __init__(self, label_en='', label_zw='', formal_name=None,
|
| - tag_prefix=None, trigger=None, automated_seq=[], dargs={}):
|
| - self.__dict__.update(vars())
|
| -
|
| - def __repr__(self):
|
| - d = ['%s=%s' % (l,repr(v))
|
| - for l,v in self.__dict__.items()
|
| - if l != 'self']
|
| - c = ('%s' % self.__class__).rpartition('.')[2]
|
| - return '%s(%s)' % (c, ','.join(d))
|
| -'''
|
| -exec(test_data_class_def)
|
| -
|
| -
|
| test_list = [
|
| - test_data(
|
| + factory.TestData(
|
| label_en='start',
|
| + label_zw='開始',
|
| formal_name='factory_Dummy',
|
| - trigger='a',
|
| + trigger='e',
|
| dargs={'quit_key':ord(' '),
|
| 'msg':'Hit SPACE to start testing...\n按 "空白鍵" 開始測試...'}),
|
| - test_data(
|
| + factory.TestData(
|
| label_en='sync',
|
| + label_zw='同步',
|
| formal_name='factory_ScriptWrapper',
|
| trigger='s',
|
| - dargs={'cmdline':'/usr/local/autotest/exscr'}),
|
| - test_data(
|
| - label_en='leds',
|
| - formal_name='factory_Dummy',
|
| - trigger='l',
|
| - dargs={'msg':'LEDs test, one day...'}),
|
| - test_data(
|
| - label_en='usb',
|
| - formal_name='factory_ExternalStorage',
|
| - trigger='u'),
|
| - test_data(
|
| - label_en='display',
|
| - formal_name='factory_Display',
|
| - trigger='m'),
|
| - test_data(
|
| - label_en='camera',
|
| - formal_name='factory_Camera',
|
| - trigger='c'),
|
| - test_data(
|
| - label_en='keyboard',
|
| - label_zw='鍵盤',
|
| - formal_name='factory_Keyboard',
|
| - trigger='k',
|
| - dargs={'layout':'en_us'}),
|
| - test_data(
|
| - label_en='touchpad',
|
| - label_zw='觸控板',
|
| - formal_name='factory_Touchpad',
|
| - trigger='t'),
|
| - test_data(
|
| - label_en='devrec',
|
| - formal_name='factory_DeveloperRecovery',
|
| - trigger='d',
|
| - dargs={'layout':'devrec'}),
|
| - test_data(
|
| + dargs={'cmdline': job.autodir +
|
| + '/site_tests/factory_ScriptWrapper/dummy.sh'}),
|
| + factory.TestData(
|
| label_en='run-in',
|
| + label_zw='燒機測試',
|
| formal_name='step_runin',
|
| automated_seq=[
|
| - test_data(
|
| + factory.TestData(
|
| label_en='component validation',
|
| + label_zw='元件驗證',
|
| formal_name='hardware_Components',
|
| dargs={'approved_db':'qualified_components'}),
|
| - test_data(
|
| + factory.TestData(
|
| label_en='gpio switch check',
|
| + label_zw='檢查 gpio 開關',
|
| formal_name='hardware_GPIOSwitches'),
|
| - test_data(
|
| + factory.TestData(
|
| label_en='system stress',
|
| + label_zw='壓力測試',
|
| formal_name='hardware_SAT'),
|
| - test_data(
|
| + factory.TestData(
|
| label_en='reboot (%s times)' % _REBOOT_SEQ_ITERATIONS,
|
| + label_zw='重新開機 (%s 次)' % _REBOOT_SEQ_ITERATIONS,
|
| formal_name='factory_RebootStub')],
|
| trigger='r'),
|
| - test_data(
|
| - label_en='end',
|
| + factory.TestData(
|
| + label_en='keyboard',
|
| + label_zw='鍵盤',
|
| + formal_name='factory_Keyboard',
|
| + trigger='k',
|
| + dargs={'layout':'en_us'}),
|
| + factory.TestData(
|
| + label_en='touchpad',
|
| + label_zw='觸控板',
|
| + formal_name='factory_Touchpad',
|
| + trigger='t'),
|
| + factory.TestData(
|
| + label_en='leds',
|
| + label_zw='機身側燈',
|
| formal_name='factory_Dummy',
|
| - trigger='e',
|
| - dargs={'msg':'end of testing...\n(chinese)...'}),
|
| + trigger='l',
|
| + dargs={'msg':'LEDs test, one day...'}),
|
| + factory.TestData(
|
| + label_en='display',
|
| + label_zw='顯示',
|
| + formal_name='factory_Display',
|
| + trigger='m'),
|
| + factory.TestData(
|
| + label_en='camera',
|
| + label_zw='相機',
|
| + formal_name='factory_Camera',
|
| + trigger='c'),
|
| + factory.TestData(
|
| + label_en='audio',
|
| + label_zw='聲音',
|
| + formal_name='factory_Dummy',
|
| + trigger='a',
|
| + dargs={'msg':'audio test, one day...'}),
|
| + factory.TestData(
|
| + label_en='usb',
|
| + formal_name='factory_ExternalStorage',
|
| + trigger='u'),
|
| + factory.TestData(
|
| + label_en='sd',
|
| + formal_name='factory_ExternalStorage',
|
| + trigger='d'),
|
| + factory.TestData(
|
| + label_en='bluetooth',
|
| + label_zw='藍牙',
|
| + formal_name='factory_Dummy',
|
| + trigger='o',
|
| + dargs={'msg':'bluetooth test, one day...'}),
|
| + factory.TestData(
|
| + label_en='3g',
|
| + label_zw='第三代',
|
| + formal_name='factory_Dummy',
|
| + trigger='g',
|
| + dargs={'msg':'3g test, one day...'}),
|
| + factory.TestData(
|
| + label_en='wifi',
|
| + label_zw='無線上網',
|
| + formal_name='factory_Dummy',
|
| + trigger='w',
|
| + dargs={'msg':'wifi test, one day...'}),
|
| + factory.TestData(
|
| + label_en='devrec',
|
| + label_zw='特殊模式',
|
| + formal_name='factory_DeveloperRecovery',
|
| + trigger='b',
|
| + dargs={'layout':'devrec'}),
|
| + factory.TestData(
|
| + label_en='final check',
|
| + label_zw='最後檢查',
|
| + formal_name='factory_Dummy',
|
| + trigger='f',
|
| + dargs={'msg':'google required checks...'}),
|
| + factory.TestData(
|
| + label_en='wipe',
|
| + label_zw='擦拭',
|
| + formal_name='factory_Dummy',
|
| + trigger='x',
|
| + dargs={'msg':('hit TAB+RETURN to finish testing and wipe test image!' +
|
| + '...\n(chinese)...')}),
|
| ]
|
|
|
| for test in test_list:
|
| @@ -146,58 +167,14 @@ for test in test_list:
|
| for subtest in test.automated_seq:
|
| subtest.tag_prefix = test.formal_name
|
|
|
| -def test_map_index(formal_name, tag_prefix):
|
| - return formal_name + '.' + tag_prefix
|
| -
|
| -test_map = dict((test_map_index(test.formal_name, test.tag_prefix), test)
|
| - for test in test_list)
|
| -
|
| -trigger_set = set(test.trigger for test in test_list)
|
| -
|
| -
|
| -class factory_ui:
|
| - '''Support communication with the factory_ui process. To simplify
|
| - surrounding code, this communication is an exchange of well formed
|
| - python expressions. Basically send wraps its arguments in a call
|
| - to repr() and recv calls eval() to re-generate the python data.'''
|
| -
|
| - def __init__(self, factory_ui_path):
|
| - self._proc = subprocess.Popen(factory_ui_path,
|
| - stdin=subprocess.PIPE,
|
| - stdout=subprocess.PIPE)
|
| -
|
| - def __del__(self):
|
| - XXX_log('control deleting factory_ui subprocess')
|
| - self._proc.terminate()
|
| - time.sleep(1)
|
| - if self._proc.poll() is None:
|
| - self._proc.kill()
|
| -
|
| - def send(self, x=None):
|
| - print >> self._proc.stdin, repr(x)
|
| - self._proc.stdin.flush()
|
| -
|
| - def send_cmd_next_test(self):
|
| - self.send(('next_test', None))
|
| -
|
| - def send_cmd_switch_to(self, trigger):
|
| - self.send(('switch_to', trigger))
|
| -
|
| - def recv(self):
|
| - return eval(self._proc.stdout.readline().rstrip())
|
| -
|
| - def recv_target_test_update(self):
|
| - update = self.recv()
|
| - XXX_log('control recv target test %s' % repr(update))
|
| - formal_name, tag_prefix, count = update
|
| - test = test_map.get(test_map_index(formal_name, tag_prefix), None)
|
| - return (test, count)
|
| +test_map = factory.make_test_map(test_list)
|
| +trigger_set = factory.make_trigger_set(test_list)
|
|
|
|
|
| def step_reboot_seq(i, tag):
|
| if i < _REBOOT_SEQ_ITERATIONS:
|
| job.next_step_prepend([step_reboot_seq, i + 1, tag])
|
| - XXX_log('rebooting (iteration %d)' % i)
|
| + factory.log('rebooting (iteration %d)' % i)
|
| time.sleep(5)
|
| job.reboot()
|
| else:
|
| @@ -230,26 +207,21 @@ def step_init():
|
| When the tests themselves run, they are expected to look for
|
| (using the factory_test library) keyboard events that match test
|
| switching triggers. When a trigger happens, it should be written
|
| - to the _RESULT_FILE_PATH, which will be read after the test
|
| + to the factory.RESULT_FILE_PATH, which will be read after the test
|
| completed and the result comminicated onwards to the UI.'''
|
|
|
| job.next_step([step_init])
|
|
|
| - status_file_path = job.autodir + '/results/default/status'
|
| - factory_ui_path = job.autodir + '/deps/factory/ui'
|
| -
|
| - ui = factory_ui(factory_ui_path)
|
| + ui = factory.UiClient(_FACTORY_UI_PATH)
|
|
|
| - ui.send(test_data_class_def)
|
| ui.send(test_list)
|
| - ui.send(status_file_path)
|
| - ui.send(_FACTORY_LOG_PATH)
|
| + ui.send(_STATUS_FILE_PATH)
|
|
|
| test_widget_size = ui.recv()
|
| - XXX_log('received test_widget_size = %s' % repr(test_widget_size))
|
| + factory.log('received test_widget_size = %s' % repr(test_widget_size))
|
|
|
| ui.send_cmd_next_test()
|
| - test, test_count = ui.recv_target_test_update()
|
| + test, test_count = ui.recv_target_test_update(test_map)
|
|
|
| while test is not None:
|
| if test.automated_seq:
|
| @@ -264,11 +236,11 @@ def step_init():
|
| 'test_count': test_count,
|
| 'test_widget_size': test_widget_size,
|
| 'trigger_set': trigger_set,
|
| - 'result_file_path': _RESULT_FILE_PATH})
|
| - with open(_RESULT_FILE_PATH, 'w') as file:
|
| + 'result_file_path': factory.RESULT_FILE_PATH})
|
| + with open(factory.RESULT_FILE_PATH, 'w') as file:
|
| file.write('None\n')
|
| job.run_test(test.formal_name, **dargs)
|
| - with open(_RESULT_FILE_PATH, 'r') as file:
|
| + with open(factory.RESULT_FILE_PATH, 'r') as file:
|
| result = eval(file.readline())
|
|
|
| if result is not None:
|
| @@ -276,6 +248,6 @@ def step_init():
|
| else:
|
| ui.send_cmd_next_test()
|
|
|
| - test, test_count = ui.recv_target_test_update()
|
| + test, test_count = ui.recv_target_test_update(test_map)
|
|
|
| - XXX_log('factory testing completed')
|
| + factory.log('factory testing completed')
|
|
|