DataStore-CAS-FS
view release on metacpan or search on metacpan
t/32-dircodec-universal.t view on Meta::CPAN
#! /usr/bin/env perl -T
use strict;
use warnings;
use Try::Tiny;
use Test::More;
use Digest;
use_ok('DataStore::CAS::Virtual') || BAIL_OUT;
use_ok('DataStore::CAS::FS::DirCodec::Universal') || BAIL_OUT;
my $cas= DataStore::CAS::Virtual->new();
sub decode_utf8 { goto &DataStore::CAS::FS::InvalidUTF8::decode_utf8; }
sub dies_ok(&@) {
my ($code, $regex, $description)= @_;
my $err= '';
try { $code->(); } catch { $err= $_ };
like( $err, $regex, $description );
}
sub dir_encode {
my ($entries, $meta)= @_;
$meta ||= {};
return DataStore::CAS::FS::DirCodec::Universal->encode($entries, $meta);
}
subtest empty_dir => sub {
my $hash= DataStore::CAS::FS::DirCodec->put($cas, 'universal', [], {});
my $file= $cas->get($hash);
is( $file->data, qq|CAS_Dir 09 universal\n{"metadata":{},\n "entries":[\n]}|, 'encode' );
isa_ok( my $decoded= DataStore::CAS::FS::DirCodec->load($file), 'DataStore::CAS::FS::Dir', 'decode' );
is( $decoded->iterator->(), undef, 'zero entries' );
done_testing;
};
subtest one_dirent => sub {
my @entries= (
{ type => 'file', name => 'test' }
);
my $hash= DataStore::CAS::FS::DirCodec->put($cas, 'universal', \@entries, {});
my $file= $cas->get($hash);
my $expected= qq|CAS_Dir 09 universal\n{"metadata":{},\n "entries":[\n{"name":"test","type":"file"}\n]}|;
is( $file->data, $expected, 'encode' );
isa_ok( my $dir= DataStore::CAS::FS::DirCodec->load($file), 'DataStore::CAS::FS::Dir', 'decode' );
my $iter= $dir->iterator;
for (@entries) {
is_deeply( $iter->()->as_hash, $_, 'entry matches' );
}
is( $iter->(), undef, 'end of list' );
done_testing;
};
subtest many_dirent => sub {
my %metadata= (
foo => 1,
bar => 2,
baz => 3
);
my @entries= (
{ type => 'file', name => 'a', size => 10, ref => '0000', foo => 42, sdlfjskldf => 'sldfjhlsdkfjh' },
{ type => 'pipe', name => 'f', size => 1, ref => undef, bar => 'xyz' },
{ type => 'blockdev', name => 'd', size => 10000, ref => '1234', },
{ type => 'file', name => 'b', size => 10, ref => '1111', 1 => 2, 3 => 4, 5 => 6},
{ type => 'chardev', name => 'e', size => 0, ref => '4321', },
{ type => 'symlink', name => 'c', size => 10, ref => 'fedcba', },
{ type => 'socket', name => 'g', size => 1, ref => undef, },
);
my @expected= (
{ type => 'file', name => 'a', size => 10, ref => '0000', foo => 42, sdlfjskldf => 'sldfjhlsdkfjh' },
{ type => 'file', name => 'b', size => 10, ref => '1111', 1 => 2, 3 => 4, 5 => 6},
{ type => 'symlink', name => 'c', size => 10, ref => 'fedcba', },
{ type => 'blockdev', name => 'd', size => 10000, ref => '1234', },
{ type => 'chardev', name => 'e', size => 0, ref => '4321', },
{ type => 'pipe', name => 'f', size => 1, ref => undef, bar => 'xyz' },
{ type => 'socket', name => 'g', size => 1, ref => undef, },
);
ok( my $hash= DataStore::CAS::FS::DirCodec->put($cas, 'universal', \@entries, {}), 'encode' );
my $file= $cas->get($hash);
isa_ok( my $dir= DataStore::CAS::FS::DirCodec->load($file), 'DataStore::CAS::FS::Dir', 'decode' );
my $iter= $dir->iterator;
for (@expected) {
is_deeply( $iter->()->as_hash, $_, 'entry matches' );
}
is( $iter->(), undef, 'and next returns undef' );
done_testing;
};
( run in 0.401 second using v1.01-cache-2.11-cpan-13bb782fe5a )