php-src/ext/zlib/tests/inflate_add_basic.phpt
Daniel Lowrey c488172975 Improve ZBLOCK handling with zlib < 1.2.4
The original commit for this issue (62b1293) assumed Z_BLOCK was
only defined in < 1.2.4. However, this flush type *is* defined but
is only unavailable for use with deflate().

This new commit correctly checks the ZLIB_VERNUM constant to
determine if Z_BLOCK flush is available for the current deflate()
operation and triggers an appropriate error as needed.

New ZLIB_VERSION and ZLIB_VERNUM constants are also exposed in
userland to allow testing this behavior in environments running
zlib < 1.2.4 (ZLIB_VERNUM check is needed).
2015-05-07 10:31:41 -04:00

74 lines
1.9 KiB
PHP

--TEST--
Test incremental inflate_add() functionality
--SKIPIF--
<?php
if (!extension_loaded("zlib")) {
print "skip - ZLIB extension not loaded";
}
?>
--FILE--
<?php
function inflateStream($mode, $flushSize) {
$buffer = "";
$inflated = null;
$resource = inflate_init($mode);
while (true) {
$dataToInflate = yield $inflated;
if (isset($dataToInflate)) {
$buffer .= $dataToInflate;
if (strlen($buffer) >= $flushSize) {
$inflated = inflate_add($resource, $buffer);
$buffer = "";
} else {
$inflated = null;
}
} else {
$inflated = inflate_add($resource, $buffer, ZLIB_FINISH);
}
}
}
$modes = [
'ZLIB_ENCODING_RAW' => ZLIB_ENCODING_RAW,
'ZLIB_ENCODING_GZIP' => ZLIB_ENCODING_GZIP,
'ZLIB_ENCODING_DEFLATE' => ZLIB_ENCODING_DEFLATE,
];
$flushSizes = [1, 4, 32768];
$flushTypes = [
'ZLIB_SYNC_FLUSH' => ZLIB_SYNC_FLUSH,
'ZLIB_PARTIAL_FLUSH' => ZLIB_PARTIAL_FLUSH,
'ZLIB_FULL_FLUSH' => ZLIB_FULL_FLUSH,
'ZLIB_NO_FLUSH' => ZLIB_NO_FLUSH,
'ZLIB_BLOCK' => ZLIB_BLOCK,
];
$uncompressed = "";
for ($i=0;$i<(32768*2);$i++) {
$uncompressed .= chr(rand(48,125));
}
foreach ($modes as $modeKey => $mode) {
$compressed = zlib_encode($uncompressed, $mode);
$compressedLen = strlen($compressed);
foreach ($flushSizes as $flushSize) {
foreach ($flushTypes as $flushTypeKey => $flushType) {
$inflated = "";
$stream = inflateStream($mode, $flushSize, $flushType);
for ($i=0;$i<$compressedLen;$i++) {
$inflated .= $stream->send($compressed[$i]);
}
$inflated .= $stream->send(null);
if ($inflated !== $uncompressed) {
echo "Error: {$modeKey} | {$flushSize} | {$flushTypeKey}\n";
}
}
}
}
?>
===DONE===
--EXPECTF--
===DONE===