Vagrantfile 8.6 KB
Newer Older
1 2 3 4 5 6
Vagrant.configure("2") do |config|
    config.vm.provider "virtualbox" do |v|
        v.memory = 1024
        v.cpus = 1
    end

L
Laurent Arnoud 已提交
7
    config.vm.box = "debian/jessie64"
8 9
    config.vm.hostname = "exa"

10

11 12
    # Install the dependencies needed for exa to build.
    config.vm.provision :shell, privileged: true, inline:
13 14
        %[apt-get install -y git cmake libssl-dev libgit2-dev libssh2-1-dev curl attr pkg-config]

15 16 17 18 19 20

    # 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]

21

22 23 24
    # Install Rust.
    # This is done as vagrant, not root, because it’s vagrant
    # who actually uses it. Sent to /dev/null because the progress
25
    # bar produces a ton of output.
26 27 28
    config.vm.provision :shell, privileged: false, inline:
        %[hash rustc &>/dev/null || curl -sSf https://static.rust-lang.org/rustup.sh | sh &> /dev/null]

29

30 31 32 33 34
    # 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:
35 36 37 38 39 40 41 42 43 44
        %[echo "export CARGO_TARGET_DIR=/home/ubuntu/target" >> ~/.bashrc]


    # We create two users that own the test files.
    # The first one just owns the ordinary ones, because we don’t want to
    # depend on “vagrant” or “ubuntu” existing.
    user = "cassowary"
    config.vm.provision :shell, privileged: true, inline:
        %[id -u #{user} &>/dev/null || useradd #{user}]

45

46 47 48
    # The second one has a long name, to test that the file owner column
    # widens correctly. The benefit of Vagrant is that we don’t need to
    # set this up on the *actual* system!
49 50 51 52
    longuser = "antidisestablishmentarienism"
    config.vm.provision :shell, privileged: true, inline:
        %[id -u #{longuser} &>/dev/null || useradd #{longuser}]

53

54 55 56 57 58 59 60
    # Because the timestamps are formatted differently depending on whether
    # they’re 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

61 62 63

    # We also need an UID and a GID that are guaranteed to not exist, to
    # test what happen when they don’t.
64 65 66 67
    invalid_uid = 666
    invalid_gid = 616


68 69 70 71 72 73 74 75 76 77
    # 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

78 79

    # Awkward file size testcases.
80
    # This needs sudo to set the files’ users at the very end.
81 82 83 84 85 86 87 88
    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
89

90
        touch -t #{some_date} "#{test_dir}/files/"*
91 92
        chmod 644 "#{test_dir}/files/"*
        sudo chown #{user}:#{user} "#{test_dir}/files/"*
93 94
    EOF

95

B
Ben S 已提交
96
    # File name extension testcases.
97 98
    # These are tested in grid view, so we don’t need to bother setting
    # owners or timestamps or anything.
B
Ben S 已提交
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
    config.vm.provision :shell, privileged: false, inline: <<-EOF
        set -xe
        mkdir "#{test_dir}/file-types"

        touch "#{test_dir}/file-types/Makefile"

        touch "#{test_dir}/file-types/image.png"
        touch "#{test_dir}/file-types/image.svg"

        touch "#{test_dir}/file-types/video.avi"
        touch "#{test_dir}/file-types/video.wmv"

        touch "#{test_dir}/file-types/music.mp3"
        touch "#{test_dir}/file-types/music.ogg"

        touch "#{test_dir}/file-types/lossless.flac"
        touch "#{test_dir}/file-types/lossless.wav"

        touch "#{test_dir}/file-types/crypto.asc"
        touch "#{test_dir}/file-types/crypto.signature"

        touch "#{test_dir}/file-types/document.pdf"
        touch "#{test_dir}/file-types/document.xlsx"

        touch "#{test_dir}/file-types/compressed.zip"
        touch "#{test_dir}/file-types/compressed.tar.gz"
B
Ben S 已提交
125
        touch "#{test_dir}/file-types/compressed.tgz"
B
Ben S 已提交
126 127 128 129 130 131 132 133 134 135 136

        touch "#{test_dir}/file-types/backup~"
        touch "#{test_dir}/file-types/#SAVEFILE#"
        touch "#{test_dir}/file-types/file.tmp"

        touch "#{test_dir}/file-types/compiled.class"
        touch "#{test_dir}/file-types/compiled.o"
        touch "#{test_dir}/file-types/compiled.js"
        touch "#{test_dir}/file-types/compiled.coffee"
    EOF

137

138 139 140 141 142 143 144
    # 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"
B
Ben S 已提交
145
        ln -s /proc/1/root "#{test_dir}/links/forbidden"
146 147
    EOF

148

149 150 151 152 153 154 155 156
    # 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"

157 158 159
        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"
160

161 162 163
        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"
164 165
    EOF

166

167 168 169 170 171
    # Awkward permission testcases.
    config.vm.provision :shell, privileged: false, inline: <<-EOF
        set -xe
        mkdir "#{test_dir}/permissions"

172
        touch     "#{test_dir}/permissions/all-permissions"
173 174
        chmod 777 "#{test_dir}/permissions/all-permissions"

175
        touch     "#{test_dir}/permissions/no-permissions"
176 177
        chmod 000 "#{test_dir}/permissions/no-permissions"

178
        mkdir     "#{test_dir}/permissions/forbidden-directory"
179 180
        chmod 000 "#{test_dir}/permissions/forbidden-directory"

181 182 183 184 185 186 187
        for perms in 001 002 004 010 020 040 100 200 400; do
            touch        "#{test_dir}/permissions/$perms"
            chmod $perms "#{test_dir}/permissions/$perms"
        done

        touch -t #{some_date}      "#{test_dir}/permissions/"*
        sudo chown #{user}:#{user} "#{test_dir}/permissions/"*
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
    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"

224
        touch -t #{some_date} "#{test_dir}/attributes"
225 226 227
        touch -t #{some_date} "#{test_dir}/attributes/"*
        touch -t #{some_date} "#{test_dir}/attributes/dirs/"*
        touch -t #{some_date} "#{test_dir}/attributes/dirs/"*/*
228 229

        sudo chown #{user}:#{user} -R "#{test_dir}/attributes"
230 231
    EOF
end