#!perl
use
lib File::Spec->catdir(
qw(t lib)
);
BEGIN {
lib->
import
(
'lib'
)
if
!-d
't'
;
}
no
warnings
'utf8'
;
my
@valid_utf8
= (
[
latin1
=>
"=srl\x01\x00'\x06Au feu"
=> 'Au feu' ],
[
utf8
=>
"=srl\x01\x00'\x08\xc3\x80 l'eau"
=>
"\xC0 l'eau"
],
[
bom
=>
"=srl\x01\x00'\x06\xEF\xBB\xBFfoo"
=>
"\x{FEFF}foo"
],
[
fffe
=>
"=srl\x01\x00'\x03\xEF\xBF\xBE"
=>
"\x{FFFE}"
],
[
ffpadded
=>
"=srl\x01\x00&\x04\xFF\xFF\xFF\xFF"
=>
"\xFF\xFF\xFF\xFF"
],
);
my
@invalid_utf8
= (
[
ffpadded
=>
"=srl\x01\x00'\x04\xFF\xFF\xFF\xFF"
],
[
overlong
=>
"=srl\x01\x00'\x04\xF0\x82\x82\xAC"
],
[
continuation
=>
"=srl\x01\x00'\x01\xC0"
],
);
plan
tests
=> 2 *
@valid_utf8
+ 2 *
@invalid_utf8
;
for
my
$test
(
@valid_utf8
) {
my
(
$name
,
$exp
,
$expected
)=
@$test
;
my
$out
;
my
$ok
=
eval
{ decode_sereal(
$exp
, {
validate_utf8
=> 1 },
$out
); 1 };
my
$err
= $@ ||
'Zombie error'
;
ok(
$ok
,
"$name: did not die"
)
or
do
{
diag
$err
;
diag
"input="
, Data::Dumper::qquote(
$exp
);
next
;
};
is(
$out
,
$expected
,
"$name: correctly decoded"
);
}
for
my
$test
(
@invalid_utf8
) {
my
(
$name
,
$exp
)=
@$test
;
my
$out
;
my
$ok
=
eval
{ decode_sereal(
$exp
,
undef
,
$out
); 1 };
my
$err
= $@ ||
'Zombie error'
;
ok(
$ok
,
"$name: did not die"
)
or
do
{
diag
$err
;
diag
"input="
, Data::Dumper::qquote(
$exp
);
next
;
};
$ok
=
eval
{ decode_sereal(
$exp
, {
validate_utf8
=> 1 },
$out
); 1 };
$err
= $@ ||
'Zombie error'
;
like(
$err
,
qr/Invalid UTF8 byte sequence/
,
"$name: die with a UTF8 error"
);
}