Fix testing and test against more scenarios.

Before this, we only ever ran against system python preinstalled on
travis (i.e. 2.7 and 3.2). This change makes sure that Vim is always
build and run against the correct python version in the virtual env.
Also adds mercurial (HEAD) Vim as a testing target.
This patch took me forever to get right. At least 2 months and ~200
travis runs of trial and error - there is just too much finicky going on
with the many virtual envs on travis, Vims strange build system that
does not use python-config and LD_LIBRARY_PATH loading. En plus, the
debugging insights one can glance from travis runs are rather limited.

Detailed changes:
- Uses less sudo and only outside of scripts.
- Build correct version of Vim against correct version of Python. This
  needs some LD_LIBRARY_PATH magic to make sure that Vim finds the
  correct Python libraries at runtime.
- Removes dirty hack that overwrote /usr/bin/vim with the correct Vim
  version to run. The test_all.py script now takes the Vim binary as a
  parameter.
This commit is contained in:
Holger Rapp 2015-07-03 21:52:50 +02:00
parent 5590f9b7be
commit 4f65a76542
6 changed files with 121 additions and 92 deletions

View File

@ -2,14 +2,26 @@ language: python
python: python:
- 2.7 - 2.7
- 3.2
- 3.3 - 3.3
- 3.4 - 3.4
env: env:
- VIM_VERSION="74" - VIM_VERSION="74"
- VIM_VERSION="mercurial"
# - VIM_VERSION="NEOVIM"
install: sudo ./install_vim.sh "${VIM_VERSION}" "$(python --version 2>&1)" matrix:
allow_failures:
# TODO(sirver): Neovim does not play well with our testing right now.
- env: VIM_VERSION="NEOVIM"
before_script: install:
- tmux new -d -s vim # Some of these commands fail transiently. We keep retrying them until they succeed.
- until sudo add-apt-repository ppa:kalakris/tmux -y; do sleep 10; done
- until sudo add-apt-repository ppa:neovim-ppa/unstable -y; do sleep 10; done
- until sudo apt-get update -qq; do sleep 10; done
- until sudo apt-get install -qq -y --force-yes tmux xclip gdb neovim mercurial; do sleep 10; done
- ./travis_install.sh
script: ./test_all.py -v --plugins --session vim script:
- ./travis_test.sh

View File

@ -1,71 +0,0 @@
#!/usr/bin/env bash
# Installs a known version of vim in the travis test runner.
set -ex
VIM_VERSION=$1; shift
PYTHON_VERSION=$1; shift
build_vanilla_vim () {
URL=$1; shift;
mkdir vim_build
pushd vim_build
curl $URL -o vim.tar.bz2
tar xjf vim.tar.bz2
cd vim${VIM_VERSION}
PYTHON_BUILD_CONFIG=""
if [[ $PYTHON_VERSION =~ "Python 2." ]]; then
PYTHON_BUILD_CONFIG="--enable-pythoninterp"
else
PYTHON_BUILD_CONFIG="--enable-python3interp"
fi
./configure \
--prefix=${HOME} \
--disable-nls \
--disable-sysmouse \
--disable-gpm \
--enable-gui=no \
--enable-multibyte \
--with-features=huge \
--with-tlib=ncurses \
--without-x \
${PYTHON_BUILD_CONFIG}
make install
popd
rm -rf vim_build
}
repeat_transiently_failing_command () {
COMMAND=$1; shift
set +e
until ${COMMAND}; do
sleep 10
done
set -e
}
# Install tmux (> 1.8) and vim.
repeat_transiently_failing_command "add-apt-repository ppa:kalakris/tmux -y"
repeat_transiently_failing_command "apt-get update -qq"
repeat_transiently_failing_command "apt-get install -qq -y tmux"
if [[ $VIM_VERSION == "74" ]]; then
build_vanilla_vim ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
else
echo "Unknown VIM_VERSION: $VIM_VERSION"
exit 1
fi
# Dirty hack, since PATH seems to be ignored.
ln -sf /home/travis/bin/vim /usr/bin/vim
vim --version
# Clone the dependent plugins we want to use.
./test_all.py --clone-plugins

