Make the Vagrant environment creation nicer

Now, instead of reams of unreadable command output, we get a nice set of stages:

[ 0/13] Deleting existing test cases directory
[ 1/13] Creating file size testcases
[ 2/13] Creating file name extension testcases
[ 3/13] Creating file names testcases
[ 4/13] Creating special file kind testcases
[ 5/13] Creating symlink testcases
[ 6/13] Creating user and group testcases
[ 7/13] Creating file permission testcases
[ 8/13] Creating date and time testcases
[ 9/13] Creating extended attribute testcases
[10/13] Creating Git testcases (1/3)
[11/13] Creating Git testcases (2/3)
[12/13] Creating Git testcases (3/3)
[13/13] Creating hidden and dot file testcases

The scripts have been moved out of the Vagrantfile because it was getting long and they're more readable this way.
This commit is contained in:
Benjamin Sago 2020-10-16 23:41:25 +01:00
parent f7a3df6229
commit 91f1541e85
4 changed files with 441 additions and 422 deletions

433
Vagrantfile vendored
View File

@ -31,7 +31,7 @@ Vagrant.configure(2) do |config|
# Install the dependencies needed for exa to build, as quietly as
# apt can do.
config.vm.provision :shell, privileged: true, inline: <<-EOF
set -xe
trap 'exit' ERR
apt-get update
apt-get install -qq -o=Dpkg::Use-Pty=0 -y \
git cmake curl attr libgit2-dev zip \
@ -53,8 +53,9 @@ Vagrant.configure(2) do |config|
if hash rustc &>/dev/null; then
echo "Rust is already installed"
else
set -xe
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
@ -84,7 +85,7 @@ Vagrant.configure(2) do |config|
# Create a variety of misc scripts.
config.vm.provision :shell, privileged: true, inline: <<-EOF
set -xe
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
@ -108,16 +109,10 @@ Vagrant.configure(2) do |config|
EOF
# This fix is applied by changing the VM rather than changing the
# Cargo.toml file so it works for everyone because its such a niche
# build issue, its not worth specifying a non-crates.io dependency
# and losing the ability to `cargo publish` the exa crate there!
# It also isolates the hackiness to the one place I can test it
# actually works.
# 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
@ -135,7 +130,7 @@ Vagrant.configure(2) do |config|
# Link the completion files so theyre “installed”.
config.vm.provision :shell, privileged: true, inline: <<-EOF
set -xe
trap 'exit' ERR
test -h /etc/bash_completion.d/exa \
|| ln -s /vagrant/contrib/completions.bash /etc/bash_completion.d/exa
@ -148,420 +143,11 @@ Vagrant.configure(2) do |config|
EOF
# We create two users that own the test files.
# The first one just owns the ordinary ones, because we dont want the
# test outputs to depend on “vagrant” or “ubuntu” existing.
user = "cassowary"
config.vm.provision :shell, privileged: true, inline:
%[id -u #{user} &>/dev/null || useradd #{user}]
# The second one has a long name, to test that the file owner column
# widens correctly. The benefit of Vagrant is that we dont need to
# set this up on the *actual* system!
longuser = "antidisestablishmentarienism"
config.vm.provision :shell, privileged: true, inline:
%[id -u #{longuser} &>/dev/null || useradd #{longuser}]
# Because the timestamps are formatted differently depending on whether
# theyre in the current year or not (see `details.rs`), we have to make
# sure that the files are created in the current year, so they get shown
# in the format we expect.
current_year = Date.today.year
some_date = "#{current_year}01011234.56" # 1st January, 12:34:56
# We also need an UID and a GID that are guaranteed to not exist, to
# test what happen when they dont.
invalid_uid = 666
invalid_gid = 616
# Delete old testcases if they exist already, then create a
# directory to house new ones.
test_dir = "/testcases"
config.vm.provision :shell, privileged: true, inline: <<-EOF
set -xe
rm -rfv #{test_dir}
mkdir #{test_dir}
chmod 777 #{test_dir}
EOF
# Awkward file size testcases.
# This needs sudo to set the files users at the very end.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/files"
for i in {1..13}; do
fallocate -l "$i" "#{test_dir}/files/$i"_bytes
fallocate -l "$i"KiB "#{test_dir}/files/$i"_KiB
fallocate -l "$i"MiB "#{test_dir}/files/$i"_MiB
done
touch -t #{some_date} "#{test_dir}/files/"*
chmod 644 "#{test_dir}/files/"*
sudo chown #{user}:#{user} "#{test_dir}/files/"*
EOF
# File name extension testcases.
# These arent tested in details view, but we set timestamps on them to
# test that various sort options work.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/file-names-exts"
touch "#{test_dir}/file-names-exts/Makefile"
touch "#{test_dir}/file-names-exts/IMAGE.PNG"
touch "#{test_dir}/file-names-exts/image.svg"
touch "#{test_dir}/file-names-exts/VIDEO.AVI"
touch "#{test_dir}/file-names-exts/video.wmv"
touch "#{test_dir}/file-names-exts/music.mp3"
touch "#{test_dir}/file-names-exts/MUSIC.OGG"
touch "#{test_dir}/file-names-exts/lossless.flac"
touch "#{test_dir}/file-names-exts/lossless.wav"
touch "#{test_dir}/file-names-exts/crypto.asc"
touch "#{test_dir}/file-names-exts/crypto.signature"
touch "#{test_dir}/file-names-exts/document.pdf"
touch "#{test_dir}/file-names-exts/DOCUMENT.XLSX"
touch "#{test_dir}/file-names-exts/COMPRESSED.ZIP"
touch "#{test_dir}/file-names-exts/compressed.tar.gz"
touch "#{test_dir}/file-names-exts/compressed.tgz"
touch "#{test_dir}/file-names-exts/compressed.tar.xz"
touch "#{test_dir}/file-names-exts/compressed.txz"
touch "#{test_dir}/file-names-exts/compressed.deb"
touch "#{test_dir}/file-names-exts/backup~"
touch "#{test_dir}/file-names-exts/#SAVEFILE#"
touch "#{test_dir}/file-names-exts/file.tmp"
touch "#{test_dir}/file-names-exts/compiled.class"
touch "#{test_dir}/file-names-exts/compiled.o"
touch "#{test_dir}/file-names-exts/compiled.js"
touch "#{test_dir}/file-names-exts/compiled.coffee"
EOF
# File name testcases.
# bash really doesnt want you to create a file with escaped characters
# in its name, so we have to resort to the echo builtin and touch!
#
# The double backslashes are not strictly necessary; without them, Ruby
# will interpolate them instead of bash, but because Vagrant prints out
# each command it runs, your *own* terminal will go “ding” from the alarm!
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/file-names"
echo -ne "#{test_dir}/file-names/ascii: hello" | xargs -0 touch
echo -ne "#{test_dir}/file-names/emoji: [🆒]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/utf-8: pâté" | xargs -0 touch
echo -ne "#{test_dir}/file-names/bell: [\\a]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/backspace: [\\b]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/form-feed: [\\f]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/new-line: [\\n]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/return: [\\r]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/tab: [\\t]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/vertical-tab: [\\v]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/escape: [\\033]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/ansi: [\\033[34mblue\\033[0m]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/invalid-utf8-1: [\\xFF]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/invalid-utf8-2: [\\xc3\\x28]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/invalid-utf8-3: [\\xe2\\x82\\x28]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/invalid-utf8-4: [\\xf0\\x28\\x8c\\x28]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/new-line-dir: [\\n]" | xargs -0 mkdir
echo -ne "#{test_dir}/file-names/new-line-dir: [\\n]/subfile" | xargs -0 touch
echo -ne "#{test_dir}/file-names/new-line-dir: [\\n]/another: [\\n]" | xargs -0 touch
echo -ne "#{test_dir}/file-names/new-line-dir: [\\n]/broken" | xargs -0 touch
mkdir "#{test_dir}/file-names/links"
ln -s "#{test_dir}/file-names/new-line-dir"*/* "#{test_dir}/file-names/links"
echo -ne "#{test_dir}/file-names/new-line-dir: [\\n]/broken" | xargs -0 rm
EOF
# Special file testcases.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/specials"
sudo mknod "#{test_dir}/specials/block-device" b 3 60
sudo mknod "#{test_dir}/specials/char-device" c 14 40
sudo mknod "#{test_dir}/specials/named-pipe" p
sudo touch -t #{some_date} "#{test_dir}/specials/"*
EOF
# Awkward symlink testcases.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/links"
ln -s / "#{test_dir}/links/root"
ln -s /usr "#{test_dir}/links/usr"
ln -s nowhere "#{test_dir}/links/broken"
ln -s /proc/1/root "#{test_dir}/links/forbidden"
touch "#{test_dir}/links/some_file"
ln -s "#{test_dir}/links/some_file" "#{test_dir}/links/some_file_absolute"
(cd "#{test_dir}/links"; ln -s "some_file" "some_file_relative")
(cd "#{test_dir}/links"; ln -s "." "current_dir")
(cd "#{test_dir}/links"; ln -s ".." "parent_dir")
(cd "#{test_dir}/links"; ln -s "itself" "itself")
EOF
# Awkward passwd testcases.
# sudo is needed for these because we technically arent a member
# of the groups (because they dont exist), and chown and chgrp
# are smart enough to disallow it!
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/passwd"
touch -t #{some_date} "#{test_dir}/passwd/unknown-uid"
chmod 644 "#{test_dir}/passwd/unknown-uid"
sudo chown #{invalid_uid}:#{user} "#{test_dir}/passwd/unknown-uid"
touch -t #{some_date} "#{test_dir}/passwd/unknown-gid"
chmod 644 "#{test_dir}/passwd/unknown-gid"
sudo chown #{user}:#{invalid_gid} "#{test_dir}/passwd/unknown-gid"
EOF
# Awkward permission testcases.
# Differences in the way chmod handles setting setuid and setgid
# when you dont already own the file mean that we need to use sudo
# to change permissions to those.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/permissions"
mkdir "#{test_dir}/permissions/forbidden-directory"
chmod 000 "#{test_dir}/permissions/forbidden-directory"
touch -t #{some_date} "#{test_dir}/permissions/forbidden-directory"
sudo chown #{user}:#{user} "#{test_dir}/permissions/forbidden-directory"
for perms in 000 001 002 004 010 020 040 100 200 400 644 755 777 1000 1001 2000 2010 4000 4100 7666 7777; do
touch "#{test_dir}/permissions/$perms"
sudo chown #{user}:#{user} "#{test_dir}/permissions/$perms"
sudo chmod $perms "#{test_dir}/permissions/$perms"
sudo touch -t #{some_date} "#{test_dir}/permissions/$perms"
done
EOF
old = '200303030000.00'
med = '200606152314.29' # the june gets used for fr_FR locale tests
new = '200912221038.53' # and the december for ja_JP local tests
# Awkward date and time testcases.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/dates"
# there's no way to touch the created date of a file...
# so we have to do this the old-fashioned way!
# (and make sure these don't actually get listed)
touch -t #{old} "#{test_dir}/dates/peach"; sleep 1
touch -t #{med} "#{test_dir}/dates/plum"; sleep 1
touch -t #{new} "#{test_dir}/dates/pear"
# modified dates
touch -t #{old} -m "#{test_dir}/dates/pear"
touch -t #{med} -m "#{test_dir}/dates/peach"
touch -t #{new} -m "#{test_dir}/dates/plum"
# accessed dates
touch -t #{old} -a "#{test_dir}/dates/plum"
touch -t #{med} -a "#{test_dir}/dates/pear"
touch -t #{new} -a "#{test_dir}/dates/peach"
sudo chown #{user}:#{user} -R "#{test_dir}/dates"
EOF
# Awkward extended attribute testcases.
# We need to test combinations of various numbers of files *and*
# extended attributes in directories. Turns out, the easiest way to
# do this is to generate all combinations of files with “one-xattr”
# or “two-xattrs” in their name and directories with “empty” or
# “one-file” in their name, then just give the right number of
# xattrs and children to those.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/attributes"
mkdir "#{test_dir}/attributes/files"
touch "#{test_dir}/attributes/files/"{no-xattrs,one-xattr,two-xattrs}{,_forbidden}
mkdir "#{test_dir}/attributes/dirs"
mkdir "#{test_dir}/attributes/dirs/"{no-xattrs,one-xattr,two-xattrs}_{empty,one-file,two-files}{,_forbidden}
setfattr -n user.greeting -v hello "#{test_dir}/attributes"/**/*{one-xattr,two-xattrs}*
setfattr -n user.another_greeting -v hi "#{test_dir}/attributes"/**/*two-xattrs*
for dir in "#{test_dir}/attributes/dirs/"*one-file*; do
touch $dir/file-in-question
done
for dir in "#{test_dir}/attributes/dirs/"*two-files*; do
touch $dir/this-file
touch $dir/that-file
done
find "#{test_dir}/attributes" -exec touch {} -t #{some_date} \\;
# I want to use the following to test,
# but it only works on macos:
#chmod +a "#{user} deny readextattr" "#{test_dir}/attributes"/**/*_forbidden
sudo chmod 000 "#{test_dir}/attributes"/**/*_forbidden
sudo chown #{user}:#{user} -R "#{test_dir}/attributes"
EOF
# A sample Git repository
# This uses cd because it's easier than telling Git where to go each time
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir "#{test_dir}/git"
cd "#{test_dir}/git"
git init
mkdir edits additions moves
echo "original content" | tee edits/{staged,unstaged,both}
echo "this file gets moved" > moves/hither
git add edits moves
git config --global user.email "exa@exa.exa"
git config --global user.name "Exa Exa"
git commit -m "Automated test commit"
echo "modifications!" | tee edits/{staged,both}
touch additions/{staged,edited}
mv moves/{hither,thither}
git add edits moves additions
echo "more modifications!" | tee edits/unstaged edits/both additions/edited
touch additions/unstaged
find "#{test_dir}/git" -exec touch {} -t #{some_date} \\;
sudo chown #{user}:#{user} -R "#{test_dir}/git"
EOF
# A second Git repository
# for testing two at once
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir -p "#{test_dir}/git2/deeply/nested/directory"
cd "#{test_dir}/git2"
git init
touch "deeply/nested/directory/upd8d"
git add "deeply/nested/directory/upd8d"
git commit -m "Automated test commit"
echo "Now with contents" > "deeply/nested/directory/upd8d"
touch "deeply/nested/directory/l8st"
echo -e "target\n*.mp3" > ".gitignore"
mkdir "ignoreds"
touch "ignoreds/music.mp3"
touch "ignoreds/music.m4a"
mkdir "ignoreds/nested"
touch "ignoreds/nested/70s grove.mp3"
touch "ignoreds/nested/funky chicken.m4a"
mkdir "target"
touch "target/another ignored file"
mkdir "deeply/nested/repository"
cd "deeply/nested/repository"
git init
touch subfile
find "#{test_dir}/git2" -exec touch {} -t #{some_date} \\;
sudo chown #{user}:#{user} -R "#{test_dir}/git2"
EOF
# A third Git repository
# Regression test for https://github.com/ogham/exa/issues/526
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
mkdir -p "#{test_dir}/git3"
cd "#{test_dir}/git3"
git init
# Create a symbolic link pointing to a non-existing file
ln -s aaa/aaa/a b
find "#{test_dir}/git3" -exec touch {} -t #{some_date} \\;
sudo chown #{user}:#{user} -R "#{test_dir}/git3"
EOF
# Hidden and dot file testcases.
# We need to set the permissions of `.` and `..` because they actually
# get displayed in the output here, so this has to come last.
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
shopt -u dotglob
GLOBIGNORE=".:.."
mkdir "#{test_dir}/hiddens"
touch "#{test_dir}/hiddens/visible"
touch "#{test_dir}/hiddens/.hidden"
touch "#{test_dir}/hiddens/..extra-hidden"
# ./hiddens/
touch -t #{some_date} "#{test_dir}/hiddens/"*
chmod 644 "#{test_dir}/hiddens/"*
sudo chown #{user}:#{user} "#{test_dir}/hiddens/"*
# .
touch -t #{some_date} "#{test_dir}/hiddens"
chmod 755 "#{test_dir}/hiddens"
sudo chown #{user}:#{user} "#{test_dir}/hiddens"
# ..
sudo touch -t #{some_date} "#{test_dir}"
sudo chmod 755 "#{test_dir}"
sudo chown #{user}:#{user} "#{test_dir}"
EOF
# Set up some locales
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
# uncomment these from the config file
sudo sed -i '/fr_FR.UTF-8/s/^# //g' /etc/locale.gen
sudo sed -i '/ja_JP.UTF-8/s/^# //g' /etc/locale.gen
sudo locale-gen
EOF
# Install kcov for test coverage
# This doesnt run coverage over the xtests so its less useful for now
if ENV.key?('INSTALL_KCOV')
config.vm.provision :shell, privileged: false, inline: <<-EOF
set -xe
trap 'exit' ERR
test -e ~/.cargo/bin/cargo-kcov \
|| cargo install cargo-kcov
@ -573,5 +159,8 @@ Vagrant.configure(2) do |config|
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

View File

@ -0,0 +1,352 @@
#!/bin/bash
# This script creates a bunch of awkward test case files. It gets
# automatically run as part of Vagrant provisioning.
trap 'exit' ERR
if [[ ! -d "/vagrant" ]]; then
echo "This script should be run in the Vagrant environment"
exit 1
fi
source "/vagrant/devtools/dev-fixtures.sh"
# Delete old testcases if they exist already, then create a
# directory to house new ones.
if [[ -d "$TEST_ROOT" ]]; then
echo -e "\033[1m[ 0/13]\033[0m Deleting existing test cases directory"
sudo rm -rf "$TEST_ROOT"
fi
sudo mkdir "$TEST_ROOT"
sudo chmod 777 "$TEST_ROOT"
# Awkward file size testcases.
# This needs sudo to set the files users at the very end.
mkdir "$TEST_ROOT/files"
echo -e "\033[1m[ 1/13]\033[0m Creating file size testcases"
for i in {1..13}; do
fallocate -l "$i" "$TEST_ROOT/files/$i"_bytes
fallocate -l "$i"KiB "$TEST_ROOT/files/$i"_KiB
fallocate -l "$i"MiB "$TEST_ROOT/files/$i"_MiB
done
touch -t $FIXED_DATE "$TEST_ROOT/files/"*
chmod 644 "$TEST_ROOT/files/"*
sudo chown $FIXED_USER:$FIXED_USER "$TEST_ROOT/files/"*
# File name extension testcases.
# These arent tested in details view, but we set timestamps on them to
# test that various sort options work.
mkdir "$TEST_ROOT/file-names-exts"
echo -e "\033[1m[ 2/13]\033[0m Creating file name extension testcases"
touch "$TEST_ROOT/file-names-exts/Makefile"
touch "$TEST_ROOT/file-names-exts/IMAGE.PNG"
touch "$TEST_ROOT/file-names-exts/image.svg"
touch "$TEST_ROOT/file-names-exts/VIDEO.AVI"
touch "$TEST_ROOT/file-names-exts/video.wmv"
touch "$TEST_ROOT/file-names-exts/music.mp3"
touch "$TEST_ROOT/file-names-exts/MUSIC.OGG"
touch "$TEST_ROOT/file-names-exts/lossless.flac"
touch "$TEST_ROOT/file-names-exts/lossless.wav"
touch "$TEST_ROOT/file-names-exts/crypto.asc"
touch "$TEST_ROOT/file-names-exts/crypto.signature"
touch "$TEST_ROOT/file-names-exts/document.pdf"
touch "$TEST_ROOT/file-names-exts/DOCUMENT.XLSX"
touch "$TEST_ROOT/file-names-exts/COMPRESSED.ZIP"
touch "$TEST_ROOT/file-names-exts/compressed.tar.gz"
touch "$TEST_ROOT/file-names-exts/compressed.tgz"
touch "$TEST_ROOT/file-names-exts/compressed.tar.xz"
touch "$TEST_ROOT/file-names-exts/compressed.txz"
touch "$TEST_ROOT/file-names-exts/compressed.deb"
touch "$TEST_ROOT/file-names-exts/backup~"
touch "$TEST_ROOT/file-names-exts/#SAVEFILE#"
touch "$TEST_ROOT/file-names-exts/file.tmp"
touch "$TEST_ROOT/file-names-exts/compiled.class"
touch "$TEST_ROOT/file-names-exts/compiled.o"
touch "$TEST_ROOT/file-names-exts/compiled.js"
touch "$TEST_ROOT/file-names-exts/compiled.coffee"
# File name testcases.
# bash really doesnt want you to create a file with escaped characters
# in its name, so we have to resort to the echo builtin and touch!
mkdir "$TEST_ROOT/file-names"
echo -e "\033[1m[ 3/13]\033[0m Creating file names testcases"
echo -ne "$TEST_ROOT/file-names/ascii: hello" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/emoji: [🆒]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/utf-8: pâté" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/bell: [\a]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/backspace: [\b]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/form-feed: [\f]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/new-line: [\n]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/return: [\r]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/tab: [\t]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/vertical-tab: [\v]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/escape: [\033]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/ansi: [\033[34mblue\033[0m]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/invalid-utf8-1: [\xFF]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/invalid-utf8-2: [\xc3\x28]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/invalid-utf8-3: [\xe2\x82\x28]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/invalid-utf8-4: [\xf0\x28\x8c\x28]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/new-line-dir: [\n]" | xargs -0 mkdir
echo -ne "$TEST_ROOT/file-names/new-line-dir: [\n]/subfile" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/new-line-dir: [\n]/another: [\n]" | xargs -0 touch
echo -ne "$TEST_ROOT/file-names/new-line-dir: [\n]/broken" | xargs -0 touch
mkdir "$TEST_ROOT/file-names/links"
ln -s "$TEST_ROOT/file-names/new-line-dir"*/* "$TEST_ROOT/file-names/links"
echo -ne "$TEST_ROOT/file-names/new-line-dir: [\n]/broken" | xargs -0 rm
# Special file testcases.
mkdir "$TEST_ROOT/specials"
echo -e "\033[1m[ 4/13]\033[0m Creating special file kind testcases"
sudo mknod "$TEST_ROOT/specials/block-device" b 3 60
sudo mknod "$TEST_ROOT/specials/char-device" c 14 40
sudo mknod "$TEST_ROOT/specials/named-pipe" p
sudo touch -t $FIXED_DATE "$TEST_ROOT/specials/"*
# Awkward symlink testcases.
mkdir "$TEST_ROOT/links"
echo -e "\033[1m[ 5/13]\033[0m Creating symlink testcases"
ln -s / "$TEST_ROOT/links/root"
ln -s /usr "$TEST_ROOT/links/usr"
ln -s nowhere "$TEST_ROOT/links/broken"
ln -s /proc/1/root "$TEST_ROOT/links/forbidden"
touch "$TEST_ROOT/links/some_file"
ln -s "$TEST_ROOT/links/some_file" "$TEST_ROOT/links/some_file_absolute"
(cd "$TEST_ROOT/links"; ln -s "some_file" "some_file_relative")
(cd "$TEST_ROOT/links"; ln -s "." "current_dir")
(cd "$TEST_ROOT/links"; ln -s ".." "parent_dir")
(cd "$TEST_ROOT/links"; ln -s "itself" "itself")
# Awkward passwd testcases.
# sudo is needed for these because we technically arent a member
# of the groups (because they dont exist), and chown and chgrp
# are smart enough to disallow it!
mkdir "$TEST_ROOT/passwd"
echo -e "\033[1m[ 6/13]\033[0m Creating user and group testcases"
touch -t $FIXED_DATE "$TEST_ROOT/passwd/unknown-uid"
chmod 644 "$TEST_ROOT/passwd/unknown-uid"
sudo chown $FIXED_BAD_UID:$FIXED_USER "$TEST_ROOT/passwd/unknown-uid"
touch -t $FIXED_DATE "$TEST_ROOT/passwd/unknown-gid"
chmod 644 "$TEST_ROOT/passwd/unknown-gid"
sudo chown $FIXED_USER:$FIXED_BAD_GID "$TEST_ROOT/passwd/unknown-gid"
# Awkward permission testcases.
# Differences in the way chmod handles setting setuid and setgid
# when you dont already own the file mean that we need to use sudo
# to change permissions to those.
mkdir "$TEST_ROOT/permissions"
echo -e "\033[1m[ 7/13]\033[0m Creating file permission testcases"
mkdir "$TEST_ROOT/permissions/forbidden-directory"
chmod 000 "$TEST_ROOT/permissions/forbidden-directory"
touch -t $FIXED_DATE "$TEST_ROOT/permissions/forbidden-directory"
sudo chown $FIXED_USER:$FIXED_USER "$TEST_ROOT/permissions/forbidden-directory"
for perms in 000 001 002 004 010 020 040 100 200 400 644 755 777 1000 1001 2000 2010 4000 4100 7666 7777; do
touch "$TEST_ROOT/permissions/$perms"
sudo chown $FIXED_USER:$FIXED_USER "$TEST_ROOT/permissions/$perms"
sudo chmod $perms "$TEST_ROOT/permissions/$perms"
sudo touch -t $FIXED_DATE "$TEST_ROOT/permissions/$perms"
done
# Awkward date and time testcases.
mkdir "$TEST_ROOT/dates"
echo -e "\033[1m[ 8/13]\033[0m Creating date and time testcases"
# created dates
# theres no way to touch the created date of a file...
# so we have to do this the old-fashioned way!
# (and make sure these don't actually get listed)
touch -t $OLD_DATE "$TEST_ROOT/dates/peach"; sleep 1
touch -t $MED_DATE "$TEST_ROOT/dates/plum"; sleep 1
touch -t $NEW_DATE "$TEST_ROOT/dates/pear"
# modified dates
touch -t $OLD_DATE -m "$TEST_ROOT/dates/pear"
touch -t $MED_DATE -m "$TEST_ROOT/dates/peach"
touch -t $NEW_DATE -m "$TEST_ROOT/dates/plum"
# accessed dates
touch -t $OLD_DATE -a "$TEST_ROOT/dates/plum"
touch -t $MED_DATE -a "$TEST_ROOT/dates/pear"
touch -t $NEW_DATE -a "$TEST_ROOT/dates/peach"
sudo chown $FIXED_USER:$FIXED_USER -R "$TEST_ROOT/dates"
# Awkward extended attribute testcases.
# We need to test combinations of various numbers of files *and*
# extended attributes in directories. Turns out, the easiest way to
# do this is to generate all combinations of files with “one-xattr”
# or “two-xattrs” in their name and directories with “empty” or
# “one-file” in their name, then just give the right number of
# xattrs and children to those.
mkdir "$TEST_ROOT/attributes"
echo -e "\033[1m[ 9/13]\033[0m Creating extended attribute testcases"
mkdir "$TEST_ROOT/attributes/files"
touch "$TEST_ROOT/attributes/files/"{no-xattrs,one-xattr,two-xattrs}{,_forbidden}
mkdir "$TEST_ROOT/attributes/dirs"
mkdir "$TEST_ROOT/attributes/dirs/"{no-xattrs,one-xattr,two-xattrs}_{empty,one-file,two-files}{,_forbidden}
setfattr -n user.greeting -v hello "$TEST_ROOT/attributes"/**/*{one-xattr,two-xattrs}*
setfattr -n user.another_greeting -v hi "$TEST_ROOT/attributes"/**/*two-xattrs*
for dir in "$TEST_ROOT/attributes/dirs/"*one-file*; do
touch $dir/file-in-question
done
for dir in "$TEST_ROOT/attributes/dirs/"*two-files*; do
touch $dir/this-file
touch $dir/that-file
done
find "$TEST_ROOT/attributes" -exec touch {} -t $FIXED_DATE \;
# I want to use the following to test,
# but it only works on macos:
#chmod +a "$FIXED_USER deny readextattr" "$TEST_ROOT/attributes"/**/*_forbidden
sudo chmod 000 "$TEST_ROOT/attributes"/**/*_forbidden
sudo chown $FIXED_USER:$FIXED_USER -R "$TEST_ROOT/attributes"
# A sample Git repository
# This uses cd because it's easier than telling Git where to go each time
echo -e "\033[1m[10/13]\033[0m Creating Git testcases (1/3)"
mkdir "$TEST_ROOT/git"
cd "$TEST_ROOT/git"
git init >/dev/null
mkdir edits additions moves
echo "original content" | tee edits/{staged,unstaged,both} >/dev/null
echo "this file gets moved" > moves/hither
git add edits moves
git config --global user.email "exa@exa.exa"
git config --global user.name "Exa Exa"
git commit -m "Automated test commit" >/dev/null
echo "modifications!" | tee edits/{staged,both} >/dev/null
touch additions/{staged,edited}
mv moves/{hither,thither}
git add edits moves additions
echo "more modifications!" | tee edits/unstaged edits/both additions/edited >/dev/null
touch additions/unstaged
find "$TEST_ROOT/git" -exec touch {} -t $FIXED_DATE \;
sudo chown $FIXED_USER:$FIXED_USER -R "$TEST_ROOT/git"
# A second Git repository
# for testing two at once
echo -e "\033[1m[11/13]\033[0m Creating Git testcases (2/3)"
mkdir -p "$TEST_ROOT/git2/deeply/nested/directory"
cd "$TEST_ROOT/git2"
git init >/dev/null
touch "deeply/nested/directory/upd8d"
git add "deeply/nested/directory/upd8d"
git commit -m "Automated test commit" >/dev/null
echo "Now with contents" > "deeply/nested/directory/upd8d"
touch "deeply/nested/directory/l8st"
echo -e "target\n*.mp3" > ".gitignore"
mkdir "ignoreds"
touch "ignoreds/music.mp3"
touch "ignoreds/music.m4a"
mkdir "ignoreds/nested"
touch "ignoreds/nested/70s grove.mp3"
touch "ignoreds/nested/funky chicken.m4a"
mkdir "target"
touch "target/another ignored file"
mkdir "deeply/nested/repository"
cd "deeply/nested/repository"
git init >/dev/null
touch subfile
find "$TEST_ROOT/git2" -exec touch {} -t $FIXED_DATE \;
sudo chown $FIXED_USER:$FIXED_USER -R "$TEST_ROOT/git2"
# A third Git repository
# Regression test for https://github.com/ogham/exa/issues/526
echo -e "\033[1m[12/13]\033[0m Creating Git testcases (3/3)"
mkdir -p "$TEST_ROOT/git3"
cd "$TEST_ROOT/git3"
git init >/dev/null
# Create a symbolic link pointing to a non-existing file
ln -s aaa/aaa/a b
# This normally fails with:
# touch: cannot touch '/testcases/git3/b': No such file or directory
# but thats expected (the file deliberately does not exist)
find "$TEST_ROOT/git3" -exec touch {} -t $FIXED_DATE \; 2>/dev/null
sudo chown $FIXED_USER:$FIXED_USER -R "$TEST_ROOT/git3"
# Hidden and dot file testcases.
# We need to set the permissions of `.` and `..` because they actually
# get displayed in the output here, so this has to come last.
echo -e "\033[1m[13/13]\033[0m Creating hidden and dot file testcases"
shopt -u dotglob
GLOBIGNORE=".:.."
mkdir "$TEST_ROOT/hiddens"
touch "$TEST_ROOT/hiddens/visible"
touch "$TEST_ROOT/hiddens/.hidden"
touch "$TEST_ROOT/hiddens/..extra-hidden"
# ./hiddens/
touch -t $FIXED_DATE "$TEST_ROOT/hiddens/"*
chmod 644 "$TEST_ROOT/hiddens/"*
sudo chown $FIXED_USER:$FIXED_USER "$TEST_ROOT/hiddens/"*
# .
touch -t $FIXED_DATE "$TEST_ROOT/hiddens"
chmod 755 "$TEST_ROOT/hiddens"
sudo chown $FIXED_USER:$FIXED_USER "$TEST_ROOT/hiddens"
# ..
sudo touch -t $FIXED_DATE "$TEST_ROOT"
sudo chmod 755 "$TEST_ROOT"
sudo chown $FIXED_USER:$FIXED_USER "$TEST_ROOT"

39
devtools/dev-fixtures.sh Normal file
View File

@ -0,0 +1,39 @@
#!/bin/bash
# This file contains the text fixtures — the known, constant data — that are
# used when setting up the environment that exas tests get run in.
# The directory that all the test files are created under.
export TEST_ROOT=/testcases
# Because the timestamps are formatted differently depending on whether
# theyre in the current year or not (see `details.rs`), we have to make
# sure that the files are created in the current year, so they get shown
# in the format we expect.
export CURRENT_YEAR=$(date "+%Y")
export FIXED_DATE="${CURRENT_YEAR}01011234.56" # 1st January, 12:34:56
# We also need an UID and a GID that are guaranteed to not exist, to
# test what happen when they dont.
export FIXED_BAD_UID=666
export FIXED_BAD_GID=616
# We create two users that own the test files.
#
# The first one just owns the ordinary ones, because we dont want the
# test outputs to depend on “vagrant” or “ubuntu” existing.
#
# The second one has a long name, to test that the file owner column
# widens correctly. The benefit of Vagrant is that we dont need to
# set this up on the *actual* system!
export FIXED_USER="cassowary"
export FIXED_LONG_USER="antidisestablishmentarienism"
# A couple of dates, for date-time testing.
export OLD_DATE='200303030000.00'
export MED_DATE='200606152314.29' # the june gets used for fr_FR locale tests
export NEW_DATE='200912221038.53' # and the december for ja_JP local tests

View File

@ -0,0 +1,39 @@
#!/bin/bash
if [[ ! -d "/vagrant" ]]; then
echo "This script should be run in the Vagrant environment"
exit 1
fi
if [[ $EUID -ne 0 ]]; then
echo "This script should be run as root"
exit 1
fi
source "/vagrant/devtools/dev-fixtures.sh"
# create our test users
if id -u $FIXED_USER &>/dev/null; then
echo "Normal user already exists"
else
echo "Creating normal user"
useradd $FIXED_USER
fi
if id -u $FIXED_LONG_USER &>/dev/null; then
echo "Long user already exists"
else
echo "Creating long user"
useradd $FIXED_LONG_USER
fi
# set up locales
# uncomment these from the config file
sudo sed -i '/fr_FR.UTF-8/s/^# //g' /etc/locale.gen
sudo sed -i '/ja_JP.UTF-8/s/^# //g' /etc/locale.gen
sudo locale-gen