mirror of
https://github.com/NixOS/nix.git
synced 2024-11-25 00:02:25 +00:00
Merge pull request #11609 from yannham/fix/nar-test-zfs
Fix NAR tests on Linux+ZFS+normalize
This commit is contained in:
commit
26c3fc11ea
@ -88,17 +88,50 @@ touch "$TEST_ROOT/case/xt_CONNMARK.h~nix~case~hack~3"
|
||||
rm -rf "$TEST_ROOT/case"
|
||||
expectStderr 1 nix-store "${opts[@]}" --restore "$TEST_ROOT/case" < case-collision.nar | grepQuiet "NAR contains file name 'test' that collides with case-hacked file name 'Test~nix~case~hack~1'"
|
||||
|
||||
# Deserializing a NAR that contains file names that Unicode-normalize
|
||||
# to the same name should fail on macOS but succeed on Linux.
|
||||
# Deserializing a NAR that contains file names that Unicode-normalize to the
|
||||
# same name should fail on macOS and specific Linux setups (typically ZFS with
|
||||
# `utf8only` enabled and `normalization` set to anything else than `none`). The
|
||||
# deserialization should succeed on most Linux, where file names aren't
|
||||
# unicode-normalized.
|
||||
#
|
||||
# We test that:
|
||||
#
|
||||
# 1. It either succeeds or fails with "already exists" error.
|
||||
# 2. Nix has the same behavior with respect to unicode normalization than
|
||||
# $TEST_ROOT's filesystem (when using basic Unix commands)
|
||||
rm -rf "$TEST_ROOT/out"
|
||||
if [[ $(uname) = Darwin ]]; then
|
||||
expectStderr 1 nix-store --restore "$TEST_ROOT/out" < unnormalized.nar | grepQuiet "path '.*/out/â' already exists"
|
||||
else
|
||||
nix-store --restore "$TEST_ROOT/out" < unnormalized.nar
|
||||
set +e
|
||||
unicodeTestOut=$(nix-store --restore "$TEST_ROOT/out" < unnormalized.nar 2>&1)
|
||||
unicodeTestCode=$?
|
||||
set -e
|
||||
|
||||
touch "$TEST_ROOT/unicode-â" # non-canonical version
|
||||
touch "$TEST_ROOT/unicode-â"
|
||||
|
||||
touchFilesCount=$(find "$TEST_ROOT" -maxdepth 1 -name "unicode-*" -type f | wc -l)
|
||||
|
||||
if (( unicodeTestCode == 1 )); then
|
||||
# If the command failed (MacOS or ZFS + normalization), checks that it failed
|
||||
# with the expected "already exists" error, and that this is the same
|
||||
# behavior as `touch`
|
||||
echo "$unicodeTestOut" | grepQuiet "path '.*/out/â' already exists"
|
||||
|
||||
(( touchFilesCount == 1 ))
|
||||
elif (( unicodeTestCode == 0 )); then
|
||||
# If the command succeeded, check that both files are present, and that this
|
||||
# is the same behavior as `touch`
|
||||
[[ -e $TEST_ROOT/out/â ]]
|
||||
[[ -e $TEST_ROOT/out/â ]]
|
||||
|
||||
(( touchFilesCount == 2 ))
|
||||
else
|
||||
# if the return code is neither 0 or 1, fail the test.
|
||||
echo "NAR deserialization of files with the same Unicode normalization failed with unexpected return code $unicodeTestCode" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm -f "$TEST_ROOT/unicode-*"
|
||||
|
||||
# Unpacking a NAR with a NUL character in a file name should fail.
|
||||
rm -rf "$TEST_ROOT/out"
|
||||
expectStderr 1 nix-store --restore "$TEST_ROOT/out" < nul.nar | grepQuiet "NAR contains invalid file name 'f"
|
||||
|
Loading…
Reference in New Issue
Block a user