#!perl
use Cassandane::Tiny;

sub test_cyr_expire_delete_noexpire
    :DelayedDelete :min_version_3_9 :NoAltNameSpace
    ($self)
{
    my $store = $self->{store};
    my $adminstore = $self->{adminstore};
    my $talk = $store->get_client();
    my $admintalk = $adminstore->get_client();

    my $noexpire_annot = '/shared/vendor/cmu/cyrus-imapd/noexpire_until';

    my $subfoldername = 'foo';
    my $subfolder = 'INBOX.foo';
    $talk->create($subfolder)
        or $self->fail("Cannot create folder $subfolder: $@");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Setting /vendor/cmu/cyrus-imapd/delete annotation.";
    $talk->setmetadata($subfolder, "/shared/vendor/cmu/cyrus-imapd/delete", '1s');

    $self->check_folder_ondisk($subfolder);
    $self->check_folder_not_ondisk($subfolder, deleted => 1);

    xlog $self, "Delete $subfolder";
    $talk->unselect();
    $talk->delete($subfolder)
        or $self->fail("Cannot delete folder $subfolder: $@");
    $self->assert_str_equals('ok', $talk->get_last_completion_response());

    xlog $self, "Ensure we can't select $subfolder anymore";
    $talk->select($subfolder);
    $self->assert_str_equals('no', $talk->get_last_completion_response());
    $self->assert_matches(qr/Mailbox does not exist/i, $talk->get_last_error());

    $self->check_folder_not_ondisk($subfolder);

    my ($path) = $self->{instance}->folder_to_deleted_directories("user.cassandane.$subfoldername");
    $self->assert(-d "$path");

    xlog $self, "Set $noexpire_annot annotation on inbox";
    $talk->setmetadata('INBOX', $noexpire_annot, '0');
    $self->assert_str_equals('ok', $talk->get_last_completion_response);

    sleep(2);
    xlog $self, "Run cyr_expire";
    $self->{instance}->run_command({ cyrus => 1 }, 'cyr_expire', '-D' => '1s' );
    $self->assert(-d "$path");

    xlog $self, "Remove $noexpire_annot annotation from inbox";
    $talk->setmetadata('INBOX', $noexpire_annot, '');
    $self->assert_str_equals('ok', $talk->get_last_completion_response);

    xlog $self, "Run cyr_expire";
    $self->{instance}->run_command({ cyrus => 1 }, 'cyr_expire', '-D' => '1s' );
    $self->assert(!-d "$path");

    $self->check_syslog($self->{instance});
}
