mirror of
https://github.com/Llewellynvdm/exa.git
synced 2024-12-26 18:10:13 +00:00
61c5df7c11
This commit changes the way the extended test suite is run. Previously, there was a folder full of outputs, and a script that ran exa repeatedly to check the outputs match. This script was hacked-together, with many problems: • It stops at the first failure, so if one test fails, you have no idea how many actually failed. • It also didn't actually show you the diff if one was different, it just checked it. • It combined stdout and stderr, and didn't test the exit status of exa. • All the output file names were just whatever I felt like calling the file at the time. • There is no way to only run a few of the tests — you have to run the whole thing each time. • There's no feel-good overall view where you see how many tests are passing. I started writing Specsheet to solve this problem (amongst other problems), and now, three and a half years later, it's finally ready for prime time. The tests are now defined as data rather than as a script. The outputs have a consistent naming convention (directory_flags.ansitxt), and they check stdout, stderr, and exit status separately. Specsheet also lets simple outputs (empty, non-empty, or one-line error messages) can be written inline rather than needing to be in files. So even though this pretty much runs the same tests as the run.sh script did, the tests are now more organised, making it easy to see where tests are missing and functionality is not being tested.
165 lines
5.8 KiB
Ruby
165 lines
5.8 KiB
Ruby
Vagrant.configure(2) do |config|
|
||
|
||
# We use Ubuntu instead of Debian because the image comes with two-way
|
||
# shared folder support by default.
|
||
UBUNTU = 'hashicorp/bionic64'
|
||
|
||
config.vm.define(:exa) do |config|
|
||
config.vm.provider :virtualbox do |v|
|
||
v.name = 'exa'
|
||
v.memory = 2048
|
||
v.cpus = `nproc`.chomp.to_i
|
||
end
|
||
|
||
config.vm.provider :vmware_desktop do |v|
|
||
v.vmx['memsize'] = '2048'
|
||
v.vmx['numvcpus'] = `nproc`.chomp
|
||
end
|
||
|
||
config.vm.box = UBUNTU
|
||
config.vm.hostname = 'exa'
|
||
|
||
|
||
# Make sure we know the VM image’s default user name. The ‘cassowary’ user
|
||
# (specified later) is used for most of the test *output*, but we still
|
||
# need to know where the ‘target’ and ‘.cargo’ directories go.
|
||
developer = 'vagrant'
|
||
|
||
|
||
# Install the dependencies needed for exa to build, as quietly as
|
||
# apt can do.
|
||
config.vm.provision :shell, privileged: true, inline: <<-EOF
|
||
trap 'exit' ERR
|
||
apt-get update
|
||
apt-get install -qq -o=Dpkg::Use-Pty=0 -y \
|
||
git cmake curl attr libgit2-dev zip \
|
||
fish zsh bash bash-completion
|
||
EOF
|
||
|
||
|
||
# Guarantee that the timezone is UTC -- some of the tests
|
||
# depend on this (for now).
|
||
config.vm.provision :shell, privileged: true, inline:
|
||
%[timedatectl set-timezone UTC]
|
||
|
||
|
||
# Install Rust.
|
||
# This is done as vagrant, not root, because it’s vagrant
|
||
# who actually uses it. Sent to /dev/null because the progress
|
||
# bar produces a ton of output.
|
||
config.vm.provision :shell, privileged: false, inline: <<-EOF
|
||
if hash rustc &>/dev/null; then
|
||
echo "Rust is already installed"
|
||
else
|
||
trap 'exit' ERR
|
||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||
source $HOME/.cargo/env
|
||
cargo install cargo-hack
|
||
fi
|
||
EOF
|
||
|
||
|
||
# Install Just, the command runner.
|
||
config.vm.provision :shell, privileged: true, inline: <<-EOF
|
||
if hash just &>/dev/null; then
|
||
echo "just is already installed"
|
||
else
|
||
wget "https://github.com/casey/just/releases/download/v0.8.0/just-v0.8.0-x86_64-unknown-linux-musl.tar.gz"
|
||
tar -xf "just-v0.8.0-x86_64-unknown-linux-musl.tar.gz"
|
||
cp just /usr/local/bin
|
||
fi
|
||
EOF
|
||
|
||
|
||
# Use a different ‘target’ directory on the VM than on the host.
|
||
# By default it just uses the one in /vagrant/target, which can
|
||
# cause problems if it has different permissions than the other
|
||
# directories, or contains object files compiled for the host.
|
||
config.vm.provision :shell, privileged: true, inline: <<-EOF
|
||
echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/#{developer}/.cargo/bin"' > /etc/environment
|
||
echo 'CARGO_TARGET_DIR="/home/#{developer}/target"' >> /etc/environment
|
||
EOF
|
||
|
||
|
||
# Create a variety of misc scripts.
|
||
config.vm.provision :shell, privileged: true, inline: <<-EOF
|
||
trap 'exit' ERR
|
||
|
||
ln -sf /vagrant/devtools/dev-run-debug.sh /usr/bin/exa
|
||
ln -sf /vagrant/devtools/dev-run-release.sh /usr/bin/rexa
|
||
|
||
echo -e "#!/bin/sh\ncargo build --manifest-path /vagrant/Cargo.toml \\$@" > /usr/bin/build-exa
|
||
ln -sf /usr/bin/build-exa /usr/bin/b
|
||
|
||
echo -e "#!/bin/sh\ncargo test --manifest-path /vagrant/Cargo.toml \\$@ -- --quiet" > /usr/bin/test-exa
|
||
ln -sf /usr/bin/test-exa /usr/bin/t
|
||
|
||
echo -e "#!/bin/sh\n/vagrant/xtests/run.sh" > /usr/bin/run-xtests
|
||
ln -sf /usr/bin/run-xtests /usr/bin/x
|
||
|
||
echo -e "#!/bin/sh\nbuild-exa && test-exa && run-xtests" > /usr/bin/compile-exa
|
||
ln -sf /usr/bin/compile-exa /usr/bin/c
|
||
|
||
echo -e "#!/bin/sh\nbash /vagrant/devtools/dev-package-for-linux.sh \\$@" > /usr/bin/package-exa
|
||
echo -e "#!/bin/sh\ncat /etc/motd" > /usr/bin/halp
|
||
|
||
chmod +x /usr/bin/{exa,rexa,b,t,x,c,build-exa,test-exa,run-xtests,compile-exa,package-exa,halp}
|
||
EOF
|
||
|
||
|
||
# Configure the welcoming text that gets shown.
|
||
config.vm.provision :shell, privileged: true, inline: <<-EOF
|
||
trap 'exit' ERR
|
||
|
||
rm -f /etc/update-motd.d/*
|
||
|
||
# Capture the help text so it gets displayed first
|
||
bash /vagrant/devtools/dev-help.sh > /etc/motd
|
||
|
||
# Tell bash to execute a bunch of stuff when a session starts
|
||
echo "source /vagrant/devtools/dev-bash.sh" > /home/#{developer}/.bash_profile
|
||
chown #{developer} /home/#{developer}/.bash_profile
|
||
|
||
# Disable last login date in sshd
|
||
sed -i '/PrintLastLog yes/c\PrintLastLog no' /etc/ssh/sshd_config
|
||
systemctl restart sshd
|
||
EOF
|
||
|
||
|
||
# Link the completion files so they’re “installed”.
|
||
config.vm.provision :shell, privileged: true, inline: <<-EOF
|
||
trap 'exit' ERR
|
||
|
||
test -h /etc/bash_completion.d/exa \
|
||
|| ln -s /vagrant/contrib/completions.bash /etc/bash_completion.d/exa
|
||
|
||
test -h /usr/share/zsh/vendor-completions/_exa \
|
||
|| ln -s /vagrant/contrib/completions.zsh /usr/share/zsh/vendor-completions/_exa
|
||
|
||
test -h /usr/share/fish/completions/exa.fish \
|
||
|| ln -s /vagrant/contrib/completions.fish /usr/share/fish/completions/exa.fish
|
||
EOF
|
||
|
||
|
||
# Install kcov for test coverage
|
||
# This doesn’t run coverage over the xtests so it’s less useful for now
|
||
if ENV.key?('INSTALL_KCOV')
|
||
config.vm.provision :shell, privileged: false, inline: <<-EOF
|
||
trap 'exit' ERR
|
||
|
||
test -e ~/.cargo/bin/cargo-kcov \
|
||
|| cargo install cargo-kcov
|
||
|
||
sudo apt-get install -qq -o=Dpkg::Use-Pty=0 -y \
|
||
cmake g++ pkg-config \
|
||
libcurl4-openssl-dev libdw-dev binutils-dev libiberty-dev
|
||
|
||
cargo kcov --print-install-kcov-sh | sudo sh
|
||
EOF
|
||
end
|
||
|
||
config.vm.provision :shell, privileged: true, path: 'devtools/dev-set-up-environment.sh'
|
||
config.vm.provision :shell, privileged: false, path: 'devtools/dev-create-test-filesystem.sh'
|
||
end
|
||
end
|