#!/bin/bash
|
|
[ -f testing.sh ] && . testing.sh
|
|
#testing "name" "command" "result" "infile" "stdin"
|
|
# For reproducibility: UTC and umask 0002
|
|
OLDTZ="$TZ"
|
export TZ=utc
|
OLDUMASK=$(umask)
|
umask 0002
|
|
# 3888 bytes, most of PATH_MAX
|
LONG=abcdefghijklmnopqrstuvwxyz0123456789
|
LONG=$LONG$LONG$LONG$LONG$LONG$LONG$LONG$LONG$LONG
|
LONG=$LONG$LONG$LONG$LONG$LONG$LONG
|
LONG=$LONG$LONG
|
|
# Reproducible tarballs: override ownership and timestamp. Also amount of
|
# trailing NUL padding varies (1024 bytes is minimum, gnu/dammit does more)
|
# so look at first 3 512-byte frames when analyzing header content.
|
|
TAR='tar c --owner root --group root --mtime @1234567890'
|
SUM='head -c $((3*512)) | sha1sum | sed "s/ .*//"'
|
[ -n "$TARHD" ] && SUM="tee >(hd >&2) | $SUM"
|
LST='tar tv | sed "s/[ \t][ \t]*/ /g"'
|
|
touch file
|
testing "create file" "$TAR file | $SUM" \
|
"fecaecba936e604bb115627a6ef4db7c7a3a8f81\n" "" ""
|
|
testing "pass file" "$TAR file | $LST" \
|
"-rw-rw-r-- root/root 0 2009-02-13 23:31 file\n" "" ""
|
|
# The kernel has two hardwired meaningful UIDs: 0 (root) and 65534 (nobody).
|
# (Technically changeable via /proc/sys/*/overflowuid but nobody ever does)
|
skipnot id nobody >/dev/null
|
testing "pass user" "tar -c --owner nobody --group root --mtime @0 file | $LST" \
|
"-rw-rw-r-- nobody/root 0 1970-01-01 00:00 file\n" "" ""
|
skipnot grep nobody /etc/group >/dev/null
|
testing "pass group" "tar c --owner root --group nobody --mtime @0 file | $LST" \
|
"-rw-rw-r-- root/nobody 0 1970-01-01 00:00 file\n" "" ""
|
|
touch -t 198701231234.56 file
|
testing "pass mtime" \
|
"tar c --owner root --group root file | tar tv --full-time | sed 's/[ \t][ \t]*/ /g'" \
|
"-rw-rw-r-- root/root 0 1987-01-23 12:34:56 file\n" "" ""
|
|
mkdir dir
|
testing "create dir" "$TAR dir | $SUM" \
|
"05739c423d7d4a7f12b3dbb7c94149acb2bb4f8d\n" "" ""
|
|
testing "pass dir" "$TAR dir | $LST" \
|
"drwxrwxr-x root/root 0 2009-02-13 23:31 dir/\n" "" ""
|
|
# note: does _not_ include dir entry in archive, just file
|
touch dir/file
|
testing "create file in dir" "$TAR dir/file | $SUM" \
|
"2d7b96c7025987215f5a41f10eaa84311160afdb\n" "" ""
|
|
# Tests recursion without worrying about content order
|
testing "create dir and dir/file" "$TAR dir | $SUM" \
|
"0bcc8005a3e07eb63c9b735267aecc5b774795d7\n" "" ""
|
|
testing "pass dir/file" "$TAR dir | $LST" \
|
"drwxrwxr-x root/root 0 2009-02-13 23:31 dir/\n-rw-rw-r-- root/root 0 2009-02-13 23:31 dir/file\n" "" ""
|
|
# / and .. only stripped from name, not symlink target.
|
ln -s ../name.././.. dir/link
|
testing "create symlink" "$TAR dir/link | $SUM" \
|
"7324cafbd9aeec5036b6efc54d741f11528aeb10\n" "" ""
|
|
# Also two explicit targets
|
ln dir/file dir/hardlink
|
testing "create hardlink" "$TAR dir/file dir/hardlink | $SUM" \
|
"c5383651f8c03ec0fe15e8a9e28a4e8e5273990d\n" "" ""
|
|
ln dir/link dir/hlink
|
testing "create hardlink to symlink" "$TAR dir/link dir/hlink | $SUM" \
|
"3bc16f8fb6fc8b05f691da8caf989a70ee99284a\n" "" ""
|
|
skipnot mkfifo dir/fifo
|
testing "create dir/fifo" "$TAR dir/fifo | $SUM" \
|
"bd1365db6e8ead4c813333f9666994c1899924d9\n" "" ""
|
|
# test L and K records
|
|
# 4+96=100 (biggest short name), 4+97=101 (shortest long name)
|
touch dir/${LONG:1:96} dir/${LONG:1:97}
|
testing "create longfilename" "$TAR dir/${LONG:1:97} dir/${LONG:1:96} | $SUM" \
|
"08af4f9d8b7f4b2f6c264689efe42a4159314708\n" "" ""
|
|
# this expects devtmpfs values
|
|
testing "pass /dev/null" \
|
"tar c --mtime @0 /dev/null 2>/dev/null | $LST" \
|
"crw-rw-rw- root/root 1,3 1970-01-01 00:00 dev/null\n" "" ""
|
|
testing "pass /dev/loop0" \
|
"tar c --numeric-owner --mtime @0 /dev/loop0 2>/dev/null | $LST" \
|
"brw-rw---- 0/6 7,0 1970-01-01 00:00 dev/loop0\n" "" ""
|
|
skipnot mknod dir/char c 12 34
|
testing "create char2" "$TAR /dev/null | $SUM" \
|
"" "" ""
|
|
#testing "create block" "$TAR /dev/
|
|
skipnot mknod dir/block b 56 78
|
testing "create dir/block" "$TAR dir/block | $SUM" \
|
"" "" ""
|
|
skipnot chown nobody dir/file
|
testing "ownership" "$TAR dir/block | $SUM" \
|
"blat" "" ""
|
|
TZ="$OLDTZ"
|
umask $OLDUMASK
|
unset LONG TAR SUM OLDUMASK OLDTZ LST
|