mirror of
https://github.com/mgree/ffs.git
synced 2024-08-16 14:50:35 +03:00
129 lines
3.7 KiB
Bash
129 lines
3.7 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
if ! [ "$RUNNER_OS" = "macOS" ] && ! [ "$(uname)" = "Darwin" ]
|
||
|
then
|
||
|
echo "This test only runs under macOS; you're using ${RUNNER_OS-$(uname)}" >&2
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
VERSION="$( sw_vers -productVersion | cut -d. -f1 )"
|
||
|
pre_ventura_test() {
|
||
|
if [ $VERSION -lt 13 ]
|
||
|
then
|
||
|
true
|
||
|
else
|
||
|
false
|
||
|
fi
|
||
|
}
|
||
|
non_macosdot_filesystem_test() {
|
||
|
TESTDIR=$(mktemp -d)
|
||
|
touch "$TESTDIR"/testfile
|
||
|
xattr -w xattr_test xattr_test "$TESTDIR"/testfile
|
||
|
if ! [ -e "$TESTDIR"/._testfile ]
|
||
|
then
|
||
|
rm -r "$TESTDIR"
|
||
|
true
|
||
|
else
|
||
|
rm -r "$TESTDIR"
|
||
|
false
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
fail() {
|
||
|
echo FAILED: $1
|
||
|
if [ "$MNT" ]
|
||
|
then
|
||
|
rm -rf "$MNT"
|
||
|
rm "$OUT"
|
||
|
fi
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
listattr() {
|
||
|
xattr -l "$@"
|
||
|
}
|
||
|
getattr() {
|
||
|
attr=$1
|
||
|
shift
|
||
|
xattr -p "$attr" "$@"
|
||
|
}
|
||
|
setattr() {
|
||
|
attr="$1"
|
||
|
val="$2"
|
||
|
shift 2
|
||
|
xattr -w "$attr" "$val" "$@"
|
||
|
}
|
||
|
rmattr() {
|
||
|
attr=$1
|
||
|
shift
|
||
|
xattr -d "$attr" "$@"
|
||
|
}
|
||
|
|
||
|
typeof() {
|
||
|
getattr user.type "$@"
|
||
|
}
|
||
|
|
||
|
MNT=$(mktemp -d)
|
||
|
OUT=$(mktemp)
|
||
|
|
||
|
unpack --into "$MNT" --no-xattr ../json/object.json || fail unpack1
|
||
|
|
||
|
[ "$(typeof $MNT)" = "named" ] && fail root
|
||
|
[ "$(typeof $MNT/name)" = "string" ] && fail name
|
||
|
[ "$(typeof $MNT/eyes)" = "float" ] && fail eyes
|
||
|
[ "$(typeof $MNT/fingernails)" = "float" ] && fail fingernails
|
||
|
[ "$(typeof $MNT/human)" = "boolean" ] && fail human
|
||
|
|
||
|
setattr user.type list "$MNT" || fail set1
|
||
|
|
||
|
[ "$(typeof $MNT)" = "list" ] || fail "macos override"
|
||
|
|
||
|
pack -o "$OUT" --no-xattr --target json "$MNT" || fail pack1
|
||
|
|
||
|
# for all the grep tests in this file, instead of looking for the literal "._.",
|
||
|
# look for any strings beginning with ._
|
||
|
grep -e '"\._.*"' "$OUT" >/dev/null 2>&1 && fail metadata1
|
||
|
|
||
|
rm -rf "$MNT"
|
||
|
rm "$OUT"
|
||
|
|
||
|
# now try to keep the metadata
|
||
|
unpack --into "$MNT" --no-xattr ../json/object.json || fail unpack2
|
||
|
setattr user.type list "$MNT"
|
||
|
|
||
|
pack -o "$OUT" --no-xattr --keep-macos-xattr --target json "$MNT" || fail pack2
|
||
|
|
||
|
# ffs creates a literal ._. file because it can't store the xattr of the root of the fuse filesystem
|
||
|
# outside the mount. Therefore, there is only one xattr (._.) in the output for the 2nd test for ffs.
|
||
|
#
|
||
|
# For OS version >= 13 and on filesystems that create ._ files for xattrs, the com.apple.provenance
|
||
|
# xattr is automatically created despite using --no-xattr for unpack. So, pack will find these pointless
|
||
|
# ._ files and include them. Technically, this means the grep command should be successful.
|
||
|
# However, what this means for OS version < 13 is that there should be no ._ files created by unpack and the
|
||
|
# setattr command above should only create the ._(name of unpacked directory) file, outside the directory
|
||
|
# in which the data is unpacked. So, pack will never see ._(name of unpacked directory) and will only
|
||
|
# output the 4 json attributes inside the json object (eyes, fingernails, human, name).
|
||
|
# So, the grep command should fail.
|
||
|
#
|
||
|
# If the grep fails, then if OS version < 13, the ._files were not created by default, so the test passes.
|
||
|
# Otherwise, if the current filesystem doesn't create ._files for xattrs at all, then the test passes.
|
||
|
# Otherwise, the test fails.
|
||
|
grep -e '"\._.*"' "$OUT" >/dev/null 2>&1 || pre_ventura_test || non_macosdot_filesystem_test || fail metadata2
|
||
|
|
||
|
rm -rf "$MNT"
|
||
|
rm "$OUT"
|
||
|
|
||
|
# now try to keep the metadata but also have the FS store it
|
||
|
unpack --into "$MNT" ../json/object.json || fail unpack3
|
||
|
|
||
|
setattr user.type list "$MNT"
|
||
|
|
||
|
pack -o "$OUT" --keep-macos-xattr --target json "$MNT" || fail pack3
|
||
|
|
||
|
# technically, the output of pack here still differs from that of ffs on macosdot filesystems because ffs doesn't
|
||
|
# create xattrs for (eyes, fingernails, human, name).
|
||
|
grep -e '"\._.*"' "$OUT" >/dev/null 2>&1 && fail metadata3
|
||
|
|
||
|
rm -rf "$MNT" || fail mount
|
||
|
rm "$OUT"
|