The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
##########################################################################
# Check basic variable substitution.
# Mike Schilli, 2003 (m@perlmeister.com)
##########################################################################

BEGIN { 
    if($ENV{INTERNAL_DEBUG}) {
        require Log::Log4perl::InternalDebug;
        Log::Log4perl::InternalDebug->enable();
    }
}

use warnings;
use strict;

use Test::More;
BEGIN { plan tests => 8 }
use Log::Log4perl qw(get_logger);

########################################################
# Wrong variable name
########################################################
my $conf = q(
screen = Log::Log4perl::Appender::Screen
log4perl.category = WARN, ScreenApp
log4perl.appender.ScreenApp = ${screen1}
log4perl.appender.ScreenApp.layout = \
    Log::Log4perl::Layout::PatternLayout
log4perl.appender.ScreenApp.layout.ConversionPattern = %d %F{1} %L> %m %n
);

eval { Log::Log4perl::init(\$conf) };

like($@, qr/Undefined Variable 'screen1'/);

########################################################
# Replacing appender class name
########################################################
$conf = q(
screen = Log::Log4perl::Appender::TestBuffer
log4perl.category = WARN, BufferApp
log4perl.appender.BufferApp = ${screen}
log4perl.appender.BufferApp.layout = \
    Log::Log4perl::Layout::PatternLayout
log4perl.appender.BufferApp.layout.ConversionPattern = %d %F{1} %L> %m %n
);

Log::Log4perl::init(\$conf);
my $logger = get_logger("");
$logger->error("foobar");
my $buffer = Log::Log4perl::Appender::TestBuffer->by_name("BufferApp");
like($buffer->buffer, qr/foobar/);

########################################################
# Replacing appender class name
########################################################
$conf = q(
    layout_class   = Log::Log4perl::Layout::PatternLayout
    layout_pattern = %d %F{1} %L> %m %n
    
    log4perl.category.Bar.Twix = WARN, Logfile, Screen

    log4perl.appender.Logfile  = Log::Log4perl::Appender::TestBuffer
    log4perl.appender.Logfile.filename = test.log
    log4perl.appender.Logfile.layout = ${layout_class}
    log4perl.appender.Logfile.layout.ConversionPattern = ${layout_pattern}

    log4perl.appender.Screen  = Log::Log4perl::Appender::TestBuffer
    log4perl.appender.Screen.layout = ${layout_class}
    log4perl.appender.Screen.layout.ConversionPattern = ${layout_pattern}
);

Log::Log4perl::init(\$conf);
$logger = get_logger("Bar::Twix");
$logger->error("foobar");

$buffer = Log::Log4perl::Appender::TestBuffer->by_name("Logfile");
like($buffer->buffer, qr/foobar/);
$buffer = Log::Log4perl::Appender::TestBuffer->by_name("Screen");
like($buffer->buffer, qr/foobar/);

########################################################
# Multi-Line variable
########################################################
$conf = q(
    layout_class   = \
Log::Log4perl::\
Layout::PatternLayout
    layout_pattern = %d %F{1} \
%L> \
%m \
%n
    log4perl.category.Bar.Twix = WARN, Logfile, Screen

    log4perl.appender.Logfile  = Log::Log4perl::Appender::TestBuffer
    log4perl.appender.Logfile.filename = test.log
    log4perl.appender.Logfile.layout = ${layout_class}
    log4perl.appender.Logfile.layout.ConversionPattern = ${layout_pattern}

    log4perl.appender.Screen  = Log::Log4perl::Appender::TestBuffer
    log4perl.appender.Screen.layout = ${layout_class}
    log4perl.appender.Screen.layout.ConversionPattern = ${layout_pattern}
);

Log::Log4perl::init(\$conf);
$logger = get_logger("Bar::Twix");
$logger->error("foobar");

$buffer = Log::Log4perl::Appender::TestBuffer->by_name("Logfile");
like($buffer->buffer, qr/foobar/);
$buffer = Log::Log4perl::Appender::TestBuffer->by_name("Screen");
like($buffer->buffer, qr/foobar/);

########################################################
# Environment variable substitution
########################################################
$ENV{layout_class}   = "Log::Log4perl::Layout::PatternLayout";
$ENV{layout_pattern} = "%d %F{1} %L> %m %n";

$conf = q(
    log4perl.category.Bar.Twix = WARN, Logfile, Screen

    log4perl.appender.Logfile  = Log::Log4perl::Appender::TestBuffer
    log4perl.appender.Logfile.filename = test.log
    log4perl.appender.Logfile.layout = ${layout_class}
    log4perl.appender.Logfile.layout.ConversionPattern = ${layout_pattern}

    log4perl.appender.Screen  = Log::Log4perl::Appender::TestBuffer
    log4perl.appender.Screen.layout = ${layout_class}
    log4perl.appender.Screen.layout.ConversionPattern = ${layout_pattern}
);

Log::Log4perl::init(\$conf);
$logger = get_logger("Bar::Twix");
$logger->error("foobar");

$buffer = Log::Log4perl::Appender::TestBuffer->by_name("Logfile");
like($buffer->buffer, qr/foobar/);
$buffer = Log::Log4perl::Appender::TestBuffer->by_name("Screen");
like($buffer->buffer, qr/foobar/);