diff options
author | Benjamin Sago <ogham@bsago.me> | 2016-10-07 19:31:03 +0100 |
---|---|---|
committer | Benjamin Sago <ogham@bsago.me> | 2016-10-07 19:31:03 +0100 |
commit | 54067bf7650472f7acecc497f5d31032446212f0 (patch) | |
tree | b5f279c32ea61031fd22457b353e5a6b24ae6e40 /Vagrantfile | |
parent | d321434a4759a23c7bbf6c491f99ebbcd4bc4ad3 (diff) |
Replace the testcases script with a Vagrant VM
See the README section for more details. Basically, with this way, we can store a bunch of existing valid exa outputs, change a VM's environment to match our values, then check that exa still works by comparing outputs.
Diffstat (limited to 'Vagrantfile')
-rw-r--r-- | Vagrantfile | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..99e789b --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,146 @@ +Vagrant.configure("2") do |config| + config.vm.provider "virtualbox" do |v| + v.memory = 1024 + v.cpus = 1 + end + + config.vm.box = "debian/contrib-jessie64" + config.vm.hostname = "exa" + + # Install the dependencies needed for exa to build. + config.vm.provision :shell, privileged: true, inline: + %[apt-get install -y git cmake libgit2-dev libssh2-1-dev curl attr] + + # 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 lot of output. + config.vm.provision :shell, privileged: false, inline: + %[hash rustc &>/dev/null || curl -sSf https://static.rust-lang.org/rustup.sh | sh &> /dev/null] + + # 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: false, inline: + %[echo "export CARGO_TARGET_DIR=/home/vagrant/target" >> ~/.bashrc] + + # Test that wide columns work with a really long username. + # The benefit of Vagrant is that we don’t 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}] + + test_dir = "/home/vagrant/testcases" + invalid_uid = 666 + invalid_gid = 616 + some_date = "201601011234.56" # 1st January 2016, 12:34:56 + + # Delete old testcases if they exist already. + # This needs root because the generator does some sudo-ing. + config.vm.provision :shell, privileged: true, inline: + %[rm -rfv #{test_dir}] + + # Generate our awkward testcases. + config.vm.provision :shell, privileged: false, inline: + %[mkdir #{test_dir}] + + # Awkward file size testcases. + 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/"* + 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" + EOF + + # Awkward passwd testcases. + # sudo is needed for these because we technically aren’t a member + # of the groups (because they don’t 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" + sudo chown #{invalid_uid} "#{test_dir}/passwd/unknown-uid" + + touch -t #{some_date} "#{test_dir}/passwd/unknown-gid" + sudo chgrp #{invalid_gid} "#{test_dir}/passwd/unknown-gid" + EOF + + # Awkward permission testcases. + config.vm.provision :shell, privileged: false, inline: <<-EOF + set -xe + mkdir "#{test_dir}/permissions" + + touch "#{test_dir}/permissions/all-permissions" + chmod 777 "#{test_dir}/permissions/all-permissions" + + touch "#{test_dir}/permissions/no-permissions" + chmod 000 "#{test_dir}/permissions/no-permissions" + + mkdir "#{test_dir}/permissions/forbidden-directory" + chmod 000 "#{test_dir}/permissions/forbidden-directory" + + touch -t #{some_date} "#{test_dir}/permissions/"* + EOF + + + # Awkward extended attribute testcases. + config.vm.provision :shell, privileged: false, inline: <<-EOF + set -xe + mkdir "#{test_dir}/attributes" + + touch "#{test_dir}/attributes/none" + + touch "#{test_dir}/attributes/one" + setfattr -n user.greeting -v hello "#{test_dir}/attributes/one" + + touch "#{test_dir}/attributes/two" + setfattr -n user.greeting -v hello "#{test_dir}/attributes/two" + setfattr -n user.another_greeting -v hi "#{test_dir}/attributes/two" + + #touch "#{test_dir}/attributes/forbidden" + #setfattr -n user.greeting -v hello "#{test_dir}/attributes/forbidden" + #chmod +a "$YOU deny readextattr" "#{test_dir}/attributes/forbidden" + + mkdir "#{test_dir}/attributes/dirs" + + mkdir "#{test_dir}/attributes/dirs/empty-with-attribute" + setfattr -n user.greeting -v hello "#{test_dir}/attributes/dirs/empty-with-attribute" + + mkdir "#{test_dir}/attributes/dirs/full-with-attribute" + touch "#{test_dir}/attributes/dirs/full-with-attribute/file" + setfattr -n user.greeting -v hello "#{test_dir}/attributes/dirs/full-with-attribute" + + mkdir "#{test_dir}/attributes/dirs/full-but-forbidden" + touch "#{test_dir}/attributes/dirs/full-but-forbidden/file" + #setfattr -n user.greeting -v hello "#{test_dir}/attributes/dirs/full-but-forbidden" + #chmod 000 "#{test_dir}/attributes/dirs/full-but-forbidden" + #chmod +a "$YOU deny readextattr" "#{test_dir}/attributes/dirs/full-but-forbidden" + + touch -t #{some_date} "#{test_dir}/attributes" + touch -t #{some_date} "#{test_dir}/attributes/"* + touch -t #{some_date} "#{test_dir}/attributes/dirs/"* + touch -t #{some_date} "#{test_dir}/attributes/dirs/"*/* + EOF +end |