From 51c5ff889ccd3836c25f40baafb350f92c9ee103 Mon Sep 17 00:00:00 2001 From: Paul Yang Date: Tue, 25 Oct 2016 17:27:05 -0700 Subject: [PATCH] Fix pure php implementation for 32-bit machine. (#2282) --- Makefile.am | 1 - composer.json | 3 +- jenkins/buildcmds/pull_request_32.sh | 2 +- jenkins/docker32/Dockerfile | 4 +- php/src/Google/Protobuf/Internal/GPBUtil.php | 41 +++- php/src/Google/Protobuf/Internal/GPBWire.php | 47 +++-- .../Google/Protobuf/Internal/InputStream.php | 68 ++++++- php/src/Google/Protobuf/Internal/Message.php | 5 - .../Google/Protobuf/Internal/OutputStream.php | 51 +++-- php/src/Google/Protobuf/Internal/Type.php | 175 ------------------ php/tests/array_test.php | 111 +++++++---- php/tests/generated_class_test.php | 65 ++++++- php/tests/map_field_test.php | 56 ++++-- php/tests/php_implementation_test.php | 144 ++++++++------ php/tests/test_base.php | 20 +- php/tests/test_util.php | 129 ++++++++----- tests.sh | 21 +++ 17 files changed, 548 insertions(+), 395 deletions(-) delete mode 100644 php/src/Google/Protobuf/Internal/Type.php diff --git a/Makefile.am b/Makefile.am index 7e47a1193..4763d9495 100644 --- a/Makefile.am +++ b/Makefile.am @@ -577,7 +577,6 @@ php_EXTRA_DIST= \ php/src/Google/Protobuf/Internal/DescriptorPool.php \ php/src/Google/Protobuf/Internal/OneofField.php \ php/src/Google/Protobuf/Internal/MapEntry.php \ - php/src/Google/Protobuf/Internal/Type.php \ php/src/Google/Protobuf/Internal/InputStream.php \ php/src/Google/Protobuf/Internal/OutputStream.php \ php/src/Google/Protobuf/Internal/MessageBuilderContext.php \ diff --git a/composer.json b/composer.json index 8b73a2b98..6afe71ce7 100644 --- a/composer.json +++ b/composer.json @@ -17,8 +17,7 @@ }, "files": [ "php/src/Google/Protobuf/descriptor.php", - "php/src/Google/Protobuf/descriptor_internal.pb.php", - "php/src/Google/Protobuf/Internal/Type.php" + "php/src/Google/Protobuf/descriptor_internal.pb.php" ] } } diff --git a/jenkins/buildcmds/pull_request_32.sh b/jenkins/buildcmds/pull_request_32.sh index 99df29719..bf0fb7ffe 100755 --- a/jenkins/buildcmds/pull_request_32.sh +++ b/jenkins/buildcmds/pull_request_32.sh @@ -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 diff --git a/jenkins/docker32/Dockerfile b/jenkins/docker32/Dockerfile index 73dfd8d52..015d273cb 100644 --- a/jenkins/docker32/Dockerfile +++ b/jenkins/docker32/Dockerfile @@ -83,7 +83,9 @@ RUN wget http://am1.php.net/get/php-5.5.38.tar.bz2/from/this/mirror RUN mv mirror php-5.5.38.tar.bz2 RUN tar -xvf php-5.5.38.tar.bz2 RUN cd php-5.5.38 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.5-zts && \ - make && make install + make && make install && make clean && cd .. +RUN cd php-5.5.38 && ./configure --enable-bcmath --prefix=/usr/local/php-5.5-bc && \ + make && make install && make clean && cd .. ################## # Python dependencies diff --git a/php/src/Google/Protobuf/Internal/GPBUtil.php b/php/src/Google/Protobuf/Internal/GPBUtil.php index 417a97298..30d7350f1 100644 --- a/php/src/Google/Protobuf/Internal/GPBUtil.php +++ b/php/src/Google/Protobuf/Internal/GPBUtil.php @@ -37,6 +37,28 @@ use Google\Protobuf\Internal\RepeatedField; class GPBUtil { + public function divideInt64ToInt32($value, &$high, &$low, $trim = false) + { + $isNeg = (bccomp($value, 0) < 0); + if ($isNeg) { + $value = bcsub(0, $value); + } + $high = (int) bcdiv(bcadd($value, 1), 4294967296); + $low = (int) bcmod($value, 4294967296); + if ($isNeg) { + $high = ~$high; + $low = ~$low; + $low++; + if (!$low) { + $high++; + } + } + + if ($trim) { + $high = 0; + } + } + public static function checkString(&$var, $check_utf8) { @@ -70,9 +92,14 @@ class GPBUtil public static function checkUint32(&$var) { if (is_numeric($var)) { - $var = intval($var); if (PHP_INT_SIZE === 8) { + $var = intval($var); $var |= ((-(($var >> 31) & 0x1)) & ~0xFFFFFFFF); + } else { + if (bccomp($var, 0x7FFFFFFF) > 0) { + $var = bcsub($var, "4294967296"); + } + $var = (int) $var; } } else { trigger_error("Expect integer.", E_USER_ERROR); @@ -82,7 +109,11 @@ class GPBUtil public static function checkInt64(&$var) { if (is_numeric($var)) { - $var = intval($var); + if (PHP_INT_SIZE == 8) { + $var = intval($var); + } else { + $var = bcdiv($var, 1, 0); + } } else { trigger_error("Expect integer.", E_USER_ERROR); } @@ -91,7 +122,11 @@ class GPBUtil public static function checkUint64(&$var) { if (is_numeric($var)) { - $var = intval($var); + if (PHP_INT_SIZE == 8) { + $var = intval($var); + } else { + $var = bcdiv($var, 1, 0); + } } else { trigger_error("Expect integer.", E_USER_ERROR); } diff --git a/php/src/Google/Protobuf/Internal/GPBWire.php b/php/src/Google/Protobuf/Internal/GPBWire.php index 0e741e158..7e2c124fe 100644 --- a/php/src/Google/Protobuf/Internal/GPBWire.php +++ b/php/src/Google/Protobuf/Internal/GPBWire.php @@ -32,10 +32,6 @@ namespace Google\Protobuf\Internal; -use Google\Protobuf\Internal\GPBUtil; -use Google\Protobuf\Internal\Int64; -use Google\Protobuf\Internal\Uint64; - class GPBWire { @@ -150,20 +146,28 @@ class GPBWire public static function zigZagEncode64($int64) { - $a = $int64->copy()->leftShift(1); - $b = $int64->copy()->rightShift(63); - $result = $a->bitXor($b); - $uint64 = Uint64::newValue($result->high, $result->low); - return $uint64; + if (PHP_INT_SIZE == 4) { + if (bccomp($int64, 0) >= 0) { + return bcmul($int64, 2); + } else { + return bcsub(bcmul(bcsub(0, $int64), 2), 1); + } + } else { + return ($int64 << 1) ^ ($int64 >> 63); + } } public static function zigZagDecode64($uint64) { - $a = $uint64->copy()->rightShift(1); - $b = $uint64->oddMask(); - $result = $a->bitXor($b); - $int64 = Int64::newValue($result->high, $result->low); - return $int64; + if (PHP_INT_SIZE == 4) { + if (bcmod($uint64, 2) == 0) { + return bcdiv($uint64, 2, 0); + } else { + return bcsub(0, bcdiv(bcadd($uint64, 1), 2, 0)); + } + } else { + return (($uint64 >> 1) & 0x7FFFFFFFFFFFFFFF) ^ (-($uint64 & 1)); + } } public static function readInt32(&$input, &$value) @@ -227,11 +231,7 @@ class GPBWire public static function readSfixed64(&$input, &$value) { - if (!self::readFixed64($input, $value)) { - return false; - } - $value = Int64::newValue($value->high, $value->low); - return true; + return $input->readLittleEndian64($value); } public static function readFloat(&$input, &$value) @@ -259,7 +259,7 @@ class GPBWire if (!$input->readVarint64($value)) { return false; } - if ($value->high === 0 && $value->low === 0) { + if ($value == 0) { $value = false; } else { $value = true; @@ -324,8 +324,8 @@ class GPBWire public static function writeSint64(&$output, $value) { - $value = GPBWire::zigZagEncode64(GPBUtil::Int64($value)); - return $output->writeVarint64($value->toInteger()); + $value = GPBWire::zigZagEncode64($value); + return $output->writeVarint64($value); } public static function writeFixed32(&$output, $value) @@ -431,9 +431,8 @@ class GPBWire public static function sint64Size($value) { - $value = GPBUtil::Int64($value); $value = self::zigZagEncode64($value); - return self::varint64Size($value->toInteger()); + return self::varint64Size($value); } public static function varint64Size($value) diff --git a/php/src/Google/Protobuf/Internal/InputStream.php b/php/src/Google/Protobuf/Internal/InputStream.php index 18d07075e..6d6c74e90 100644 --- a/php/src/Google/Protobuf/Internal/InputStream.php +++ b/php/src/Google/Protobuf/Internal/InputStream.php @@ -34,6 +34,24 @@ namespace Google\Protobuf\Internal; use Google\Protobuf\Internal\Uint64; +function combineInt32ToInt64($high, $low) +{ + $isNeg = $high < 0; + if ($isNeg) { + $high = ~$high; + $low = ~$low; + $low++; + if (!$low) { + $high++; + } + } + $result = bcadd(bcmul($high, 4294967296), $low); + if ($isNeg) { + $result = bcsub(0, $result); + } + return $result; +} + class InputStream { @@ -116,11 +134,23 @@ class InputStream if (!$this->readVarint64($var)) { return false; } - $var = $var->toInteger() & 0xFFFFFFFF; - // Convert large uint32 to int32. - if (PHP_INT_SIZE === 8 && ($var > 0x7FFFFFFF)) { - $var = $var | (0xFFFFFFFF << 32); + + if (PHP_INT_SIZE == 4) { + $var = bcmod($var, 4294967296); + } else { + $var &= 0xFFFFFFFF; } + + // Convert large uint32 to int32. + if ($var > 0x7FFFFFFF) { + if (PHP_INT_SIZE === 8) { + $var = $var | (0xFFFFFFFF << 32); + } else { + $var = bcsub($var, 4294967296); + } + } + + $var = intval($var); return true; } @@ -130,7 +160,8 @@ class InputStream */ public function readVarint64(&$var) { - $result = new Uint64(0); + $high = 0; + $low = 0; $count = 0; $b = 0; @@ -142,12 +173,27 @@ class InputStream return false; } $b = ord($this->buffer[$this->current]); - $result->bitOr((new Uint64($b & 0x7F))->leftShift(7 * $count)); + $bits = 7 * $count; + if ($bits >= 32) { + $high |= (($b & 0x7F) << ($bits - 32)); + } else if ($bits > 25){ + $high_bits = $bits - 25; + $low = ($low | (($b & 0x7F) << $bits)) & (int) 0xFFFFFFFF; + $high = $b & ((0x1 << $high_bits) -1); + } else { + $low |= (($b & 0x7F) << $bits); + } + $this->advance(1); $count += 1; } while ($b & 0x80); - $var = $result; + if (PHP_INT_SIZE == 4) { + $var = combineInt32ToInt64($high, $low); + } else { + $var = ($high & 0xFFFFFFFF) << 32 | + ($low & 0xFFFFFFFF); + } return true; } @@ -161,7 +207,7 @@ class InputStream if (!$this->readVarint64($var)) { return false; } - $var = $var->toInteger(); + $var = (int)$var; return true; } @@ -197,7 +243,11 @@ class InputStream return false; } $high = unpack('V', $data)[1]; - $var = Uint64::newValue($high, $low); + if (PHP_INT_SIZE == 4) { + $var = combineInt32ToInt64($high, $low); + } else { + $var = ($high << 32) | $low; + } return true; } diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php index 7bdc6a8c2..38513e914 100644 --- a/php/src/Google/Protobuf/Internal/Message.php +++ b/php/src/Google/Protobuf/Internal/Message.php @@ -210,13 +210,11 @@ class Message if (!GPBWire::readInt64($input, $value)) { return false; } - $value = $value->toInteger(); break; case GPBType::UINT64: if (!GPBWire::readUint64($input, $value)) { return false; } - $value = $value->toInteger(); break; case GPBType::INT32: if (!GPBWire::readInt32($input, $value)) { @@ -227,7 +225,6 @@ class Message if (!GPBWire::readFixed64($input, $value)) { return false; } - $value = $value->toInteger(); break; case GPBType::FIXED32: if (!GPBWire::readFixed32($input, $value)) { @@ -285,7 +282,6 @@ class Message if (!GPBWire::readSfixed64($input, $value)) { return false; } - $value = $value->toInteger(); break; case GPBType::SINT32: if (!GPBWire::readSint32($input, $value)) { @@ -296,7 +292,6 @@ class Message if (!GPBWire::readSint64($input, $value)) { return false; } - $value = $value->toInteger(); break; default: user_error("Unsupported type."); diff --git a/php/src/Google/Protobuf/Internal/OutputStream.php b/php/src/Google/Protobuf/Internal/OutputStream.php index fcc5ce6da..587ac352d 100644 --- a/php/src/Google/Protobuf/Internal/OutputStream.php +++ b/php/src/Google/Protobuf/Internal/OutputStream.php @@ -90,8 +90,6 @@ class OutputStream public function writeRaw($data, $size) { if ($this->buffer_size < $size) { - var_dump($this->buffer_size); - var_dump($size); trigger_error("Output stream doesn't have enough buffer."); return false; } @@ -107,15 +105,28 @@ class OutputStream private static function writeVarintToArray($value, &$buffer, $trim = false) { $current = 0; - if ($trim) { - $value &= 0xFFFFFFFF; + + $high = 0; + $low = 0; + if (PHP_INT_SIZE == 4) { + GPBUtil::divideInt64ToInt32($value, $high, $low, $trim); + } else { + if ($trim) { + $low = $value & 0xFFFFFFFF; + } else { + $low = $value; + } } - while ($value >= 0x80 || $value < 0) { - $buffer[$current] = chr($value | 0x80); + + while ($low >= 0x80 || $low < 0) { + $buffer[$current] = chr($low | 0x80); $value = ($value >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7)); + $carry = ($high & 0x7F) << ((PHP_INT_SIZE << 3) - 7); + $high = ($high >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7)); + $low = (($low >> 7) & ~(0x7F << ((PHP_INT_SIZE << 3) - 7)) | $carry); $current++; } - $buffer[$current] = chr($value); + $buffer[$current] = chr($low); return $current + 1; } @@ -130,14 +141,24 @@ class OutputStream private static function writeLittleEndian64ToArray($value, &$buffer) { - $buffer[0] = chr($value & 0x000000FF); - $buffer[1] = chr(($value >> 8) & 0x000000FF); - $buffer[2] = chr(($value >> 16) & 0x000000FF); - $buffer[3] = chr(($value >> 24) & 0x000000FF); - $buffer[4] = chr(($value >> 32) & 0x000000FF); - $buffer[5] = chr(($value >> 40) & 0x000000FF); - $buffer[6] = chr(($value >> 48) & 0x000000FF); - $buffer[7] = chr(($value >> 56) & 0x000000FF); + $high = 0; + $low = 0; + if (PHP_INT_SIZE == 4) { + GPBUtil::divideInt64ToInt32($value, $high, $low); + } else { + $low = $value & 0xFFFFFFFF; + $high = ($value >> 32) & 0xFFFFFFFF; + } + + $buffer[0] = chr($low & 0x000000FF); + $buffer[1] = chr(($low >> 8) & 0x000000FF); + $buffer[2] = chr(($low >> 16) & 0x000000FF); + $buffer[3] = chr(($low >> 24) & 0x000000FF); + $buffer[4] = chr($high & 0x000000FF); + $buffer[5] = chr(($high >> 8) & 0x000000FF); + $buffer[6] = chr(($high >> 16) & 0x000000FF); + $buffer[7] = chr(($high >> 24) & 0x000000FF); return 8; } + } diff --git a/php/src/Google/Protobuf/Internal/Type.php b/php/src/Google/Protobuf/Internal/Type.php deleted file mode 100644 index 088f0e0cb..000000000 --- a/php/src/Google/Protobuf/Internal/Type.php +++ /dev/null @@ -1,175 +0,0 @@ -low = $value & 0xFFFFFFFF; - if (PHP_INT_SIZE === 8) { - $this->high = ($value >> 32) & 0xFFFFFFFF; - } - } - - // Return 0 for unsigned integers and 1 for signed integers. - protected function sign() - { - trigger_error("Not implemented", E_ERROR); - } - - public function leftShift($count) - { - if ($count > 63) { - $this->low = 0; - $this->high = 0; - return; - } - if ($count > 32) { - $this->high = $this->low; - $this->low = 0; - $count -= 32; - } - $mask = (1 << $count) - 1; - $this->high = (($this->high << $count) & 0xFFFFFFFF) | - (($this->low >> (32 - $count)) & $mask); - $this->low = ($this->low << $count) & 0xFFFFFFFF; - - $this->high &= 0xFFFFFFFF; - $this->low &= 0xFFFFFFFF; - return $this; - } - - public function rightShift($count) - { - $sign = (($this->high & 0x80000000) >> 31) & $this->sign(); - if ($count > 63) { - $this->low = -$sign; - $this->high = -$sign; - return; - } - if ($count > 32) { - $this->low = $this->high; - $this->high = -$sign; - $count -= 32; - } - $this->low = (($this->low >> $count) & 0xFFFFFFFF) | - (($this->high << (32 - $count)) & 0xFFFFFFFF); - $this->high = (($this->high >> $count) | (-$sign << $count)); - - $this->high &= 0xFFFFFFFF; - $this->low &= 0xFFFFFFFF; - - return $this; - } - - public function bitOr($var) - { - $this->high |= $var->high; - $this->low |= $var->low; - return $this; - } - - public function bitXor($var) - { - $this->high ^= $var->high; - $this->low ^= $var->low; - return $this; - } - - public function bitAnd($var) - { - $this->high &= $var->high; - $this->low &= $var->low; - return $this; - } - - // Even: all zero; Odd: all one. - public function oddMask() - { - $low = (-($this->low & 1)) & 0xFFFFFFFF; - $high = $low; - return UInt64::newValue($high, $low); - } - - public function toInteger() - { - if (PHP_INT_SIZE === 8) { - return ($this->high << 32) | $this->low; - } else { - return $this->low; - } - } - - public function copy() - { - return static::newValue($this->high, $this->low); - } -} - -class Uint64 extends GPBInteger -{ - - public static function newValue($high, $low) - { - $uint64 = new Uint64(0); - $uint64->high = $high; - $uint64->low = $low; - return $uint64; - } - - protected function sign() - { - return 0; - } -} - -class Int64 extends GPBInteger -{ - - public static function newValue($high, $low) - { - $int64 = new Int64(0); - $int64->high = $high; - $int64->low = $low; - return $int64; - } - - protected function sign() - { - return 1; - } -} diff --git a/php/tests/array_test.php b/php/tests/array_test.php index 09d4dc822..a118b54cf 100644 --- a/php/tests/array_test.php +++ b/php/tests/array_test.php @@ -225,46 +225,68 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase // Test append. $arr []= MAX_INT64; - $this->assertSame(MAX_INT64, $arr[0]); $arr []= MIN_INT64; - $this->assertEquals(MIN_INT64, $arr[1]); - $arr []= 1.1; - $this->assertSame(1, $arr[2]); - $arr []= '2'; - $this->assertSame(2, $arr[3]); $arr []= '3.1'; - $this->assertSame(3, $arr[4]); $arr []= MAX_INT64_STRING; - $this->assertSame(MAX_INT64, $arr[5]); $arr []= MIN_INT64_STRING; - $this->assertEquals(MIN_INT64, $arr[6]); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_INT64, $arr[0]); + $this->assertSame(MIN_INT64, $arr[1]); + $this->assertSame('1', $arr[2]); + $this->assertSame('2', $arr[3]); + $this->assertSame('3', $arr[4]); + $this->assertSame(MAX_INT64_STRING, $arr[5]); + $this->assertSame(MIN_INT64_STRING, $arr[6]); + } else { + $this->assertSame(MAX_INT64, $arr[0]); + $this->assertSame(MIN_INT64, $arr[1]); + $this->assertSame(1, $arr[2]); + $this->assertSame(2, $arr[3]); + $this->assertSame(3, $arr[4]); + $this->assertSame(MAX_INT64, $arr[5]); + $this->assertSame(MIN_INT64, $arr[6]); + } + $this->assertEquals(7, count($arr)); for ($i = 0; $i < count($arr); $i++) { $arr[$i] = 0; - $this->assertSame(0, $arr[$i]); + if (PHP_INT_SIZE == 4) { + $this->assertSame('0', $arr[$i]); + } else { + $this->assertSame(0, $arr[$i]); + } } // Test set. $arr [0]= MAX_INT64; - $this->assertSame(MAX_INT64, $arr[0]); $arr [1]= MIN_INT64; - $this->assertEquals(MIN_INT64, $arr[1]); - $arr [2]= 1.1; - $this->assertSame(1, $arr[2]); - $arr [3]= '2'; - $this->assertSame(2, $arr[3]); $arr [4]= '3.1'; - $this->assertSame(3, $arr[4]); $arr [5]= MAX_INT64_STRING; - $this->assertSame(MAX_INT64, $arr[5]); $arr [6]= MIN_INT64_STRING; - $this->assertEquals(MIN_INT64, $arr[6]); + + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_INT64_STRING, $arr[0]); + $this->assertSame(MIN_INT64_STRING, $arr[1]); + $this->assertSame('1', $arr[2]); + $this->assertSame('2', $arr[3]); + $this->assertSame('3', $arr[4]); + $this->assertSame(MAX_INT64_STRING, $arr[5]); + $this->assertEquals(MIN_INT64_STRING, $arr[6]); + } else { + $this->assertSame(MAX_INT64, $arr[0]); + $this->assertSame(MIN_INT64, $arr[1]); + $this->assertSame(1, $arr[2]); + $this->assertSame(2, $arr[3]); + $this->assertSame(3, $arr[4]); + $this->assertSame(MAX_INT64, $arr[5]); + $this->assertEquals(MIN_INT64, $arr[6]); + } } /** @@ -315,38 +337,57 @@ class RepeatedFieldTest extends PHPUnit_Framework_TestCase // Test append. $arr []= MAX_UINT64; - $this->assertEquals(MAX_UINT64, $arr[0]); - $arr []= 1.1; - $this->assertSame(1, $arr[1]); - $arr []= '2'; - $this->assertSame(2, $arr[2]); $arr []= '3.1'; - $this->assertSame(3, $arr[3]); $arr []= MAX_UINT64_STRING; - $this->assertEquals(MAX_UINT64, $arr[4]); - $this->assertEquals(5, count($arr)); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_UINT64_STRING, $arr[0]); + $this->assertSame('1', $arr[1]); + $this->assertSame('2', $arr[2]); + $this->assertSame('3', $arr[3]); + $this->assertSame(MAX_UINT64_STRING, $arr[4]); + } else { + $this->assertSame(MAX_UINT64, $arr[0]); + $this->assertSame(1, $arr[1]); + $this->assertSame(2, $arr[2]); + $this->assertSame(3, $arr[3]); + $this->assertSame(MAX_UINT64, $arr[4]); + $this->assertSame(5, count($arr)); + } + + $this->assertSame(5, count($arr)); for ($i = 0; $i < count($arr); $i++) { $arr[$i] = 0; - $this->assertSame(0, $arr[$i]); + if (PHP_INT_SIZE == 4) { + $this->assertSame('0', $arr[$i]); + } else { + $this->assertSame(0, $arr[$i]); + } } // Test set. $arr [0]= MAX_UINT64; - $this->assertEquals(MAX_UINT64, $arr[0]); - $arr [1]= 1.1; - $this->assertSame(1, $arr[1]); - $arr [2]= '2'; - $this->assertSame(2, $arr[2]); $arr [3]= '3.1'; - $this->assertSame(3, $arr[3]); $arr [4]= MAX_UINT64_STRING; - $this->assertEquals(MAX_UINT64, $arr[4]); + + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_UINT64_STRING, $arr[0]); + $this->assertSame('1', $arr[1]); + $this->assertSame('2', $arr[2]); + $this->assertSame('3', $arr[3]); + $this->assertSame(MAX_UINT64_STRING, $arr[4]); + } else { + $this->assertSame(MAX_UINT64, $arr[0]); + $this->assertSame(1, $arr[1]); + $this->assertSame(2, $arr[2]); + $this->assertSame(3, $arr[3]); + $this->assertSame(MAX_UINT64, $arr[4]); + } } /** diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php index d1a0bd51c..b3ecd3a11 100644 --- a/php/tests/generated_class_test.php +++ b/php/tests/generated_class_test.php @@ -148,17 +148,40 @@ class GeneratedClassTest extends PHPUnit_Framework_TestCase // Set float. $m->setOptionalInt64(1.1); - $this->assertSame(1, $m->getOptionalInt64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('1', $m->getOptionalInt64()); + } else { + $this->assertSame(1, $m->getOptionalInt64()); + } // Set string. $m->setOptionalInt64('2'); - $this->assertSame(2, $m->getOptionalInt64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('2', $m->getOptionalInt64()); + } else { + $this->assertSame(2, $m->getOptionalInt64()); + } + $m->setOptionalInt64('3.1'); - $this->assertSame(3, $m->getOptionalInt64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('3', $m->getOptionalInt64()); + } else { + $this->assertSame(3, $m->getOptionalInt64()); + } + $m->setOptionalInt64(MAX_INT64_STRING); - $this->assertSame(MAX_INT64, $m->getOptionalInt64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_INT64_STRING, $m->getOptionalInt64()); + } else { + $this->assertSame(MAX_INT64, $m->getOptionalInt64()); + } + $m->setOptionalInt64(MIN_INT64_STRING); - $this->assertEquals(MIN_INT64, $m->getOptionalInt64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MIN_INT64_STRING, $m->getOptionalInt64()); + } else { + $this->assertSame(MIN_INT64, $m->getOptionalInt64()); + } } /** @@ -189,19 +212,41 @@ class GeneratedClassTest extends PHPUnit_Framework_TestCase // Set integer. $m->setOptionalUint64(MAX_UINT64); - $this->assertEquals(MAX_UINT64, $m->getOptionalUint64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_UINT64_STRING, $m->getOptionalUint64()); + } else { + $this->assertSame(MAX_UINT64, $m->getOptionalUint64()); + } // Set float. $m->setOptionalUint64(1.1); - $this->assertSame(1, $m->getOptionalUint64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('1', $m->getOptionalUint64()); + } else { + $this->assertSame(1, $m->getOptionalUint64()); + } // Set string. $m->setOptionalUint64('2'); - $this->assertSame(2, $m->getOptionalUint64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('2', $m->getOptionalUint64()); + } else { + $this->assertSame(2, $m->getOptionalUint64()); + } + $m->setOptionalUint64('3.1'); - $this->assertSame(3, $m->getOptionalUint64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('3', $m->getOptionalUint64()); + } else { + $this->assertSame(3, $m->getOptionalUint64()); + } + $m->setOptionalUint64(MAX_UINT64_STRING); - $this->assertEquals(MAX_UINT64, $m->getOptionalUint64()); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_UINT64_STRING, $m->getOptionalUint64()); + } else { + $this->assertSame(MAX_UINT64, $m->getOptionalUint64()); + } } /** diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php index d79d0da3f..4e42361d4 100644 --- a/php/tests/map_field_test.php +++ b/php/tests/map_field_test.php @@ -205,9 +205,14 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { // Test integer argument. $arr[MAX_INT64] = MAX_INT64; - $this->assertSame(MAX_INT64, $arr[MAX_INT64]); $arr[MIN_INT64] = MIN_INT64; - $this->assertEquals(MIN_INT64, $arr[MIN_INT64]); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]); + $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]); + } else { + $this->assertSame(MAX_INT64, $arr[MAX_INT64]); + $this->assertSame(MIN_INT64, $arr[MIN_INT64]); + } $this->assertEquals(2, count($arr)); unset($arr[MAX_INT64]); unset($arr[MIN_INT64]); @@ -215,20 +220,31 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { // Test float argument. $arr[1.1] = 1.1; - $this->assertSame(1, $arr[1]); + if (PHP_INT_SIZE == 4) { + $this->assertSame('1', $arr['1']); + } else { + $this->assertSame(1, $arr[1]); + } $this->assertEquals(1, count($arr)); unset($arr[1.1]); $this->assertEquals(0, count($arr)); // Test string argument. $arr['2'] = '2'; - $this->assertSame(2, $arr[2]); $arr['3.1'] = '3.1'; - $this->assertSame(3, $arr[3]); $arr[MAX_INT64_STRING] = MAX_INT64_STRING; - $this->assertSame(MAX_INT64, $arr[MAX_INT64]); $arr[MIN_INT64_STRING] = MIN_INT64_STRING; - $this->assertEquals(MIN_INT64, $arr[MIN_INT64]); + if (PHP_INT_SIZE == 4) { + $this->assertSame('2', $arr['2']); + $this->assertSame('3', $arr['3']); + $this->assertSame(MAX_INT64_STRING, $arr[MAX_INT64_STRING]); + $this->assertSame(MIN_INT64_STRING, $arr[MIN_INT64_STRING]); + } else { + $this->assertSame(2, $arr[2]); + $this->assertSame(3, $arr[3]); + $this->assertSame(MAX_INT64, $arr[MAX_INT64]); + $this->assertSame(MIN_INT64, $arr[MIN_INT64]); + } $this->assertEquals(4, count($arr)); unset($arr['2']); unset($arr['3.1']); @@ -282,25 +298,41 @@ class MapFieldTest extends PHPUnit_Framework_TestCase { // Test integer argument. $arr[MAX_UINT64] = MAX_UINT64; - $this->assertEquals(MAX_UINT64, $arr[MAX_UINT64]); + if (PHP_INT_SIZE == 4) { + $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]); + } else { + $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]); + } $this->assertEquals(1, count($arr)); unset($arr[MAX_UINT64]); $this->assertEquals(0, count($arr)); // Test float argument. $arr[1.1] = 1.1; - $this->assertSame(1, $arr[1]); + if (PHP_INT_SIZE == 4) { + $this->assertSame('1', $arr['1']); + } else { + $this->assertSame(1, $arr[1]); + } $this->assertEquals(1, count($arr)); unset($arr[1.1]); $this->assertEquals(0, count($arr)); // Test string argument. $arr['2'] = '2'; - $this->assertSame(2, $arr[2]); $arr['3.1'] = '3.1'; - $this->assertSame(3, $arr[3]); $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING; - $this->assertEquals(MAX_UINT64, $arr[MAX_UINT64]); + + if (PHP_INT_SIZE == 4) { + $this->assertSame('2', $arr['2']); + $this->assertSame('3', $arr['3']); + $this->assertSame(MAX_UINT64_STRING, $arr[MAX_UINT64_STRING]); + } else { + $this->assertSame(2, $arr[2]); + $this->assertSame(3, $arr[3]); + $this->assertSame(MAX_UINT64, $arr[MAX_UINT64]); + } + $this->assertEquals(3, count($arr)); unset($arr['2']); unset($arr['3.1']); diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php index 82941dd27..485956cc1 100644 --- a/php/tests/php_implementation_test.php +++ b/php/tests/php_implementation_test.php @@ -9,14 +9,10 @@ use Foo\TestMessage_Sub; use Foo\TestPackedMessage; use Google\Protobuf\Internal\InputStream; use Google\Protobuf\Internal\FileDescriptorSet; -use Google\Protobuf\Internal\GPBUtil; -use Google\Protobuf\Internal\Int64; -use Google\Protobuf\Internal\Uint64; use Google\Protobuf\Internal\GPBLabel; use Google\Protobuf\Internal\GPBType; use Google\Protobuf\Internal\GPBWire; use Google\Protobuf\Internal\OutputStream; -use Google\Protobuf\Internal\RepeatedField; class ImplementationTest extends TestBase { @@ -68,17 +64,17 @@ class ImplementationTest extends TestBase // Positive number. $input = new InputStream(hex2bin("01")); GPBWire::readInt64($input, $value); - $this->assertSame(1, $value->toInteger()); + $this->assertEquals(1, $value); // Negative number. $input = new InputStream(hex2bin("ffffffffffffffffff01")); GPBWire::readInt64($input, $value); - $this->assertSame(-1, $value->toInteger()); + $this->assertEquals(-1, $value); // Discard overflow bits. $input = new InputStream(hex2bin("ffffffffffffffffff0f")); GPBWire::readInt64($input, $value); - $this->assertSame(-1, $value->toInteger()); + $this->assertEquals(-1, $value); } public function testReadUint64() @@ -88,17 +84,17 @@ class ImplementationTest extends TestBase // Positive number. $input = new InputStream(hex2bin("01")); GPBWire::readUint64($input, $value); - $this->assertSame(1, $value->toInteger()); + $this->assertEquals(1, $value); // Negative number. $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF01")); GPBWire::readUint64($input, $value); - $this->assertSame(-1, $value->toInteger()); + $this->assertEquals(-1, $value); // Discard overflow bits. $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F")); GPBWire::readUint64($input, $value); - $this->assertSame(-1, $value->toInteger()); + $this->assertEquals(-1, $value); } public function testReadSint32() @@ -124,15 +120,15 @@ class ImplementationTest extends TestBase $input = new InputStream(hex2bin("00")); GPBWire::readSint64($input, $value); - $this->assertEquals(GPBUtil::Int64(0), $value); + $this->assertEquals(0, $value); $input = new InputStream(hex2bin("01")); GPBWire::readSint64($input, $value); - $this->assertEquals(GPBUtil::Int64(-1), $value); + $this->assertEquals(-1, $value); $input = new InputStream(hex2bin("02")); GPBWire::readSint64($input, $value); - $this->assertEquals(GPBUtil::Int64(1), $value); + $this->assertEquals(1, $value); } public function testReadFixed32() @@ -148,7 +144,11 @@ class ImplementationTest extends TestBase $value = null; $input = new InputStream(hex2bin("1234567812345678")); GPBWire::readFixed64($input, $value); - $this->assertEquals(Uint64::newValue(0x78563412, 0x78563412), $value); + if (PHP_INT_SIZE == 4) { + $this->assertSame("8671175386481439762", $value); + } else { + $this->assertSame(0x7856341278563412, $value); + } } public function testReadSfixed32() @@ -193,7 +193,11 @@ class ImplementationTest extends TestBase $value = null; $input = new InputStream(hex2bin("1234567812345678")); GPBWire::readSfixed64($input, $value); - $this->assertEquals(Int64::newValue(0x78563412, 0x78563412), $value); + if (PHP_INT_SIZE == 4) { + $this->assertSame("8671175386481439762", $value); + } else { + $this->assertSame(0x7856341278563412, $value); + } } public function testZigZagEncodeDecode() @@ -214,43 +218,65 @@ class ImplementationTest extends TestBase $this->assertSame(0x3FFFFFFF, GPBWire::zigZagDecode32(0x7FFFFFFE)); $this->assertSame(-1073741824, GPBWire::zigZagDecode32(0x7FFFFFFF)); $this->assertSame(0x7FFFFFFF, GPBWire::zigZagDecode32(0xFFFFFFFE)); - $this->assertSame(-2147483648, GPBWire::zigZagDecode32(0xFFFFFFFF)); + $this->assertSame((int)-2147483648,GPBWire::zigZagDecode32(0xFFFFFFFF)); - $this->assertEquals(GPBUtil::Uint64(0), - GPBWire::zigZagEncode64(GPBUtil::Int64(0))); - $this->assertEquals(GPBUtil::Uint64(1), - GPBWire::zigZagEncode64(GPBUtil::Int64(-1))); - $this->assertEquals(GPBUtil::Uint64(2), - GPBWire::zigZagEncode64(GPBUtil::Int64(1))); - $this->assertEquals(GPBUtil::Uint64(3), - GPBWire::zigZagEncode64(GPBUtil::Int64(-2))); - $this->assertEquals( - GPBUtil::Uint64(0x000000007FFFFFFE), - GPBWire::zigZagEncode64(GPBUtil::Int64(0x000000003FFFFFFF))); - $this->assertEquals( - GPBUtil::Uint64(0x000000007FFFFFFF), - GPBWire::zigZagEncode64(GPBUtil::Int64(0xFFFFFFFFC0000000))); - $this->assertEquals( - GPBUtil::Uint64(0x00000000FFFFFFFE), - GPBWire::zigZagEncode64(GPBUtil::Int64(0x000000007FFFFFFF))); - $this->assertEquals( - GPBUtil::Uint64(0x00000000FFFFFFFF), - GPBWire::zigZagEncode64(GPBUtil::Int64(0xFFFFFFFF80000000))); - $this->assertEquals( - Uint64::newValue(4294967295, 4294967294), - GPBWire::zigZagEncode64(GPBUtil::Int64(0x7FFFFFFFFFFFFFFF))); - $this->assertEquals( - Uint64::newValue(4294967295, 4294967295), - GPBWire::zigZagEncode64(GPBUtil::Int64(0x8000000000000000))); + if (PHP_INT_SIZE == 4) { + $this->assertSame('0', GPBWire::zigZagEncode64(0)); + $this->assertSame('1', GPBWire::zigZagEncode64(-1)); + $this->assertSame('2', GPBWire::zigZagEncode64(1)); + $this->assertSame('3', GPBWire::zigZagEncode64(-2)); + $this->assertSame( + '2147483646', // 0x7FFFFFE + GPBWire::zigZagEncode64(0x3FFFFFFF)); + $this->assertSame( + '2147483647', // 0x7FFFFFF + GPBWire::zigZagEncode64(-1073741824)); // 0xFFFFFFFFC0000000 + $this->assertSame( + '4294967294', // 0xFFFFFFFE + GPBWire::zigZagEncode64(2147483647)); // 0x7FFFFFFF + $this->assertSame( + '4294967295', // 0xFFFFFFFF + GPBWire::zigZagEncode64(-2147483648)); // 0xFFFFFFFF80000000 + $this->assertSame( + '18446744073709551614', // 0xFFFFFFFFFFFFFFFE + // 0x7FFFFFFFFFFFFFFF + GPBWire::zigZagEncode64("9223372036854775807")); + $this->assertSame( + '18446744073709551615', // 0xFFFFFFFFFFFFFFFF + // 0x8000000000000000 + GPBWire::zigZagEncode64("-9223372036854775808")); - $this->assertEquals(GPBUtil::Int64(0), - GPBWire::zigZagDecode64(GPBUtil::Uint64(0))); - $this->assertEquals(GPBUtil::Int64(-1), - GPBWire::zigZagDecode64(GPBUtil::Uint64(1))); - $this->assertEquals(GPBUtil::Int64(1), - GPBWire::zigZagDecode64(GPBUtil::Uint64(2))); - $this->assertEquals(GPBUtil::Int64(-2), - GPBWire::zigZagDecode64(GPBUtil::Uint64(3))); + $this->assertSame('0', GPBWire::zigZagDecode64(0)); + $this->assertSame('-1', GPBWire::zigZagDecode64(1)); + $this->assertSame('1', GPBWire::zigZagDecode64(2)); + $this->assertSame('-2', GPBWire::zigZagDecode64(3)); + } else { + $this->assertSame(0, GPBWire::zigZagEncode64(0)); + $this->assertSame(1, GPBWire::zigZagEncode64(-1)); + $this->assertSame(2, GPBWire::zigZagEncode64(1)); + $this->assertSame(3, GPBWire::zigZagEncode64(-2)); + $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode64(0x3FFFFFFF)); + $this->assertSame( + 0x7FFFFFFF, + GPBWire::zigZagEncode64(0xFFFFFFFFC0000000)); + $this->assertSame( + 0xFFFFFFFE, + GPBWire::zigZagEncode64(0x7FFFFFFF)); + $this->assertSame( + 0xFFFFFFFF, + GPBWire::zigZagEncode64(0xFFFFFFFF80000000)); + $this->assertSame( + -2, // 0xFFFFFFFFFFFFFFFE + GPBWire::zigZagEncode64(0x7FFFFFFFFFFFFFFF)); + $this->assertSame( + -1, // 0xFFFFFFFFFFFFFFFF + GPBWire::zigZagEncode64(0x8000000000000000)); + + $this->assertSame(0, GPBWire::zigZagDecode64(0)); + $this->assertSame(-1, GPBWire::zigZagDecode64(1)); + $this->assertSame(1, GPBWire::zigZagDecode64(2)); + $this->assertSame(-2, GPBWire::zigZagDecode64(3)); + } // Round trip $this->assertSame(0, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(0))); @@ -319,15 +345,27 @@ class ImplementationTest extends TestBase // Normal case. $input = new InputStream(hex2bin('808001')); $this->assertTrue($input->readVarint64($var)); - $this->assertSame(16384, $var->toInteger()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('16384', $var); + } else { + $this->assertSame(16384, $var); + } $this->assertFalse($input->readVarint64($var)); // Read two varint. $input = new InputStream(hex2bin('808001808002')); $this->assertTrue($input->readVarint64($var)); - $this->assertSame(16384, $var->toInteger()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('16384', $var); + } else { + $this->assertSame(16384, $var); + } $this->assertTrue($input->readVarint64($var)); - $this->assertSame(32768, $var->toInteger()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('32768', $var); + } else { + $this->assertSame(32768, $var); + } $this->assertFalse($input->readVarint64($var)); } diff --git a/php/tests/test_base.php b/php/tests/test_base.php index 25f18f74f..498860506 100644 --- a/php/tests/test_base.php +++ b/php/tests/test_base.php @@ -13,22 +13,28 @@ class TestBase extends PHPUnit_Framework_TestCase public function expectFields(TestMessage $m) { - $this->assertSame(-42, $m->getOptionalInt32()); - $this->assertSame(42, $m->getOptionalUint32()); - $this->assertSame(-43, $m->getOptionalInt64()); - $this->assertSame(43, $m->getOptionalUint64()); $this->assertSame(-44, $m->getOptionalSint32()); - $this->assertSame(-45, $m->getOptionalSint64()); $this->assertSame(46, $m->getOptionalFixed32()); - $this->assertSame(47, $m->getOptionalFixed64()); $this->assertSame(-46, $m->getOptionalSfixed32()); - $this->assertSame(-47, $m->getOptionalSfixed64()); $this->assertSame(1.5, $m->getOptionalFloat()); $this->assertSame(1.6, $m->getOptionalDouble()); $this->assertSame(true, $m->getOptionalBool()); $this->assertSame('a', $m->getOptionalString()); $this->assertSame('b', $m->getOptionalBytes()); $this->assertSame(33, $m->getOptionalMessage()->getA()); + if (PHP_INT_SIZE == 4) { + $this->assertSame('-43', $m->getOptionalInt64()); + $this->assertSame('43', $m->getOptionalUint64()); + $this->assertSame('-45', $m->getOptionalSint64()); + $this->assertSame('47', $m->getOptionalFixed64()); + $this->assertSame('-47', $m->getOptionalSfixed64()); + } else { + $this->assertSame(-43, $m->getOptionalInt64()); + $this->assertSame(43, $m->getOptionalUint64()); + $this->assertSame(-45, $m->getOptionalSint64()); + $this->assertSame(47, $m->getOptionalFixed64()); + $this->assertSame(-47, $m->getOptionalSfixed64()); + } $this->assertEquals(-42, $m->getRepeatedInt32()[0]); $this->assertEquals(42, $m->getRepeatedUint32()[0]); diff --git a/php/tests/test_util.php b/php/tests/test_util.php index 2f6e4dd8b..7f2aae159 100644 --- a/php/tests/test_util.php +++ b/php/tests/test_util.php @@ -20,7 +20,7 @@ define('MAX_INT32', 2147483647); define('MAX_INT32_FLOAT', 2147483647.0); define('MAX_INT32_STRING', '2147483647'); -define('MIN_INT32', -2147483648); +define('MIN_INT32', (int)-2147483648); define('MIN_INT32_FLOAT', -2147483648.0); define('MIN_INT32_STRING', '-2147483648'); @@ -28,22 +28,23 @@ define('MAX_UINT32', 4294967295); define('MAX_UINT32_FLOAT', 4294967295.0); define('MAX_UINT32_STRING', '4294967295'); -define('MIN_UINT32', -2147483648); +define('MIN_UINT32', (int)-2147483648); define('MIN_UINT32_FLOAT', -2147483648.0); define('MIN_UINT32_STRING', '-2147483648'); -define('MAX_INT64', 9223372036854775807); -define('MAX_INT64_STRING', '9223372036854775807'); - -define('MIN_INT64_STRING', '-9223372036854775808'); -if (PHP_INT_SIZE === 8) { - define('MIN_INT64', -9223372036854775808); -} else { - define('MIN_INT64', MIN_INT64_STRING); -} - +define('MAX_INT64_STRING', '9223372036854775807'); +define('MIN_INT64_STRING', '-9223372036854775808'); define('MAX_UINT64_STRING', '-9223372036854775808'); -define('MAX_UINT64', MAX_UINT64_STRING); + +if (PHP_INT_SIZE === 8) { + define('MAX_INT64', (int)9223372036854775807); + define('MIN_INT64', (int)-9223372036854775808); + define('MAX_UINT64', (int)-9223372036854775808); +} else { + define('MAX_INT64', MAX_INT64_STRING); + define('MIN_INT64', MIN_INT64_STRING); + define('MAX_UINT64', MAX_UINT64_STRING); +} class TestUtil { @@ -129,16 +130,24 @@ class TestUtil public static function assertTestMessage(TestMessage $m) { + if (PHP_INT_SIZE == 4) { + assert('-43' === $m->getOptionalInt64()); + assert('43' === $m->getOptionalUint64()); + assert('-45' === $m->getOptionalSint64()); + assert('47' === $m->getOptionalFixed64()); + assert('-47' === $m->getOptionalSfixed64()); + } else { + assert(-43 === $m->getOptionalInt64()); + assert(43 === $m->getOptionalUint64()); + assert(-45 === $m->getOptionalSint64()); + assert(47 === $m->getOptionalFixed64()); + assert(-47 === $m->getOptionalSfixed64()); + } assert(-42 === $m->getOptionalInt32()); assert(42 === $m->getOptionalUint32()); - assert(-43 === $m->getOptionalInt64()); - assert(43 === $m->getOptionalUint64()); assert(-44 === $m->getOptionalSint32()); - assert(-45 === $m->getOptionalSint64()); assert(46 === $m->getOptionalFixed32()); - assert(47 === $m->getOptionalFixed64()); assert(-46 === $m->getOptionalSfixed32()); - assert(-47 === $m->getOptionalSfixed64()); assert(1.5 === $m->getOptionalFloat()); assert(1.6 === $m->getOptionalDouble()); assert(true=== $m->getOptionalBool()); @@ -147,16 +156,24 @@ class TestUtil assert(TestEnum::ONE === $m->getOptionalEnum()); assert(33 === $m->getOptionalMessage()->getA()); + if (PHP_INT_SIZE == 4) { + assert('-43' === $m->getRepeatedInt64()[0]); + assert('43' === $m->getRepeatedUint64()[0]); + assert('-45' === $m->getRepeatedSint64()[0]); + assert('47' === $m->getRepeatedFixed64()[0]); + assert('-47' === $m->getRepeatedSfixed64()[0]); + } else { + assert(-43 === $m->getRepeatedInt64()[0]); + assert(43 === $m->getRepeatedUint64()[0]); + assert(-45 === $m->getRepeatedSint64()[0]); + assert(47 === $m->getRepeatedFixed64()[0]); + assert(-47 === $m->getRepeatedSfixed64()[0]); + } assert(-42 === $m->getRepeatedInt32()[0]); assert(42 === $m->getRepeatedUint32()[0]); - assert(-43 === $m->getRepeatedInt64()[0]); - assert(43 === $m->getRepeatedUint64()[0]); assert(-44 === $m->getRepeatedSint32()[0]); - assert(-45 === $m->getRepeatedSint64()[0]); assert(46 === $m->getRepeatedFixed32()[0]); - assert(47 === $m->getRepeatedFixed64()[0]); assert(-46 === $m->getRepeatedSfixed32()[0]); - assert(-47 === $m->getRepeatedSfixed64()[0]); assert(1.5 === $m->getRepeatedFloat()[0]); assert(1.6 === $m->getRepeatedDouble()[0]); assert(true=== $m->getRepeatedBool()[0]); @@ -165,16 +182,24 @@ class TestUtil assert(TestEnum::ZERO === $m->getRepeatedEnum()[0]); assert(34 === $m->getRepeatedMessage()[0]->getA()); + if (PHP_INT_SIZE == 4) { + assert('-53' === $m->getRepeatedInt64()[1]); + assert('53' === $m->getRepeatedUint64()[1]); + assert('-55' === $m->getRepeatedSint64()[1]); + assert('57' === $m->getRepeatedFixed64()[1]); + assert('-57' === $m->getRepeatedSfixed64()[1]); + } else { + assert(-53 === $m->getRepeatedInt64()[1]); + assert(53 === $m->getRepeatedUint64()[1]); + assert(-55 === $m->getRepeatedSint64()[1]); + assert(57 === $m->getRepeatedFixed64()[1]); + assert(-57 === $m->getRepeatedSfixed64()[1]); + } assert(-52 === $m->getRepeatedInt32()[1]); assert(52 === $m->getRepeatedUint32()[1]); - assert(-53 === $m->getRepeatedInt64()[1]); - assert(53 === $m->getRepeatedUint64()[1]); assert(-54 === $m->getRepeatedSint32()[1]); - assert(-55 === $m->getRepeatedSint64()[1]); assert(56 === $m->getRepeatedFixed32()[1]); - assert(57 === $m->getRepeatedFixed64()[1]); assert(-56 === $m->getRepeatedSfixed32()[1]); - assert(-57 === $m->getRepeatedSfixed64()[1]); assert(2.5 === $m->getRepeatedFloat()[1]); assert(2.6 === $m->getRepeatedDouble()[1]); assert(false === $m->getRepeatedBool()[1]); @@ -183,14 +208,21 @@ class TestUtil assert(TestEnum::ONE === $m->getRepeatedEnum()[1]); assert(35 === $m->getRepeatedMessage()[1]->getA()); + if (PHP_INT_SIZE == 4) { + assert('-63' === $m->getMapInt64Int64()['-63']); + assert('63' === $m->getMapUint64Uint64()['63']); + assert('-65' === $m->getMapSint64Sint64()['-65']); + assert('67' === $m->getMapFixed64Fixed64()['67']); + } else { + assert(-63 === $m->getMapInt64Int64()[-63]); + assert(63 === $m->getMapUint64Uint64()[63]); + assert(-65 === $m->getMapSint64Sint64()[-65]); + assert(67 === $m->getMapFixed64Fixed64()[67]); + } assert(-62 === $m->getMapInt32Int32()[-62]); - assert(-63 === $m->getMapInt64Int64()[-63]); assert(62 === $m->getMapUint32Uint32()[62]); - assert(63 === $m->getMapUint64Uint64()[63]); assert(-64 === $m->getMapSint32Sint32()[-64]); - assert(-65 === $m->getMapSint64Sint64()[-65]); assert(66 === $m->getMapFixed32Fixed32()[66]); - assert(67 === $m->getMapFixed64Fixed64()[67]); assert(3.5 === $m->getMapInt32Float()[1]); assert(3.6 === $m->getMapInt32Double()[1]); assert(true === $m->getMapBoolBool()[true]); @@ -325,24 +357,14 @@ class TestUtil assert(-42 === $m->getRepeatedInt32()[0]); assert(-52 === $m->getRepeatedInt32()[1]); - assert(-43 === $m->getRepeatedInt64()[0]); - assert(-53 === $m->getRepeatedInt64()[1]); assert(42 === $m->getRepeatedUint32()[0]); assert(52 === $m->getRepeatedUint32()[1]); - assert(43 === $m->getRepeatedUint64()[0]); - assert(53 === $m->getRepeatedUint64()[1]); assert(-44 === $m->getRepeatedSint32()[0]); assert(-54 === $m->getRepeatedSint32()[1]); - assert(-45 === $m->getRepeatedSint64()[0]); - assert(-55 === $m->getRepeatedSint64()[1]); assert(46 === $m->getRepeatedFixed32()[0]); assert(56 === $m->getRepeatedFixed32()[1]); - assert(47 === $m->getRepeatedFixed64()[0]); - assert(57 === $m->getRepeatedFixed64()[1]); assert(-46 === $m->getRepeatedSfixed32()[0]); assert(-56 === $m->getRepeatedSfixed32()[1]); - assert(-47 === $m->getRepeatedSfixed64()[0]); - assert(-57 === $m->getRepeatedSfixed64()[1]); assert(1.5 === $m->getRepeatedFloat()[0]); assert(2.5 === $m->getRepeatedFloat()[1]); assert(1.6 === $m->getRepeatedDouble()[0]); @@ -351,6 +373,29 @@ class TestUtil assert(false === $m->getRepeatedBool()[1]); assert(TestEnum::ONE === $m->getRepeatedEnum()[0]); assert(TestEnum::ZERO === $m->getRepeatedEnum()[1]); + if (PHP_INT_SIZE == 4) { + assert('-43' === $m->getRepeatedInt64()[0]); + assert('-53' === $m->getRepeatedInt64()[1]); + assert('43' === $m->getRepeatedUint64()[0]); + assert('53' === $m->getRepeatedUint64()[1]); + assert('-45' === $m->getRepeatedSint64()[0]); + assert('-55' === $m->getRepeatedSint64()[1]); + assert('47' === $m->getRepeatedFixed64()[0]); + assert('57' === $m->getRepeatedFixed64()[1]); + assert('-47' === $m->getRepeatedSfixed64()[0]); + assert('-57' === $m->getRepeatedSfixed64()[1]); + } else { + assert(-43 === $m->getRepeatedInt64()[0]); + assert(-53 === $m->getRepeatedInt64()[1]); + assert(43 === $m->getRepeatedUint64()[0]); + assert(53 === $m->getRepeatedUint64()[1]); + assert(-45 === $m->getRepeatedSint64()[0]); + assert(-55 === $m->getRepeatedSint64()[1]); + assert(47 === $m->getRepeatedFixed64()[0]); + assert(57 === $m->getRepeatedFixed64()[1]); + assert(-47 === $m->getRepeatedSfixed64()[0]); + assert(-57 === $m->getRepeatedSfixed64()[1]); + } } public static function getGoldenTestPackedMessage() diff --git a/tests.sh b/tests.sh index fb7044f33..1335c06bf 100755 --- a/tests.sh +++ b/tests.sh @@ -358,6 +358,16 @@ use_php_zts() { ln -sfn "/usr/local/php-${VERSION}-zts/bin/phpize" $PHPIZE } +use_php_bc() { + VERSION=$1 + PHP=`which php` + PHP_CONFIG=`which php-config` + PHPIZE=`which phpize` + ln -sfn "/usr/local/php-${VERSION}-bc/bin/php" $PHP + ln -sfn "/usr/local/php-${VERSION}-bc/bin/php-config" $PHP_CONFIG + ln -sfn "/usr/local/php-${VERSION}-bc/bin/phpize" $PHPIZE +} + build_php5.5() { use_php 5.5 rm -rf vendor @@ -376,6 +386,13 @@ build_php5.5_zts_c() { cd php/tests && /bin/bash ./test.sh && cd ../.. } +build_php5.5_32() { + use_php_bc 5.5 + rm -rf vendor + cp -r /usr/local/vendor-5.5 vendor + ./vendor/bin/phpunit +} + build_php5.6() { use_php 5.6 rm -rf vendor @@ -429,6 +446,10 @@ build_php_all() { build_php5.5_zts_c } +build_php_all_32() { + build_php5.5_32 +} + # 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