The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use Test::More tests => 15;
use Carp;

use strict;
use warnings;

use Net::DAV::LockManager ();
use Net::DAV::LockManager::Simple ();

{
    my $db = Net::DAV::LockManager::Simple->new();
    my $mgr = Net::DAV::LockManager->new($db);

    my @locks = $mgr->list_all_locks({ 'path' => '/foo/bar/baz' });
    is_deeply( \@locks, [], 'No locks returned if no locks' );
}

{
    my $label = 'Direct lock';
    my $db = Net::DAV::LockManager::Simple->new();
    my $mgr = Net::DAV::LockManager->new($db);

    ok( my $lock = $mgr->lock({ 'path' => '/foo', 'user' => 'fred', 'owner' => 'Fred' }), "$label: Locked resource" );
    my @locks = $mgr->list_all_locks({ 'path' => '/foo' });
    is_deeply( \@locks, [ $lock ], "$label: Direct lock returned" );
}

{
    my $label = 'Indirect lock';
    my $db = Net::DAV::LockManager::Simple->new();
    my $mgr = Net::DAV::LockManager->new($db);

    ok( my $lock = $mgr->lock({ 'path' => '/foo', 'user' => 'fred', 'owner' => 'Fred' }), "$label: Locked resource" );
    my @locks = $mgr->list_all_locks({ 'path' => '/foo/bar/baz' });
    is_deeply( \@locks, [ $lock ], "$label: Indirect lock returned" );
}

{
    my $label = 'Two indirect locks';
    my $db = Net::DAV::LockManager::Simple->new();
    my $mgr = Net::DAV::LockManager->new($db);

    ok( my $lock_i = $mgr->lock({ 'path' => '/foo', 'user' => 'fred', 'owner' => 'Fred' }), "$label: Locked resource 1" );
    ok( my $lock = $mgr->lock({ 'path' => '/foo/bar/baz', 'user' => 'fred', 'owner' => 'Fred', 'token' => $lock_i->token }), "$label: Locked resource 2" );
    my @locks = $mgr->list_all_locks({ 'path' => '/foo/bar/baz' });
    is_deeply( \@locks, [ $lock, $lock_i ], "$label: Both locks returned" );
}

{
    my $label = 'Depth-0 ancestor lock';
    my $db = Net::DAV::LockManager::Simple->new();
    my $mgr = Net::DAV::LockManager->new($db);

    ok( my $lock_i = $mgr->lock({ 'path' => '/foo', 'user' => 'fred', 'owner' => 'Fred', 'depth' => 0 }), "$label: Locked resource 1" );
    ok( my $lock = $mgr->lock({ 'path' => '/foo/bar/baz', 'user' => 'fred', 'owner' => 'Fred' }), "$label: Locked resource" );
    my @locks = $mgr->list_all_locks({ 'path' => '/foo/bar/baz' });
    is_deeply( \@locks, [ $lock ], "$label: Depth 0 locks not returned." );
}

{
    my $label = 'Multiple indirect locks';
    my $db = Net::DAV::LockManager::Simple->new();
    my $mgr = Net::DAV::LockManager->new($db);

    ok( my $lock_i = $mgr->lock({ 'path' => '/foo', 'user' => 'fred', 'owner' => 'Fred' }), "$label: Locked resource 1" );
    ok( my $lock_i2 = $mgr->lock({ 'path' => '/foo/bar', 'user' => 'fred', 'owner' => 'Fred', 'token' => $lock_i->token }), "$label: Locked resource 2" );
    ok( my $lock = $mgr->lock({ 'path' => '/foo/bar/baz', 'user' => 'fred', 'owner' => 'Fred', 'token' => [ $lock_i->token, $lock_i2->token ] }), "$label: Locked resource 3" );
    my @locks = $mgr->list_all_locks({ 'path' => '/foo/bar/baz' });
    is_deeply( \@locks, [ $lock, $lock_i2, $lock_i ], "$label: Depth 0 locks not returned." );
}