Skip to content

Commit

Permalink
Install PHP5.2/5.3 on trusty for unit tests
Browse files Browse the repository at this point in the history
Stolen from WordPress/gutenberg#2049.
Intended to compensate for Travis removing support for
PHP 5.2/5.3.

Uses the SWITCH_TO_PHP environment variable to request older versions of
PHP.

PHP5.3 and PHP5.2 are installed for the user, using phpbrew.

The correct version of PHPUnit is also installed.

~/.phpbrew contains the built PHP versions, and this is cached.
  • Loading branch information
jtsternberg committed Sep 18, 2017
1 parent 2f4d6f4 commit 7b4b416
Show file tree
Hide file tree
Showing 5 changed files with 285 additions and 33 deletions.
89 changes: 56 additions & 33 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,52 +1,75 @@
language: php
sudo: false
dist: trusty
php:
- 5.3
dist: precise
- 5.4
- 5.5
- 5.6
- 7.0
- nightly
env:
- WP_VERSION=latest WP_MULTISITE=0
- WP_VERSION=latest WP_MULTISITE=1
- WP_VERSION=3.8 WP_MULTISITE=0
- WP_VERSION=3.8 WP_MULTISITE=1

matrix:
include:
- php: nightly
env: WP_VERSION=latest
- php: 7.1
env: WP_VERSION=latest
- php: 5.6
env:
- WP_VERSION=latest
- WP_VERSION=3.8
- php: 7.1
env:
- WP_VERSION=latest SWITCH_TO_PHP=5.3
- WP_VERSION=3.8
- php: 7.1
env:
- WP_VERSION=latest SWITCH_TO_PHP=5.2
- WP_VERSION=3.8
- php: 5.4
env:
- WP_VERSION=latest
- WP_VERSION=3.8
fast_finish: true
allow_failures:
- env: WP_VERSION=3.8 WP_MULTISITE=0
php: nightly
- env: WP_VERSION=3.8 WP_MULTISITE=1
- env: WP_VERSION=3.8
php: nightly
- env: WP_VERSION=latest WP_MULTISITE=0
php: nightly
- env: WP_VERSION=latest WP_MULTISITE=1
- env: WP_VERSION=latest
php: nightly
- env: WP_VERSION=3.8 WP_MULTISITE=0
php: 7.0
- env: WP_VERSION=3.8 WP_MULTISITE=1
php: 7.0
php: 7.1
- env: WP_VERSION=3.8
php: 7.1

cache:
directories:
- vendor
- $HOME/.composer/cache
- $HOME/.phpbrew

before_script: # Make PHP 7 test work. https://github.com/CMB2/CMB2/pull/885
- export PATH="$HOME/.composer/vendor/bin:$PATH"
- |
if [[ ${TRAVIS_PHP_VERSION:0:2} == "7." ]]; then
composer global require "phpunit/phpunit=5.7.*"
else
composer global require "phpunit/phpunit=4.8.*"
fi
- bash tests/bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
- phpunit --version
- export PATH="$HOME/.composer/vendor/bin:$PATH"
- |
if [[ ${TRAVIS_PHP_VERSION:0:2} == "7." ]]; then
composer global require "phpunit/phpunit=5.7.*"
else
composer global require "phpunit/phpunit=4.8.*"
fi
- |
if [[ ! -z "$WP_VERSION" ]] ; then
set -e
bash tests/bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
source bin/install-php-phpunit.sh
set +e
fi
- phpunit --version

script: if [[ latest == $WP_VERSION ]]; then phpunit --coverage-clover=coverage.clover; else phpunit --exclude-group cmb2-rest-api --coverage-clover=coverage.clover; fi

after_script:
- wget https://scrutinizer-ci.com/ocular.phar
- php ocular.phar code-coverage:upload --format=php-clover coverage.clover
- wget https://scrutinizer-ci.com/ocular.phar
- php ocular.phar code-coverage:upload --format=php-clover coverage.clover

branches:
only:
- master
- trunk

