From: Dagfinn Ilmari Mannsåker Date: Mon, 28 Jul 2014 17:54:33 +0000 (+0100) Subject: Steal Travis-CI setup from DBIx::Class X-Git-Tag: 0.07041~30 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits%2FDBIx-Class-Schema-Loader.git;a=commitdiff_plain;h=b7254ae221e81d8b89d1b616f4f02a7ff0b2942e Steal Travis-CI setup from DBIx::Class --- diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ea82e32 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,264 @@ +# Some overall notes on how this works +# +# * We smoke using the system provided latest, and custom built "oddball perls" +# The reason for not having a blanket matrix is to conserve travis resources +# as a full DBIC depchain isn't cheap +# +# * Minimum perl officially supported by DBIC is 5.8.3. This *includes* the +# basic depchain. On failure either attempt to fix it or bring it to the +# attention of ribasushi. *DO NOT* disable 5.8 testing - it is here for a +# reason +# +# * The matrix is built from two main modes - CLEANTEST = [true|false]. +# - In the first case we test with minimal deps available, and skip everything +# listed in DBIC::OptDesps. The modules are installed with classic CPAN +# invocations and are *fully tested*. In other words we simulate what would +# happen if a user tried to install on a just-compiled virgin perl +# - Without CLEANTEST we bring the armada of RDBMS and install the maximum +# possible set of deps *without testing them*. This ensures we stay within +# a reasonable build-time and still run as many of our tests as possible +# +# * The perl builds and the DBIC tests run under NUMTHREADS number of threads. +# The testing of dependencies under CLEANTEST runs single-threaded, at least +# until we fix our entire dep-chain to safely pass under -j +# +# * The way .travis.yml is fed to the command controller is idiotic - it +# makes using multiline `bash -c` statements impossible. Therefore to +# aid readability (our travis logic is rather complex), the bulk of +# functionality is moved to scripts. More about the problem (and the +# WONTFIX "explanation") here: https://github.com/travis-ci/travis-ci/issues/497 +# + +# +# Smoke all branches except for blocked* and wip/* +# +# Additionally master does not smoke with bleadperl +# ( implemented in maint/travis-ci_scripts/10_before_install.bash ) +# +branches: + except: + - /^wip\// + - /^blocked/ + +x_disabled_notifications: + irc: + channels: + - "irc.perl.org#dbic-smoke" + template: + - "%{branch}#%{build_number} by %{author}: %{message} (%{build_url})" + on_success: change + on_failure: always + use_notice: true + + email: + recipients: + - ilmari@ilmari.org + # Temporary - if it proves to be too noisy, we'll shut it off + #- dbix-class-devel@lists.scsys.co.uk + on_success: change + on_failure: always + +# FIXME - This stuff is not yet available for free OSS accounts, sadpanda +# First paragrah on http://about.travis-ci.org/docs/user/caching/ +#cache: +# apt: true +# directories: +# - /var/cache/apt/archives + +language: perl + +perl: + - "5.18" + +env: + - CLEANTEST=false + - CLEANTEST=true + +x_disabled_matrix: + fast_finish: true + include: + # this particular perl is quite widespread + - perl: 5.8.8_thr_mb + env: + - CLEANTEST=true + - BREWOPTS="-Duseithreads -Dusemorebits" + - BREWVER=5.8.8 + + # so is this one (test a sane CPAN.pm) + - perl: 5.12.4_thr_mb + env: + - CLEANTEST=true + - BREWOPTS="-Duseithreads -Dusemorebits" + - BREWVER=5.12.4 + + # this is the perl suse ships + - perl: 5.10.0_thr_dbg + env: + - CLEANTEST=true + - BREWOPTS="-DDEBUGGING -Duseithreads" + - BREWVER=5.10.0 + + # CLEANTEST of minimum supported + - perl: 5.8.3_nt_mb + env: + - CLEANTEST=true + - BREWOPTS="-Dusemorebits" + - BREWVER=5.8.3 + + # Full Test of minimum supported with threads + - perl: 5.8.5_thr + env: + - CLEANTEST=false + - BREWOPTS="-Duseithreads" + - BREWVER=5.8.5 + - DBIC_TRACE_PROFILE=console + + # Full Test of minimum supported without threads + - perl: 5.8.3_nt + env: + - CLEANTEST=false + - BREWOPTS="" + - BREWVER=5.8.3 + - DBIC_TRACE_PROFILE=console_monochrome + + ### + # some permutations of tracing and envvar poisoning + + - perl: 5.16.2_thr_mb + env: + - CLEANTEST=false + - POISON_ENV=true + - DBIC_TRACE=1 + - DBIC_MULTICREATE_DEBUG=0 + - BREWOPTS="-Duseithreads -Dusemorebits" + - BREWVER=5.16.2 + + - perl: 5.18 + env: + - CLEANTEST=false + - POISON_ENV=true + - DBIC_TRACE_PROFILE=console + + - perl: 5.8 + env: + - CLEANTEST=true + - POISON_ENV=true + - DBIC_TRACE=1 + - DBIC_TRACE_PROFILE=console + + - perl: 5.18 + env: + - CLEANTEST=false + - POISON_ENV=true + - DBIC_TRACE=1 + - DBIC_TRACE_PROFILE=console_monochrome + - DBIC_MULTICREATE_DEBUG=0 + + ### + # Start of the allow_failures block + + # old threaded with blead CPAN + - perl: devcpan_5.8.7_thr + env: + - CLEANTEST=true + - BREWOPTS="-Duseithreads" + - BREWVER=5.8.7 + - DEVREL_DEPS=true + + # 5.10.0 threaded with blead CPAN + - perl: devcpan_5.10.0_thr_mb + env: + - CLEANTEST=true + - BREWOPTS="-Duseithreads -Dusemorebits" + - BREWVER=5.10.0 + - DEVREL_DEPS=true + + # 5.12.2 with blead CPAN + - perl: devcpan_5.12.2_thr + env: + - CLEANTEST=true + - BREWOPTS="-Duseithreads" + - BREWVER=5.12.2 + - DEVREL_DEPS=true + + # recentish threaded stable with blead CPAN + - perl: devcpan_5.18.2_thr_mb + env: + - CLEANTEST=false + - BREWOPTS="-Duseithreads -Dusemorebits" + - BREWVER=5.18.2 + - DEVREL_DEPS=true + + # bleadperl with stock CPAN, full depchain test + - perl: bleadperl + env: + - CLEANTEST=true + - BREWVER=blead + + # bleadperl with blead CPAN + - perl: devcpan_bleadperl_thr_mb + env: + - CLEANTEST=false + - BREWOPTS="-Duseithreads -Dusemorebits" + - BREWVER=blead + - DEVREL_DEPS=true + + + # which ones of the above can fail + allow_failures: + + # these run with various dev snapshots - allowed to fail + - perl: devcpan_5.8.7_thr + - perl: devcpan_5.10.0_thr_mb + - perl: devcpan_5.12.2_thr + - perl: devcpan_5.18.2_thr_mb + - perl: bleadperl + - perl: devcpan_bleadperl_thr_mb + + +# sourcing the files is *EXTREMELY* important - otherwise +# no envvars will survive + +# the entire run times out after 50 minutes, or after 5 minutes without +# console output + +before_install: + # Sets global envvars, downloads/configures debs based on CLEANTEST + # Sets extra DBICTEST_* envvars + # + - source maint/travis-ci_scripts/10_before_install.bash + +install: + # Build and switch to a custom perl if requested + # Configure the perl env, preinstall some generic toolchain parts + # + - source maint/travis-ci_scripts/20_install.bash + +before_script: + # Preinstall/install deps based on envvars/CLEANTEST + # + - source maint/travis-ci_scripts/30_before_script.bash + +script: + # Run actual tests + # + - source maint/travis-ci_scripts/40_script.bash + +after_success: + # Check if we can assemble a dist properly if not in CLEANTEST + # skipped for now + # - source maint/travis-ci_scripts/50_after_success.bash + +after_failure: + # No tasks yet + # + #- source maint/travis-ci_scripts/50_after_failure.bash + +after_script: + # No tasks yet + # + #- source maint/travis-ci_scripts/60_after_script.bash + + # if we do not unset this before we terminate the travis teardown will + # mark the entire job as failed + - set +e diff --git a/maint/travis-ci_scripts/10_before_install.bash b/maint/travis-ci_scripts/10_before_install.bash new file mode 100755 index 0000000..f861b0e --- /dev/null +++ b/maint/travis-ci_scripts/10_before_install.bash @@ -0,0 +1,188 @@ +#!/bin/bash + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +# Different boxes we run on may have different amount of hw threads +# Hence why we need to query +# Originally we used to read /sys/devices/system/cpu/online +# but it is not available these days (odd). Thus we fall to +# the alwas-present /proc/cpuinfo +# The oneliner is a tad convoluted - basicaly what we do is +# slurp the entire file and get the index off the last +# `processor : XX` line +export NUMTHREADS="$(( $(perl -0777 -n -e 'print (/ (?: .+ ^ processor \s+ : \s+ (\d+) ) (?! ^ processor ) /smx)' < /proc/cpuinfo) + 1 ))" + +export CACHE_DIR="/tmp/poormanscache" + +# install some common tools from APT, more below unless CLEANTEST +apt_install libapp-nopaste-perl tree apt-transport-https + +# FIXME - the debian package is oddly broken - uses a bin/env based shebang +# so nothing works under a brew. Fix here until #debian-perl patches it up +sudo /usr/bin/perl -p -i -e 's|#!/usr/bin/env perl|#!/usr/bin/perl|' $(which nopaste) + +if [[ "$CLEANTEST" != "true" ]]; then +### apt-get invocation - faster to grab everything at once + # + # FIXME these debconf lines should automate the firebird config but do not :((( + sudo bash -c 'echo -e "firebird2.5-super\tshared/firebird/enabled\tboolean\ttrue" | debconf-set-selections' + sudo bash -c 'echo -e "firebird2.5-super\tshared/firebird/sysdba_password/new_password\tpassword\t123" | debconf-set-selections' + + # add extra APT repo for Oracle + # (https is critical - apt-get update can't seem to follow the 302) + sudo bash -c 'echo -e "\ndeb [arch=i386] https://oss.oracle.com/debian unstable main non-free" >> /etc/apt/sources.list' + + run_or_err "Cloning poor man's cache from github" "git clone --depth=1 --branch=poor_mans_travis_cache https://github.com/ribasushi/travis_futzing.git $CACHE_DIR && $CACHE_DIR/reassemble" + + run_or_err "Priming up the APT cache with $(echo $(ls -d $CACHE_DIR/apt_cache/*.deb))" "sudo cp $CACHE_DIR/apt_cache/*.deb /var/cache/apt/archives" + + apt_install memcached firebird2.5-super firebird2.5-dev unixodbc-dev expect oracle-xe + +### config memcached + run_or_err "Starting memcached" "sudo /etc/init.d/memcached start" + export DBICTEST_MEMCACHED=127.0.0.1:11211 + +### config mysql + run_or_err "Creating MySQL TestDB" "mysql -e 'create database dbic_test;'" + export DBICTEST_MYSQL_DSN='dbi:mysql:database=dbic_test;host=127.0.0.1' + export DBICTEST_MYSQL_USER=root + +### config pg + run_or_err "Creating PostgreSQL TestDB" "psql -c 'create database dbic_test;' -U postgres" + export DBICTEST_PG_DSN='dbi:Pg:database=dbic_test;host=127.0.0.1' + export DBICTEST_PG_USER=postgres + +### conig firebird + # poor man's deb config + EXPECT_FB_SCRIPT=' + spawn dpkg-reconfigure --frontend=text firebird2.5-super + expect "Enable Firebird server?" + send "\177\177\177\177yes\r" + expect "Password for SYSDBA" + send "123\r" + sleep 1 + expect eof + ' + # creating testdb + # FIXME - this step still fails from time to time >:((( + # has to do with the FB reconfiguration I suppose + # for now if it fails twice - simply skip FB testing + for i in 1 2 ; do + + run_or_err "Re-configuring Firebird" " + sync + DEBIAN_FRONTEND=text sudo expect -c '$EXPECT_FB_SCRIPT' + sleep 1 + sync + # restart the server for good measure + sudo /etc/init.d/firebird2.5-super stop || true + sleep 1 + sync + sudo /etc/init.d/firebird2.5-super start + sleep 1 + sync + " + + if run_or_err "Creating Firebird TestDB" \ + "echo \"CREATE DATABASE '/var/lib/firebird/2.5/data/dbic_test.fdb';\" | sudo isql-fb -u sysdba -p 123" + then + + run_or_err "Fetching and building Firebird ODBC driver" ' + cd "$(mktemp -d)" + wget -qO- http://sourceforge.net/projects/firebird/files/firebird-ODBC-driver/2.0.2-Release/OdbcFb-Source-2.0.2.153.gz/download | tar -zx + cd Builds/Gcc.lin + perl -p -i -e "s|/usr/lib64|/usr/lib/x86_64-linux-gnu|g" ../makefile.environ + make -f makefile.linux + sudo make -f makefile.linux install + ' + + sudo bash -c 'cat >> /etc/odbcinst.ini' <<< " +[Firebird] +Description = InterBase/Firebird ODBC Driver +Driver = /usr/lib/x86_64-linux-gnu/libOdbcFb.so +Setup = /usr/lib/x86_64-linux-gnu/libOdbcFb.so +Threading = 1 +FileUsage = 1 +" + + export DBICTEST_FIREBIRD_DSN=dbi:Firebird:dbname=/var/lib/firebird/2.5/data/dbic_test.fdb + export DBICTEST_FIREBIRD_USER=SYSDBA + export DBICTEST_FIREBIRD_PASS=123 + + export DBICTEST_FIREBIRD_INTERBASE_DSN=dbi:InterBase:dbname=/var/lib/firebird/2.5/data/dbic_test.fdb + export DBICTEST_FIREBIRD_INTERBASE_USER=SYSDBA + export DBICTEST_FIREBIRD_INTERBASE_PASS=123 + + export DBICTEST_FIREBIRD_ODBC_DSN="dbi:ODBC:Driver=Firebird;Dbname=/var/lib/firebird/2.5/data/dbic_test.fdb" + export DBICTEST_FIREBIRD_ODBC_USER=SYSDBA + export DBICTEST_FIREBIRD_ODBC_PASS=123 + + break + fi + + done + +### config oracle + SRV_ORA_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server + + # without this some of the more zealous tests can exhaust the amount + # of listeners and oracle is too slow to spin extras up :( + sudo bash -c "echo -e '\nprocesses=150' >> $SRV_ORA_HOME/config/scripts/init.ora" + + EXPECT_ORA_SCRIPT=' + spawn /etc/init.d/oracle-xe configure + + sleep 1 + set send_slow {1 .005} + + expect "Specify the HTTP port that will be used for Oracle Application Express" + sleep 0.5 + send -s "8021\r" + + expect "Specify a port that will be used for the database listener" + sleep 0.5 + send -s "1521\r" + + expect "Specify a password to be used for database accounts" + sleep 0.5 + send -s "adminpass\r" + + expect "Confirm the password" + sleep 0.5 + send -s "adminpass\r" + + expect "Do you want Oracle Database 10g Express Edition to be started on boot" + sleep 0.5 + send -s "n\r" + + sleep 0.5 + expect "Configuring Database" + + sleep 1 + expect eof + wait + ' + + # if we do not redirect to some random file, but instead try to capture + # into a var the way run_or_err does - everything hangs + # FIXME: I couldn't figure it out after 3 hours of headdesking, + # would be nice to know the reason eventually + run_or_err "Configuring OracleXE" "sudo $(which expect) -c '$EXPECT_ORA_SCRIPT' &>/tmp/ora_configure_10.2.log" + + export DBICTEST_ORA_DSN=dbi:Oracle://localhost:1521/XE + export DBICTEST_ORA_USER=dbic_test + export DBICTEST_ORA_PASS=abc123456 + export DBICTEST_ORA_EXTRAUSER_DSN="$DBICTEST_ORA_DSN" + export DBICTEST_ORA_EXTRAUSER_USER=dbic_test_extra + export DBICTEST_ORA_EXTRAUSER_PASS=abc123456 + + run_or_err "Create Oracle users" "ORACLE_SID=XE ORACLE_HOME=$SRV_ORA_HOME $SRV_ORA_HOME/bin/sqlplus -L -S system/adminpass @/dev/stdin <<< ' + CREATE USER $DBICTEST_ORA_USER IDENTIFIED BY $DBICTEST_ORA_PASS; + GRANT connect,resource TO $DBICTEST_ORA_USER; + CREATE USER $DBICTEST_ORA_EXTRAUSER_USER IDENTIFIED BY $DBICTEST_ORA_EXTRAUSER_PASS; + GRANT connect,resource TO $DBICTEST_ORA_EXTRAUSER_USER; + '" + + export ORACLE_HOME="$CACHE_DIR/ora_instaclient/x86-64/oracle_instaclient_10.2.0.5.0" +fi diff --git a/maint/travis-ci_scripts/20_install.bash b/maint/travis-ci_scripts/20_install.bash new file mode 100755 index 0000000..79e75cd --- /dev/null +++ b/maint/travis-ci_scripts/20_install.bash @@ -0,0 +1,86 @@ +#!/bin/bash + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +CPAN_MIRROR=$(echo "$PERL_CPANM_OPT" | grep -oP -- '--mirror\s+\S+' | head -n 1 | cut -d ' ' -f 2) +if ! [[ "$CPAN_MIRROR" =~ "http://" ]] ; then + echo_err "Unable to extract primary cpan mirror from PERL_CPANM_OPT - something is wrong" + echo_err "PERL_CPANM_OPT: $PERL_CPANM_OPT" + CPAN_MIRROR="https://cpan.metacpan.org/" + PERL_CPANM_OPT="$PERL_CPANM_OPT --mirror $CPAN_MIRROR" + echo_err "Using $CPAN_MIRROR for the time being" +fi + +export PERL_MM_USE_DEFAULT=1 PERL_MM_NONINTERACTIVE=1 PERL_AUTOINSTALL_PREFER_CPAN=1 PERLBREW_CPAN_MIRROR="$CPAN_MIRROR" HARNESS_TIMER=1 MAKEFLAGS="-j$NUMTHREADS" + +# try CPAN's latest offering if requested +if [[ "$DEVREL_DEPS" == "true" ]] ; then + + PERL_CPANM_OPT="$PERL_CPANM_OPT --dev" + + # FIXME inline-upgrade cpanm, work around https://github.com/travis-ci/travis-ci/issues/1477 + cpanm_loc="$(which cpanm)" + run_or_err "Upgrading cpanm ($cpanm_loc) to latest stable" \ + "wget -q -O $cpanm_loc cpanmin.us && chmod a+x $cpanm_loc" +fi + +# Fixup CPANM_OPT to behave more like a traditional cpan client +export PERL_CPANM_OPT="--verbose --no-interactive --no-man-pages $( echo $PERL_CPANM_OPT | sed 's/--skip-satisfied//' )" + +if [[ -n "$BREWVER" ]] ; then + # since perl 5.14 a perl can safely be built concurrently with -j$large + # (according to brute force testing and my power bill) + if [[ "$BREWVER" == "blead" ]] || perl -Mversion -e "exit !!(version->new(q($BREWVER)) < 5.014)" ; then + perlbrew_jopt="$NUMTHREADS" + fi + + run_or_err "Compiling/installing Perl $BREWVER (without testing, using ${perlbrew_jopt:-1} threads, may take up to 5 minutes)" \ + "perlbrew install --as $BREWVER --notest --noman --verbose $BREWOPTS -j${perlbrew_jopt:-1} $BREWVER" + + # can not do 'perlbrew uss' in the run_or_err subshell above, or a $() + # furthermore `perlbrew use` returns 0 regardless of whether the perl is + # found (won't be there unless compilation suceeded, wich *ALSO* returns 0) + perlbrew use $BREWVER + + if [[ "$( perlbrew use | grep -oP '(?<=Currently using ).+' )" != "$BREWVER" ]] ; then + echo_err "Unable to switch to $BREWVER - compilation failed...?" + echo_err "$LASTOUT" + exit 1 + fi + +# no brewver - this means a travis perl, which means we want to clean up +# the presently installed libs +# Idea stolen from +# https://github.com/kentfredric/Dist-Zilla-Plugin-Prereqs-MatchInstalled-All/blob/master/maint-travis-ci/sterilize_env.pl +elif [[ "$CLEANTEST" == "true" ]] && [[ "$POISON_ENV" != "true" ]] ; then + + echo_err "$(tstamp) Cleaning precompiled Travis-Perl" + perl -MConfig -MFile::Find -e ' + my $sitedirs = { + map { $Config{$_} => 1 } + grep { $_ =~ /site(lib|arch)exp$/ } + keys %Config + }; + find({ bydepth => 1, no_chdir => 1, follow_fast => 1, wanted => sub { + ! $sitedirs->{$_} and ( -d _ ? rmdir : unlink ) + } }, keys %$sitedirs ) + ' + + echo_err "Post-cleanup contents of sitelib of the pre-compiled Travis-Perl $TRAVIS_PERL_VERSION:" + echo_err "$(tree $(perl -MConfig -e 'print $Config{sitelib_stem}'))" + echo_err +fi + +# configure CPAN.pm - older versions go into an endless loop +# when trying to autoconf themselves +CPAN_CFG_SCRIPT=" + require CPAN; + require CPAN::FirstTime; + *CPAN::FirstTime::conf_sites = sub {}; + CPAN::Config->load; + \$CPAN::Config->{urllist} = [qw{ $CPAN_MIRROR }]; + \$CPAN::Config->{halt_on_failure} = 1; + CPAN::Config->commit; +" +run_or_err "Configuring CPAN.pm" "perl -e '$CPAN_CFG_SCRIPT'" diff --git a/maint/travis-ci_scripts/30_before_script.bash b/maint/travis-ci_scripts/30_before_script.bash new file mode 100755 index 0000000..b920a1d --- /dev/null +++ b/maint/travis-ci_scripts/30_before_script.bash @@ -0,0 +1,269 @@ +#!/bin/bash + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +# poison the environment +if [[ "$POISON_ENV" = "true" ]] ; then + + # in addition to making sure tests do not rely on implicid order of + # returned results, look through lib, find all mentioned ENVvars and + # set them to true and see if anything explodes + for var in \ + DBICTEST_SQLITE_REVERSE_DEFAULT_ORDER \ + $(grep -P '\$ENV\{' -r lib/ --exclude-dir Optional | grep -oP '\bDBIC\w+' | sort -u | grep -v DBIC_TRACE) + do + if [[ -z "${!var}" ]] ; then + export $var=1 + echo "POISON_ENV: setting $var to 1" + fi + done + + # bogus nonexisting DBI_* + export DBI_DSN="dbi:ODBC:server=NonexistentServerAddress" + export DBI_DRIVER="ADO" + + + # emulate a local::lib-like env + # trick cpanm into executing true as shell - we just need the find+unpack + run_or_err "Downloading latest stable DBIC from CPAN" \ + "SHELL=/bin/true cpanm --look DBIx::Class::Schema::Loader" + + export PERL5LIB="$( ls -d ~/.cpanm/latest-build/DBIx-Class-Schema-Loader-*/lib | tail -n1 ):$PERL5LIB" + + # perldoc -l searches $(pwd)/lib in addition to PERL5LIB etc, hence the cd / + echo_err "Latest stable DBIC (without deps) locatable via \$PERL5LIB at $(cd / && perldoc -l DBIx::Class::Schema::Loader)" + + # FIXME - this is a kludge in place of proper MDV testing. For the time + # being simply use the minimum versions of our DBI/DBDstack, to avoid + # fuckups like 0.08260 (went unnoticed for 5 months) + # + # use url-spec for DBI due to https://github.com/miyagawa/cpanminus/issues/328 + if perl -M5.013003 -e1 &>/dev/null ; then + # earlier DBI will not compile without PERL_POLLUTE which was gone in 5.14 + parallel_installdeps_notest T/TI/TIMB/DBI-1.614.tar.gz + else + parallel_installdeps_notest T/TI/TIMB/DBI-1.57.tar.gz + fi + + # Test both minimum DBD::SQLite and minimum BigInt SQLite + if [[ "$CLEANTEST" = "true" ]]; then + parallel_installdeps_notest DBD::SQLite@1.37 + else + parallel_installdeps_notest DBD::SQLite@1.29 + fi + +fi + +if [[ "$CLEANTEST" = "true" ]]; then + # get the last inc/ off cpan - we will get rid of MI + # soon enough, but till then this will do + # the point is to have a *really* clean perl (the ones + # we build are guaranteed to be clean, without side + # effects from travis preinstalls) + + # trick cpanm into executing true as shell - we just need the find+unpack + [[ -d ~/.cpanm/latest-build/DBIx-Class-*/inc ]] || run_or_err "Downloading latest stable DBIC inc/ from CPAN" \ + "SHELL=/bin/true cpanm --look DBIx::Class::Schema::Loader" + + mv ~/.cpanm/latest-build/DBIx-Class-Schema-Loader-*/inc . + + # The first CPAN which is somewhat sane is around 1.94_56 (perl 5.12) + # The problem is that the first sane version also brings a *lot* of + # deps with it, notably things like YAML and HTTP::Tiny + # The goal of CLEANTEST is to have as little extra stuff installed as + # possible, mainly to catch "but X is perl core" mistakes + # So instead we still use our stock (possibly old) CPAN, and add some + # handholding + + if [[ "$DEVREL_DEPS" == "true" ]] ; then + # We are not "quite ready" for SQLA 1.99, do not consider it + # + installdeps 'SQL::Abstract~<1.99' + + elif ! CPAN_is_sane ; then + # no configure_requires - we will need the usual suspects anyway + # without pre-installing these in one pass things like extract_prereqs won't work + installdeps ExtUtils::MakeMaker ExtUtils::CBuilder Module::Build + + fi + +else + # we will be running all dbic tests - preinstall lots of stuff, run basic tests + # using SQLT and set up whatever databases necessary + export DBICTEST_SQLT_DEPLOY=1 + + # do the preinstall in several passes to minimize amount of cross-deps installing + # multiple times, and to avoid module re-architecture breaking another install + # (e.g. once Carp is upgraded there's no more Carp::Heavy, + # while a File::Path upgrade may cause a parallel EUMM run to fail) + # + parallel_installdeps_notest ExtUtils::MakeMaker + parallel_installdeps_notest File::Path + parallel_installdeps_notest Carp + parallel_installdeps_notest Module::Build + parallel_installdeps_notest File::Spec Data::Dumper Module::Runtime + parallel_installdeps_notest Test::Exception Encode::Locale Test::Fatal + parallel_installdeps_notest Test::Warn B::Hooks::EndOfScope Test::Differences HTTP::Status + parallel_installdeps_notest Test::Pod::Coverage Test::EOL Devel::GlobalDestruction Sub::Name MRO::Compat Class::XSAccessor URI::Escape HTML::Entities + parallel_installdeps_notest YAML LWP Class::Trigger JSON::XS DateTime::Format::Builder Class::Accessor::Grouped Package::Variant + parallel_installdeps_notest SQL::Abstract Moose Module::Install JSON SQL::Translator File::Which + + if [[ -n "$DBICTEST_FIREBIRD_INTERBASE_DSN" ]] ; then + # the official version is very much outdated and does not compile on 5.14+ + # use this rather updated source tree (needs to go to PAUSE): + # https://github.com/pilcrow/perl-dbd-interbase + parallel_installdeps_notest git://github.com/dbsrgits/perl-dbd-interbase.git + fi + +fi + +# generate the makefile which will have different deps depending on +# the runmode and envvars set above +run_or_err "Configure on current branch" "perl Makefile.PL" + +# install (remaining) dependencies, sometimes with a gentle push +if [[ "$CLEANTEST" = "true" ]]; then + # we may need to prepend some stuff to that list + HARD_DEPS="$(echo $(make listdeps))" + +##### TEMPORARY WORKAROUNDS needed in case we will be using CPAN.pm + if [[ "$DEVREL_DEPS" != "true" ]] && ! CPAN_is_sane ; then + # combat dzillirium on harness-wide level, otherwise breakage happens weekly + echo_err "$(tstamp) Ancient CPAN.pm: engaging TAP::Harness::IgnoreNonessentialDzilAutogeneratedTests during dep install" + perl -MTAP::Harness\ 3.18 -e1 &>/dev/null || run_or_err "Upgrading TAP::Harness for HARNESS_SUBCLASS support" "cpan TAP::Harness" + export PERL5LIB="$(pwd)/maint/travis-ci_scripts/lib:$PERL5LIB" + export HARNESS_SUBCLASS="TAP::Harness::IgnoreNonessentialDzilAutogeneratedTests" + # sanity check, T::H does not report sensible errors when the subclass fails to load + perl -MTAP::Harness::IgnoreNonessentialDzilAutogeneratedTests -e1 + + # DBD::SQLite reasonably wants DBI at config time + perl -MDBI -e1 &>/dev/null || HARD_DEPS="DBI $HARD_DEPS" + + # this is a fucked CPAN - won't understand configure_requires of + # various pieces we may run into + # FIXME - need to get these off metacpan or something instead + HARD_DEPS="ExtUtils::Depends B::Hooks::OP::Check $HARD_DEPS" + + # FIXME + # parent is temporary due to Carp https://rt.cpan.org/Ticket/Display.html?id=88494 + HARD_DEPS="parent $HARD_DEPS" + + if CPAN_supports_BUILDPL ; then + # We will invoke a posibly MBT based BUILD-file, but we do not support + # configure requires. So we not only need to install MBT but its prereqs + # FIXME This is madness + HARD_DEPS="$(extract_prereqs Module::Build::Tiny) Module::Build::Tiny $HARD_DEPS" + else + # FIXME + # work around Params::Validate not having a Makefile.PL so really old + # toolchains can not figure out what the prereqs are ;( + # Need to do more research before filing a bug requesting Makefile inclusion + HARD_DEPS="$(extract_prereqs Params::Validate) $HARD_DEPS" + fi + fi +##### END TEMPORARY WORKAROUNDS + + installdeps $HARD_DEPS + +### FIXME in case we set it earlier in a workaround + if [[ -n "$HARNESS_SUBCLASS" ]] ; then + + INSTALLDEPS_SKIPPED_TESTLIST=$(perl -0777 -e ' +my $curmod_re = qr{ +^ + (?: + \QBuilding and testing\E + | + [\x20\t]* CPAN\.pm: [^\n]*? (?i:build)\S* + ) + + [\x20\t]+ (\S+) +$}mx; + +my $curskip_re = qr{^ === \x20 \QSkipping nonessential autogenerated tests: \E([^\n]+) }mx; + +my (undef, @chunks) = (split qr/$curmod_re/, <>); +while (@chunks) { + my ($mod, $log) = splice @chunks, 0, 2; + print "!!! Skipped nonessential tests while installing $mod:\n\t$1\n" + if $log =~ $curskip_re; +} +' <<< "$LASTOUT") + + if [[ -n "$INSTALLDEPS_SKIPPED_TESTLIST" ]] ; then + POSTMORTEM="$POSTMORTEM$( + echo + echo "The following non-essential tests were skipped during deps installation" + echo "=============================================================" + echo "$INSTALLDEPS_SKIPPED_TESTLIST" + echo "=============================================================" + echo + )" + fi + + unset HARNESS_SUBCLASS + fi + +else + + # listalldeps is deliberate - will upgrade everything it can find + # we exclude SQLA specifically, since we do not want to pull + # in 1.99_xx on bleadcpan runs + deplist="$(make listalldeps | grep -vP '^(SQL::Abstract)$')" + + # assume MDV on POISON_ENV, do not touch DBI/SQLite + if [[ "$POISON_ENV" = "true" ]] ; then + deplist="$(grep -vP '^(DBI|DBD::SQLite)$' <<< "$deplist")" + fi + + parallel_installdeps_notest "$deplist" +fi + +echo_err "$(tstamp) Dependency installation finished" +# this will display list of available versions +perl Makefile.PL + +# make sure we got everything we need +if [[ -n "$(make listdeps)" ]] ; then + echo_err "$(tstamp) Not all deps installed - something went wrong :(" + sleep 1 # without this the echo below confuses the console listener >.< + CPAN_is_sane || echo_err -e "Outdated CPAN.pm used - full installdep log follows\n$INSTALLDEPS_OUT\n\nSearch for 'NOT OK' in the text above\n\nDeps still missing:" + sleep 3 # without this the above echo confuses the console listener >.< + make listdeps + exit 1 +fi + +# check that our MDV somewhat works +if [[ "$POISON_ENV" = "true" ]] && ( perl -MDBD::SQLite\ 1.38 -e1 || perl -MDBI\ 1.615 -e1 ) &>/dev/null ; then + echo_err "Something went wrong - higher versions of DBI and/or DBD::SQLite than we expected" + exit 1 +fi + + +# announce what are we running +echo_err " +===================== DEPENDENCY CONFIGURATION COMPLETE ===================== +$(tstamp) Configuration phase seems to have taken $(date -ud "@$SECONDS" '+%H:%M:%S') (@$SECONDS) + += CPUinfo +$(perl -0777 -p -e 's/.+\n\n(?!\z)//s' < /proc/cpuinfo) + += Meminfo +$(free -m -t) + += Kernel info +$(uname -a) + += Network Configuration +$(ip addr) + += Network Sockets Status +$(sudo netstat -an46p | grep -Pv '\s(CLOSING|(FIN|TIME|CLOSE)_WAIT.?|LAST_ACK)\s') + += Environment +$(env | grep -P 'TEST|HARNESS|MAKE|TRAVIS|PERL|DBIC' | LC_ALL=C sort | cat -v) + += Perl in use +$(perl -V) +=============================================================================" diff --git a/maint/travis-ci_scripts/40_script.bash b/maint/travis-ci_scripts/40_script.bash new file mode 100755 index 0000000..8cb9048 --- /dev/null +++ b/maint/travis-ci_scripts/40_script.bash @@ -0,0 +1,52 @@ +#!/bin/bash + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +run_harness_tests() { + local -x HARNESS_OPTIONS=c:j$NUMTHREADS + make test 2> >(tee "$TEST_STDERR_LOG") +} + +TEST_T0=$SECONDS +if [[ "$CLEANTEST" = "true" ]] ; then + echo_err "$(tstamp) Running tests with plain \`make test\`" + run_or_err "Prepare blib" "make pure_all" + run_harness_tests +else + PROVECMD="prove -lrswj$NUMTHREADS xt t" + + # FIXME - temporary, until Package::Stash is fixed + if perl -M5.010 -e 1 &>/dev/null ; then + PROVECMD="$PROVECMD -T" + fi + + echo_err "$(tstamp) running tests with \`$PROVECMD\`" + $PROVECMD 2> >(tee "$TEST_STDERR_LOG") +fi +TEST_T1=$SECONDS + +if [[ -z "$DBICTRACE" ]] && [[ -z "$POISON_ENV" ]] && [[ -s "$TEST_STDERR_LOG" ]] ; then + STDERR_LOG_SIZE=$(wc -l < "$TEST_STDERR_LOG") + + # prepend STDERR log + POSTMORTEM="$( + echo + echo "Test run produced $STDERR_LOG_SIZE lines of output on STDERR:" + echo "=============================================================" + cat "$TEST_STDERR_LOG" + echo "=============================================================" + echo "End of test run STDERR output ($STDERR_LOG_SIZE lines)" + echo + echo + )$POSTMORTEM" +fi + +echo +echo "${POSTMORTEM:- \o/ No notable smoke run issues \o/ }" +echo +echo "$(tstamp) Testing took a total of $(( $TEST_T1 - $TEST_T0 ))s" +if [[ -n "$INSTALLDEPS_OUT" ]] ; then + echo "$(tstamp) Full dep install log at $(/usr/bin/nopaste -q -s Shadowcat -d DepInstall <<< "$INSTALLDEPS_OUT")" +fi +echo diff --git a/maint/travis-ci_scripts/50_after_failure.bash b/maint/travis-ci_scripts/50_after_failure.bash new file mode 100755 index 0000000..4935763 --- /dev/null +++ b/maint/travis-ci_scripts/50_after_failure.bash @@ -0,0 +1,11 @@ +#!/bin/bash + +# !!! Nothing here will be executed !!! +# The source-line calling this script is commented out in .travis.yml + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +echo_err "Nothing to do" + +return 0 diff --git a/maint/travis-ci_scripts/50_after_success.bash b/maint/travis-ci_scripts/50_after_success.bash new file mode 100755 index 0000000..c8d2bac --- /dev/null +++ b/maint/travis-ci_scripts/50_after_success.bash @@ -0,0 +1,15 @@ +#!/bin/bash + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +if [[ "$CLEANTEST" != "true" ]] ; then + parallel_installdeps_notest $(perl -Ilib -MDBIx::Class -e 'print join " ", keys %{DBIx::Class::Optional::Dependencies->req_list_for("dist_dir")}') + run_or_err "Attempt to build a dist with all prereqs present" "make dist" + echo "Contents of the resulting dist tarball:" + echo "===========================================" + tar -vzxf DBIx-Class-*.tar.gz + echo "===========================================" + run_or_err 'Attempt to configure from re-extracted distdir' \ + 'bash -c "cd \$(find DBIx-Class-* -maxdepth 0 -type d | head -n 1) && perl Makefile.PL"' +fi diff --git a/maint/travis-ci_scripts/60_after_script.bash b/maint/travis-ci_scripts/60_after_script.bash new file mode 100755 index 0000000..4935763 --- /dev/null +++ b/maint/travis-ci_scripts/60_after_script.bash @@ -0,0 +1,11 @@ +#!/bin/bash + +# !!! Nothing here will be executed !!! +# The source-line calling this script is commented out in .travis.yml + +source maint/travis-ci_scripts/common.bash +if [[ -n "$SHORT_CIRCUIT_SMOKE" ]] ; then return ; fi + +echo_err "Nothing to do" + +return 0 diff --git a/maint/travis-ci_scripts/common.bash b/maint/travis-ci_scripts/common.bash new file mode 100755 index 0000000..da6ce33 --- /dev/null +++ b/maint/travis-ci_scripts/common.bash @@ -0,0 +1,189 @@ +#!/bin/bash + +set -e + +TEST_STDERR_LOG=/tmp/dbictest.stderr +TIMEOUT_CMD="/usr/bin/timeout --kill-after=9.5m --signal=TERM 9m" + +echo_err() { echo "$@" 1>&2 ; } + +if [[ "$TRAVIS" != "true" ]] ; then + echo_err "Running this script makes no sense outside of travis-ci" + exit 1 +fi + +tstamp() { echo -n "[$(date '+%H:%M:%S')]" ; } + +run_or_err() { + echo_err -n "$(tstamp) $1 ... " + + LASTCMD="$2" + LASTEXIT=0 + START_TIME=$SECONDS + + PRMETER_PIDFILE="$(tempfile)_$SECONDS" + # the double bash is to hide the job control messages + bash -c "bash -c 'echo \$\$ >> $PRMETER_PIDFILE; while true; do sleep 10; echo -n \"\${SECONDS}s ... \"; done' &" + + LASTOUT=$( eval "$2" 2>&1 ) || LASTEXIT=$? + + # stop progress meter + for p in $(cat "$PRMETER_PIDFILE"); do kill $p ; done + + DELTA_TIME=$(( $SECONDS - $START_TIME )) + + if [[ "$LASTEXIT" != "0" ]] ; then + if [[ -z "$3" ]] ; then + echo_err "FAILED !!! (after ${DELTA_TIME}s)" + echo_err "Command executed:" + echo_err "$LASTCMD" + echo_err "STDOUT+STDERR:" + echo_err "$LASTOUT" + fi + + return $LASTEXIT + else + echo_err "done (took ${DELTA_TIME}s)" + fi +} + +apt_install() { + # flatten + pkgs="$@" + + # Need to do this at every step, the sources list may very well have changed + run_or_err "Updating APT available package list" "sudo apt-get update" + + run_or_err "Installing Debian APT packages: $pkgs" "sudo apt-get install --allow-unauthenticated --no-install-recommends -y $pkgs" +} + +extract_prereqs() { + # once --verbose is set, --no-verbose can't disable it + # do this by hand + local PERL_CPANM_OPT="$( echo $PERL_CPANM_OPT | sed 's/--verbose\s*//' )" + + # hack-hack-hack + LASTEXIT=0 + COMBINED_OUT="$( { stdout="$(cpanm --quiet --scandeps --format tree "$@")" ; } 2>&1; echo "!!!STDERRSTDOUTSEPARATOR!!!$stdout")" \ + || LASTEXIT=$? + + OUT=${COMBINED_OUT#*!!!STDERRSTDOUTSEPARATOR!!!} + ERR=${COMBINED_OUT%!!!STDERRSTDOUTSEPARATOR!!!*} + + if [[ "$LASTEXIT" != "0" ]] ; then + echo_err "Error occured (exit code $LASTEXIT) retrieving dependencies of $@:" + echo_err "$ERR" + echo_err "$OUT" + exit 1 + fi + + # throw away warnings, up-to-date diag, ascii art, convert to modnames + PQ=$(perl -p -e ' + s/^.*?is up to date.*$//; + s/^\!.*//; + s/^[^a-z]+//i; + s/\-[^\-]+$/ /; # strip version part + s/\-/::/g + ' <<< "$OUT") + + # throw away what was in $@ + for m in "$@" ; do + PQ=$( perl -p -e 's/(?:\s|^)\Q'"$m"'\E(?:\s|$)/ /mg' <<< "$PQ") + done + + # RV + echo "$PQ" +} + +parallel_installdeps_notest() { + if [[ -z "$@" ]] ; then return; fi + + # one module spec per line + MODLIST="$(printf '%s\n' "$@")" + + # We want to trap the output of each process and serially append them to + # each other as opposed to just dumping a jumbled up mass-log that would + # need careful unpicking by a human + # + # While cpanm does maintain individual buildlogs in more recent versions, + # we are not terribly interested in trying to figure out which log is which + # dist. The verbose-output + trap STDIO technique is vastly superior in this + # particular case + # + # Explanation of inline args: + # + # [09:38] you need a $0 + # [09:38] hence the _ + # [09:38] bash -c '...' _ + # [09:39] I like -- because it's the magic that gnu getopts uses for somethign else + # [09:39] or --, yes + # [09:39] ribasushi: you could put "giant space monkey penises" instead of "--" and it would work just as well + # + run_or_err "Installing (without testing) $(echo $MODLIST)" \ + "echo \\ +\"$MODLIST\" \\ + | xargs -d '\\n' -n 1 -P $NUMTHREADS bash -c \\ + 'OUT=\$($TIMEOUT_CMD cpanm --notest \"\$@\" 2>&1 ) || (LASTEXIT=\$?; echo \"\$OUT\"; exit \$LASTEXIT)' \\ + 'giant space monkey penises' + " +} + +installdeps() { + if [[ -z "$@" ]] ; then return; fi + + MODLIST=$(printf "%q " "$@" | perl -pe 's/^\s+|\s+$//g') + + local -x HARNESS_OPTIONS + + HARNESS_OPTIONS="j$NUMTHREADS" + + if ! run_or_err "Attempting install of $# modules under parallel ($HARNESS_OPTIONS) testing ($MODLIST)" "_dep_inst_with_test $MODLIST" quiet_fail ; then + local errlog="failed after ${DELTA_TIME}s Exit:$LASTEXIT Log:$(/usr/bin/nopaste -q -s Shadowcat -d "Parallel testfail" <<< "$LASTOUT")" + echo "$errlog" + + POSTMORTEM="$POSTMORTEM$( + echo + echo "Depinstall of $MODLIST under $HARNESS_OPTIONS parallel testing $errlog" + )" + + HARNESS_OPTIONS="" + run_or_err "Retrying same $# modules without parallel testing" "_dep_inst_with_test $MODLIST" + fi + + INSTALLDEPS_OUT="${INSTALLDEPS_OUT}${LASTOUT}" +} + +_dep_inst_with_test() { + if [[ "$DEVREL_DEPS" == "true" ]] ; then + # --dev is already part of CPANM_OPT + LASTCMD="$TIMEOUT_CMD cpanm $@" + $LASTCMD 2>&1 + else + LASTCMD="$TIMEOUT_CMD cpan $@" + $LASTCMD 2>&1 + + # older perls do not have a CPAN which can exit with error on failed install + for m in "$@"; do + if ! perl -e ' + +my $mod = ( + $ARGV[0] =~ m{ \/ .*? ([^\/]+) $ }x + ? do { my @p = split (/\-/, $1); pop @p; join "::", @p } + : $ARGV[0] +); + +$mod = q{List::Util} if $mod eq q{Scalar::List::Utils}; + +eval qq{require($mod)} or ( print $@ and exit 1) + + ' "$m" 2> /dev/null ; then + echo -e "$m installation seems to have failed" + return 1 + fi + done + fi +} + +CPAN_is_sane() { perl -MCPAN\ 1.94_56 -e 1 &>/dev/null ; } + +CPAN_supports_BUILDPL() { perl -MCPAN\ 1.9205 -e1 &>/dev/null; } diff --git a/maint/travis-ci_scripts/lib/TAP/Harness/IgnoreNonessentialDzilAutogeneratedTests.pm b/maint/travis-ci_scripts/lib/TAP/Harness/IgnoreNonessentialDzilAutogeneratedTests.pm new file mode 100644 index 0000000..7f01716 --- /dev/null +++ b/maint/travis-ci_scripts/lib/TAP/Harness/IgnoreNonessentialDzilAutogeneratedTests.pm @@ -0,0 +1,93 @@ +package TAP::Harness::IgnoreNonessentialDzilAutogeneratedTests; + +use warnings; +use strict; + +use base 'TAP::Harness'; +use File::Spec (); +use IPC::Open3 'open3'; +use File::Temp (); +use List::Util 'first'; + +my $frivolous_test_map = { +# Test based on the extremely dep-heavy, *prone to failures* Test::CheckDeps +# + qr|^t/00-check-deps.t$| => [ + qr|^\Q# this test was generated with Dist::Zilla::Plugin::Test::CheckDeps|m, + + # older non-annotated versions + qr|use \s+ Test::CheckDeps .*? ^\Qcheck_dependencies('suggests')\E .*? \QBAIL_OUT("Missing dependencies") if !Test::More->builder->is_passing|smx, + ], + +# "does everything compile" tests are useless by definition - this is what the +# rest of the test suite is for +# + qr|^t/00-compile.t$| => [ + qr|^\Q# this test was generated with Dist::Zilla::Plugin::Test::Compile|m, + ], + +# The report prereq test managed to become fatal as well +# + qr|^t/00-report-prereqs.t$| => [ + qr|^\Q# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs|m, + ], + +# Just future-proof the thing, catch anything autogened by dzil for a bit + qr|^t/00-| => [ + qr|^\Q# This test was generated by Dist::Zilla::|m, + ] +}; + +sub aggregate_tests { + my ($self, $aggregate, @all_tests) = @_; + + my ($run_tests, $skip_tests); + + TESTFILE: + for (@all_tests) { + my $fn = File::Spec::Unix->catpath( File::Spec->splitpath( $_ ) ); + + if (my $REs = $frivolous_test_map->{ + (first { $fn =~ $_ } keys %$frivolous_test_map ) || '' + }) { + my $slurptest = do { local (@ARGV, $/) = $fn; <> }; + $slurptest =~ $_ and push @$skip_tests, $fn and next TESTFILE for @$REs; + } + + push @$run_tests, $fn; + } + + if ($skip_tests) { + + for my $tfn (@$skip_tests) { + + (my $tfn_flattened = $tfn) =~ s|/|_|g; + + my $log_file = File::Temp->new( + DIR => '/tmp', + TEMPLATE => "AutoGenTest_${tfn_flattened}_XXXXX", + SUFFIX => '.txt', + ); + + # FIXME I have no idea why the fileno dance is necessary - will investigate later + # All I know is that if I pass in just $log_file - open3 ignores it >:( + my $pid = open3(undef, '>&'.fileno($log_file), undef, $^X, qw(-I blib -I arch/lib), $tfn ); + waitpid ($pid, 0); + my $ex = $?; + + if ($ex) { + # use qx as opposed to another open3 until I figure out the above + close $log_file or die "Unable to close $log_file: $!"; + chomp( my $url = `/usr/bin/nopaste -q -s Shadowcat -d $log_file < $log_file` ); + + $tfn .= "[would NOT have passed: $ex / $url]"; + } + } + + print STDERR "=== Skipping nonessential autogenerated tests: @$skip_tests\n"; + } + + return $self->SUPER::aggregate_tests($aggregate, @$run_tests); +} + +1;