#!/usr/bin/env python # vim:fileencoding=utf-8:noet from __future__ import (unicode_literals, division, absolute_import, print_function) import argparse import os import re from time import sleep from subprocess import check_call from io import BytesIO import pexpect def get_argparser(ArgumentParser=argparse.ArgumentParser): parser = ArgumentParser(description='Run powerline shell test using pexpect') parser.add_argument('--wait-for-echo', action='store_true', help='Wait until the input is echoed back.') parser.add_argument('--type', metavar='TYPE', help='Test type (daemon, nodaemon, …).') parser.add_argument('--client', metavar='CLIENT', help='Type of the client used (C, shell, zpython, …).') parser.add_argument('--shell', metavar='SHELL', help='Shell name.') parser.add_argument('command', nargs=argparse.REMAINDER, metavar='COMMAND', help='Command to run and its argument.') return parser def main(): test_root = os.environ['TEST_ROOT'] parser = get_argparser() args = parser.parse_args() shell = args.shell or args.command[0] test_type = args.type or shell test_client = args.client or test_type log_file_base = '{0}.{1}.{2}'.format(shell, test_type, test_client) full_log_file_name = os.path.join(test_root, '{0}.full.log'.format(log_file_base)) local_paths = [ os.path.abspath(os.path.join(test_root, 'path')), os.path.abspath('scripts'), ] if test_type == 'fish': local_paths += ['/usr/bin', '/bin'] python_paths = os.environ.get('PYTHONPATH', '') if python_paths: python_paths = ':' + python_paths python_paths = os.path.abspath('.') + python_paths environ = { 'LANG': 'en_US.UTF-8', 'PATH': os.pathsep.join(local_paths), 'TERM': 'screen-256color', 'DIR1': os.environ['DIR1'], 'DIR2': os.environ['DIR2'], 'XDG_CONFIG_HOME': os.path.abspath(os.path.join(test_root, 'fish_home')), 'IPYTHONDIR': os.path.abspath(os.path.join(test_root, 'ipython_home')), 'PYTHONPATH': python_paths, 'POWERLINE_CONFIG_OVERRIDES': os.environ.get('POWERLINE_CONFIG_OVERRIDES', ''), 'POWERLINE_THEME_OVERRIDES': os.environ.get('POWERLINE_THEME_OVERRIDES', ''), 'POWERLINE_CONFIG_PATHS': os.path.abspath(os.path.join('powerline', 'config_files')), 'POWERLINE_COMMAND_ARGS': os.environ.get('POWERLINE_COMMAND_ARGS', ''), 'POWERLINE_COMMAND': os.environ.get('POWERLINE_COMMAND', ''), 'LD_LIBRARY_PATH': os.environ.get('LD_LIBRARY_PATH', ''), 'TEST_ROOT': test_root, } os.environ['PATH'] = environ['PATH'] if test_type == 'daemon': environ['POWERLINE_SHELL_CONTINUATION'] = '1' environ['POWERLINE_SHELL_SELECT'] = '1' if test_type != 'zpython' and shell == 'zsh': environ['POWERLINE_NO_ZSH_ZPYTHON'] = '1' sio = BytesIO() child = pexpect.spawn( args.command[0], args.command[1:], env=environ, logfile=sio, timeout=30, ) child.expect(re.compile(b'.*')) sleep(0.5) child.setwinsize(1, 300) with open(os.path.join('tests', 'test_shells', 'inputs', shell), 'rb') as F: if not args.wait_for_echo: child.send(F.read()) else: for line in F: child.send(line) sleep(1) # TODO Implement something more smart with open(full_log_file_name, 'wb') as LF: while True: try: s = child.read_nonblocking(1000) except pexpect.TIMEOUT: break except pexpect.EOF: break else: LF.write(s) child.close(force=True) check_call([ os.path.join(test_root, 'path', 'python'), os.path.join('tests', 'test_shells', 'postproc.py'), test_type, test_client, shell ]) pidfile = os.path.join(test_root, '3rd', 'pid') if os.path.exists(pidfile): os.unlink(pidfile) if __name__ == '__main__': main()