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