notifications:
slack:
rooms:
Expand All @@ -61,4 +84,4 @@ notifications:
on_start: false # default: false
email:
on_success: never # default: change
on_failure: always # default: always
on_failure: change # default: always
124 changes: 124 additions & 0 deletions tests/bin/install-php-phpunit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#!/bin/bash

# Uses phpbrew to install older php versions on modern(ish) distros.
# Installs the correct version of phpunit for the requested php
# version. ~/.phpbrew is expected to be cached so we only have
# to build php the first time.

# we have to save and restore the original working directory, because
# phpbrew can mess up if we don't run it from the home directory
ORIG_DIR=`pwd`;
THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
PHP52_PATH=$HOME/.phpbrew/php/php-5.2.17

# install phpunit

mkdir -p $HOME/phpunit-bin

if [[ ${SWITCH_TO_PHP:0:3} == "5.2" ]]; then
# use the phpunit in the PHP5.2 installation
ln -s ${PHP52_PATH}/lib/php/phpunit/phpunit.php $HOME/phpunit-bin/phpunit
elif [[ ${TRAVIS_PHP_VERSION:0:2} == "5." ]] || [[ ${SWITCH_TO_PHP:0:2} == "5." ]]; then
wget -O $HOME/phpunit-bin/phpunit https://phar.phpunit.de/phpunit-4.8.phar
chmod +x $HOME/phpunit-bin/phpunit
else
composer global require "phpunit/phpunit=6.*"
fi

export PATH=$HOME/phpunit-bin/:$PATH

if [[ ${SWITCH_TO_PHP:0:3} == "5.2" ]] || [[ ${SWITCH_TO_PHP:0:3} == "5.3" ]]; then
PHPBREW_BUILT_CHECK=$HOME/.phpbrew/bashrc

# directory to install phpbrew into
mkdir -p $HOME/php-utils-bin

# install phpbrew
curl -L -o $HOME/php-utils-bin/phpbrew https://github.com/phpbrew/phpbrew/raw/f6a422e1ba49293ee73bc4c317795c021bc57020/phpbrew
chmod +x $HOME/php-utils-bin/phpbrew

# needs to be on the path for switching php versions to work
export PATH=$HOME/php-utils-bin:$PATH

# php and phpunit3.6 installs should be cached, only build if they're not there.
if [ ! -f $PHPBREW_BUILT_CHECK ]; then

# init with known --old to get 5.2 and 5.3
$HOME/php-utils-bin/phpbrew init
$HOME/php-utils-bin/phpbrew known --old

# build PHP5.2
tail -F $HOME/.phpbrew/build/php-5.2.17/build.log &
TAIL_PID=$!
$HOME/php-utils-bin/phpbrew install --patch ${THIS_DIR}/patches/node.patch --patch ${THIS_DIR}/patches/openssl.patch 5.2 +default +mysql +pdo \
+gettext +phar +openssl -- --with-openssl-dir=/usr/include/openssl --enable-spl --with-mysql --with-mysqli=/usr/bin/mysql_config --with-pdo-mysql=/usr
kill -TERM $TAIL_PID

# build PHP5.3
tail -F $HOME/.phpbrew/build/php-5.3.29/build.log &
TAIL_PID=$!
$HOME/php-utils-bin/phpbrew install --patch ${THIS_DIR}/patches/node.patch --patch ${THIS_DIR}/patches/openssl.patch 5.3 +default +mysql +pdo \
+gettext +phar +openssl -- --with-openssl-dir=/usr/include/openssl --enable-spl --with-mysql --with-mysqli=/usr/bin/mysql_config --with-pdo-mysql=/usr
kill -TERM $TAIL_PID

# install PHPUnit 3.6. The only install method available is from source, using git branches old
# enough that they don't rely on any PHP5.3+ features. This clones each needed dependency
# and then we add the paths to the include_path by setting up an extra .ini file
cd ${PHP52_PATH}/lib/php

