#!/bin/bash function generate_proto() { PROTOC1=$1 PROTOC2=$2 rm -rf generated mkdir generated $PROTOC1 --php_out=generated proto/test_include.proto $PROTOC2 --php_out=generated \ -I../../src -I. \ proto/empty/echo.proto \ proto/test.proto \ proto/test_no_namespace.proto \ proto/test_prefix.proto \ proto/test_php_namespace.proto \ proto/test_empty_php_namespace.proto \ proto/test_reserved_enum_lower.proto \ proto/test_reserved_enum_upper.proto \ proto/test_reserved_enum_value_lower.proto \ proto/test_reserved_enum_value_upper.proto \ proto/test_reserved_message_lower.proto \ proto/test_reserved_message_upper.proto \ proto/test_service.proto \ proto/test_service_namespace.proto \ proto/test_wrapper_type_setters.proto \ proto/test_descriptors.proto pushd ../../src $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto popd } # Remove tests to expect error. These were added to API tests by mistake. function remove_error_test() { local TEMPFILE=`tempfile` cat $1 | \ awk -v file=`basename $1` -v dir=`basename $(dirname $1)` ' BEGIN { show = 1 } /@expectedException PHPUnit_Framework_Error/ { show = 0; next; } / *\*\// { print; next; } / *}/ { if (!show) { show = 1; next; } } show { print } ' > $TEMPFILE cp $TEMPFILE $1 } set -ex # Change to the script's directory. cd $(dirname $0) OLD_VERSION=$1 OLD_VERSION_PROTOC=https://repo1.maven.org/maven2/com/google/protobuf/protoc/$OLD_VERSION/protoc-$OLD_VERSION-linux-x86_64.exe # 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 current $VERSION_NUMBER and released $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/protocolbuffers/protobuf.git pushd protobuf git checkout v$OLD_VERSION popd # Build and copy the new runtime 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 composer install # Remove implementation detail tests. # TODO(teboring): Temporarily disable encode_decode_test.php. In 3.13.0-rc1, # repeated primitive field encoding is changed to packed, which is a bug fix. # However, this fails the compatibility test which hard coded old encoding. # Will re-enable the test after making a release. After the version bump, the # compatibility test will use the updated test code. tests=( array_test.php generated_class_test.php map_field_test.php well_known_test.php ) sed -i.bak '/php_implementation_test.php/d' phpunit.xml sed -i.bak '/generated_phpdoc_test.php/d' phpunit.xml sed -i.bak '/encode_decode_test.php/d' phpunit.xml sed -i.bak 's/generated_phpdoc_test.php//g' tests/test.sh sed -i.bak 's/generated_service_test.php//g' tests/test.sh sed -i.bak 's/encode_decode_test.php//g' tests/test.sh sed -i.bak '/memory_leak_test.php/d' tests/test.sh sed -i.bak '/^ public function testTimestamp()$/,/^ }$/d' tests/well_known_test.php sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/array_test.php sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/map_field_test.php sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/test_base.php for t in "${tests[@]}" do remove_error_test tests/$t done 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 .. ./vendor/bin/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 .. ./vendor/bin/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 .. ./vendor/bin/phpunit popd