AnyEvent-Filesys-Watcher
view release on metacpan or search on metacpan
t/lib/TestSupport.pm view on Meta::CPAN
open my $fd, ">", $full_file;
print $fd "Test\n" x $size++ if $exists;
close $fd;
}
}
sub delete_test_files {
my (@files) = @_;
for my $file (@files) {
my $full_file = File::Spec->catfile($dir, $file);
if (-d $full_file) { rmdir $full_file; }
else { unlink $full_file; }
}
}
sub move_test_files {
my (%files) = @_;
while (my ($src, $dst) = each %files) {
my $full_src = File::Spec->catfile($dir, $src);
my $full_dst = File::Spec->catfile($dir, $dst);
move $full_src, $full_dst;
}
}
sub modify_attrs_on_test_files {
my (@files) = @_;
for my $file (@files) {
my $full_file = File::Spec->catfile($dir, $file);
chmod 0750, $full_file or die "Error chmod on $full_file: $!";
}
}
sub test {
my (%args) = @_;
$args{setup} ||= {};
$args{filter} ||= sub { 1 };
$args{expected} ||= {};
$args{ignore} ||= [];
my @received;
my $watcher = AnyEvent::Filesys::Watcher->new(
directories => $dir,
callback => sub {
push @received, @_;
},
filter => $args{filter},
backend => $args{backend},
parse_events => 1,
skip_subdirectories => $args{skip_subdirectories},
);
$args{setup}->();
my $done = AnyEvent->condvar;
my $count = 0;
my $timer = AnyEvent->timer(
interval => 0.1,
cb => sub {
$done->send if test_done \@received, $args{expected};
if (++$count > 30) {
ok 0, "$args{description}: lame test\n";
$done->send;
}
},
);
$done->recv;
compare_ok $args{description}, \@received, $args{expected}, $args{ignore};
}
sub test_done {
my ($received, $expected) = @_;
my %expected = %$expected;
foreach my $event (@$received) {
my $path = File::Spec->abs2rel($event->path, $dir);
# This is not portable but good enough for our test cases. Otherwise
# we would have to drag in Path::Class as a dependency.
$path =~ s{\\}{/}g;
delete $expected{$path};
}
return if keys %expected;
return 1;
}
sub compare_ok {
my ($description, $received, $expected, $ignore) = @_;
$description .= ':';
my %got;
my %received_events;
# First translate the events to either EXISTS or DELETED.
foreach my $event (@{$received}) {
my $path = File::Spec->abs2rel($event->path, $dir);
# This is not portable but good enough for our test cases. Otherwise
# we would have to drag in Path::Class as a dependency.
$path =~ s{\\}{/}g;
my $type = $event->type;
$received_events{$path} ||= [];
push @{$received_events{$path}}, $type;
if ('deleted' eq $type) {
$got{$path} = DELETED;
} else {
$got{$path} = EXISTS;
}
}
$ignore = [$ignore] if !ref $ignore;
my %ignore = map { $_ => 1 } @$ignore;
( run in 0.512 second using v1.01-cache-2.11-cpan-acf6aa7dc9e )