| # 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. |
| |
| |
| # DESCRIPTION : |
| # |
| # This factory test allows execution of a test-based script, with the |
| # stdout of the script displayed in a the testing widget via gtk |
| # label. Keyboard input will be passed to the script via its stdin. |
| |
| import imp |
| import gobject |
| import gtk |
| import pango |
| import sys |
| import subprocess |
| |
| from gtk import gdk |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib import pexpect |
| from autotest_lib.client.cros import factory_setup_modules |
| from cros.factory.test import factory |
| from cros.factory.test import ui as ful |
| |
| |
| _MAX_LABEL_CHARS=256 |
| |
| |
| class Script: |
| |
| def __init__(self, cmdline, pexpect, label): |
| self._cmdline = cmdline |
| self._label = label |
| self._ibuf = '' |
| self._proc = pexpect.spawn(cmdline) |
| gobject.io_add_watch(self._proc.fileno(), gobject.IO_IN, self.recv) |
| |
| def recv(self, src, cond): |
| msg = self._proc.read_nonblocking(_MAX_LABEL_CHARS) |
| factory.log('recv script msg %s' % repr(msg)) |
| self._label.set_text(msg) |
| self._label.queue_draw() |
| if not self._proc.isalive(): |
| self._proc.close() |
| gtk.main_quit() |
| if self._proc.exitstatus is not 0: |
| error.TestFail('%s script return code was %d' % |
| (self._cmdline, self._proc.exitstatus)) |
| return True |
| |
| def send(self, char): |
| if char != '\n': |
| self._ibuf += char |
| return |
| factory.log('sending script %s' % repr(self._ibuf)) |
| self._proc.sendline(self._ibuf) |
| self._ibuf = '' |
| |
| |
| class factory_ScriptWrapper(test.test): |
| version = 1 |
| |
| def key_release_callback(self, widget, event): |
| char = event.keyval in range(32,127) and chr(event.keyval) or None |
| char = event.keyval == gdk.keyval_from_name('Return') and '\n' or char |
| if char is not None: |
| self._script.send(char) |
| return True |
| |
| def register_callbacks(self, window): |
| window.connect('key-release-event', self.key_release_callback) |
| window.add_events(gdk.KEY_RELEASE_MASK) |
| |
| def run_once(self, cmdline=None): |
| |
| factory.log('%s run_once' % self.__class__) |
| |
| label = ful.make_label('', alignment=(0.5, 0.5)) |
| |
| test_widget = gtk.EventBox() |
| test_widget.modify_bg(gtk.STATE_NORMAL, ful.BLACK) |
| test_widget.add(label) |
| |
| self._script = Script(cmdline, pexpect, label) |
| |
| ful.run_test_widget(self.job, test_widget, |
| window_registration_callback=self.register_callbacks) |
| |
| factory.log('%s run_once finished' % self.__class__) |