summaryrefslogtreecommitdiff
path: root/t/033UsrCspec.t
diff options
context:
space:
mode:
Diffstat (limited to 't/033UsrCspec.t')
-rw-r--r--t/033UsrCspec.t314
1 files changed, 314 insertions, 0 deletions
diff --git a/t/033UsrCspec.t b/t/033UsrCspec.t
new file mode 100644
index 0000000..36651be
--- /dev/null
+++ b/t/033UsrCspec.t
@@ -0,0 +1,314 @@
+#testing user-defined conversion specifiers (cspec)
+
+BEGIN {
+ if($ENV{INTERNAL_DEBUG}) {
+ require Log::Log4perl::InternalDebug;
+ Log::Log4perl::InternalDebug->enable();
+ }
+}
+
+use Test::More;
+use Log::Log4perl;
+use Log::Log4perl::Appender::TestBuffer;
+use File::Spec;
+
+Log::Log4perl::Appender::TestBuffer->reset();
+
+
+my $config = <<'EOL';
+log4j.category.plant = DEBUG, appndr1
+log4j.category.animal = DEBUG, appndr2
+
+#'U' a global user-defined cspec
+log4j.PatternLayout.cspec.U = \
+ sub { \
+ return "UID $< GID $("; \
+ } \
+
+
+# ********************
+# first appender
+log4j.appender.appndr1 = Log::Log4perl::Appender::TestBuffer
+#log4j.appender.appndr1 = Log::Log4perl::Appender::Screen
+log4j.appender.appndr1.layout = org.apache.log4j.PatternLayout
+log4j.appender.appndr1.layout.ConversionPattern = %K xx %G %U
+
+#'K' cspec local to appndr1 (pid in hex)
+log4j.appender.appndr1.layout.cspec.K = sub { return sprintf "%1x", $$}
+
+#'G' cspec unique to appdnr1
+log4j.appender.appndr1.layout.cspec.G = sub {return 'thisistheGcspec'}
+
+
+
+# ********************
+# second appender
+log4j.appender.appndr2 = Log::Log4perl::Appender::TestBuffer
+#log4j.appender.appndr2 = Log::Log4perl::Appender::Screen
+log4j.appender.appndr2.layout = org.apache.log4j.PatternLayout
+log4j.appender.appndr2.layout.ConversionPattern = %K %U
+
+#'K' cspec local to appndr2
+log4j.appender.appndr2.layout.cspec.K = \
+ sub { \
+ my ($self, $message, $category, $priority, $caller_level) = @_; \
+ $message =~ /--- (.+) ---/; \
+ my $snippet = $1; \
+ return ucfirst(lc($priority)).'-'.$snippet.'-'.ucfirst(lc($priority)); \
+ }
+
+#override global 'U' cspec
+log4j.appender.appndr2.layout.cspec.U = sub {return 'foobar'}
+
+EOL
+
+
+Log::Log4perl::init(\$config);
+
+my $plant = Log::Log4perl::get_logger('plant');
+my $animal = Log::Log4perl::get_logger('animal');
+
+
+my $hexpid = sprintf "%1x", $$;
+my $uid = $<;
+my $gid = $(;
+
+
+my $plantbuffer = Log::Log4perl::Appender::TestBuffer->by_name("appndr1");
+my $animalbuffer = Log::Log4perl::Appender::TestBuffer->by_name("appndr2");
+
+$plant->fatal('blah blah blah --- plant --- yadda yadda');
+is($plantbuffer->buffer(), "$hexpid xx thisistheGcspec UID $uid GID $gid");
+$plantbuffer->reset;
+
+$animal->fatal('blah blah blah --- animal --- yadda yadda');
+is($animalbuffer->buffer(), "Fatal-animal-Fatal foobar");
+$animalbuffer->reset;
+
+$plant->error('blah blah blah --- plant --- yadda yadda');
+is($plantbuffer->buffer(), "$hexpid xx thisistheGcspec UID $uid GID $gid");
+$plantbuffer->reset;
+
+$animal->error('blah blah blah --- animal --- yadda yadda');
+is($animalbuffer->buffer(), "Error-animal-Error foobar");
+$animalbuffer->reset;
+
+$plant->warn('blah blah blah --- plant --- yadda yadda');
+is($plantbuffer->buffer(), "$hexpid xx thisistheGcspec UID $uid GID $gid");
+$plantbuffer->reset;
+
+$animal->warn('blah blah blah --- animal --- yadda yadda');
+is($animalbuffer->buffer(), "Warn-animal-Warn foobar");
+$animalbuffer->reset;
+
+$plant->info('blah blah blah --- plant --- yadda yadda');
+is($plantbuffer->buffer(), "$hexpid xx thisistheGcspec UID $uid GID $gid");
+$plantbuffer->reset;
+
+$animal->info('blah blah blah --- animal --- yadda yadda');
+is($animalbuffer->buffer(), "Info-animal-Info foobar");
+$animalbuffer->reset;
+
+$plant->debug('blah blah blah --- plant --- yadda yadda');
+is($plantbuffer->buffer(), "$hexpid xx thisistheGcspec UID $uid GID $gid");
+$plantbuffer->reset;
+
+$animal->debug('blah blah blah --- animal --- yadda yadda');
+is($animalbuffer->buffer(), "Debug-animal-Debug foobar");
+$animalbuffer->reset;
+
+
+#now test the api call we're adding
+
+Log::Log4perl::Layout::PatternLayout::add_global_cspec('Z', sub {'zzzzzzzz'}); #snooze?
+
+
+my $app = Log::Log4perl::Appender->new(
+ "Log::Log4perl::Appender::TestBuffer");
+
+my $logger = Log::Log4perl->get_logger("plant");
+$logger->add_appender($app);
+my $layout = Log::Log4perl::Layout::PatternLayout->new(
+ "%m %Z");
+$app->layout($layout);
+$logger->debug("That's the message");
+
+is($app->buffer(), "That's the message zzzzzzzz");
+
+###########################################################
+#testing perl code snippets in Log4perl configuration files
+###########################################################
+
+Log::Log4perl::Appender::TestBuffer->reset();
+
+$config = <<'EOL';
+log4perl.category.some = DEBUG, appndr
+
+ # This should be evaluated at config parse time
+log4perl.appender.appndr = sub { \
+ return "Log::Log4perl::Appender::TestBuffer" }
+log4perl.appender.appndr.layout = Log::Log4perl::Layout::PatternLayout
+ # This should be evaluated at config parse time ("%m %K%n")
+log4perl.appender.appndr.layout.ConversionPattern = sub{ "%" . \
+ chr(109) . " %K%n"; }
+
+ # This should be evaluated at run time ('K' cspec)
+log4perl.appender.appndr.layout.cspec.K = sub { $ENV{TEST_VALUE} }
+EOL
+
+Log::Log4perl::init(\$config);
+
+$ENV{TEST_VALUE} = "env_value";
+
+$logger = Log::Log4perl::get_logger('some');
+$logger->debug("log_message");
+
+$ENV{TEST_VALUE} = "env_value2";
+$logger->info("log_message2");
+
+my $buffer = Log::Log4perl::Appender::TestBuffer->by_name("appndr");
+
+#print "Testbuffer: ", $buffer->buffer(), "\n";
+
+is($buffer->buffer(), "log_message env_value\nlog_message2 env_value2\n");
+
+###########################################################
+#testing perl code snippets with ALLOW_CODE_IN_CONFIG_FILE
+#disabled
+###########################################################
+
+Log::Log4perl::Appender::TestBuffer->reset();
+
+$config = <<'EOL';
+log4perl.category.some = DEBUG, appndr
+
+ # This should be evaluated at config parse time
+log4perl.appender.appndr = Log::Log4perl::Appender::TestBuffer
+log4perl.appender.appndr.layout = Log::Log4perl::Layout::PatternLayout
+ # This should be evaluated at config parse time ("%m %K%n")
+log4perl.appender.appndr.layout.ConversionPattern = sub{ "%m" . \
+ chr(109) . " %n"; }
+EOL
+
+Log::Log4perl::Config::allow_code(0);
+
+eval {
+ Log::Log4perl::init(\$config);
+};
+
+print "ERR is $@\n";
+
+if($@ and $@ =~ /prohibits/) {
+ ok(1);
+} else {
+ ok(0);
+}
+
+# Test if cspecs are denied
+Log::Log4perl::Appender::TestBuffer->reset();
+
+$config = <<'EOL';
+log4perl.category.some = DEBUG, appndr
+
+ # This should be evaluated at config parse time
+log4perl.appender.appndr = Log::Log4perl::Appender::TestBuffer
+log4perl.appender.appndr.layout = Log::Log4perl::Layout::PatternLayout
+log4perl.appender.appndr.layout.ConversionPattern = %m %n
+log4perl.appender.appndr.layout.cspec.K = sub { $ENV{TEST_VALUE} }
+EOL
+
+Log::Log4perl::Config->allow_code(0);
+
+eval {
+ Log::Log4perl::init(\$config);
+};
+
+print "ERR is $@\n";
+
+if($@ and $@ =~ /prohibits/) {
+ ok(1);
+} else {
+ ok(0);
+}
+
+################################################################
+# Test if cspecs are passing the correct caller level
+################################################################
+Log::Log4perl::Config::allow_code(1);
+Log::Log4perl::Appender::TestBuffer->reset();
+
+$config = <<'EOL';
+log4perl.category.some = DEBUG, appndr
+
+ # This should be evaluated at config parse time
+log4perl.appender.appndr = Log::Log4perl::Appender::TestBuffer
+log4perl.appender.appndr.layout = Log::Log4perl::Layout::PatternLayout
+log4perl.appender.appndr.layout.ConversionPattern = %K %m %n
+log4perl.appender.appndr.layout.cspec.K = sub { return (caller($_[4]))[1] }
+EOL
+
+Log::Log4perl::init(\$config);
+
+my $some = Log::Log4perl::get_logger('some');
+$some->debug("blah");
+
+my $somebuffer = Log::Log4perl::Appender::TestBuffer->by_name("appndr");
+
+like($somebuffer->buffer(), qr/033UsrCspec.t blah/);
+
+################################################################
+# cspecs with parameters in curlies
+################################################################
+Log::Log4perl::Config::allow_code(1);
+Log::Log4perl::Appender::TestBuffer->reset();
+
+our %hash = (foo => "bar", quack => "schmack");
+$hash{hollerin} = "hootin"; # shut up perl warnings
+
+use Data::Dumper;
+$config = <<'EOL';
+log4perl.category.some = DEBUG, appndr
+
+ # This should be evaluated at config parse time
+log4perl.appender.appndr = Log::Log4perl::Appender::TestBuffer
+log4perl.appender.appndr.layout = Log::Log4perl::Layout::PatternLayout
+log4perl.appender.appndr.layout.ConversionPattern = %K{foo} %m %K{quack}%n
+log4perl.appender.appndr.layout.cspec.K = sub { $main::hash{$_[0]->{curlies} } }
+EOL
+
+Log::Log4perl::init(\$config);
+
+$some = Log::Log4perl::get_logger('some');
+$some->debug("blah");
+
+$somebuffer = Log::Log4perl::Appender::TestBuffer->by_name("appndr");
+
+is($somebuffer->buffer(), "bar blah schmack\n");
+
+################################################################
+# Get the calling package from a cspec
+################################################################
+Log::Log4perl::Config::allow_code(1);
+Log::Log4perl::Appender::TestBuffer->reset();
+
+$config = <<'EOL';
+log4perl.category.some = DEBUG, appndr
+
+ # This should be evaluated at config parse time
+log4perl.appender.appndr = Log::Log4perl::Appender::TestBuffer
+log4perl.appender.appndr.layout = Log::Log4perl::Layout::PatternLayout
+log4perl.appender.appndr.layout.ConversionPattern = %K %m%n
+log4perl.appender.appndr.layout.cspec.K = \
+ sub { scalar caller( $_[4] )}
+EOL
+
+Log::Log4perl::init(\$config);
+
+$some = Log::Log4perl::get_logger('some');
+$some->debug("blah");
+
+$somebuffer = Log::Log4perl::Appender::TestBuffer->by_name("appndr");
+
+is($somebuffer->buffer(), "main blah\n");
+
+BEGIN { plan tests => 17, }