Merge branch 'jc/test-prereq'

Teaches the test framework to probe rarely used prerequistes lazily,
and make use of it for detecting SYMLINKS, CASE_INSENSITIVE_FS and
NKD/NKC MacOS x gotcha.

* jc/test-prereq:
  t3910: use the UTF8_NFD_TO_NFC test prereq
  test-lib: provide UTF8 behaviour as a prerequisite
  t0050: use the SYMLINKS test prereq
  t0050: use the CASE_INSENSITIVE_FS test prereq
  test-lib: provide case insensitivity as a prerequisite
  test: allow prerequisite to be evaluated lazily
  test: rename $satisfied to $satisfied_prereq
This commit is contained in:
Junio C Hamano 2012-08-22 11:51:26 -07:00
commit 16a3f91a36
6 changed files with 235 additions and 207 deletions

View File

@ -625,6 +625,15 @@ use these, and "test_set_prereq" for how to define your own.
Git was compiled with USE_LIBPCRE=YesPlease. Wrap any tests Git was compiled with USE_LIBPCRE=YesPlease. Wrap any tests
that use git-grep --perl-regexp or git-grep -P in these. that use git-grep --perl-regexp or git-grep -P in these.
- CASE_INSENSITIVE_FS
Test is run on a case insensitive file system.
- UTF8_NFD_TO_NFC
Test is run on a filesystem which converts decomposed utf-8 (nfd)
to precomposed utf-8 (nfc).
Tips for Writing Tests Tips for Writing Tests
---------------------- ----------------------

View File

@ -123,16 +123,6 @@ test_expect_success 'attribute matching is case insensitive when core.ignorecase
' '
test_expect_success 'check whether FS is case-insensitive' '
mkdir junk &&
echo good >junk/CamelCase &&
echo bad >junk/camelcase &&
if test "$(cat junk/CamelCase)" != good
then
test_set_prereq CASE_INSENSITIVE_FS
fi
'
test_expect_success CASE_INSENSITIVE_FS 'additional case insensitivity tests' ' test_expect_success CASE_INSENSITIVE_FS 'additional case insensitivity tests' '
test_must_fail attr_check a/B/D/g "a/b/d/*" "-c core.ignorecase=0" && test_must_fail attr_check a/B/D/g "a/b/d/*" "-c core.ignorecase=0" &&
test_must_fail attr_check A/B/D/NO "a/b/d/*" "-c core.ignorecase=0" && test_must_fail attr_check A/B/D/NO "a/b/d/*" "-c core.ignorecase=0" &&

View File

@ -7,48 +7,26 @@ test_description='Various filesystem issues'
auml=$(printf '\303\244') auml=$(printf '\303\244')
aumlcdiar=$(printf '\141\314\210') aumlcdiar=$(printf '\141\314\210')
case_insensitive= if test_have_prereq CASE_INSENSITIVE_FS
unibad= then
no_symlinks=
test_expect_success 'see what we expect' '
test_case=test_expect_success &&
test_unicode=test_expect_success &&
mkdir junk &&
echo good >junk/CamelCase &&
echo bad >junk/camelcase &&
if test "$(cat junk/CamelCase)" != good
then
test_case=test_expect_failure &&
case_insensitive=t
fi &&
rm -fr junk &&
mkdir junk &&
>junk/"$auml" &&
case "$(cd junk && echo *)" in
"$aumlcdiar")
test_unicode=test_expect_failure &&
unibad=t
;;
*) ;;
esac &&
rm -fr junk &&
{
ln -s x y 2> /dev/null &&
test -h y 2> /dev/null ||
no_symlinks=1 &&
rm -f y
}
'
test "$case_insensitive" &&
say "will test on a case insensitive filesystem" say "will test on a case insensitive filesystem"
test "$unibad" && test_case=test_expect_failure
else
test_case=test_expect_success
fi
if test_have_prereq UTF8_NFD_TO_NFC
then
say "will test on a unicode corrupting filesystem" say "will test on a unicode corrupting filesystem"
test "$no_symlinks" && test_unicode=test_expect_failure
else
test_unicode=test_expect_success
fi
test_have_prereq SYMLINKS ||
say "will test on a filesystem lacking symbolic links" say "will test on a filesystem lacking symbolic links"
if test "$case_insensitive" if test_have_prereq CASE_INSENSITIVE_FS
then then
test_expect_success "detection of case insensitive filesystem during repo init" ' test_expect_success "detection of case insensitive filesystem during repo init" '
@ -62,19 +40,19 @@ test_expect_success "detection of case insensitive filesystem during repo init"
' '
fi fi
if test "$no_symlinks" if test_have_prereq SYMLINKS
then then
test_expect_success "detection of filesystem w/o symlink support during repo init" '
v=$(git config --bool core.symlinks) &&
test "$v" = false
'
else
test_expect_success "detection of filesystem w/o symlink support during repo init" ' test_expect_success "detection of filesystem w/o symlink support during repo init" '
test_must_fail git config --bool core.symlinks || test_must_fail git config --bool core.symlinks ||
test "$(git config --bool core.symlinks)" = true test "$(git config --bool core.symlinks)" = true
' '
else
test_expect_success "detection of filesystem w/o symlink support during repo init" '
v=$(git config --bool core.symlinks) &&
test "$v" = false
'
fi fi
test_expect_success "setup case tests" ' test_expect_success "setup case tests" '

