Projekt

Obecné

Profil

Stáhnout (4.52 KB) Statistiky
| Větev: | Tag: | Revize:
#!/usr/bin/perl
#
# Script for auto testing controllers, check each controller by curl with
# data given by config.
#
# Require libraries: libwww-curl-perl, libxml-dom-perl
#
# @author Ondřej Fibich
# @version 1.1
#

use strict;
use warnings;
use XML::DOM;
use URI::Escape;

# Print error message to stderr and terminate program with error code
# Params:
# $message Error message to STDERR
# $ecode Error code for exit
#
sub Error($$);

# Print warning message to stderr
# Params:
# $message Warning message to STDERR
#
sub Warning($);

# XML config for unit testing
my $XML_CONFIG = "unit_testing_config.xml";
# Tag name of controller in XML config
my $TAG_NAME = "controller";
# XML Parser
my $parser = new XML::DOM::Parser;
# Error counter
my $error_counter = 0;
# Check valid counter
my $valid_counter = 0;

if ($#ARGV != 1 and $#ARGV != 2)
{
Error("Wrong arguments, missing url or cookies file", 1);
}

# Already created config?
# Is readable?
if (!(-r $XML_CONFIG))
{
Error("Cannot read from file: " . $XML_CONFIG, 2);
}

# Read
my $xml_reader = $parser->parsefile($XML_CONFIG);

if (!$xml_reader)
{
Error("Cannot parse config file", 2);
}

# Go throught config
my $readed_items = $xml_reader->getElementsByTagName($TAG_NAME);
# All items
for (my $i = 0; $i < $readed_items->getLength; $i++)
{
my $readed_item = $readed_items->item($i);
my $readed_methods = $readed_item->getElementsByTagName("method");
my $c_name = $readed_item->getAttributeNode("name")->getValue;
# All methods of current controller
for (my $u = 0; $u < $readed_methods->getLength; $u++)
{
my $readed_method = $readed_methods->item($u);
my $m_name = $readed_method->getAttributeNode("name")->getValue;
my $readed_inputs = $readed_method->getElementsByTagName("input");
# Get all inputs for this controller
for (my $w = 0; $w < $readed_inputs->getLength; $w++)
{
my $readed_input = $readed_inputs->item($w);
my $readed_params = $readed_input->getElementsByTagName("param");
# init transfer
my $url = $ARGV[0] . "/en/" . $c_name . "/" . $m_name;
my $get = "";
my $data = "";
# Get all params of input
for (my $v = 0; $v < $readed_params->getLength; $v++)
{
my $readed_param = $readed_params->item($v);
my $param_val = $readed_param->getAttributeNode("value")->getValue;
my $type_attr = $readed_param->getAttributeNode("type");
if (defined $type_attr)
{
if (lc($type_attr->getValue) eq "post")
{
$data .= "&" if ($data ne "");
$data .= uri_escape($readed_param->getAttributeNode("name")->getValue);
$data .= "=" . uri_escape($param_val);
}
elsif (lc($type_attr->getValue) eq "get")
{
$get .= ($get ne "") ? "&" : "?";
$get .= uri_escape($readed_param->getAttributeNode("name")->getValue);
$get .= "=" . uri_escape($param_val);
}
}
else
{
$url .= "/" . $param_val;
}
}

# Add get variables
$url .= $get;

my $index = ($error_counter + $valid_counter);
my $filename = "curl/controller_test_error_" . $index . ".html";
my $http_code;
# download page by curl
if ($data eq "")
{
$http_code = `curl -s -L -w %{http_code} -o "${filename}" --cookie "${ARGV[1]}" "${url}"`;
}
else
{
$http_code = `curl -s -L -w %{http_code} -o "${filename}" --data "${data}" --cookie "${ARGV[1]}" "${url}"`;
}

if ($http_code != 200)
{
$error_counter = $error_counter + 1;
print STDERR "$index:$url";
print STDERR " POST: $data" if ($data ne "");
print STDERR "\n";
}
else
{
$valid_counter = $valid_counter + 1;

# benchmark?
if ($#ARGV == 2 and open(my $file, $filename))
{
my $fcontent = join("", <$file>);

if ($fcontent =~ /Loaded in (\d+\.\d+) seconds, using (\d+\.\d+)MB of memory. Version:/)
{
`echo "$1\t$2\t$url\t$data" >> curl/cstats`;
}

close($file);
}

unlink($filename);
}
}
}
}

$xml_reader->dispose;

# output
print $error_counter . ":" . $valid_counter . "\n";

exit 0;

################################################################################


# Print error message to stderr and terminate program with error code
# Params:
# $message Error message to STDERR
# $ecode Error code for exit
#
sub Error($$)
{
my($message, $ecode) = @_;
print STDERR "Program error: ";
print STDERR $message . "\n";
print STDERR "Program will be terminated...\n";
exit $ecode;
}

# Print warning message to stderr
# Params:
# $message Warning message to STDERR
#
sub Warning($)
{
my($message) = @_;
print STDERR "Program warning: ";
print STDERR $message . "\n";
}
(1-1/3)