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 )