Skip to content

Commit

Permalink
Add compatibility test for php. (protocolbuffers#3041)
Browse files Browse the repository at this point in the history
* Add compatibility test for php.

* Revert API incompatible change.
  • Loading branch information
TeBoring authored May 5, 2017
1 parent 4833960 commit 25abd7b
Showing 6 changed files with 129 additions and 4 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -138,6 +138,8 @@ conformance/conformance-php-c
# php test output
composer.lock
php/tests/generated/
php/tests/old_protoc
php/tests/protobuf/
php/ext/google/protobuf/.libs/
php/ext/google/protobuf/Makefile.fragments
php/ext/google/protobuf/Makefile.global
1 change: 1 addition & 0 deletions Makefile.am
Original file line number Diff line number Diff line change
@@ -651,6 +651,7 @@ php_EXTRA_DIST= \
php/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php \
php/tests/array_test.php \
php/tests/autoload.php \
php/tests/compatibility_test.sh \
php/tests/encode_decode_test.php \
php/tests/gdb_test.sh \
php/tests/generated_class_test.php \
2 changes: 1 addition & 1 deletion jenkins/buildcmds/pull_request_32.sh
Original file line number Diff line number Diff line change
@@ -12,5 +12,5 @@
export DOCKERFILE_DIR=jenkins/docker32
export DOCKER_RUN_SCRIPT=jenkins/pull_request_in_docker.sh
export OUTPUT_DIR=testoutput
export TEST_SET="php_all"
export TEST_SET="php_all_32"
./jenkins/build_and_run_docker.sh
111 changes: 111 additions & 0 deletions php/tests/compatibility_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#!/bin/bash

use_php() {
VERSION=$1
PHP=`which php`
PHP_CONFIG=`which php-config`
PHPIZE=`which phpize`
ln -sfn "/usr/local/php-${VERSION}/bin/php" $PHP
ln -sfn "/usr/local/php-${VERSION}/bin/php-config" $PHP_CONFIG
ln -sfn "/usr/local/php-${VERSION}/bin/phpize" $PHPIZE
}

generate_proto() {
PROTOC1=$1
PROTOC2=$2

rm -rf generated
mkdir generated

$PROTOC1 --php_out=generated proto/test_include.proto
$PROTOC2 --php_out=generated proto/test.proto proto/test_no_namespace.proto proto/test_prefix.proto
pushd ../../src
$PROTOC2 --php_out=../php/tests/generated google/protobuf/empty.proto
$PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto
popd
}

set -ex

# Change to the script's directory.
cd $(dirname $0)

# The old version of protobuf that we are testing compatibility against.
case "$1" in
""|3.3.0)
OLD_VERSION=3.3.0
OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/3.3.0/protoc-3.3.0-linux-x86_64.exe
;;
*)
echo "[ERROR]: Unknown version number: $1"
exit 1
;;
esac

# Extract the latest protobuf version number.
VERSION_NUMBER=`grep "PHP_PROTOBUF_VERSION" ../ext/google/protobuf/protobuf.h | sed "s|#define PHP_PROTOBUF_VERSION \"\(.*\)\"|\1|"`

echo "Running compatibility tests between $VERSION_NUMBER and $OLD_VERSION"

# Check protoc
[ -f ../../src/protoc ] || {
echo "[ERROR]: Please build protoc first."
exit 1
}

# Download old test.
rm -rf protobuf
git clone https://github.com/google/protobuf.git
pushd protobuf
git checkout v$OLD_VERSION
popd

# Build and copy the new runtime
use_php 5.5
pushd ../ext/google/protobuf
make clean || true
phpize && ./configure && make
popd

rm -rf protobuf/php/ext
rm -rf protobuf/php/src
cp -r ../ext protobuf/php/ext/
cp -r ../src protobuf/php/src/

# Download old version protoc compiler (for linux)
wget $OLD_VERSION_PROTOC -O old_protoc
chmod +x old_protoc

NEW_PROTOC=`pwd`/../../src/protoc
OLD_PROTOC=`pwd`/old_protoc
cd protobuf/php
cp -r /usr/local/vendor-5.5 vendor
wget https://phar.phpunit.de/phpunit-4.8.0.phar -O /usr/bin/phpunit
cd tests

# Test A.1:
# proto set 1: use old version
# proto set 2 which may import protos in set 1: use old version
generate_proto $OLD_PROTOC $OLD_PROTOC
./test.sh
pushd ..
phpunit
popd

# Test A.2:
# proto set 1: use new version
# proto set 2 which may import protos in set 1: use old version
generate_proto $NEW_PROTOC $OLD_PROTOC
./test.sh
pushd ..
phpunit
popd

# Test A.3:
# proto set 1: use old version
# proto set 2 which may import protos in set 1: use new version
generate_proto $OLD_PROTOC $NEW_PROTOC
./test.sh
pushd ..
phpunit
popd
4 changes: 2 additions & 2 deletions php/tests/test.sh
Original file line number Diff line number Diff line change
@@ -2,10 +2,10 @@

# Compile c extension
pushd ../ext/google/protobuf/
make clean
make clean || true
set -e
# Add following in configure for debug: --enable-debug CFLAGS='-g -O0'
phpize && ./configure --enable-debug CFLAGS='-g -O0' && make
phpize && ./configure CFLAGS='-g -O0' && make
popd

tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php )
13 changes: 12 additions & 1 deletion tests.sh
Original file line number Diff line number Diff line change
@@ -545,7 +545,12 @@ build_php7.0_mac() {
popd
}

build_php_all() {
build_php_compatibility() {
internal_build_cpp
php/tests/compatibility_test.sh
}

build_php_all_32() {
build_php5.5
build_php5.6
build_php7.0
@@ -557,6 +562,11 @@ build_php_all() {
build_php7.0_zts_c
}

build_php_all() {
build_php_all_32
build_php_compatibility
}

# Note: travis currently does not support testing more than one language so the
# .travis.yml cheats and claims to only be cpp. If they add multiple language
# support, this should probably get updated to install steps and/or
@@ -595,6 +605,7 @@ Usage: $0 { cpp |
php5.6_c |
php7.0 |
php7.0_c |
php_compatibility |
php_all)
"
exit 1

0 comments on commit 25abd7b

Please sign in to comment.