# dependencies
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/dbunit.git
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/php-code-coverage.git
git clone --depth=1 --branch=1.3.2 git://github.com/sebastianbergmann/php-file-iterator.git
git clone --depth=1 --branch=1.1.1 git://github.com/sebastianbergmann/php-invoker.git
git clone --depth=1 --branch=1.1.2 git://github.com/sebastianbergmann/php-text-template.git
git clone --depth=1 --branch=1.0.3 git://github.com/sebastianbergmann/php-timer.git
git clone --depth=1 --branch=1.1.4 git://github.com/sebastianbergmann/php-token-stream.git
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/phpunit-mock-objects.git
git clone --depth=1 --branch=1.1 git://github.com/sebastianbergmann/phpunit-selenium.git
git clone --depth=1 --branch=1.0.0 git://github.com/sebastianbergmann/phpunit-story.git

# and the version of phpunit that we expect to run with php 5.2
git clone --depth=1 --branch=3.6 git://github.com/sebastianbergmann/phpunit.git

# fix up the version number of phpunit
sed -i 's/@package_version@/3.6-git/g' phpunit/PHPUnit/Runner/Version.php

# now set up an ini file that adds all of the above to include_path for the PHP5.2 install
mkdir -p ${PHP52_PATH}/var/db
echo "include_path=.:${PHP52_PATH}/lib/php:${PHP52_PATH}/lib/php/dbunit:${PHP52_PATH}/lib/php/php-code-coverage:${PHP52_PATH}/lib/php/php-file-iterator:${PHP52_PATH}/lib/php/php-invoker:${PHP52_PATH}/lib/php/php-text-template:${PHP52_PATH}/lib/php/php-timer:${PHP52_PATH}/lib/php/php-token-stream:${PHP52_PATH}/lib/php/phpunit-mock-objects:${PHP52_PATH}/lib/php/phpunit-selenium:${PHP52_PATH}/lib/php/phpunit-story:${PHP52_PATH}/lib/php/phpunit" > ${PHP52_PATH}/var/db/path.ini

# one more PHPUnit dependency that we need to install using pear under PHP5.2
cd $HOME
export PHPBREW_RC_ENABLE=1
source $HOME/.phpbrew/bashrc
phpbrew use 5.2.17
pear channel-discover pear.symfony-project.com
pear install pear.symfony-project.com/YAML-1.0.2

# manually go back to the system php, we can't use `phpbrew switch-off`
# because we're running a version of php that phpbrew doesn't work with at this point
unset PHPBREW_PHP
unset PHPBREW_PATH
__phpbrew_set_path
__phpbrew_reinit
eval `$BIN env`

