1#!/bin/bash 2 3function use_php() { 4 VERSION=$1 5 6 OLD_PATH=$PATH 7 OLD_CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH 8 OLD_C_INCLUDE_PATH=$C_INCLUDE_PATH 9 10 export PATH=/usr/local/php-${VERSION}/bin:$OLD_PATH 11 export CPLUS_INCLUDE_PATH=/usr/local/php-${VERSION}/include/php/main:/usr/local/php-${VERSION}/include/php/:$OLD_CPLUS_INCLUDE_PATH 12 export C_INCLUDE_PATH=/usr/local/php-${VERSION}/include/php/main:/usr/local/php-${VERSION}/include/php/:$OLD_C_INCLUDE_PATH 13} 14 15function generate_proto() { 16 PROTOC1=$1 17 PROTOC2=$2 18 19 rm -rf generated 20 mkdir generated 21 22 $PROTOC1 --php_out=generated proto/test_include.proto 23 $PROTOC2 --php_out=generated \ 24 proto/test.proto \ 25 proto/test_no_namespace.proto \ 26 proto/test_prefix.proto \ 27 proto/test_php_namespace.proto \ 28 proto/test_empty_php_namespace.proto \ 29 proto/test_reserved_enum_lower.proto \ 30 proto/test_reserved_enum_upper.proto \ 31 proto/test_reserved_enum_value_lower.proto \ 32 proto/test_reserved_enum_value_upper.proto \ 33 proto/test_reserved_message_lower.proto \ 34 proto/test_reserved_message_upper.proto \ 35 proto/test_service.proto \ 36 proto/test_service_namespace.proto \ 37 proto/test_descriptors.proto 38 39 pushd ../../src 40 $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto 41 popd 42} 43 44# Remove tests to expect error. These were added to API tests by mistake. 45function remove_error_test() { 46 local TEMPFILE=`tempfile` 47 cat $1 | \ 48 awk -v file=`basename $1` -v dir=`basename $(dirname $1)` ' 49 BEGIN { 50 show = 1 51 } 52 /@expectedException PHPUnit_Framework_Error/ { show = 0; next; } 53 / *\*\// { print; next; } 54 / *}/ { 55 if (!show) { 56 show = 1; 57 next; 58 } 59 } 60 show { print } 61 ' > $TEMPFILE 62 cp $TEMPFILE $1 63} 64 65set -ex 66 67# Change to the script's directory. 68cd $(dirname $0) 69 70# The old version of protobuf that we are testing compatibility against. 71case "$1" in 72 ""|3.5.0) 73 OLD_VERSION=3.5.0 74 OLD_VERSION_PROTOC=http://repo1.maven.org/maven2/com/google/protobuf/protoc/$OLD_VERSION/protoc-$OLD_VERSION-linux-x86_64.exe 75 ;; 76 *) 77 echo "[ERROR]: Unknown version number: $1" 78 exit 1 79 ;; 80esac 81 82# Extract the latest protobuf version number. 83VERSION_NUMBER=`grep "PHP_PROTOBUF_VERSION" ../ext/google/protobuf/protobuf.h | sed "s|#define PHP_PROTOBUF_VERSION \"\(.*\)\"|\1|"` 84 85echo "Running compatibility tests between $VERSION_NUMBER and $OLD_VERSION" 86 87# Check protoc 88[ -f ../../src/protoc ] || { 89 echo "[ERROR]: Please build protoc first." 90 exit 1 91} 92 93# Download old test. 94rm -rf protobuf 95git clone https://github.com/protocolbuffers/protobuf.git 96pushd protobuf 97git checkout v$OLD_VERSION 98popd 99 100# Build and copy the new runtime 101use_php 7.1 102pushd ../ext/google/protobuf 103make clean || true 104phpize && ./configure && make 105popd 106 107rm -rf protobuf/php/ext 108rm -rf protobuf/php/src 109cp -r ../ext protobuf/php/ext/ 110cp -r ../src protobuf/php/src/ 111 112# Download old version protoc compiler (for linux) 113wget $OLD_VERSION_PROTOC -O old_protoc 114chmod +x old_protoc 115 116NEW_PROTOC=`pwd`/../../src/protoc 117OLD_PROTOC=`pwd`/old_protoc 118cd protobuf/php 119composer install 120 121# Remove implementation detail tests. 122tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php well_known_test.php ) 123sed -i.bak '/php_implementation_test.php/d' phpunit.xml 124sed -i.bak '/generated_phpdoc_test.php/d' phpunit.xml 125sed -i.bak 's/generated_phpdoc_test.php//g' tests/test.sh 126sed -i.bak 's/generated_service_test.php//g' tests/test.sh 127sed -i.bak '/memory_leak_test.php/d' tests/test.sh 128sed -i.bak '/^ public function testTimestamp()$/,/^ }$/d' tests/well_known_test.php 129sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/array_test.php 130sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/map_field_test.php 131sed -i.bak 's/PHPUnit_Framework_TestCase/\\PHPUnit\\Framework\\TestCase/g' tests/test_base.php 132for t in "${tests[@]}" 133do 134 remove_error_test tests/$t 135done 136 137cd tests 138 139# Test A.1: 140# proto set 1: use old version 141# proto set 2 which may import protos in set 1: use old version 142generate_proto $OLD_PROTOC $OLD_PROTOC 143./test.sh 144pushd .. 145./vendor/bin/phpunit 146popd 147 148# Test A.2: 149# proto set 1: use new version 150# proto set 2 which may import protos in set 1: use old version 151generate_proto $NEW_PROTOC $OLD_PROTOC 152./test.sh 153pushd .. 154./vendor/bin/phpunit 155popd 156 157# Test A.3: 158# proto set 1: use old version 159# proto set 2 which may import protos in set 1: use new version 160generate_proto $OLD_PROTOC $NEW_PROTOC 161./test.sh 162pushd .. 163./vendor/bin/phpunit 164popd 165