#!/bin/perl
use File::RsyncP::FileList;
use Data::Dumper;
my $f = File::RsyncP::FileList->new({
protocol_version => 28,
});
my @Tests = (
#
# Test 1: basic excludes with wildcards
#
{
excludes => [
{exclude => "*.doc"},
{exclude => "*.xls"},
],
tests => [
{file => "other/bar.doc", result => -1},
{file => "other/bar.xls", result => -1},
{file => "other/bar.doc2", result => 0},
{file => "other/bar.xls2", result => 0},
],
data => "050000002a2e646f63050000002a2e786c7300000000",
},
#
# Test 2: basic excludes and includes with wildcards
#
{
excludes => [
{exclude => "*.doc"},
{include => "*.doc2"},
{exclude => "*.xls"},
{include => "*.xls2"},
],
tests => [
{file => "other/bar.doc", result => -1},
{file => "other/bar.xls", result => -1},
{file => "other/bar.doc2", result => 1},
{file => "other/bar.xls2", result => 1},
],
data => "050000002a2e646f63080000002b202a2e646f6332050000002a2e786c73080000002b202a2e786c733200000000",
},
#
# Test 2: top-level patterns
#
{
excludes => [
{exclude => "/*/*.doc"},
{exclude => "/*/*/*.xls"},
{include => "*.xls2"},
],
tests => [
{file => "other/bar.doc", result => -1},
{file => "other/bar.xls", result => 0},
{file => "other/bar.doc2", result => 0},
{file => "other/bar.xls2", result => 1},
],
data => "080000002f2a2f2a2e646f630a0000002f2a2f2a2f2a2e786c73080000002b202a2e786c733200000000",
},
);
my $numTests = @Tests;
print "1..$numTests\n";
my $testNum = 1;
foreach my $t ( @Tests ) {
my $ok = 1;
#
# Add excludes
#
$f->exclude_list_clear();
foreach my $e ( @{$t->{excludes}} ) {
if ( defined($e->{exclude}) ) {
$f->exclude_add($e->{exclude}, 0);
} elsif ( defined($e->{include}) ) {
$f->exclude_add($e->{include}, 2);
}
}
#
# Check list
#
my $exc = $f->exclude_list_get();
#print STDERR Dumper $exc;
if ( @$exc != @{$t->{excludes}} ) {
printf(STDERR "Exclude list count mismatch: %d vs %d\n",
scalar(@$exc), scalar(@{$t->{excludes}}));
$ok = 0;
}
foreach my $e ( @{$t->{excludes}} ) {
if ( defined($e->{exclude}) ) {
if ( $e->{exclude} ne $exc->[0]{pattern} ) {
printf(STDERR "Exclude list pattern mismatch: %s vs %s\n",
$e->{exclude}, $exc->[0]{pattern});
$ok = 0;
}
if ( $exc->[0]{flags} & (1 << 4) ) {
printf(STDERR "Exclude %s has wrong flag %d\n",
$e->{exclude}, $exc->[0]{flags});
$ok = 0;
}
}
if ( defined($e->{include}) ) {
if ( $e->{include} ne $exc->[0]{pattern} ) {
printf(STDERR "Exclude list pattern mismatch: %s vs %s\n",
$e->{include}, $exc->[0]{pattern});
$ok = 0;
}
if ( !($exc->[0]{flags} & (1 << 4)) ) {
printf(STDERR "Exclude %s has wrong flag %d\n",
$e->{include}, $exc->[0]{flags});
$ok = 0;
}
}
shift(@$exc);
}
#
# Check files
#
foreach my $file ( @{$t->{tests}} ) {
if ( $f->exclude_check($file->{file}, 0) != $file->{result} ) {
$ok = 0;
printf(STDERR "Exclude check on %s returns %d vs %d\n",
$file->{file},
$f->exclude_check($file->{file}, 0), $file->{result});
}
}
#
# Check encoding
#
$f->exclude_list_send();
my $data = $f->encodeData();
if ( defined($t->{data}) && $t->{data} ne unpack("H*", $data) ) {
print(STDERR "Botch encoded data: ", unpack("H*", $data),
" vs $t->{data}\n");
$ok = 0;
}
#
# Print result
#
if ( $ok ) {
print("ok $testNum\n");
} else {
print("not ok $testNum\n");
}
$testNum++;
}
syntax highlighted by Code2HTML, v. 0.9.1