View File

@ -7,158 +7,147 @@ test_description='utf-8 decomposed (nfd) converted to precomposed (nfc)'
. ./test-lib.sh . ./test-lib.sh
if ! test_have_prereq UTF8_NFD_TO_NFC
then
skip_all="filesystem does not corrupt utf-8"
test_done
fi
# create utf-8 variables
Adiarnfc=`printf '\303\204'` Adiarnfc=`printf '\303\204'`
Adiarnfd=`printf 'A\314\210'` Adiarnfd=`printf 'A\314\210'`
# check if the feature is compiled in Odiarnfc=`printf '\303\226'`
mkdir junk && Odiarnfd=`printf 'O\314\210'`
>junk/"$Adiarnfc" && AEligatu=`printf '\303\206'`
case "$(cd junk && echo *)" in Invalidu=`printf '\303\377'`
"$Adiarnfd")
test_nfd=1
;;
*) ;;
esac
rm -rf junk
if test "$test_nfd" #Create a string with 255 bytes (decomposed)
then Alongd=$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd #21 Byte
# create more utf-8 variables Alongd=$Alongd$Alongd$Alongd #63 Byte
Odiarnfc=`printf '\303\226'` Alongd=$Alongd$Alongd$Alongd$Alongd$Adiarnfd #255 Byte
Odiarnfd=`printf 'O\314\210'`
AEligatu=`printf '\303\206'`
Invalidu=`printf '\303\377'`
#Create a string with 254 bytes (precomposed)
Alongc=$AEligatu$AEligatu$AEligatu$AEligatu$AEligatu #10 Byte
Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #50 Byte
Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #250 Byte
Alongc=$Alongc$AEligatu$AEligatu #254 Byte
#Create a string with 255 bytes (decomposed) test_expect_success "detect if nfd needed" '
Alongd=$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd #21 Byte
Alongd=$Alongd$Alongd$Alongd #63 Byte
Alongd=$Alongd$Alongd$Alongd$Alongd$Adiarnfd #255 Byte
#Create a string with 254 bytes (precomposed)
Alongc=$AEligatu$AEligatu$AEligatu$AEligatu$AEligatu #10 Byte
Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #50 Byte
Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #250 Byte
Alongc=$Alongc$AEligatu$AEligatu #254 Byte
test_expect_success "detect if nfd needed" '
precomposeunicode=`git config core.precomposeunicode` && precomposeunicode=`git config core.precomposeunicode` &&
test "$precomposeunicode" = false && test "$precomposeunicode" = false &&
git config core.precomposeunicode true git config core.precomposeunicode true
' '
test_expect_success "setup" ' test_expect_success "setup" '
>x && >x &&
git add x && git add x &&
git commit -m "1st commit" && git commit -m "1st commit" &&
git rm x && git rm x &&
git commit -m "rm x" git commit -m "rm x"
' '
test_expect_success "setup case mac" ' test_expect_success "setup case mac" '
git checkout -b mac_os git checkout -b mac_os
' '
# This will test nfd2nfc in readdir() # This will test nfd2nfc in readdir()
test_expect_success "add file Adiarnfc" ' test_expect_success "add file Adiarnfc" '
echo f.Adiarnfc >f.$Adiarnfc && echo f.Adiarnfc >f.$Adiarnfc &&
git add f.$Adiarnfc && git add f.$Adiarnfc &&
git commit -m "add f.$Adiarnfc" git commit -m "add f.$Adiarnfc"
' '
# This will test nfd2nfc in git stage() # This will test nfd2nfc in git stage()
test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" ' test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" '
mkdir d.$Adiarnfd && mkdir d.$Adiarnfd &&
echo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd && echo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd &&
git stage d.$Adiarnfd/f.$Adiarnfd && git stage d.$Adiarnfd/f.$Adiarnfd &&
git commit -m "add d.$Adiarnfd/f.$Adiarnfd" git commit -m "add d.$Adiarnfd/f.$Adiarnfd"
' '
test_expect_success "add link Adiarnfc" ' test_expect_success "add link Adiarnfc" '
ln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc && ln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc &&
git add l.$Adiarnfc && git add l.$Adiarnfc &&
git commit -m "add l.Adiarnfc" git commit -m "add l.Adiarnfc"
' '
# This will test git log # This will test git log
test_expect_success "git log f.Adiar" ' test_expect_success "git log f.Adiar" '
git log f.$Adiarnfc > f.Adiarnfc.log && git log f.$Adiarnfc > f.Adiarnfc.log &&
git log f.$Adiarnfd > f.Adiarnfd.log && git log f.$Adiarnfd > f.Adiarnfd.log &&
test -s f.Adiarnfc.log && test -s f.Adiarnfc.log &&
test -s f.Adiarnfd.log && test -s f.Adiarnfd.log &&
test_cmp f.Adiarnfc.log f.Adiarnfd.log && test_cmp f.Adiarnfc.log f.Adiarnfd.log &&
rm f.Adiarnfc.log f.Adiarnfd.log rm f.Adiarnfc.log f.Adiarnfd.log
' '
# This will test git ls-files # This will test git ls-files
test_expect_success "git lsfiles f.Adiar" ' test_expect_success "git lsfiles f.Adiar" '
git ls-files f.$Adiarnfc > f.Adiarnfc.log && git ls-files f.$Adiarnfc > f.Adiarnfc.log &&
git ls-files f.$Adiarnfd > f.Adiarnfd.log && git ls-files f.$Adiarnfd > f.Adiarnfd.log &&
test -s f.Adiarnfc.log && test -s f.Adiarnfc.log &&
test -s f.Adiarnfd.log && test -s f.Adiarnfd.log &&
test_cmp f.Adiarnfc.log f.Adiarnfd.log && test_cmp f.Adiarnfc.log f.Adiarnfd.log &&
rm f.Adiarnfc.log f.Adiarnfd.log rm f.Adiarnfc.log f.Adiarnfd.log
' '
# This will test git mv # This will test git mv
test_expect_success "git mv" ' test_expect_success "git mv" '
git mv f.$Adiarnfd f.$Odiarnfc && git mv f.$Adiarnfd f.$Odiarnfc &&
git mv d.$Adiarnfd d.$Odiarnfc && git mv d.$Adiarnfd d.$Odiarnfc &&
git mv l.$Adiarnfd l.$Odiarnfc && git mv l.$Adiarnfd l.$Odiarnfc &&
git commit -m "mv Adiarnfd Odiarnfc" git commit -m "mv Adiarnfd Odiarnfc"
' '
# Files can be checked out as nfc # Files can be checked out as nfc
# And the link has been corrected from nfd to nfc # And the link has been corrected from nfd to nfc
test_expect_success "git checkout nfc" ' test_expect_success "git checkout nfc" '
rm f.$Odiarnfc && rm f.$Odiarnfc &&
git checkout f.$Odiarnfc git checkout f.$Odiarnfc
' '
# Make it possible to checkout files with their NFD names # Make it possible to checkout files with their NFD names
test_expect_success "git checkout file nfd" ' test_expect_success "git checkout file nfd" '
rm -f f.* && rm -f f.* &&
git checkout f.$Odiarnfd git checkout f.$Odiarnfd
' '
# Make it possible to checkout links with their NFD names # Make it possible to checkout links with their NFD names
test_expect_success "git checkout link nfd" ' test_expect_success "git checkout link nfd" '
rm l.* && rm l.* &&
git checkout l.$Odiarnfd git checkout l.$Odiarnfd
' '
test_expect_success "setup case mac2" ' test_expect_success "setup case mac2" '
git checkout master && git checkout master &&
git reset --hard && git reset --hard &&
git checkout -b mac_os_2 git checkout -b mac_os_2
' '
# This will test nfd2nfc in git commit # This will test nfd2nfc in git commit
test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" ' test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" '
mkdir d2.$Adiarnfd && mkdir d2.$Adiarnfd &&
echo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd && echo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd &&
git add d2.$Adiarnfd/f.$Adiarnfd && git add d2.$Adiarnfd/f.$Adiarnfd &&
git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd
' '
test_expect_success "setup for long decomposed filename" ' test_expect_success "setup for long decomposed filename" '
git checkout master && git checkout master &&
git reset --hard && git reset --hard &&
git checkout -b mac_os_long_nfd_fn git checkout -b mac_os_long_nfd_fn
' '
test_expect_success "Add long decomposed filename" ' test_expect_success "Add long decomposed filename" '
echo longd >$Alongd && echo longd >$Alongd &&
git add * && git add * &&
git commit -m "Long filename" git commit -m "Long filename"
' '
test_expect_success "setup for long precomposed filename" ' test_expect_success "setup for long precomposed filename" '
git checkout master && git checkout master &&
git reset --hard && git reset --hard &&
git checkout -b mac_os_long_nfc_fn git checkout -b mac_os_long_nfc_fn
' '
test_expect_success "Add long precomposed filename" ' test_expect_success "Add long precomposed filename" '
echo longc >$Alongc && echo longc >$Alongc &&
git add * && git add * &&
git commit -m "Long filename" git commit -m "Long filename"
' '
# Test if the global core.precomposeunicode stops autosensing # Test if the global core.precomposeunicode stops autosensing
# Must be the last test case # Must be the last test case
test_expect_success "respect git config --global core.precomposeunicode" ' test_expect_success "respect git config --global core.precomposeunicode" '
git config --global core.precomposeunicode true && git config --global core.precomposeunicode true &&
rm -rf .git && rm -rf .git &&
git init && git init &&
precomposeunicode=`git config core.precomposeunicode` && precomposeunicode=`git config core.precomposeunicode` &&
test "$precomposeunicode" = "true" test "$precomposeunicode" = "true"
' '
else
say "Skipping nfc/nfd tests"
fi
test_done test_done

