package tests::functional::DefaultsTest;

use strict;

use base qw/Lire::Test::FunctionalTestCase/;

use File::Path;
use File::Basename;
use Lire::Config::Build qw/ac_info ac_path/;
use Lire::Utils qw/tempdir create_file/;
use Carp;

sub new {
    my $self = shift->SUPER::new( @_ );

    $self->{'defaults_file'} = ac_info( "sysconfdir") . "/lire/defaults";

    return $self;
}

sub test_tmpdir_unset {
    my $self = $_[0];

    local $ENV{'TMPDIR'} = '';

    my $result = $self->lire_run( ". $self->{'defaults_file'}; env" );
    $self->annotate( $result->stderr );
    $self->assert_equals( 0, $result->status );
    $self->assert_matches( qr!TMPDIR=/tmp!, $result->stdout );
}

sub test_tmpdir_set {
    my $self = $_[0];

    my $tmpdir = $self->homedir . "/tmp";
    local $ENV{'TMPDIR'} = $tmpdir;

    my $result = $self->lire_run( ". $self->{'defaults_file'}; env" );
    $self->annotate( $result->stderr );
    $self->assert_equals( 0, $result->status );
    $self->assert_matches( qr!TMPDIR=/tmp!, $result->stdout );

    mkdir $tmpdir,0700
      or croak "mkdir $tmpdir failed $!";
    $result = $self->lire_run( ". $self->{'defaults_file'}; env" );
    $self->annotate( $result->stderr );
    $self->assert_equals( 0, $result->status );
    $self->assert_matches( qr!TMPDIR=$tmpdir!, $result->stdout );
}

sub test_lr_environment_run {
    my $self = $_[0];
    my $result = $self->lire_run( ". $self->{'defaults_file'}; env" );
    $self->annotate( $result->stderr );
    $self->assert_equals( 0, $result->status );
    $self->assert_matches( qr/lr_environment info started with/,
                           $result->stderr );
}

sub test_home_directory_setup {
    my $self = $_[0];

    # Delete the .lire directory created by our parent
    # We create in the cmd to lire_run() because the $HOME/.lire/config
    # needs to be created when lire_run() is called.
    my $homedir = $self->homedir() . "/.lire";
    my $result = $self->lire_run( "rm -fr $homedir; . $self->{'defaults_file'}; env" );
    $self->annotate( $result->stderr() );
    $self->assert_equals( 0, $result->status() );

    foreach my $d ( qw/config converters reports schemas filters plugins/ ) {
        $self->assert( -d $self->homedir() . "/.lire/$d",
                       "home directory '.lire/$d' wasn't created"
                     );
        $self->assert_matches( qr/creating.*$d directory/, $result->stderr );
    }
}

sub test_lr_tempfile {
    my $self = $_[0];

    my $result = $self->lire_run( <<EOS );
. $self->{'defaults_file'}
lr_tempfile test_XXXXXX.log
EOS
    $self->annotate( $result->stderr );
    $self->assert_equals( 0, $result->status );
    $self->assert_does_not_match( qr/ (crit|err|warning) / , $result->stderr,
                                  "There were warnings or error messages." );
    my $file = $result->stdout;
    chomp $file;
    $self->assert_matches( qr/test_[a-zA-Z0-9]{6}\.log$/, $file );
    $self->assert( -f $file, "file '$file' doesn't exists" );
}

sub test_lr_tempdir {
    my $self = $_[0];

    my $result = $self->lire_run( <<EOS );
. $self->{'defaults_file'}
lr_tempdir test_XXXXXX
EOS
    $self->annotate( $result->stderr );
    $self->assert_equals( 0, $result->status );
    $self->assert_does_not_match( qr/ (crit|err|warning) / , $result->stderr,
                                  "There were warnings or error messages." );

    my $dir = $result->stdout;
    chomp $dir;
    $self->assert_matches( qr/test_[a-zA-Z0-9]{6}/, $dir );
    $self->assert( -d $dir, "directory '$dir' doesn't exists" );
}

sub test_cleanup {
    my $self = $_[0];

    my $file = $self->rundir . "/test_file";
    create_file( $file, "This is a test\n" );
    my $dir = tempdir( "test_XXXXXX" );
    my $result = $self->lire_run( <<EOS );
. $self->{'defaults_file'}
lr_mark_for_cleanup $dir
lr_mark_for_cleanup $file
EOS
    $self->annotate( $result->stderr );
    $self->assert_does_not_match( qr/ (crit|err|warning) /, $result->stderr,
                                  "There were warnings or error messages." );
    $self->assert( !$result->stdout, "STDOUT should be empty" );
    $self->assert( ! -f $file, "$file wasn't removed" );
    $self->assert( ! -d $file, "$dir wasn't removed" );
}

sub test_keep_cleanup {
    my $self = $_[0];

    my $file = $self->rundir . "/test_file";
    $self->create_test_file( $file, "This is a test\n" );
    my $dir = tempdir( "test_XXXXXX" );
    my $result = $self->lire_run( <<EOS );
. $self->{'defaults_file'}
lr_keep=1
lr_mark_for_cleanup $dir $file
EOS
    $self->annotate( $result->stderr );
    $self->assert_does_not_match( qr/ (crit|err|warning) /, $result->stderr,
                                  "There were warnings or error messages." );
    $self->assert_matches( qr/ debug lr_keep is set, not deleting '$file'/,
                           $result->stderr );
    $self->assert_matches( qr/ debug lr_keep is set, not deleting '$dir'/,
                           $result->stderr );
    $self->assert( !$result->stdout, "STDOUT should be empty" );
    $self->assert( -f $file, "$file was removed even if with lr_keep=1" );
    $self->assert( -d $dir, "$dir was removed even if with lr_keep=1" );
}

1;


syntax highlighted by Code2HTML, v. 0.9.1