diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2004-03-23 16:07:02 +0000 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2004-03-23 16:07:02 +0000 | 
| commit | e992aa6a54f87f33eafd124cf09f0f70d7d24928 (patch) | |
| tree | f13eaabe4ef6c7ac981b61a25d230c7e1c5c397e /tests | |
| parent | 2cf218610e992d0b174b081b1b791337f26d6719 (diff) | |
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.
Diffstat (limited to 'tests')
| -rwxr-xr-x | tests/testcurl.pl | 409 | 
1 files changed, 409 insertions, 0 deletions
| diff --git a/tests/testcurl.pl b/tests/testcurl.pl new file mode 100755 index 000000000..bc2b9069b --- /dev/null +++ b/tests/testcurl.pl @@ -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"; | 
