use Test::More; use Log::Log4perl; use strict; our $no_XMLDOM; BEGIN { my $dvrq = $Log::Log4perl::DOM_VERSION_REQUIRED; eval { require XML::DOM; my $dver = XML::DOM->VERSION($dvrq); require XML::Parser; my $pver = XML::Parser->VERSION; if ($pver >= 2.32 && $dver <= 1.42){ print STDERR "Your version of XML::DOM ($dver) is incompatible with your version of XML::Parser ($pver). You should upgrade your XML::DOM to 1.43 or greater.\n"; die 'skip tests'; } }; if ($@) { plan skip_all => "only with XML::DOM > $dvrq"; }else{ plan tests => 4; } } if ($no_XMLDOM){ ok(1); exit(0); } my $xmlconfig = <<'EOL'; mary@another.jabber.server insert into log4perltest (loglevel, message, shortcaller, thingid, category, pkg, runtime1, runtime2) values (?,?,?,?,?,?,?,?) EOL my $xmldata = Log::Log4perl::Config::config_read(\$xmlconfig); my $propsconfig = <<'EOL'; log4j.category.animal.dog = INFO, jabbender log4j.threshold = DEBUG log4j.oneMessagePerAppender=1 log4j.PatternLayout.cspec.G=sub { return "UID $< GID $("; } log4j.appender.jabbender = Log::Dispatch::Jabber log4j.appender.jabbender.layout = Log::Log4perl::Layout::SimpleLayout log4j.appender.jabbender.login.hostname = a.jabber.server log4j.appender.jabbender.login.port = 5222 log4j.appender.jabbender.login.username = bobjones log4j.appender.jabbender.login.password = 12345 log4j.appender.jabbender.login.resource = logger log4j.appender.jabbender.to = bob@a.jabber.server log4j.appender.jabbender.to = mary@another.jabber.server log4j.appender.DBAppndr2 = Log::Log4perl::Appender::DBI log4j.appender.DBAppndr2.username = bobjones log4j.appender.DBAppndr2.datasource = DBI:CSV:f_dir=t/tmp log4j.appender.DBAppndr2.password = sub { $ENV{PWD} } log4j.appender.DBAppndr2.sql = insert into log4perltest (loglevel, message, shortcaller, thingid, category, pkg, runtime1, runtime2) values (?,?,?,?,?,?,?,?) log4j.appender.DBAppndr2.params.1 = %p log4j.appender.DBAppndr2.params.3 = %5.5l log4j.appender.DBAppndr2.params.5 = %c log4j.appender.DBAppndr2.params.6 = %C log4j.appender.DBAppndr2.bufferSize=2 log4j.appender.DBAppndr2.warp_message=0 #noop layout to pass it through log4j.appender.DBAppndr2.layout = Log::Log4perl::Layout::NoopLayout EOL my $propsdata = Log::Log4perl::Config::config_read(\$propsconfig); #brute force testing here, not very granular, but it is thorough eval {require Data::Dump}; my $dump_available; if (! $@) { $dump_available = 1; } require 't/compare.pl'; ok(Compare($xmldata, $propsdata)) || do { if ($dump_available) { print STDERR "got: ",Data::Dump::dump($xmldata),"\n================\n"; print STDERR "expected: ", Data::Dump::dump($propsdata),"\n"; } }; # ------------------------------------------------ #ok, let's get more hairy, make-believe $xmlconfig = <<'EOL'; fffff hhhhh mary@another.jabber.server EOL $propsconfig = <<'EOL'; log4j.appender.A1= Log::Dispatch::Jabber log4j.appender.A1.A.1=fffff log4j.appender.A1.A.list=11111 log4j.appender.A1.A.list=22222 log4j.appender.A1.A.subnest.a=hhhhh log4j.appender.A1.A.subnest.list=aaaaa log4j.appender.A1.A.subnest.list=bbbbb log4j.appender.A1.to=mary@another.jabber.server log4j.appender.A1.layout=Log::Log4perl::Layout::SimpleLayout EOL $xmldata = Log::Log4perl::Config::config_read(\$xmlconfig); $propsdata = Log::Log4perl::Config::config_read(\$propsconfig); ok(Compare($xmldata, $propsdata)) || do { if ($dump_available) { print STDERR "got: ",Data::Dump::dump($xmldata),"\n================\n"; print STDERR "expected: ", Data::Dump::dump($propsdata),"\n"; } }; # ------------------------------------------------ #now testing things like cspecs, code refs $xmlconfig = <<'EOL'; sub { return sprintf "%1x", $$} sub {return 'thisistheGcspec'} EOL $propsconfig = <<'EOL'; log4j.category.plant = DEBUG, appndr1 log4j.PatternLayout.cspec.U = \ sub { \ return "UID $< GID $("; \ } \ log4j.appender.appndr1 = Log::Log4perl::Appender::TestBuffer log4j.appender.appndr1.layout = org.apache.log4j.PatternLayout log4j.appender.appndr1.layout.ConversionPattern = %K xx %G %U log4j.appender.appndr1.layout.cspec.K = sub { return sprintf "%1x", $$} log4j.appender.appndr1.layout.cspec.G = sub {return 'thisistheGcspec'} EOL $xmldata = Log::Log4perl::Config::config_read(\$xmlconfig); $propsdata = Log::Log4perl::Config::config_read(\$propsconfig); ok(Compare($xmldata, $propsdata)) || do { if ($dump_available) { print STDERR "got: ",Data::Dump::dump($xmldata),"\n================\n"; print STDERR "expected: ", Data::Dump::dump($propsdata),"\n"; } }; #now we test variable substitution #brute force again my $varsubstconfig = <<'EOL'; ${topcdata} insert into ${tablename} (loglevel, message, shortcaller, thingid, category, pkg, runtime1, runtime2) values (?,?,?,?,?,?,?,?) EOL $ENV{onemsgperappnder} = 'true'; $ENV{jabberclass} = 'Log::Dispatch::Jabber'; $ENV{paramnestedname} = 'login'; $ENV{hostname} = 'hostname'; $ENV{hostnameval} = 'a.jabber.server'; $ENV{password} = 'password'; $ENV{passwordval} = '12345'; $ENV{topcdata} = 'mary@another.jabber.server'; $ENV{tablename} = 'log4perltest'; $ENV{cspecname} = 'G'; $ENV{perlcode} = 'return "UID $< GID $(";'; my $varsubstdata = Log::Log4perl::Config::config_read(\$varsubstconfig); ok(Compare($xmldata, $propsdata)) || do { if ($dump_available) { print STDERR "got: ",Data::Dump::dump($xmldata),"\n================\n"; print STDERR "expected: ", Data::Dump::dump($propsdata),"\n"; } };