summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/autotest-appveyor.ps171
-rw-r--r--tests/autotest-freebsd.sh10
-rw-r--r--tests/autotest-linux.sh14
-rw-r--r--tests/autotest-local.pl150
-rw-r--r--tests/autotest-macos.sh12
-rw-r--r--tests/autotest-remote-host.pl37
-rw-r--r--tests/autotest-remote-server.pl33
-rw-r--r--tests/autotest-report.pl229
-rw-r--r--tests/autotest-solaris.sh10
-rw-r--r--tests/gcov-filter.pl36
10 files changed, 71 insertions, 531 deletions
diff --git a/tests/autotest-appveyor.ps1 b/tests/autotest-appveyor.ps1
new file mode 100644
index 0000000..8b7a24c
--- /dev/null
+++ b/tests/autotest-appveyor.ps1
@@ -0,0 +1,71 @@
+function Invoke-CmdScript($scriptName)
+{
+ $cmdLine = """$scriptName"" $args & set"
+ & $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
+ select-string '^([^=]*)=(.*)$' | foreach-object {
+ $varName = $_.Matches[0].Groups[1].Value
+ $varValue = $_.Matches[0].Groups[2].Value
+ set-item Env:$varName $varValue
+ }
+}
+
+$sources = @("src/pugixml.cpp") + (Get-ChildItem -Path "tests/*.cpp" -Exclude "fuzz_*.cpp")
+$failed = $FALSE
+
+foreach ($vs in 9,10,11,12)
+{
+ foreach ($arch in "x86","x64")
+ {
+ Write-Output "# Setting up VS$vs $arch"
+
+ Invoke-CmdScript "C:\Program Files (x86)\Microsoft Visual Studio $vs.0\VC\vcvarsall.bat" $arch
+ if (! $?) { throw "Error setting up VS$vs $arch" }
+
+ foreach ($defines in "standard", "PUGIXML_WCHAR_MODE")
+ {
+ $target = "tests_vs${vs}_${arch}_${defines}"
+ $deflist = if ($defines -eq "standard") { "" } else { "/D$defines" }
+
+ Add-AppveyorTest $target -Outcome Running
+
+ Write-Output "# Building $target.exe"
+ & cmd /c "cl.exe /Fe$target.exe /EHsc /W4 /WX $deflist $sources 2>&1" | Tee-Object -Variable buildOutput
+
+ if ($?)
+ {
+ Write-Output "# Running $target.exe"
+
+ $sw = [Diagnostics.Stopwatch]::StartNew()
+
+ & .\$target | Tee-Object -Variable testOutput
+
+ if ($?)
+ {
+ Write-Output "# Passed"
+
+ Update-AppveyorTest $target -Outcome Passed -StdOut ($testOutput | out-string) -Duration $sw.ElapsedMilliseconds
+ }
+ else
+ {
+ Write-Output "# Failed"
+
+ Update-AppveyorTest $target -Outcome Failed -StdOut ($testOutput | out-string) -ErrorMessage "Running failed"
+
+ $failed = $TRUE
+ }
+ }
+ else
+ {
+ Write-Output "# Failed to build"
+
+ Update-AppveyorTest $target -Outcome Failed -StdOut ($buildOutput | out-string) -ErrorMessage "Compilation failed"
+
+ $failed = $TRUE
+ }
+ }
+ }
+}
+
+if ($failed) { throw "One or more build steps failed" }
+
+Write-Output "# End"
diff --git a/tests/autotest-freebsd.sh b/tests/autotest-freebsd.sh
deleted file mode 100644
index ccb5c6c..0000000
--- a/tests/autotest-freebsd.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-# put this to /etc/rc.d/pugixml-autotest
-# don't forget to chmod +x pugixml-autotest and to replace /home/USERNAME with actual path
-
-if [ "$1" = "start" -o "$1" = "faststart" ]
-then
- PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
- cd /home/USERNAME/pugixml
- perl tests/autotest-remote-host.pl "shutdown -p now" &
-fi
diff --git a/tests/autotest-linux.sh b/tests/autotest-linux.sh
deleted file mode 100644
index 30b9346..0000000
--- a/tests/autotest-linux.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-# chkconfig: 2345 20 80
-# description: pugixml autotest script
-# put this to /etc/init.d/pugixml-autotest.sh, then launch
-# Debian/Ubuntu: sudo update-rc.d pugixml-autotest.sh defaults 80
-# Fedora/RedHat: sudo chkconfig --add pugixml-autotest.sh
-# don't forget to chmod +x pugixml-autotest.sh and to replace /home/USERNAME with actual path
-
-if [ "$1" = "start" ]
-then
- PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
- cd /home/USERNAME/pugixml
- perl tests/autotest-remote-host.pl "shutdown -P now" &
-fi
diff --git a/tests/autotest-local.pl b/tests/autotest-local.pl
deleted file mode 100644
index 60f8b20..0000000
--- a/tests/autotest-local.pl
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/usr/bin/perl
-
-use Config;
-
-sub permute
-{
- my @defines = @_;
- my @result = ('');
-
- foreach $define (@defines)
- {
- push @result, map { length($_) == 0 ? $define : "$_,$define" } @result;
- }
-
- @result;
-}
-
-sub gcctoolset
-{
- my $gccversion = `gcc -dumpversion`;
- chomp($gccversion);
-
- my $gcc = "gcc$gccversion";
-
- return ($^O =~ /darwin/) ? ($gcc, "${gcc}_x64", "${gcc}_ppc") : (`uname -m` =~ /64/) ? ("${gcc}_x64") : ($gcc);
-}
-
-sub getcpucount
-{
- return $1 if ($^O =~ /linux/ && `cat /proc/cpuinfo` =~ /cpu cores\s*:\s*(\d+)/);
- return $1 if ($^O =~ /freebsd|darwin/ && `sysctl -a` =~ /hw\.ncpu\s*:\s*(\d+)/);
- return $1 - 1 if ($^O =~ /solaris/ && `mpstat | wc -l` =~ /(\d+)/);
-
- undef;
-}
-
-@alltoolsets = ($^O =~ /MSWin/)
- ? (bcc, cw, dmc,
- ic8, ic9, ic9_x64, ic10, ic10_x64, ic11, ic11_x64,
- mingw34, mingw44, mingw45, mingw45_0x, mingw46_x64,
- msvc6, msvc7, msvc71, msvc8, msvc8_x64, msvc9, msvc9_x64,
- msvc10, msvc10_x64, msvc10_clr, msvc10_clr_x64,
- msvc11, msvc11_x64, msvc11_clr, msvc11_clr_x64, msvc11_arm,
- msvc12, msvc12_x64, msvc12_clr, msvc12_clr_x64, msvc12_arm,
- xbox360, ps3_gcc, ps3_snc, msvc8_wince, bada, blackberry, android, android_stlport)
- : ($^O =~ /solaris/)
- ? (suncc, suncc_x64)
- : &gcctoolset();
-
-$fast = scalar grep(/^fast$/, @ARGV);
-@toolsets = map { /^fast$/ ? () : ($_) } @ARGV;
-@toolsets = @toolsets ? @toolsets : @alltoolsets;
-
-@configurations = (debug, release);
-@defines = (PUGIXML_NO_XPATH, PUGIXML_NO_EXCEPTIONS, PUGIXML_NO_STL, PUGIXML_WCHAR_MODE);
-$stddefine = 'PUGIXML_STANDARD';
-
-if ($fast)
-{
- @defines = (PUGIXML_WCHAR_MODE);
- @configurations = (debug);
-}
-
-@definesets = permute(@defines);
-
-print "### autotest begin " . scalar localtime() . "\n";
-
-# print Git revision info
-print "### autotest revision $1\n" if (`git rev-parse HEAD` =~ /(.+)/);
-
-# get CPU info
-$cpucount = &getcpucount();
-
-# build all configurations
-%results = ();
-
-foreach $toolset (@toolsets)
-{
- my $cmdline = "jam";
-
- # parallel build on non-windows platforms (since jam can't detect processor count)
- $cmdline .= " -j$cpucount" if (defined $cpucount);
-
- # add toolset
- $cmdline .= " toolset=$toolset";
-
- # add configurations
- $cmdline .= " configuration=" . join(',', @configurations);
-
- # add definesets
- $cmdline .= " defines=$stddefine";
-
- foreach $defineset (@definesets)
- {
- # STLport lacks bad_alloc on Android so skip configurations without PUGIXML_NO_EXCEPTIONS
- next if ($toolset eq 'android_stlport' && $defineset !~ /PUGIXML_NO_EXCEPTIONS/);
-
- $cmdline .= ":$defineset" if ($defineset ne '');
-
- # any configuration with prepare but without result is treated as failed
- foreach $configuration (@configurations)
- {
- print "### autotest $Config{archname} $toolset $configuration [$defineset] prepare\n";
- }
- }
-
- print STDERR "*** testing $toolset... ***\n";
-
- # launch command
- print "### autotest launch $cmdline\n";
-
- open PIPE, "$cmdline autotest=on coverage |" || die "$cmdline failed: $!\n";
-
- # parse build output
- while (<PIPE>)
- {
- # ... autotest release [wchar] success
- if (/^\.\.\. autotest (\S+) \[(.*?)\] (success|skiprun)/)
- {
- my $configuration = $1;
- my $defineset = ($2 eq $stddefine) ? '' : $2;
- my $result = $3;
-
- print "### autotest $Config{archname} $toolset $configuration [$defineset] $result\n";
- }
- # ... autotest release [wchar] gcov
- elsif (/^\.\.\. autotest (\S+) \[(.*?)\] gcov/)
- {
- my $configuration = $1;
- my $defineset = ($2 eq $stddefine) ? '' : $2;
-
- if (/pugixml\.cpp' executed:([^%]+)%/)
- {
- print "### autotest $Config{archname} $toolset $configuration [$defineset] coverage $1\n";
- }
- else
- {
- print;
- }
- }
- else
- {
- print;
- }
- }
-
- close PIPE;
-}
-
-print "### autotest end " . scalar localtime() . "\n";
diff --git a/tests/autotest-macos.sh b/tests/autotest-macos.sh
deleted file mode 100644
index fc21fc8..0000000
--- a/tests/autotest-macos.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-# put this to /Library/StartupItems/pugixml-autotest/pugixml-autotest, then create
-# file StartupParameters.plist in the same folder with the following contents:
-# <plist><dict><key>Provides</key><array><string>pugixml-autotest</string></array></dict></plist>
-# don't forget to chmod +x pugixml-autotest and to replace /Users/USERNAME with actual path
-
-if [ "$1" = "start" ]
-then
- PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
- cd /Users/USERNAME/pugixml
- perl tests/autotest-remote-host.pl "shutdown -h now" &
-fi
diff --git a/tests/autotest-remote-host.pl b/tests/autotest-remote-host.pl
deleted file mode 100644
index 63dfe68..0000000
--- a/tests/autotest-remote-host.pl
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/perl
-
-sub execprint
-{
- my $cmd = shift;
-
- open PIPE, "$cmd |" || die "$cmd failed: $!\n";
- print while (<PIPE>);
- close PIPE;
-
- return $?;
-}
-
-use IO::Socket;
-use Net::Ping;
-
-$exitcmd = shift;
-$host = "10.0.2.2";
-
-# wait while network is up
-$ping = Net::Ping->new("icmp");
-
-while (!$ping->ping($host))
-{
- print "### autotest $host is down, retrying...\n";
-}
-
-print "### autotest $host is up, connecting...\n";
-
-my $client = new IO::Socket::INET(PeerAddr => "$host:7183");
-exit unless $client;
-
-select $client;
-
-&execprint('git pull') == 0 || die "error updating from repo\n";
-&execprint('perl tests/autotest-local.pl') == 0 || die "error launching tests\n";
-system($exitcmd);
diff --git a/tests/autotest-remote-server.pl b/tests/autotest-remote-server.pl
deleted file mode 100644
index 811c3e8..0000000
--- a/tests/autotest-remote-server.pl
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/perl
-
-use IO::Socket;
-
-$vm = shift;
-$log = shift;
-
-# start virtualbox gui in minimized mode - this should be the first thing we do since this process
-# inherits all handles and we want our sockets/log file closed
-system("start /min virtualbox --startvm $vm");
-
-# start a server; vm will connect to the server via autotest-remote-host.pl
-my $server = new IO::Socket::INET(LocalPort => 7183, Listen => 1);
-die "Could not create socket: $!\n" unless $server;
-
-open LOG, ">> $log" || die "Could not open log file: $!\n";
-
-print LOG "Listening for connection...\n";
-
-my $client = $server->accept();
-
-# echo all input to log file
-print LOG $_ while (<$client>);
-close LOG;
-
-$client->close();
-$server->close();
-
-# wait for vm shutdown to decrease peak memory consumption
-while (`vboxmanage showvminfo $vm` !~ /State:\s+powered off/)
-{
- sleep(1);
-}
diff --git a/tests/autotest-report.pl b/tests/autotest-report.pl
deleted file mode 100644
index 9eebf39..0000000
--- a/tests/autotest-report.pl
+++ /dev/null
@@ -1,229 +0,0 @@
-#!/usr/bin/perl
-
-# pretty-printing
-sub prettysuffix
-{
- my $suffix = shift;
-
- return " C++0x" if ($suffix eq '_0x');
- return " x64" if ($suffix eq '_x64');
- return " CLR" if ($suffix eq '_clr');
- return " CLR x64" if ($suffix eq '_clr_x64');
- return " PPC" if ($suffix eq '_ppc');
- return " WinCE" if ($suffix eq '_wince');
- return " ARM" if ($suffix eq '_arm');
-
- return "";
-}
-
-sub prettytoolset
-{
- my $toolset = shift;
-
- return "Borland C++ 5.82" if ($toolset eq 'bcc');
- return "Metrowerks CodeWarrior 8" if ($toolset eq 'cw');
- return "Digital Mars C++ 8.51" if ($toolset eq 'dmc');
- return "Sun C++ 5.10" . prettysuffix($1) if ($toolset =~ /^suncc(.*)$/);
-
- return "Intel C++ Compiler $1.0" . prettysuffix($2) if ($toolset =~ /^ic(\d+)(.*)$/);
- return "MinGW (GCC $1.$2)" . prettysuffix($3) if ($toolset =~ /^mingw(\d)(\d)(.*)$/);
- return "Microsoft Visual C++ 7.1" if ($toolset eq 'msvc71');
- return "Microsoft Visual C++ $1.0" . prettysuffix($2) if ($toolset =~ /^msvc(\d+)(.*)$/);
- return "GNU C++ Compiler $1" . prettysuffix($2) if ($toolset =~ /^gcc([\d.]*)(.*)$/);
-
- return "Microsoft Xbox360 Compiler" if ($toolset =~ /^xbox360/);
- return "Sony PlayStation3 GCC" if ($toolset =~ /^ps3_gcc/);
- return "Sony PlayStation3 SNC" if ($toolset =~ /^ps3_snc/);
-
- return "Android NDK (GCC)" . ($1 eq '_stlport' ? " STLport" : "") if ($toolset =~ /^android(.*)$/);
- return "bada SDK (GCC)" if ($toolset =~ /^bada$/);
- return "BlackBerry NDK (GCC)" if ($toolset =~ /^blackberry$/);
-
- $toolset;
-}
-
-sub prettyplatform
-{
- my ($platform, $toolset) = @_;
-
- return "solaris" if ($platform =~ /solaris/);
-
- return "macos" if ($platform =~ /darwin/);
-
- return "linux64" if ($platform =~ /64-linux/);
- return "linux32" if ($platform =~ /86-linux/);
-
- return "fbsd64" if ($platform =~ /64-freebsd/);
- return "fbsd32" if ($platform =~ /86-freebsd/);
-
- return "x360" if ($toolset =~ /^xbox360/);
- return "ps3" if ($toolset =~ /^ps3/);
-
- return "arm" if ($toolset =~ /_arm$/);
- return "arm" if ($toolset =~ /_wince$/);
- return "arm" if ($toolset =~ /^android/);
- return "arm" if ($toolset =~ /^bada/);
- return "arm" if ($toolset =~ /^blackberry/);
-
- return "win64" if ($platform =~ /MSWin32-x64/);
- return "win32" if ($platform =~ /MSWin32/);
-
- $platform;
-}
-
-sub prettybox
-{
- my $enabled = shift;
- my $color = $enabled ? "#cccccc" : "#ffffff";
-
- "<td bgcolor='$color' align='center'>" . ($enabled ? "+" : "&nbsp;") . "</td>";
-}
-
-# parse build log
-%results = ();
-%toolsets = ();
-%defines = ();
-%configurations = ();
-
-sub insertindex
-{
- my ($hash, $key) = @_;
-
- $$hash{$key} = scalar(keys %$hash) unless defined $$hash{$key};
-}
-
-while (<>)
-{
- ### autotest i386-freebsd-64int gcc release [wchar] result 0 97.78 98.85
- if (/^### autotest (\S+) (\S+) (\S+) \[(.*?)\] (.*)/)
- {
- my ($platform, $toolset, $configuration, $defineset, $info) = ($1, $2, $3, $4, $5);
-
- my $fulltool = &prettyplatform($platform, $toolset) . ' ' . &prettytoolset($toolset);
- my $fullconf = "$configuration $defineset";
-
- if ($info =~ /^prepare/)
- {
- $results{$fulltool}{$fullconf}{result} = "";
- }
- elsif ($info =~ /^success/)
- {
- $results{$fulltool}{$fullconf}{result} = "success";
- }
- elsif ($info =~ /^skiprun/)
- {
- $results{$fulltool}{$fullconf}{result} = "skiprun";
- }
- elsif ($info =~ /^coverage (\S+)/)
- {
- $results{$fulltool}{$fullconf}{coverage} = $1;
- }
- else
- {
- print STDERR "Unrecognized autotest infoline $_";
- }
-
- &insertindex(\%toolsets, $fulltool);
-
- $defines{$_} = 1 foreach (split /,/, $defineset);
- &insertindex(\%configurations, $fullconf);
- }
- elsif (/^### autotest revision (.+)/)
- {
- if (defined $revision && $revision != $1)
- {
- print STDERR "Autotest build report contains several revisions: $revision, $1\n";
- }
- else
- {
- $revision = $1;
- }
- }
-}
-
-# make arrays of toolsets and configurations
-@toolsetarray = ();
-@configurationarray = ();
-
-$toolsetarray[$toolsets{$_}] = $_ foreach (keys %toolsets);
-$configurationarray[$configurations{$_}] = $_ foreach (keys %configurations);
-
-# print header
-$stylesheet = <<END;
-table.autotest { border: 1px solid black; border-left: none; border-top: none; }
-table.autotest td { border: 1px solid black; border-right: none; border-bottom: none; }
-END
-
-print <<END;
-<html><head><title>pugixml autotest report</title><style type="text/css"><!-- $stylesheet --></style></head><body>
-<h3>pugixml autotest report</h3>
-<table border=1 cellspacing=0 cellpadding=4 class="autotest">
-END
-
-# print configuration header (release/debug)
-print "<tr><td align='right' colspan=2>optimization</td>";
-print &prettybox((split /\s+/)[0] eq 'release') foreach (@configurationarray);
-print "</tr>\n";
-
-# print defines header (one row for each define)
-foreach $define (sort {$a cmp $b} keys %defines)
-{
- print "<tr><td align='right' colspan=2><small>$define</small></td>";
-
- foreach (@configurationarray)
- {
- my $present = ($_ =~ /\b$define\b/);
-
- print &prettybox($present);
- }
- print "</tr>\n";
-}
-
-# print data (one row for each toolset)
-foreach $tool (@toolsetarray)
-{
- my ($platform, $toolset) = split(/\s+/, $tool, 2);
- print "<tr><td style='border-right: none' align='center'><small>$platform</small></td><td style='border-left: none'><nobr>$toolset</nobr></td>";
-
- foreach (@configurationarray)
- {
- my $info = $results{$tool}{$_};
-
- if (!defined $$info{result})
- {
- print "<td bgcolor='#cccccc'>&nbsp;</td>";
- }
- elsif ($$info{result} eq "success")
- {
- my $coverage = $$info{coverage};
-
- print "<td bgcolor='#00ff00' align='center'>pass";
-
- if ($coverage > 0)
- {
- print "<br><font size='-2'>" . ($coverage + 0) . "%</font>";
- }
-
- print "</td>";
- }
- elsif ($$info{result} eq "skiprun")
- {
- print "<td bgcolor='#ffff80' align='center'>pass</td>"
- }
- else
- {
- print "<td bgcolor='#ff0000' align='center'>fail</td>"
- }
- }
-
- print "</tr>\n";
-}
-
-# print footer
-$date = localtime;
-
-print <<END;
-</table><br>
-Generated on $date from Git $revision
-</body></html>
-END
diff --git a/tests/autotest-solaris.sh b/tests/autotest-solaris.sh
deleted file mode 100644
index 96111a7..0000000
--- a/tests/autotest-solaris.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-# put this to /etc/init.d/pugixml-autotest.sh, then launch
-# ln -s /etc/init.d/pugixml-autotest.sh /etc/rc3.d/S80pugixml-autotest
-# don't forget to chmod +x pugixml-autotest.sh and to replace /export/home/USERNAME with actual path
-
-if [ "$1" = "start" ]
-then
- cd /export/home/USERNAME/pugixml
- perl tests/autotest-remote-host.pl "shutdown -g 0 -i 5 -y" &
-fi
diff --git a/tests/gcov-filter.pl b/tests/gcov-filter.pl
deleted file mode 100644
index f0d2019..0000000
--- a/tests/gcov-filter.pl
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/perl
-
-sub funcinfo
-{
- my ($name, $info) = @_;
-
- return if ($info =~ /No executable lines/);
-
- my $lines = ($info =~ /Lines executed:([^%]+)%/) ? $1 : 100;
- my $calls = ($info =~ /Calls executed:([^%]+)%/) ? $1 : 100;
- my $branches = ($info =~ /Branches executed:([^%]+)%/) ? $1 : 100;
- my $taken = ($info =~ /Taken at least once:([^%]+)%/) ? $1 : 100;
-
- return if ($lines == 100 && $calls == 100 && $branches == 100 && $taken == 100);
-
- return "Function $name: L $lines, C $calls, B $branches, BT $taken\n";
-}
-
-$prefix = join(' ', @ARGV);
-$prefix .= ' ' if ($prefix ne '');
-
-$lines = join('', <STDIN>);
-
-# merge file information
-$lines =~ s/File (.+)\nLines (.+)\n(.+\n)*\n/$1 $2\n/g;
-
-# merge function information
-$lines =~ s/Function (.+)\n((.+\n)*)\n/funcinfo($1, $2)/eg;
-
-# remove include information
-$lines =~ s/.+include\/c\+\+.+\n//g;
-
-foreach $line (split /\n/, $lines)
-{
- print "$prefix$line\n";
-}