From 08784ed58adfdb2ba82ea15e74825b599850b46c Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Fri, 10 Jan 2025 12:46:57 +0000 Subject: [PATCH] ext/zip: Add some tests for methods taking callbakcs --- ext/zip/tests/oo_cancel.phpt | 11 ++- ext/zip/tests/oo_cancel_non_int_return.phpt | 47 ++++++++++ ext/zip/tests/oo_cancel_trampoline.phpt | 97 +++++++++++++++++++++ ext/zip/tests/oo_progress.phpt | 11 ++- ext/zip/tests/oo_progress_trampoline.phpt | 97 +++++++++++++++++++++ 5 files changed, 257 insertions(+), 6 deletions(-) create mode 100644 ext/zip/tests/oo_cancel_non_int_return.phpt create mode 100644 ext/zip/tests/oo_cancel_trampoline.phpt create mode 100644 ext/zip/tests/oo_progress_trampoline.phpt diff --git a/ext/zip/tests/oo_cancel.phpt b/ext/zip/tests/oo_cancel.phpt index fa5fe92dada..85f418414d5 100644 --- a/ext/zip/tests/oo_cancel.phpt +++ b/ext/zip/tests/oo_cancel.phpt @@ -1,5 +1,5 @@ --TEST-- -registerCancelCallback +ZipArchive::registerCancelCallback() with a normal callback --EXTENSIONS-- zip --SKIPIF-- @@ -14,8 +14,6 @@ date.timezone=UTC $dirname = dirname(__FILE__) . '/'; $file = $dirname . '__tmp_oo_cancel.zip'; -@unlink($file); - $zip = new ZipArchive; if (!$zip->open($file, ZIPARCHIVE::CREATE)) { exit('failed'); @@ -33,6 +31,13 @@ var_dump($zip->getStatusString()); @unlink($file); ?> Done +--CLEAN-- + --EXPECTF-- bool(true) bool(true) diff --git a/ext/zip/tests/oo_cancel_non_int_return.phpt b/ext/zip/tests/oo_cancel_non_int_return.phpt new file mode 100644 index 00000000000..2f8c2beea91 --- /dev/null +++ b/ext/zip/tests/oo_cancel_non_int_return.phpt @@ -0,0 +1,47 @@ +--TEST-- +ZipArchive::registerCancelCallback() with a callback returning an incorrect type +--EXTENSIONS-- +zip +--SKIPIF-- + +--INI-- +date.timezone=UTC +--FILE-- +open($file, ZIPARCHIVE::CREATE)) { + exit('failed'); +} + +/* Register a bogus callback */ +var_dump($zip->registerCancelCallback(function () { + return []; +})); +var_dump($zip->addFromString(PHP_BINARY, 'entry #1')); + +var_dump($zip->close()); +var_dump($zip->status == ZipArchive::ER_CANCELLED); +var_dump($zip->getStatusString()); +@unlink($file); +?> +Done +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) +bool(true) +bool(false) +string(8) "No error" +Done diff --git a/ext/zip/tests/oo_cancel_trampoline.phpt b/ext/zip/tests/oo_cancel_trampoline.phpt new file mode 100644 index 00000000000..77a52637fc4 --- /dev/null +++ b/ext/zip/tests/oo_cancel_trampoline.phpt @@ -0,0 +1,97 @@ +--TEST-- +ZipArchive::registerCancelCallback() with a trampoline +--EXTENSIONS-- +zip +--SKIPIF-- + +--INI-- +date.timezone=UTC +--FILE-- +open($file, ZIPARCHIVE::CREATE)) { + exit('failed'); +} + +var_dump($zip->registerCancelCallback($callback)); +var_dump($zip->addFromString(PHP_BINARY, 'entry #1')); +var_dump($zip->close()); +var_dump($zip->status == ZipArchive::ER_CANCELLED); +var_dump($zip->getStatusString()); + +echo "Set trampoline after closed Archive:\n"; +try { + var_dump($zip->registerCancelCallback($callback)); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} + +@unlink($file); +unset($zip); + +$zip = new ZipArchive; +if (!$zip->open($file, ZIPARCHIVE::CREATE)) { + exit('failed'); +} + +var_dump($zip->registerCancelCallback($callbackThrow)); +var_dump($zip->addFromString(PHP_BINARY, 'entry #1')); +try { + var_dump($zip->close()); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} +var_dump($zip->status == ZipArchive::ER_CANCELLED); +var_dump($zip->getStatusString()); +@unlink($file); + +?> +Done +--CLEAN-- + +--EXPECTF-- +bool(true) +bool(true) +Trampoline for trampoline +array(0) { +} + +Warning: ZipArchive::close(): Operation cancelled in %s on line %d +bool(false) +bool(true) +string(19) "Operation cancelled" +Set trampoline after closed Archive: +ValueError: Invalid or uninitialized Zip object +bool(true) +bool(true) +Trampoline for trampolineThrow +Exception: boo +bool(false) +string(8) "No error" +Done diff --git a/ext/zip/tests/oo_progress.phpt b/ext/zip/tests/oo_progress.phpt index 690ef58a8f9..103a8556c2d 100644 --- a/ext/zip/tests/oo_progress.phpt +++ b/ext/zip/tests/oo_progress.phpt @@ -1,5 +1,5 @@ --TEST-- -registerProgressCallback +ZipArchive::registerProgressCallback() with a normal callback --EXTENSIONS-- zip --SKIPIF-- @@ -14,8 +14,6 @@ date.timezone=UTC $dirname = dirname(__FILE__) . '/'; $file = $dirname . '__tmp_oo_progress.zip'; -@unlink($file); - $zip = new ZipArchive; if (!$zip->open($file, ZIPARCHIVE::CREATE)) { exit('failed'); @@ -32,6 +30,13 @@ var_dump($zip->close()); unlink($file); ?> Done +--CLEAN-- + --EXPECT-- bool(true) bool(true) diff --git a/ext/zip/tests/oo_progress_trampoline.phpt b/ext/zip/tests/oo_progress_trampoline.phpt new file mode 100644 index 00000000000..f37bc26182d --- /dev/null +++ b/ext/zip/tests/oo_progress_trampoline.phpt @@ -0,0 +1,97 @@ +--TEST-- +ZipArchive::registerProgressCallback() with a trampoline +--EXTENSIONS-- +zip +--SKIPIF-- + +--INI-- +date.timezone=UTC +--FILE-- +open($file, ZIPARCHIVE::CREATE)) { + exit('failed'); +} +var_dump($zip->registerProgressCallback(0.5, $callback)); +var_dump($zip->addFromString('foo', 'entry #1')); +var_dump($zip->close()); + +echo "Set trampoline after closed Archive:\n"; +try { + var_dump($zip->registerProgressCallback(0.5, $callback)); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} + +unlink($file); +unset($zip); + +$zip = new ZipArchive; +if (!$zip->open($file, ZIPARCHIVE::CREATE)) { + exit('failed'); +} + +var_dump($zip->registerProgressCallback(0.5, $callbackThrow)); +var_dump($zip->addFromString('foo', 'entry #1')); +try { + var_dump($zip->close()); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} +unlink($file); +unset($zip); +?> +Done +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) +Trampoline for trampoline +array(1) { + [0]=> + float(0) +} +start +Trampoline for trampoline +array(1) { + [0]=> + float(1) +} +end +bool(true) +Set trampoline after closed Archive: +ValueError: Invalid or uninitialized Zip object +bool(true) +bool(true) +Trampoline for trampolineThrow +Exception: boo +Done