####################################################################################################################################
# FileWaitTest.pm - Tests for File->wait()
####################################################################################################################################
package pgBackRestTest::Module::File::FileWaitTest;
use parent 'pgBackRestTest::Module::File::FileCommonTest';

####################################################################################################################################
# Perl includes
####################################################################################################################################
use strict;
use warnings FATAL => qw(all);
use Carp qw(confess);
use English '-no_match_vars';

use POSIX qw(ceil);
use Time::HiRes qw(gettimeofday usleep);

use pgBackRest::Common::Log;
use pgBackRest::File;

use pgBackRestTest::Common::ExecuteTest;

####################################################################################################################################
# run
####################################################################################################################################
sub run
{
    my $self = shift;

    # Loop through local/remote
    for (my $bRemote = 0; $bRemote <= 1; $bRemote++)
    {
        my $lTimeBegin = gettimeofday();

        if (!$self->begin("rmt ${bRemote}, begin ${lTimeBegin}")) {next}

        # Setup test directory and get file object
        my $oFile = $self->setup($bRemote);

        # If there is not enough time to complete the test then sleep
        if (ceil($lTimeBegin) - $lTimeBegin < .250)
        {
            my $lSleepMs = ceil(((int($lTimeBegin) + 1) - $lTimeBegin) * 1000);

            usleep($lSleepMs * 1000);

            &log(DEBUG, "slept ${lSleepMs}ms: begin ${lTimeBegin}, end " . gettimeofday());

            $lTimeBegin = gettimeofday();
        }

        # Run the test
        my $lTimeBeginCheck = $oFile->wait(PATH_DB_ABSOLUTE);

        &log(DEBUG, "begin ${lTimeBegin}, check ${lTimeBeginCheck}, end " . time());

        # Current time should have advanced by 1 second
        if (int(time()) == int($lTimeBegin))
        {
            confess "time was not advanced by 1 second";
        }

        # lTimeBegin and lTimeBeginCheck should be equal
        if (int($lTimeBegin) != $lTimeBeginCheck)
        {
            confess 'time begin ' || int($lTimeBegin) || "and check ${lTimeBeginCheck} should be equal";
        }
    }
}

1;