You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axkit-dev@xml.apache.org by ma...@sergeant.org on 2006/08/24 17:11:50 UTC
[SVN] [121] Start of a test framework
Revision: 121
Author: matt
Date: 2006-08-24 15:11:27 +0000 (Thu, 24 Aug 2006)
Log Message:
-----------
Start of a test framework
Added Paths:
-----------
trunk/lib/AxKit2/Test.pm
trunk/plugins/logging/file
Added: trunk/lib/AxKit2/Test.pm
===================================================================
--- trunk/lib/AxKit2/Test.pm 2006-08-24 13:33:14 UTC (rev 120)
+++ trunk/lib/AxKit2/Test.pm 2006-08-24 15:11:27 UTC (rev 121)
@@ -0,0 +1,149 @@
+# Copyright 2001-2006 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+package AxKit2::Test;
+
+use strict;
+use warnings;
+
+use IO::Socket;
+use base 'Exporter';
+
+our @EXPORT = qw(start_server);
+
+# Module to assist with testing
+
+my $server_port = 54000;
+
+sub get_free_port {
+ die "No ports free" if $server_port == 65534;
+
+ while (IO::Socket::INET->new(PeerAddr => "localhost:$server_port")) {
+ $server_port++;
+ }
+ if (IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port+1)) {
+ # server port free, console port isn't
+ $server_port += 2;
+ return get_free_port();
+ }
+ return $server_port;
+}
+
+sub start_server {
+ my $config = shift;
+
+ my $port = get_free_port();
+
+ return AxKit2::Test::Server->new($port, $config);
+}
+
+
+package AxKit2::Test::Server;
+
+use File::Temp qw(tempfile);
+use AxKit2;
+
+sub new {
+ my $class = shift;
+ my ($port, $config) = @_;
+
+ my ($fh, $filename) = tempfile();
+
+ my $self = bless {
+ port => $port,
+ console_port => $port + 1,
+ config_file => $filename,
+ }, $class;
+
+ $self->setup_config($fh, $config);
+
+ my $child = fork;
+ die "fork failed" unless defined $child;
+ if ($child) {
+ $self->{child_pid} = $child;
+ return $self;
+ }
+
+ # child
+ AxKit2->run($filename);
+ exit;
+}
+
+sub setup_config {
+ my ($self, $fh, $config) = @_;
+
+ my $port = $self->{port};
+ my $console = $self->{console_port};
+
+ print $fh <<EOT;
+Plugin logging/file
+LogFile test.log
+LogLevel LOGDEBUG
+
+# setup console
+ConsolePort $console
+Plugin stats
+
+Plugin error_xml
+ErrorStylesheet demo/error.xsl
+StackTrace On
+
+<Server testserver>
+ Port $port
+
+EOT
+ print $fh $config;
+
+ print $fh <<EOT;
+
+</Server>
+EOT
+
+ seek($fh, 0, 0);
+}
+
+sub DESTROY {
+ my $self = shift;
+
+ $self->shutdown;
+}
+
+sub shutdown {
+ my $self = shift;
+
+ return unless $self->{child_pid};
+
+ my $conf = IO::Socket::INET->new(
+ PeerAddr => "127.0.0.1",
+ PeerPort => $self->{console_port},
+ ) || die "Cannot connect to console port $self->{console_port} : $!";
+
+ IO::Handle::blocking($conf, 0);
+
+ $conf->print("shutdown\n");
+
+ my $buf;
+ read($conf, $buf, 128 * 1024);
+
+ use POSIX ":sys_wait_h";
+ my $kid;
+ do {
+ $kid = waitpid(-1, WNOHANG);
+ } until $kid > 0;
+
+ unlink($self->{config_file});
+}
+
+1;
Added: trunk/plugins/logging/file
===================================================================
--- trunk/plugins/logging/file 2006-08-24 13:33:14 UTC (rev 120)
+++ trunk/plugins/logging/file 2006-08-24 15:11:27 UTC (rev 121)
@@ -0,0 +1,111 @@
+#!/usr/bin/perl -w
+
+# Copyright 2001-2006 The Apache Software Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+=head1 NAME
+
+logging/file - Logging plugin to send logging to a file
+
+=head1 SYNOPSIS
+
+ Plugin logging/file
+ LogFile log.out
+ LogLevel LOGWARN
+
+=head1 DESCRIPTION
+
+This plugin simply sends all error logging to the file specified.
+
+=head1 CONFIG
+
+=head2 LogLevel STRING | NUMBER
+
+Specify the level of logging. One of:
+
+ LOGDEBUG or 7
+ LOGINFO or 6
+ LOGNOTICE or 5
+ LOGWARN or 4
+ LOGERROR or 3
+ LOGCRIT or 2
+ LOGALERT or 1
+ LOGEMERG or 0
+
+=head2 LogFile STRING
+
+A file to use for logging.
+
+=cut
+
+sub init {
+ my $self = shift;
+
+ $self->register_config('LogLevel', sub { $self->loglevel(@_) });
+ $self->register_config('LogFile', sub { $self->logfile(@_) });
+}
+
+sub dor {
+ my $val = shift;
+ defined($val) ? $val : $_[0];
+}
+
+sub loglevel {
+ my ($self, $conf) = (shift, shift);
+
+ my $key = $self->plugin_name . '::loglevel';
+
+ if (@_) {
+ my $value = shift;
+ if ($value !~ /^\d+$/) {
+ $value = AxKit2::Constants::log_level($value)
+ || die "Invalid log level: $value";
+ }
+ $conf->notes($key, $value);
+ }
+
+ dor($conf->notes($key), 4);
+}
+
+sub logfile {
+ my $self = shift;
+ my $conf = shift;
+
+ my $key = $self->plugin_name . '::logfile';
+
+ if (@_) {
+ my $filename = shift;
+ open(my $fh, ">>$filename") || die "open($filename): $!";
+ $conf->notes($key, $fh);
+ }
+
+ $conf->notes($key) || die "No log file specified";
+}
+
+sub hook_logging {
+ my ($self, $level, @args) = @_;
+
+ if ($level <= $self->loglevel($self->config)) {
+ my $fh = $self->logfile($self->config);
+ if ($self->client->can('peer_addr_string')) {
+ print $fh ($self->client->peer_addr_string, " L$level ", @args, "\n");
+ }
+ else {
+ print $fh ("L$level ", @args, "\n");
+ }
+ }
+
+ return DECLINED;
+}