126 lines
3.6 KiB
Python
Executable File
126 lines
3.6 KiB
Python
Executable File
#!/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()
|