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

use Test::More tests => 15;
use strict;
use warnings;
use Data::Dumper;
use_ok( 'File::Temp', qw(tempdir) );
use_ok('Config::Properties');

# Set CLEAN to 0 if you want to maintain the generated config files
use constant CLEAN => 1;

$ENV{'PATH'} = '/bin:/usr/bin';

# Check the version output
ok( !system("blib/script/logparser -v") );
ok( !system("blib/script/logparser -h") );

# There should be an error invoking logparser with a null config filex
ok( system("blib/script/logparser -f /dev/null 2>&1") );

my $dir = tempdir( 'CLEANUP' => CLEAN );

SKIP: {
    skip "Unable to create a temp dir with File::Temp to create temporary config files", 10 unless defined $dir;

    # diag("The config dir is $dir");
    my $configFile = File::Temp->new(
        'UNLINK'   => CLEAN,
        'TEMPLATE' => 'logparserXXXXX',
        'SUFFIX'   => '.conf',
        'DIR'      => $dir
    );
    my $configFileName = $configFile->filename;

    # diag("The config file name is $configFileName");
    my $log4perlFile = File::Temp->new(
        'UNLINK'   => CLEAN,
        'TEMPLATE' => 'log4perlXXXXX',
        'SUFFIX'   => '.conf',
        'DIR'      => $dir
    );
    my $log4perlFileName   = $log4perlFile->filename;
    my $propertiesFileName = File::Spec->catfile( $dir, 'logparser.properties' );
    my $storeFileName      = File::Spec->catfile( $dir, 'logparser.store' );
    my $lockFileName       = File::Spec->catfile( $dir, 'logparser.lock' );
    my $logFileName        = File::Spec->catfile( $dir, 'logparser.log' );

    my $testLogFile = File::Temp->new(
        'UNLINK'   => CLEAN,
        'TEMPLATE' => 'testLogXXXXX',
        'SUFFIX'   => '.log',
        'DIR'      => $dir
    );
    my $testLogFileName = $testLogFile->filename;

    createLog4PerlFile( $log4perlFile, $logFileName );
    createConfigFile( $configFile, $storeFileName, $propertiesFileName,
        $lockFileName, $testLogFileName, 'SNMP::LogParserDriver::ExampleDriver' );

    ok( !system("blib/script/logparser -f $configFileName -l $log4perlFile") );
    ok("-r $propertiesFileName");
    my $result = open PROPS, "$propertiesFileName";
  SKIP: {
        skip "Cannot open properties file, skipping rest of tests", 8 unless $result;
        my $properties = loadProperties($propertiesFileName);

        is( $properties->getProperty('counter'), 0 );
        is( $properties->getProperty('lines'),   0 );

        print $testLogFile "Non valid line";
        ok( !system( "blib/script/logparser -f $configFileName -l $log4perlFile" ));

        $properties = loadProperties($propertiesFileName);

        is( $properties->getProperty('counter'), 0 );
        is( $properties->getProperty('lines'),   1 );
        print $testLogFile "Embedded test string in line";

        ok( !system( "blib/script/logparser -f $configFileName -l $log4perlFile" ));
        $properties = loadProperties($propertiesFileName);
        is( $properties->getProperty('counter'), 1 );
        is( $properties->getProperty('lines'),   2 );
    }
}

sub createConfigFile {
    my ( $configFile, $storeFileName, $propertiesFileName, $lockFileName, $testLogFileName, $module ) = @_;
    my $date = localtime();

    print $configFile <<EOF;
# Automatically generated for $0 at $date
storeFile=$storeFileName
propertiesFile=$propertiesFileName
lockFile=$lockFileName
log.test.file=$testLogFileName
log.test.driver=$module
EOF
}

sub createLog4PerlFile {
    my ( $log4perlFile, $logFileName ) = @_;
    print $log4perlFile <<EOF;
log4perl.logger.logparser= DEBUG, Logparser
log4perl.appender.Logparser=Log::Dispatch::FileRotate
log4perl.appender.Logparser.filename=$logFileName
log4perl.appender.Logparser.DatePattern=yyyy-MM-dd-HH
log4perl.appender.Logparser.mode=append
log4perl.appender.Logparser.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.Logparser.layout.ConversionPattern=%d [%c] %m %n

log4perl.logger = ERROR, Screen
log4perl.appender.Screen=Log::Log4perl::Appender::Screen
log4perl.appender.Screen.Threshold=ERROR
log4perl.appender.Screen.stderr=1
log4perl.appender.Screen.layout=Log::Log4perl::Layout::PatternLayout
log4perl.appender.Screen.layout.ConversionPattern=%d [%c] %m %n
EOF
}

sub loadProperties {
    my $propertiesFileName = shift;
    open PROPS, "$propertiesFileName" or die "Cannot open $propertiesFileName: $!";
    my $properties = Config::Properties->new;
    $properties->load(*PROPS);
    close PROPS;
    return $properties;
}