summaryrefslogtreecommitdiffstats
path: root/Vagrantfile
blob: ff05f89d295c0ddd6b419981ec9b0328250f0961 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
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

    # File name extension testcases.
    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"
        touch "#{test_dir}/file-types/compressed.tgz"

        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

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