View File

@ -221,9 +221,35 @@ write_script () {
# capital letters by convention). # capital letters by convention).
test_set_prereq () { test_set_prereq () {
satisfied="$satisfied$1 " satisfied_prereq="$satisfied_prereq$1 "
}
satisfied_prereq=" "
lazily_testable_prereq= lazily_tested_prereq=
# Usage: test_lazy_prereq PREREQ 'script'
test_lazy_prereq () {
lazily_testable_prereq="$lazily_testable_prereq$1 "
eval test_prereq_lazily_$1=\$2
}
test_run_lazy_prereq_ () {
script='
mkdir -p "$TRASH_DIRECTORY/prereq-test-dir" &&
(
cd "$TRASH_DIRECTORY/prereq-test-dir" &&'"$2"'
)'
say >&3 "checking prerequisite: $1"
say >&3 "$script"
test_eval_ "$script"
eval_ret=$?
rm -rf "$TRASH_DIRECTORY/prereq-test-dir"
if test "$eval_ret" = 0; then
say >&3 "prerequisite $1 ok"
else
say >&3 "prerequisite $1 not satisfied"
fi
return $eval_ret
} }
satisfied=" "
test_have_prereq () { test_have_prereq () {
# prerequisites can be concatenated with ',' # prerequisites can be concatenated with ','
@ -238,8 +264,24 @@ test_have_prereq () {
for prerequisite for prerequisite
do do
case " $lazily_tested_prereq " in
*" $prerequisite "*)
;;
*)
case " $lazily_testable_prereq " in
*" $prerequisite "*)
eval "script=\$test_prereq_lazily_$prerequisite" &&
if test_run_lazy_prereq_ "$prerequisite" "$script"
then
test_set_prereq $prerequisite
fi
lazily_tested_prereq="$lazily_tested_prereq$prerequisite "
esac
;;
esac
total_prereq=$(($total_prereq + 1)) total_prereq=$(($total_prereq + 1))
case $satisfied in case "$satisfied_prereq" in
*" $prerequisite "*) *" $prerequisite "*)
ok_prereq=$(($ok_prereq + 1)) ok_prereq=$(($ok_prereq + 1))
;; ;;

View File

@ -659,9 +659,29 @@ test_i18ngrep () {
fi fi
} }
# test whether the filesystem supports symbolic links test_lazy_prereq SYMLINKS '
ln -s x y 2>/dev/null && test -h y 2>/dev/null && test_set_prereq SYMLINKS # test whether the filesystem supports symbolic links
rm -f y ln -s x y && test -h y
'
test_lazy_prereq CASE_INSENSITIVE_FS '
echo good >CamelCase &&
echo bad >camelcase &&
test "$(cat CamelCase)" != good
'
test_lazy_prereq UTF8_NFD_TO_NFC '
# check whether FS converts nfd unicode to nfc
auml=$(printf "\303\244")
aumlcdiar=$(printf "\141\314\210")
>"$auml" &&
case "$(echo *)" in
"$aumlcdiar")
true ;;
*)
false ;;
esac
'
# When the tests are run as root, permission tests will report that # When the tests are run as root, permission tests will report that
# things are writable when they shouldn't be. # things are writable when they shouldn't be.