#!./perl
is_os_type(
'Unix'
) or plan(
skip_all
=>
"Need something vaguely POSIX"
);
my
$VERBOSE
=
grep
$_
eq
'-v'
,
@ARGV
;
my
$tmpdir
= tempdir();
my
$script
= mktemp(
'tempXXXXX'
);
my
@test_files
=
(
{
name
=>
"abc"
},
{
name
=>
"acc"
,
mtime
=>
time
() - HOUR * 48 },
{
name
=>
"adc"
,
atime
=>
time
() - HOUR * 2 },
{
name
=>
"ac"
,
content
=>
"x"
x 10 },
{
name
=>
"somedir"
,
type
=>
"d"
},
{
name
=>
"link"
,
type
=>
"l"
,
target
=>
"abc"
},
{
name
=>
"symlink"
,
type
=>
"s"
,
target
=>
"brokenlink"
},
);
pop
@test_files
if
$^O eq
'msys'
;
for
my
$spec
(
@test_files
) {
my
$file
= catfile(
$tmpdir
,
split
'/'
,
$spec
->{name});
my
$type
=
$spec
->{type} ||
"f"
;
if
(
$type
eq
"f"
) {
open
my
$fh
,
">"
,
$file
or
die
"Cannot create test file $file: $!"
;
if
(
$spec
->{content}) {
binmode
$fh
;
print
$fh
$spec
->{content};
}
close
$fh
or
die
"Cannot close $file: $!"
;
}
elsif
(
$type
eq
"d"
) {
mkdir
$file
or
die
"Cannot create test directory $file: $!"
;
}
elsif
(
$type
eq
"l"
) {
my
$target
= catfile(
$tmpdir
,
split
'/'
,
$spec
->{target});
link
$target
,
$file
or
die
"Cannot create test link $file: $!"
;
}
elsif
(
$type
eq
"s"
) {
my
$target
= catfile(
$tmpdir
,
split
'/'
,
$spec
->{target});
symlink
$target
,
$file
or
die
"Cannot create test symlink $file: $!"
;
}
if
(
$spec
->{mode}) {
chmod
$spec
->{mode},
$file
or
die
"Cannot set mode of test file $file: $!"
;
}
if
(
$spec
->{mtime} ||
$spec
->{atime}) {
my
$mtime
=
$spec
->{mtime} ||
time
();
my
$atime
=
$spec
->{atime} ||
time
();
utime
$atime
,
$mtime
,
$file
or
die
"Cannot set times of test file $file: $!"
;
}
}
my
@files
=
sort
`find
'$tmpdir'
'('
-name
'abc'
-o -name
'acc'
')'
-a -links +0`;
@files
== 2 &&
$files
[0] =~ /\babc\n\z/ &&
$files
[1] =~ /\bacc\n\z/
or skip_all(
"doesn't appear to be a sane find(1)"
);
my
@testcases
=
(
{
name
=>
"all files"
,
args
=> [],
},
{
name
=>
"mapping of *"
,
args
=> [
"-name"
,
"a*c"
],
},
{
args
=> [
"-type"
,
"d"
],
expect
=> [
""
,
"somedir"
],
},
{
args
=> [
"-type"
,
"f"
],
},
{
args
=> [
"-mtime"
,
"+1"
],
expect
=> [
"acc"
],
},
{
args
=> [
"-mtime"
,
"-1"
],
},
{
args
=> [
"-amin"
,
"+118"
],
expect
=> [
"adc"
],
},
{
args
=> [
"-amin"
,
"-118"
],
},
{
args
=> [
"-size"
,
"10c"
],
expect
=> [
"ac"
],
},
{
args
=> [
"-links"
,
"2"
],
},
{
name
=>
"[perl #113054] mapping of ?"
,
args
=> [
"-name"
,
"a?c"
],
},
);
plan(
tests
=> 1 + 4 *
@testcases
);
my
@path
=
qw/blib script find2perl/
;
my
$find2perl
= catfile(curdir(),
@path
);
unless
(-e
$find2perl
) {
shift
@path
;
$find2perl
= catfile(curdir(),
@path
);
}
ok (-x
$find2perl
,
"find2perl exists"
);
our
$TODO
;
for
my
$test
(
@testcases
) {
SKIP:
{
local
$TODO
=
$test
->{TODO};
$TODO
=
$TODO
->()
if
ref
$TODO
;
my
$args
=
$test
->{args}
or
die
"Missing test args"
;
my
$name
=
$test
->{name} ||
"@$args"
;
my
$skip
=
$test
->{SKIP} &&
$test
->{SKIP}->();
$skip
and skip(
$skip
, 4);
my
$code
= runperl(
args
=> [
$find2perl
,
$tmpdir
,
@$args
]);
ok(
$code
,
"$name: run findperl"
)
or skip(
""
, 3);
open
my
$script_fh
,
">"
,
$script
or
die
"Cannot create $script: $!"
;
print
$script_fh
$code
;
close
$script_fh
or
die
"Cannot close $script: $!"
;
my
$files
= runperl(
progfile
=>
$script
);
ok(
length
$files
,
"$name: run output script"
)
or skip(
""
, 2);
my
$find_files
;
my
$source
;
if
(
$test
->{expect}) {
$find_files
=
join
"\n"
,
map
{
$_
eq
""
?
$tmpdir
:
"$tmpdir/$_"
}
@{
$test
->{expect}};
$source
=
"expected"
;
pass(
"$name: got files ok"
);
}
else
{
my
$findcmd
=
"find $tmpdir "
.
join
" "
,
map
"'$_'"
,
@$args
;
use
open
IN
=>
':raw'
;
$find_files
= `
$findcmd
`;
ok(
length
$find_files
,
"$name: run find"
)
or skip(
""
, 1);
$source
=
"find"
;
}
$files
=
join
(
"\n"
,
sort
split
/\n/,
$files
);
$find_files
=
join
(
"\n"
,
sort
split
/\n/,
$find_files
);
if
(
$VERBOSE
) {
note(
"script:\n$code"
);
note(
"args:\n@$args"
);
note(
"find2perl:\n$files"
);
note(
"find:\n$find_files"
);
}
is(
$files
,
$find_files
,
"$name: find2perl matches $source"
);
}
}
END {
remove_tree(
$tmpdir
)
if
defined
$tmpdir
;
remove_tree(
$script
)
if
defined
$script
;
}
sub
runperl {
my
%args
=
@_
;
my
@args
= find_perl_interpreter();
push
@args
,
$args
{progfile}
if
$args
{progfile};
push
@args
, @{
$args
{args} }
if
$args
{args};
my
$pid
= open2(
my
(
$in
,
$out
),
@args
) or
die
"Can't open2: $!"
;
binmode
$in
,
':crlf'
if
$^O eq
'MSWin32'
;
my
$ret
=
do
{
local
$/; <
$in
> };
waitpid
$pid
, 0;
return
$ret
;
}