# clean up build directory
rm -rf $HOME/.phpbrew/build/*
fi

# all needed php versions and phpunit versions are installed, either from the above
# install script, or from travis cache, so switch to using them
cd $HOME
export PHPBREW_RC_ENABLE=1
source $HOME/.phpbrew/bashrc

if [[ ${SWITCH_TO_PHP:0:3} == "5.2" ]]; then
phpbrew use 5.2.17
else
phpbrew use 5.3.29
fi
fi

cd $ORIG_DIR
2 changes: 2 additions & 0 deletions tests/bin/patches/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
This directory contains patches required to build
older versions of PHP on trusty.
51 changes: 51 additions & 0 deletions tests/bin/patches/node.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
--- ext/dom/node.c 2012-08-06 17:49:48.826716692 +0800
+++ ext/dom/node.c 2012-08-06 17:52:47.633484660 +0800
@@ -1895,9 +1895,17 @@ static void dom_canonicalization(INTERNA
RETVAL_FALSE;
} else {
if (mode == 0) {
+#ifdef LIBXML2_NEW_BUFFER
+ ret = xmlOutputBufferGetSize(buf);
+#else
ret = buf->buffer->use;
+#endif
if (ret > 0) {
+#ifdef LIBXML2_NEW_BUFFER
+ RETVAL_STRINGL((char *) xmlOutputBufferGetContent(buf), ret, 1);
+#else
RETVAL_STRINGL((char *) buf->buffer->content, ret, 1);
+#endif
} else {
RETVAL_EMPTY_STRING();
}
--- ext/dom/documenttype.c 2012-08-06 18:02:16.019640870 +0800
+++ ext/dom/documenttype.c 2012-08-06 18:06:16.612228905 +0800
@@ -205,7 +205,13 @@ int dom_documenttype_internal_subset_rea
if (buff != NULL) {
xmlNodeDumpOutput (buff, NULL, (xmlNodePtr) intsubset, 0, 0, NULL);
xmlOutputBufferFlush(buff);
+
+#ifdef LIBXML2_NEW_BUFFER
+ ZVAL_STRINGL(*retval, xmlOutputBufferGetContent(buff),
+ xmlOutputBufferGetSize(buff), 1);
+#else
ZVAL_STRINGL(*retval, buff->buffer->content, buff->buffer->use, 1);
+#endif
(void)xmlOutputBufferClose(buff);
return SUCCESS;
}
--- ext/simplexml/simplexml.c 2012-08-06 18:10:44.621017026 +0800
+++ ext/simplexml/simplexml.c 2012-08-06 18:12:48.016270419 +0800
@@ -1417,7 +1417,12 @@ SXE_METHOD(asXML)

xmlNodeDumpOutput(outbuf, (xmlDocPtr) sxe->document->ptr, node, 0, 0, ((xmlDocPtr) sxe->document->ptr)->encoding);
xmlOutputBufferFlush(outbuf);
+#ifdef LIBXML2_NEW_BUFFER
+ RETVAL_STRINGL((char *)xmlOutputBufferGetContent(outbuf),
+ xmlOutputBufferGetSize(outbuf), 1);
+#else
RETVAL_STRINGL((char *)outbuf->buffer->content, outbuf->buffer->use, 1);
+#endif
xmlOutputBufferClose(outbuf);
}
} else {
52 changes: 52 additions & 0 deletions tests/bin/patches/openssl.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
--- ext/openssl/xp_ssl.c
+++ ext/openssl/xp_ssl.c
@@ -328,10 +328,12 @@ static inline int php_openssl_setup_cryp
sslsock->is_client = 1;
method = SSLv23_client_method();
break;
+#ifndef OPENSSL_NO_SSL2
case STREAM_CRYPTO_METHOD_SSLv2_CLIENT:
sslsock->is_client = 1;
method = SSLv2_client_method();
break;
+#endif
case STREAM_CRYPTO_METHOD_SSLv3_CLIENT:
sslsock->is_client = 1;
method = SSLv3_client_method();
@@ -348,10 +350,12 @@ static inline int php_openssl_setup_cryp
sslsock->is_client = 0;
method = SSLv3_server_method();
break;
+#ifndef OPENSSL_NO_SSL2
case STREAM_CRYPTO_METHOD_SSLv2_SERVER:
sslsock->is_client = 0;
method = SSLv2_server_method();
break;
+#endif
case STREAM_CRYPTO_METHOD_TLS_SERVER:
sslsock->is_client = 0;
method = TLSv1_server_method();
@@ -629,9 +633,11 @@ static inline int php_openssl_tcp_sockop
case STREAM_CRYPTO_METHOD_SSLv23_CLIENT:
sock->method = STREAM_CRYPTO_METHOD_SSLv23_SERVER;
break;
+#ifndef OPENSSL_NO_SSL2
case STREAM_CRYPTO_METHOD_SSLv2_CLIENT:
sock->method = STREAM_CRYPTO_METHOD_SSLv2_SERVER;
break;
+#endif
case STREAM_CRYPTO_METHOD_SSLv3_CLIENT:
sock->method = STREAM_CRYPTO_METHOD_SSLv3_SERVER;
break;
@@ -911,9 +917,11 @@ php_stream *php_openssl_ssl_socket_facto
if (strncmp(proto, "ssl", protolen) == 0) {
sslsock->enable_on_connect = 1;
sslsock->method = STREAM_CRYPTO_METHOD_SSLv23_CLIENT;
+#ifndef OPENSSL_NO_SSL2
} else if (strncmp(proto, "sslv2", protolen) == 0) {
sslsock->enable_on_connect = 1;
sslsock->method = STREAM_CRYPTO_METHOD_SSLv2_CLIENT;
+#endif
} else if (strncmp(proto, "sslv3", protolen) == 0) {
sslsock->enable_on_connect = 1;
sslsock->method = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;

0 comments on commit 7b4b416

Please sign in to comment.