mirror of
https://github.com/curl/curl.git
synced 2024-11-21 01:16:58 +08:00
Greg Hewgill's version of testcurl.sh rewritten in perl for greater
portability. I put it in this directory instead of the root since I think perhaps it makes more sense.
This commit is contained in:
parent
2cf218610e
commit
e992aa6a54
409
tests/testcurl.pl
Executable file
409
tests/testcurl.pl
Executable file
@ -0,0 +1,409 @@
|
||||
#!/usr/bin/perl -w
|
||||
#***************************************************************************
|
||||
# _ _ ____ _
|
||||
# Project ___| | | | _ \| |
|
||||
# / __| | | | |_) | |
|
||||
# | (__| |_| | _ <| |___
|
||||
# \___|\___/|_| \_\_____|
|
||||
#
|
||||
# Copyright (C) 1998 - 2004, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at http://curl.haxx.se/docs/copyright.html.
|
||||
#
|
||||
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
# copies of the Software, and permit persons to whom the Software is
|
||||
# furnished to do so, under the terms of the COPYING file.
|
||||
#
|
||||
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
# KIND, either express or implied.
|
||||
#
|
||||
# $Id$
|
||||
###########################################################################
|
||||
|
||||
###########################
|
||||
# What is This Script?
|
||||
###########################
|
||||
|
||||
# testcurl.pl is the master script to use for automatic testing of CVS-curl.
|
||||
# This is written for the purpose of being run from a crontab job or similar
|
||||
# at a regular interval. The output will be suitable to be mailed automaticly
|
||||
# to "curl-autocompile@haxx.se" to be dealt with automatically. The most
|
||||
# current build status (with a resonable backlog) will be published on the
|
||||
# curl site, at http://curl.haxx.se/auto/
|
||||
|
||||
# USAGE:
|
||||
# testcurl.pl [curl-daily-name] > output
|
||||
|
||||
# Updated:
|
||||
# v1.2 8-Mar-04 - rewritten in perl
|
||||
# v1.1 6-Nov-03 - to take an optional parameter, the name of a daily-build
|
||||
# directory. If present, build from that directory, otherwise
|
||||
# perform a normal CVS build.
|
||||
|
||||
use strict;
|
||||
|
||||
use Cwd;
|
||||
|
||||
use vars qw($version $fixed $infixed $CURLDIR $CVS $pwd $build $buildlog $buildlogname $gnulikebuild);
|
||||
use vars qw($name $email $desc $confopts);
|
||||
|
||||
# version of this script
|
||||
$version='$Revision$';
|
||||
$fixed=0;
|
||||
|
||||
# Determine if we're running from CVS or a canned copy of curl
|
||||
if (@ARGV && $ARGV[0]) {
|
||||
$CURLDIR=$ARGV[0];
|
||||
$CVS=0;
|
||||
} else {
|
||||
$CURLDIR="curl";
|
||||
$CVS=1;
|
||||
}
|
||||
|
||||
$ENV{LANG}="C";
|
||||
|
||||
sub rmtree($) {
|
||||
my $target = $_[0];
|
||||
if ($^O eq 'MSWin32') {
|
||||
foreach (glob($target)) {
|
||||
s:/:\\:g;
|
||||
system("rd /s /q $_");
|
||||
}
|
||||
} else {
|
||||
system("rm -rf $target");
|
||||
}
|
||||
}
|
||||
|
||||
sub grepfile($$) {
|
||||
my ($target, $fn) = @_;
|
||||
open(F, $fn) or die;
|
||||
while (<F>) {
|
||||
if (/$target/) {
|
||||
close(F);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
close(F);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sub logit($) {
|
||||
my $text=$_[0];
|
||||
if ($text) {
|
||||
print "testcurl: $text\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub mydie($){
|
||||
my $text=$_[0];
|
||||
logit "$text";
|
||||
chdir $pwd; # cd back to the original root dir
|
||||
|
||||
if ($pwd && $build) {
|
||||
# we have a build directory name, remove the dir
|
||||
logit "removing the $build dir";
|
||||
rmtree "$pwd/$build";
|
||||
}
|
||||
if (-r $buildlog) {
|
||||
# we have a build log output file left, remove it
|
||||
logit "removing the $buildlogname file";
|
||||
unlink "$buildlog";
|
||||
}
|
||||
logit "ENDING HERE"; # last line logged!
|
||||
exit 1;
|
||||
}
|
||||
|
||||
$gnulikebuild = 1;
|
||||
if ($^O eq 'MSWin32') {
|
||||
$gnulikebuild = 0;
|
||||
}
|
||||
|
||||
if (open(F, "setup")) {
|
||||
while (<F>) {
|
||||
if (/(\w+)=(.*)/) {
|
||||
eval "\$$1=$2;";
|
||||
}
|
||||
}
|
||||
close(F);
|
||||
$infixed=$fixed;
|
||||
} else {
|
||||
$infixed=0; # so that "additional args to configure" works properly first time...
|
||||
}
|
||||
|
||||
if (!$name) {
|
||||
print "please enter your name\n";
|
||||
$name = <>;
|
||||
chomp $name;
|
||||
$fixed=1;
|
||||
}
|
||||
|
||||
if (!$email) {
|
||||
print "please enter your contact email address\n";
|
||||
$email = <>;
|
||||
chomp $email;
|
||||
$fixed=2;
|
||||
}
|
||||
|
||||
if (!$desc) {
|
||||
print "please enter a one line system description\n";
|
||||
$desc = <>;
|
||||
chomp $desc;
|
||||
$fixed=3;
|
||||
}
|
||||
|
||||
if (!$confopts) {
|
||||
if ($infixed < 4) {
|
||||
print "please enter your additional arguments to configure\n";
|
||||
print "examples: --with-ssl --enable-debug --enable-ipv6 --with-krb4\n";
|
||||
$confopts = <>;
|
||||
chomp $confopts;
|
||||
$fixed=4;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($fixed > 0) {
|
||||
open(F, ">setup") or die;
|
||||
print F "name='$name'\n";
|
||||
print F "email='$email'\n";
|
||||
print F "desc='$desc'\n";
|
||||
print F "confopts='$confopts'\n";
|
||||
print F "fixed='$fixed'\n";
|
||||
}
|
||||
|
||||
logit "STARTING HERE"; # first line logged
|
||||
logit "NAME = $name";
|
||||
logit "EMAIL = $email";
|
||||
logit "DESC = $desc";
|
||||
logit "CONFOPTS = $confopts";
|
||||
logit "CFLAGS = ".($ENV{CFLAGS} ? $ENV{CFLAGS} : "");
|
||||
logit "CC = ".($ENV{CC} ? $ENV{CC} : "");
|
||||
logit "version = $version";
|
||||
logit "date = ".(scalar gmtime)." UTC";
|
||||
|
||||
# Make $pwd to become the path without newline. We'll use that in order to cut
|
||||
# off that path from all possible logs and error messages etc.
|
||||
$pwd = cwd();
|
||||
|
||||
if (-d $CURLDIR) {
|
||||
if ($CVS && -d "$CURLDIR/CVS") {
|
||||
logit "curl is verified to be a fine source dir";
|
||||
# remove the generated sources to force them to be re-generated each
|
||||
# time we run this test
|
||||
unlink "$CURLDIR/lib/getdate.c";
|
||||
unlink "$CURLDIR/src/hugehelp.c";
|
||||
} elsif (!$CVS && -f "$CURLDIR/testcurl.pl") {
|
||||
logit "curl is verified to be a fine daily source dir"
|
||||
} else {
|
||||
mydie "curl is not a daily source dir or checked out from CVS!"
|
||||
}
|
||||
}
|
||||
$build="build-$$";
|
||||
$buildlogname="buildlog-$$";
|
||||
$buildlog="$pwd/$buildlogname";
|
||||
|
||||
# remove any previous left-overs
|
||||
rmtree "build-*";
|
||||
rmtree "buildlog-*";
|
||||
|
||||
# this is to remove old build logs that ended up in the wrong dir
|
||||
foreach (glob("$CURLDIR/buildlog-*")) { unlink $_; }
|
||||
|
||||
# create a dir to build in
|
||||
mkdir $build;
|
||||
|
||||
if (-d $build) {
|
||||
logit "build dir $build was created fine";
|
||||
} else {
|
||||
mydie "failed to create dir $build";
|
||||
}
|
||||
|
||||
# get in the curl source tree root
|
||||
chdir $CURLDIR;
|
||||
|
||||
# Do the CVS thing, or not...
|
||||
if ($CVS) {
|
||||
|
||||
# this is a temporary fix to make things work again, remove later
|
||||
logit "remove ares/aclocal.m4";
|
||||
unlink "ares/aclocal.m4";
|
||||
|
||||
logit "update from CVS";
|
||||
my $cvsstat;
|
||||
|
||||
sub cvsup() {
|
||||
# update quietly to the latest CVS
|
||||
logit "run cvs up";
|
||||
system("cvs -Q up -dP 2>&1");
|
||||
|
||||
$cvsstat=$?;
|
||||
|
||||
# return !RETURNVALUE so that errors return 0 while goodness
|
||||
# returns 1
|
||||
return !$cvsstat;
|
||||
}
|
||||
|
||||
my $att=0;
|
||||
while (!cvsup()) {
|
||||
$att++;
|
||||
logit "failed CVS update attempt number $att.";
|
||||
if ($att > 10) {
|
||||
$cvsstat=111;
|
||||
last; # get out of the loop
|
||||
}
|
||||
sleep 5;
|
||||
}
|
||||
|
||||
if ($cvsstat != 0) {
|
||||
mydie "failed to update from CVS ($cvsstat), exiting";
|
||||
}
|
||||
|
||||
# remove possible left-overs from the past
|
||||
unlink "configure";
|
||||
unlink "autom4te.cache";
|
||||
|
||||
if ($gnulikebuild) {
|
||||
# generate the build files
|
||||
logit "invoke buildconf, but filter off the silly aclocal warnings";
|
||||
open(F, "./buildconf 2>&1 |") or die;
|
||||
open(LOG, ">$buildlog") or die;
|
||||
while (<F>) {
|
||||
next if /warning: underquoted definition of/;
|
||||
print;
|
||||
print LOG;
|
||||
}
|
||||
close(F);
|
||||
close(LOG);
|
||||
|
||||
if (grepfile("^buildconf: OK", $buildlog)) {
|
||||
logit "buildconf was successful";
|
||||
} else {
|
||||
mydie "buildconf was NOT successful";
|
||||
}
|
||||
} else {
|
||||
system("buildconf.bat");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($gnulikebuild) {
|
||||
if (-f "configure") {
|
||||
logit "configure created";
|
||||
} else {
|
||||
mydie "no configure created";
|
||||
}
|
||||
} else {
|
||||
logit "configure created (dummy message)"; # dummy message to feign success
|
||||
}
|
||||
|
||||
# change to build dir
|
||||
chdir "../$build";
|
||||
|
||||
if ($gnulikebuild) {
|
||||
# run configure script
|
||||
system("../$CURLDIR/configure $confopts 2>&1");
|
||||
|
||||
if (-f "lib/Makefile") {
|
||||
logit "configure seems to have finished fine";
|
||||
} else {
|
||||
mydie "configure didn't work";
|
||||
}
|
||||
} else {
|
||||
system("xcopy /s /q ..\\$CURLDIR .");
|
||||
}
|
||||
|
||||
logit "display lib/config.h";
|
||||
open(F, $gnulikebuild ? "lib/config.h" : "lib/config-win32.h") or die;
|
||||
while (<F>) {
|
||||
print if /^ *#/;
|
||||
}
|
||||
close(F);
|
||||
|
||||
logit "display src/config.h";
|
||||
open(F, $gnulikebuild ? "src/config.h" : "src/config-win32.h") or die;
|
||||
while (<F>) {
|
||||
print if /^ *#/;
|
||||
}
|
||||
close(F);
|
||||
|
||||
if (grepfile("define USE_ARES", $gnulikebuild ? "lib/config.h" : "lib/config-win32.h")) {
|
||||
logit "setup to build ares";
|
||||
|
||||
logit "build ares";
|
||||
chdir "ares";
|
||||
open(F, "make 2>&1 |") or die;
|
||||
while (<F>) {
|
||||
s/$pwd//g;
|
||||
print;
|
||||
}
|
||||
close(F);
|
||||
|
||||
if (-f "libcares.a") {
|
||||
logit "ares is now built successfully";
|
||||
} else {
|
||||
logit "ares build failed";
|
||||
}
|
||||
|
||||
# cd back to the curl build dir
|
||||
chdir "..";
|
||||
}
|
||||
|
||||
logit "run make";
|
||||
if ($gnulikebuild) {
|
||||
open(F, "make -i 2>&1 |") or die;
|
||||
while (<F>) {
|
||||
s/$pwd//g;
|
||||
print;
|
||||
}
|
||||
close(F);
|
||||
} else {
|
||||
open(F, "nmake -i vc|") or die;
|
||||
while (<F>) {
|
||||
s/$pwd//g;
|
||||
print;
|
||||
}
|
||||
close(F);
|
||||
}
|
||||
|
||||
my $exe = $gnulikebuild ? "curl" : "curl.exe";
|
||||
if (-f "src/$exe") {
|
||||
logit "src/curl was created fine ($exe)";
|
||||
} else {
|
||||
mydie "src/curl was not created ($exe)";
|
||||
}
|
||||
|
||||
logit "display $exe --version output";
|
||||
|
||||
system("./src/$exe --version");
|
||||
|
||||
if ($gnulikebuild) {
|
||||
logit "run make test-full";
|
||||
open(F, "make test-full 2>&1 |") or die;
|
||||
open(LOG, ">$buildlog") or die;
|
||||
while (<F>) {
|
||||
s/$pwd//g;
|
||||
print;
|
||||
print LOG;
|
||||
}
|
||||
close(F);
|
||||
close(LOG);
|
||||
|
||||
if (grepfile("^TEST", $buildlog)) {
|
||||
logit "tests were run";
|
||||
} else {
|
||||
mydie "test suite failure";
|
||||
}
|
||||
|
||||
if (grepfile("^TESTFAIL:", $buildlog)) {
|
||||
logit "the tests were not successful";
|
||||
} else {
|
||||
logit "the tests were successful!";
|
||||
}
|
||||
} else {
|
||||
print "TESTDONE: 1 tests out of 0 (dummy message)\n"; # dummy message to feign success
|
||||
}
|
||||
|
||||
# mydie to cleanup
|
||||
mydie "ending nicely";
|
Loading…
Reference in New Issue
Block a user