summaryrefslogtreecommitdiffstats
path: root/tests/bsd/type_w.sh
blob: 3aa50d551d615a17bb71b764dcd96714666d35ec (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
# Only ffs supports whiteouts on FreeBSD
command -v mdconfig &>/dev/null || skip
command -v newfs &>/dev/null || skip

cd "$TEST"

# Create a ramdisk
if command -v truncate &>/dev/null; then
    truncate -s1M img
else
    dd if=/dev/zero of=img bs=1k count=1k
fi
md=$(bfs_sudo mdconfig img) || skip
defer bfs_sudo mdconfig -du "$md"

# Make an ffs filesystem
bfs_sudo newfs -n "/dev/$md" >&2 || skip
mkdir mnt

# Mount it
bfs_sudo mount "/dev/$md" mnt || skip
defer bfs_sudo umount mnt

# Make it owned by us
bfs_sudo chown "$(id -u):$(id -g)" mnt
"$XTOUCH" -p mnt/{lower/{foo,bar,baz},upper/{bar,baz/qux}}

# Mount a union filesystem within it
bfs_sudo mount -t unionfs -o below mnt/{lower,upper}
defer bfs_sudo umount mnt/upper

# Create a whiteout
rm mnt/upper/bar

# FreeBSD find doesn't have -printf, so munge -ls output
munge_ls() {
    sed -En 's|.*([-drwx]{10}).*(mnt/.*)|'"$1"': \1 \2|p'
}

# Do a few tests in one
{
    # Normally, we shouldn't see the whiteouts
    invoke_bfs mnt -ls | munge_ls 1
    # -type w adds whiteouts to the output
    invoke_bfs mnt -type w -ls | munge_ls 2
    # So this is not the same as test 1
    invoke_bfs mnt \( -type w -or -not -type w \) -ls | munge_ls 3
    # Unmount the unionfs
    pop_defer
    # Now repeat the same tests
    invoke_bfs mnt -ls | munge_ls 4
    invoke_bfs mnt -type w -ls | munge_ls 5
    invoke_bfs mnt \( -type w -or -not -type w \) -ls | munge_ls 6
} >"$OUT"
sort_output
diff_output