t4210: detect REG_ILLSEQ dynamically and skip affected tests

7187c7bbb8 (t4210: skip i18n tests that don't work on FreeBSD, 2019-11-27)
adds a REG_ILLSEQ prerequisite, and to do that copies the common branch in
test-lib and expands it to include it in a special case for FreeBSD.

Instead; test for it using a previously added extension to test-tool and
use that, together with a function that identifies when regcomp/regexec
will be called with broken patterns to avoid any test that would otherwise
rely on undefined behaviour.

The description of the first test which wasn't accurate has been corrected,
and the test rearranged for clarity, including a helper function that avoids
overly long lines.

Only the affected engines will have their tests suppressed, also including
"fixed" if the PCRE optimization that uses LIBPCRE2 since b65abcafc7
(grep: use PCRE v2 for optimized fixed-string search, 2019-07-01) is not
available.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Carlo Marcelo Arenas Belón 2020-05-18 11:44:16 -07:00 committed by Junio C Hamano
parent aba8187e4d
commit c4c2a96ec7
2 changed files with 59 additions and 24 deletions

View File

@ -10,6 +10,13 @@ latin1_e=$(printf '\351')
# invalid UTF-8 # invalid UTF-8
invalid_e=$(printf '\303\50)') # ")" at end to close opening "(" invalid_e=$(printf '\303\50)') # ")" at end to close opening "("
have_reg_illseq=
if test_have_prereq GETTEXT_LOCALE &&
! LC_ALL=$is_IS_locale test-tool regex --silent $latin1_e
then
have_reg_illseq=1
fi
test_expect_success 'create commits in different encodings' ' test_expect_success 'create commits in different encodings' '
test_tick && test_tick &&
cat >msg <<-EOF && cat >msg <<-EOF &&
@ -51,43 +58,77 @@ test_expect_success !MINGW 'log --grep does not find non-reencoded values (utf8)
test_must_be_empty actual test_must_be_empty actual
' '
test_expect_success !MINGW 'log --grep does not find non-reencoded values (latin1)' ' test_expect_success 'log --grep does not find non-reencoded values (latin1)' '
git log --encoding=ISO-8859-1 --format=%s --grep=$utf8_e >actual && git log --encoding=ISO-8859-1 --format=%s --grep=$utf8_e >actual &&
test_must_be_empty actual test_must_be_empty actual
' '
triggers_undefined_behaviour () {
local engine=$1
case $engine in
fixed)
if test -n "$have_reg_illseq" &&
! test_have_prereq LIBPCRE2
then
return 0
fi
;;
basic|extended)
if test -n "$have_reg_illseq"
then
return 0
fi
;;
esac
return 1
}
mismatched_git_log () {
local pattern=$1
LC_ALL=$is_IS_locale git log --encoding=ISO-8859-1 --format=%s \
--grep=$pattern
}
for engine in fixed basic extended perl for engine in fixed basic extended perl
do do
prereq= prereq=
if test $engine = "perl" if test $engine = "perl"
then then
prereq="PCRE" prereq=PCRE
else
prereq=""
fi fi
force_regex= force_regex=
if test $engine != "fixed" if test $engine != "fixed"
then then
force_regex=.* force_regex='.*'
fi fi
test_expect_success !MINGW,!REGEX_ILLSEQ,GETTEXT_LOCALE,$prereq "-c grep.patternType=$engine log --grep does not find non-reencoded values (latin1 + locale)" "
cat >expect <<-\EOF && test_expect_success $prereq "config grep.patternType=$engine" "
latin1 git config grep.patternType $engine
utf8
EOF
LC_ALL=\"$is_IS_locale\" git -c grep.patternType=$engine log --encoding=ISO-8859-1 --format=%s --grep=\"$force_regex$latin1_e\" >actual &&
test_cmp expect actual
" "
test_expect_success !MINGW,GETTEXT_LOCALE,$prereq "-c grep.patternType=$engine log --grep does not find non-reencoded values (latin1 + locale)" " test_expect_success GETTEXT_LOCALE,$prereq "log --grep does not find non-reencoded values (latin1 + locale)" "
LC_ALL=\"$is_IS_locale\" git -c grep.patternType=$engine log --encoding=ISO-8859-1 --format=%s --grep=\"$force_regex$utf8_e\" >actual && mismatched_git_log '$force_regex$utf8_e' >actual &&
test_must_be_empty actual test_must_be_empty actual
" "
test_expect_success !MINGW,!REGEX_ILLSEQ,GETTEXT_LOCALE,$prereq "-c grep.patternType=$engine log --grep does not die on invalid UTF-8 value (latin1 + locale + invalid needle)" " if ! triggers_undefined_behaviour $engine
LC_ALL=\"$is_IS_locale\" git -c grep.patternType=$engine log --encoding=ISO-8859-1 --format=%s --grep=\"$force_regex$invalid_e\" >actual && then
test_must_be_empty actual test_expect_success !MINGW,GETTEXT_LOCALE,$prereq "log --grep searches in log output encoding (latin1 + locale)" "
" cat >expect <<-\EOF &&
latin1
utf8
EOF
mismatched_git_log '$force_regex$latin1_e' >actual &&
test_cmp expect actual
"
test_expect_success GETTEXT_LOCALE,$prereq "log --grep does not die on invalid UTF-8 value (latin1 + locale + invalid needle)" "
mismatched_git_log '$force_regex$invalid_e' >actual &&
test_must_be_empty actual
"
fi
done done
test_done test_done

View File

@ -1454,12 +1454,6 @@ case $uname_s in
test_set_prereq SED_STRIPS_CR test_set_prereq SED_STRIPS_CR
test_set_prereq GREP_STRIPS_CR test_set_prereq GREP_STRIPS_CR
;; ;;
FreeBSD)
test_set_prereq REGEX_ILLSEQ
test_set_prereq POSIXPERM
test_set_prereq BSLASHPSPEC
test_set_prereq EXECKEEPSPID
;;
*) *)
test_set_prereq POSIXPERM test_set_prereq POSIXPERM
test_set_prereq BSLASHPSPEC test_set_prereq BSLASHPSPEC