View File

@ -9,7 +9,7 @@ import textwrap
import time import time
from test.constant import (ARR_D, ARR_L, ARR_R, ARR_U, BS, ESC, PYTHON3, from test.constant import (ARR_D, ARR_L, ARR_R, ARR_U, BS, ESC, PYTHON3,
SEQUENCES) SEQUENCES)
def wait_until_file_exists(file_path, times=None, interval=0.01): def wait_until_file_exists(file_path, times=None, interval=0.01):
@ -88,8 +88,9 @@ class TempFileManager(object):
class VimInterface(TempFileManager): class VimInterface(TempFileManager):
def __init__(self, name=''): def __init__(self, vim_executable, name):
TempFileManager.__init__(self, name) TempFileManager.__init__(self, name)
self._vim_executable = vim_executable
def get_buffer_data(self): def get_buffer_data(self):
buffer_path = self.unique_name_temp(prefix='buffer_') buffer_path = self.unique_name_temp(prefix='buffer_')
@ -121,7 +122,7 @@ class VimInterface(TempFileManager):
textwrap.dedent(os.linesep.join(config + post_config) + '\n')) textwrap.dedent(os.linesep.join(config + post_config) + '\n'))
# Note the space to exclude it from shell history. # Note the space to exclude it from shell history.
self.send(""" vim -u %s\r\n""" % config_path) self.send(""" %s -u %s\r\n""" % (self._vim_executable, config_path))
wait_until_file_exists(done_file) wait_until_file_exists(done_file)
self._vim_pid = int(open(pid_file, 'r').read()) self._vim_pid = int(open(pid_file, 'r').read())
@ -133,8 +134,8 @@ class VimInterface(TempFileManager):
class VimInterfaceTmux(VimInterface): class VimInterfaceTmux(VimInterface):
def __init__(self, session): def __init__(self, vim_executable, session):
VimInterface.__init__(self, 'Tmux') VimInterface.__init__(self, vim_executable, 'Tmux')
self.session = session self.session = session
self._check_version() self._check_version()
@ -181,7 +182,6 @@ class VimInterfaceWindows(VimInterface):
] ]
def __init__(self): def __init__(self):
self.seq_buf = []
# import windows specific modules # import windows specific modules
import win32com.client import win32com.client
import win32gui import win32gui
@ -209,15 +209,7 @@ class VimInterfaceWindows(VimInterface):
return keys return keys
def send(self, keys): def send(self, keys):
self.seq_buf.append(keys) keys = self.convert_keys(keys)
seq = ''.join(self.seq_buf)
for f in SEQUENCES:
if f.startswith(seq) and f != seq:
return
self.seq_buf = []
seq = self.convert_keys(seq)
if not self.is_focused(): if not self.is_focused():
time.sleep(2) time.sleep(2)
@ -226,4 +218,4 @@ class VimInterfaceWindows(VimInterface):
# This is the only way I can find to stop test execution # This is the only way I can find to stop test execution
raise KeyboardInterrupt('Failed to focus GVIM') raise KeyboardInterrupt('Failed to focus GVIM')
self.shell.SendKeys(seq) self.shell.SendKeys(keys)

View File

@ -100,6 +100,8 @@ if __name__ == '__main__':
'multiplexer and race conditions in writing to the file system.') 'multiplexer and race conditions in writing to the file system.')
p.add_option('-x', '--exitfirst', dest='exitfirst', action='store_true', p.add_option('-x', '--exitfirst', dest='exitfirst', action='store_true',
help='exit instantly on first error or failed test.') help='exit instantly on first error or failed test.')
p.add_option('--vim', dest='vim', type=str, default="vim",
help='executable to run when launching vim.')
o, args = p.parse_args() o, args = p.parse_args()
return o, args return o, args
@ -118,7 +120,7 @@ if __name__ == '__main__':
all_test_suites = unittest.defaultTestLoader.discover(start_dir='test') all_test_suites = unittest.defaultTestLoader.discover(start_dir='test')
vim = VimInterfaceTmux(options.session) vim = VimInterfaceTmux(options.vim, options.session)
if not options.clone_plugins and platform.system() == 'Windows': if not options.clone_plugins and platform.system() == 'Windows':
raise RuntimeError( raise RuntimeError(
'TODO: TestSuite is broken under windows. Volunteers wanted!.') 'TODO: TestSuite is broken under windows. Volunteers wanted!.')

