blob: 9a834d95bf73c79aa14cf9943e63f743b0c238ff [file] [log] [blame]
# -*- coding: utf-8 -*-
# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import gtk
from gtk import gdk
import os
import time
from autotest_lib.client.bin import factory
from autotest_lib.client.bin import factory_ui_lib as ful
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import gooftools
# TODO(hungte) We may consider using real factory_Verify in the future.
class MiniVerifier(object):
""" Simplified version of factory_Verify. """
def set_test_info(self, status_file, test_list):
""" Configures the test list map """
self.status_file = status_file
self.test_list = test_list
def check_developer_switch(self):
""" Checks if developer switch button is disabled """
try:
gooftools.run('gooftool --verify_switch_dev --verbose')
except:
return False
return True
def check_write_protect(self):
""" Checks if hardware write protection pin is enabled """
try:
gooftools.run('gooftool --verify_switch_wp --verbose')
except:
return False
return True
def check_required_tests(self):
""" Checks if all previous tests are passed """
db = factory.TestDatabase(self.test_list)
status_map = factory.StatusMap(self.test_list, self.status_file, db)
if status_map.filter_by_status(ful.FAILED):
return False
return True
class factory_PreFinalCheck(test.test):
version = 3
# messages for localization
MSG_START = ("Press SPACE to start checking for finalization.\n"
"請按空白鍵開始檢查系統是否已可開始最終程序。")
MSG_CHECKING = ("Checking system status for finalization...\n"
"正在檢查系統是否已可執行最終程序...")
MSG_PENDING = ("System is NOT ready. Please fix RED tasks and then\n"
" press SPACE to continue,\n"
" or press 'f' to force starting finalization procedure.\n"
"系統尚未就緒。請修正紅色項目後按空白鍵以重新檢查,\n"
"或是按下 'f' 鍵以強迫開始最終程序。")
MSG_READY = ("System is READY. Press SPACE to start FINALIZATION!\n"
"系統已準備就緒。 請按空白鍵開始最終程序!")
# list of tasks to be checked in format ('name': 'label')
CHECK_TASKS = {
'required_tests': ("Verify all required tests are passed\n"
"確認所有必要測試已通過"),
'developer_switch': ("Turn off Developer Switch\n"
"停用開發者開關 (Developer Switch)"),
'write_protect': ("Enable write protection pin\n"
"確認硬體寫入保護已開啟"),
}
def run_verify(self, vector):
return getattr(self.verifier, 'check_' + vector)()
def all_passed(self):
assert(self.check_results)
return all(self.check_results)
def set_task_as_disabled(self, label_widget):
label_widget.modify_fg(gtk.STATE_NORMAL, self.COLOR_DISABLED)
def set_task_by_result(self, label_widget, result):
if result:
label_widget.modify_fg(gtk.STATE_NORMAL, self.COLOR_PASSED)
else:
label_widget.modify_fg(gtk.STATE_NORMAL, self.COLOR_ACTIVE)
def update_status(self):
self.label_status.set_label(self.MSG_CHECKING)
for label in self.check_labels:
self.set_task_as_disabled(label)
# Warning: to provide some visual feedback for operator, here we try to
# process GTK events for redrawing window, and sleep for one second.
# This also implies we must make sure there's no reentrant.
gtk.main_iteration(False)
time.sleep(1)
self.check_results = [self.run_verify(vector)
for vector in self.CHECK_TASKS]
for label, result in zip(self.check_labels, self.check_results):
self.set_task_by_result(label, result)
# update the summary
if self.all_passed():
self.label_status.set_label(self.MSG_READY)
else:
self.label_status.set_label(self.MSG_PENDING)
def key_release_callback(self, widget, event):
if event.keyval == ord('f'):
factory.log("WARNING: Operator manually forced finalization.")
gtk.main_quit()
elif event.keyval == ord(' '):
if self.all_passed():
gtk.main_quit()
else:
if self.last_check and (time.time() < self.last_check + 1):
# ignore flooding events in 1 second
return True
widget.handler_block(self.key_released_handler_id)
self.update_status()
widget.handler_unblock(self.key_released_handler_id)
self.last_check = time.time()
return True
def register_callback(self, window):
self.key_released_handler_id = window.connect(
'key-release-event', self.key_release_callback)
window.add_events(gdk.KEY_RELEASE_MASK)
def create_disabled_label(self, message):
return ful.make_label(
message, fg=self.COLOR_DISABLED, alignment=(0, 0.5))
def run_once(self, status_file_path=None, test_list=None):
# configure verifier
self.verifier = MiniVerifier()
self.verifier.set_test_info(status_file_path, test_list)
self.last_check = None
self.COLOR_DISABLED = gtk.gdk.Color(0x7000, 0x7000, 0x7000)
self.COLOR_PASSED = ful.LIGHT_GREEN
self.COLOR_ACTIVE = ful.RED
# build check list from self.CHECK_TASKS
self.check_results = []
self.check_labels = []
for message in self.CHECK_TASKS.values():
self.check_labels.append(self.create_disabled_label(message))
self.check_results.append(False)
# build main window
self.label_status = ful.make_label(self.MSG_START, fg=ful.WHITE)
vbox = gtk.VBox()
vbox.set_spacing(20)
vbox.pack_start(self.label_status, False, False)
for label in self.check_labels:
vbox.pack_start(label, False, False)
widget = gtk.EventBox()
widget.modify_bg(gtk.STATE_NORMAL, ful.BLACK)
widget.add(vbox)
ful.run_test_widget(self.job, widget,
window_registration_callback=self.register_callback)