Data-Graph-Shared
view release on metacpan or search on metacpan
t/04-frozen.t view on Meta::CPAN
like exception(sub { $ro->add_node(1) }), qr/read-only/, 'add_node on read-only view croaks';
like exception(sub { $ro->add_edge($ids{0}, $ids{1}, 1) }), qr/read-only/, 'add_edge on read-only view croaks';
like exception(sub { $ro->remove_node($ids{0}) }), qr/read-only/, 'remove_node on read-only view croaks';
like exception(sub { $ro->remove_node_full($ids{0}) }), qr/read-only/, 'remove_node_full on read-only view croaks';
like exception(sub { $ro->set_node_data($ids{0}, 1) }), qr/read-only/, 'set_node_data on read-only view croaks';
like exception(sub { $ro->freeze }), qr/read-only/, 'freeze on read-only view croaks';
}
# ---- two independent read-only views of the same file, concurrently ----
{
my $a = Data::Graph::Shared->new_readonly($path);
my $b = Data::Graph::Shared->new_readonly($path);
ok $a->has_node($ids{0}) && $b->has_node($ids{0}), 'two read-only views query the same file';
is_deeply [ sorted_pairs([ $a->neighbors($ids{0}) ]) ], [ sorted_pairs([ $b->neighbors($ids{0}) ]) ],
'two read-only views agree on neighbors';
}
# ---- refuse a read-write reopen of a sealed file (create-reopen path) ----
like exception(sub { Data::Graph::Shared->new($path, $N + $SPARE, $MAXE) }),
qr/frozen|read-only/, 'read-write reopen of a sealed file is refused';
# ---- refuse a read-write reopen of a sealed file (open_fd path) ----
{
open my $fh, '+<', $path or die "open $path: $!";
my $fd = fileno($fh);
like exception(sub { Data::Graph::Shared->new_from_fd($fd) }),
qr/frozen|read-only/, 'new_from_fd on a sealed file is refused';
close $fh;
}
# ---- refuse a read-write reopen of a sealed memfd (open_fd path, memfd route) ----
{
my $mg = Data::Graph::Shared->new_memfd("frozen_test", 10, 20);
my $x = $mg->add_node(1);
my $y = $mg->add_node(2);
$mg->add_edge($x, $y, 3);
$mg->freeze;
my $dup_fd = POSIX::dup($mg->memfd);
like exception(sub { Data::Graph::Shared->new_from_fd($dup_fd) }),
qr/frozen|read-only/, 'new_from_fd on a sealed memfd is refused';
POSIX::close($dup_fd);
}
# ---- new_readonly rejects a non-frozen file ----
{
my $u = "$dir/unsealed.graph";
{ my $g = Data::Graph::Shared->new($u, 10, 20); $g->add_node(1); }
like exception(sub { Data::Graph::Shared->new_readonly($u) }),
qr/not frozen/, 'new_readonly on an unsealed file croaks';
}
# ---- new_readonly error paths ----
like exception(sub { Data::Graph::Shared->new_readonly("$dir/does-not-exist.graph") }),
qr/open|No such/, 'new_readonly on a missing path croaks';
like exception(sub { Data::Graph::Shared->new_readonly(undef) }),
qr/required/, 'new_readonly requires a path';
done_testing;
# minimal exception helper (avoid a Test::Fatal dependency)
sub exception {
my $code = shift;
my $err;
{ local $@; eval { $code->(); 1 } or $err = $@; }
return $err;
}
( run in 0.971 second using v1.01-cache-2.11-cpan-54e63673c56 )