67
travis_install.sh Normal file
View File

@ -0,0 +1,67 @@
#!/usr/bin/env bash
# Installs a known version of vim in the travis test runner.
set -ex
PYTHON="python${TRAVIS_PYTHON_VERSION}"
build_vanilla_vim () {
mkdir ~/vim_build
pushd ~/vim_build
if [[ $VIM_VERSION == "74" ]]; then
until curl ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 -o vim.tar.bz2; do sleep 10; done
tar xjf vim.tar.bz2
cd vim${VIM_VERSION}
elif [[ $VIM_VERSION == "mercurial" ]]; then
hg clone https://vim.googlecode.com/hg/ vim
cd vim
fi
local PYTHON_CONFIG_DIR=$(dirname $(find $($PYTHON-config --prefix)/lib -iname 'config.c') | grep $TRAVIS_PYTHON_VERSION)
local PYTHON_BUILD_CONFIG=""
if [[ $TRAVIS_PYTHON_VERSION =~ ^2\. ]]; then
PYTHON_BUILD_CONFIG="--enable-pythoninterp --with-python-config-dir=${PYTHON_CONFIG_DIR}"
else
PYTHON_BUILD_CONFIG="--enable-python3interp --with-python3-config-dir=${PYTHON_CONFIG_DIR}"
fi
export LDFLAGS="$($PYTHON-config --ldflags) -L$($PYTHON-config --prefix)/lib"
export CFLAGS="$($PYTHON-config --cflags)"
# This is needed so that vim finds the shared libraries it was build against
# - they are not on the regular path.
export LD_LIBRARY_PATH="$($PYTHON-config --prefix)/lib"
echo $LDFLAGS
echo $CFLAGS
./configure \
--prefix=${HOME} \
--disable-nls \
--disable-sysmouse \
--disable-gpm \
--enable-gui=no \
--enable-multibyte \
--with-features=huge \
--with-tlib=ncurses \
--without-x \
${PYTHON_BUILD_CONFIG} || cat $(find . -name 'config.log')
make install
popd
rm -rf vim_build
}
if [[ $VIM_VERSION = "74" || $VIM_VERSION = "mercurial" ]]; then
build_vanilla_vim
elif [[ $VIM_VERSION == "NEOVIM" ]]; then
pip install neovim
else
echo "Unknown VIM_VERSION: $VIM_VERSION"
exit 1
fi
# Clone the dependent plugins we want to use.
PYTHON_CMD="$(which $PYTHON)"
$PYTHON_CMD ./test_all.py --clone-plugins

27
travis_test.sh Normal file
View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -ex
VIM="${HOME}/bin/vim"
PYTHON="python${TRAVIS_PYTHON_VERSION}"
PYTHON_CMD="$(which ${PYTHON})"
# This is needed so that vim finds the shared libraries it was build against -
# they are not on the regular path.
export LD_LIBRARY_PATH="$($PYTHON-config --prefix)/lib"
if [[ $TRAVIS_PYTHON_VERSION =~ ^2\. ]]; then
PY_IN_VIM="py"
else
PY_IN_VIM="py3"
fi
echo "Using python from: $PYTHON_CMD Version: $($PYTHON_CMD --version 2>&1)"
echo "Using vim from: $VIM. Version: $($VIMn)"
printf "${PY_IN_VIM} import sys;print(sys.version);\nquit" | $VIM -e -V9myVimLog
cat myVimLog
tmux new -d -s vim
$PYTHON_CMD ./test_all.py -v --plugins --session vim --vim $VIM