diff --git a/shadow.c b/shadow.c index 3ad3d8a..7f1e904 100644 --- a/shadow.c +++ b/shadow.c @@ -1054,7 +1054,7 @@ static php_stream *shadow_dir_opener(php_stream_wrapper *wrapper, const char *pa php_stream *tempdir = NULL, *instdir, *mergestream; HashTable *mergedata; php_stream_dirent entry; - void *dummy = (void *)1; + // void *dummy = (void *)1; // Replaced by type_ptr_temp and type_ptr_inst char *templname = NULL; if(options & STREAM_USE_GLOB_DIR_OPEN) { @@ -1115,12 +1115,14 @@ static php_stream *shadow_dir_opener(php_stream_wrapper *wrapper, const char *pa tempdir->flags |= PHP_STREAM_FLAG_NO_BUFFER; ALLOC_HASHTABLE(mergedata); - zend_hash_init(mergedata, 10, NULL, NULL, 0); + zend_hash_init(mergedata, 10, NULL, NULL, 0); // Using NULL for dtor as type_ptr is simple while(php_stream_readdir(tempdir, &entry)) { - zend_hash_str_add_new_ptr(mergedata, entry.d_name, strlen(entry.d_name), &dummy); + void *type_ptr_temp = (void *)(uintptr_t)(entry.d_type + 1); + zend_hash_str_add_new_ptr(mergedata, entry.d_name, strlen(entry.d_name), type_ptr_temp); } while(php_stream_readdir(instdir, &entry)) { - zend_hash_str_update_ptr(mergedata, entry.d_name, strlen(entry.d_name), &dummy); + void *type_ptr_inst = (void *)(uintptr_t)(entry.d_type + 1); + zend_hash_str_update_ptr(mergedata, entry.d_name, strlen(entry.d_name), type_ptr_inst); } zend_hash_internal_pointer_reset(mergedata); php_stream_free(instdir, PHP_STREAM_FREE_CLOSE); @@ -1140,22 +1142,37 @@ static ssize_t shadow_dirstream_read(php_stream *stream, char *buf, size_t count { php_stream_dirent *ent = (php_stream_dirent*)buf; HashTable *mergedata = (HashTable *)stream->abstract; - zend_string *name = NULL; - zend_ulong num; + zend_string *current_entry_name_key = NULL; + zend_ulong current_entry_num_key; + void *current_entry_type_ptr; - /* avoid problems if someone mis-uses the stream */ - if (count != sizeof(php_stream_dirent)) + if (count != sizeof(php_stream_dirent)) { /* avoid problems if someone mis-uses the stream */ return 0; + } - if (zend_hash_get_current_key(mergedata, &name, &num) != HASH_KEY_IS_STRING) { - return 0; + current_entry_type_ptr = zend_hash_get_current_data_ptr(mergedata); // Get data for current entry + if (zend_hash_get_current_key(mergedata, ¤t_entry_name_key, ¤t_entry_num_key) != HASH_KEY_IS_STRING) { + return 0; // No more entries or error } - if(!ZSTR_VAL(name) || !ZSTR_LEN(name)) { + + // It's good practice to check if current_entry_name_key is not NULL and has a valid length, + // though HASH_KEY_IS_STRING should generally ensure ZSTR_VAL is safe. + if (!current_entry_name_key || ZSTR_LEN(current_entry_name_key) == 0) { + // This might indicate an issue or an empty key, though rare for directory entries. return 0; } - zend_hash_move_forward(mergedata); - PHP_STRLCPY(ent->d_name, ZSTR_VAL(name), sizeof(ent->d_name), ZSTR_LEN(name)); + PHP_STRLCPY(ent->d_name, ZSTR_VAL(current_entry_name_key), sizeof(ent->d_name), ZSTR_LEN(current_entry_name_key)); + + if (current_entry_type_ptr) { + ent->d_type = (unsigned char)((uintptr_t)current_entry_type_ptr - 1); + } else { + // This case should ideally not be reached if the key was valid and data was stored. + // Default to DT_UNKNOWN if something went wrong during storage or retrieval. + ent->d_type = 0; // DT_UNKNOWN is often 0 + } + + zend_hash_move_forward(mergedata); return sizeof(php_stream_dirent); } diff --git a/tests/fixtures/instance/api/rest.php b/tests/fixtures/instance/api/rest.php new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/instance/mixtype_test/instance_dir/.gitkeep b/tests/fixtures/instance/mixtype_test/instance_dir/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/instance/mixtype_test/instance_file.txt b/tests/fixtures/instance/mixtype_test/instance_file.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/instance/mixtype_test/shared_dir/another_instance_file_in_shared_dir.txt b/tests/fixtures/instance/mixtype_test/shared_dir/another_instance_file_in_shared_dir.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/instance/mixtype_test/shared_dir/shared_dir_instance_file.txt b/tests/fixtures/instance/mixtype_test/shared_dir/shared_dir_instance_file.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/instance/mixtype_test/shared_file.txt b/tests/fixtures/instance/mixtype_test/shared_file.txt new file mode 100644 index 0000000..13b2a10 --- /dev/null +++ b/tests/fixtures/instance/mixtype_test/shared_file.txt @@ -0,0 +1 @@ +instance diff --git a/tests/fixtures/templatedir/api/rest.php b/tests/fixtures/templatedir/api/rest.php new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/templatedir/mixtype_test/shared_dir/shared_dir_template_file.txt b/tests/fixtures/templatedir/mixtype_test/shared_dir/shared_dir_template_file.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/templatedir/mixtype_test/shared_file.txt b/tests/fixtures/templatedir/mixtype_test/shared_file.txt new file mode 100644 index 0000000..3236cba --- /dev/null +++ b/tests/fixtures/templatedir/mixtype_test/shared_file.txt @@ -0,0 +1 @@ +template diff --git a/tests/fixtures/templatedir/mixtype_test/template_dir/.gitkeep b/tests/fixtures/templatedir/mixtype_test/template_dir/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/fixtures/templatedir/mixtype_test/template_file.txt b/tests/fixtures/templatedir/mixtype_test/template_file.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/iterator_child_types.diff b/tests/iterator_child_types.diff new file mode 100644 index 0000000..97159b6 --- /dev/null +++ b/tests/iterator_child_types.diff @@ -0,0 +1,14 @@ +-- + Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + + Iterating: %s/instance/mixtype_test (SELF_FIRST) +012- Path: ., Type: dir, isDir: 1, isFile: 0 +012+ Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + Path: instance_dir, Type: dir, isDir: 1, isFile: 0 + Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 + Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +-- + Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 + Path: template_dir, Type: dir, isDir: 1, isFile: 0 + Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +023- Path: template_file.txt, Type: file, isDir: 0, isFile: 1 diff --git a/tests/iterator_child_types.exp b/tests/iterator_child_types.exp new file mode 100644 index 0000000..e2bf284 --- /dev/null +++ b/tests/iterator_child_types.exp @@ -0,0 +1,23 @@ +Iterating: %s/instance/mixtype_test (LEAVES_ONLY) +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + +Iterating: %s/instance/mixtype_test (SELF_FIRST) +Path: ., Type: dir, isDir: 1, isFile: 0 +Path: instance_dir, Type: dir, isDir: 1, isFile: 0 +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir, Type: dir, isDir: 1, isFile: 0 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir, Type: dir, isDir: 1, isFile: 0 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 \ No newline at end of file diff --git a/tests/iterator_child_types.log b/tests/iterator_child_types.log new file mode 100644 index 0000000..ece1270 --- /dev/null +++ b/tests/iterator_child_types.log @@ -0,0 +1,49 @@ + +---- EXPECTED OUTPUT +Iterating: %s/instance/mixtype_test (LEAVES_ONLY) +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + +Iterating: %s/instance/mixtype_test (SELF_FIRST) +Path: ., Type: dir, isDir: 1, isFile: 0 +Path: instance_dir, Type: dir, isDir: 1, isFile: 0 +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir, Type: dir, isDir: 1, isFile: 0 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir, Type: dir, isDir: 1, isFile: 0 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 +---- ACTUAL OUTPUT +Iterating: /app/tests/fixtures/instance/mixtype_test (LEAVES_ONLY) +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + +Iterating: /app/tests/fixtures/instance/mixtype_test (SELF_FIRST) +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: instance_dir, Type: dir, isDir: 1, isFile: 0 +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir, Type: dir, isDir: 1, isFile: 0 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir, Type: dir, isDir: 1, isFile: 0 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +---- FAILED diff --git a/tests/iterator_child_types.out b/tests/iterator_child_types.out new file mode 100644 index 0000000..62dac24 --- /dev/null +++ b/tests/iterator_child_types.out @@ -0,0 +1,22 @@ +Iterating: /app/tests/fixtures/instance/mixtype_test (LEAVES_ONLY) +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + +Iterating: /app/tests/fixtures/instance/mixtype_test (SELF_FIRST) +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: instance_dir, Type: dir, isDir: 1, isFile: 0 +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir, Type: dir, isDir: 1, isFile: 0 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir, Type: dir, isDir: 1, isFile: 0 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 \ No newline at end of file diff --git a/tests/iterator_child_types.php b/tests/iterator_child_types.php new file mode 100644 index 0000000..9b27218 --- /dev/null +++ b/tests/iterator_child_types.php @@ -0,0 +1,72 @@ +getPathname())); + $actual_items_leaves[] = sprintf("Path: %s, Type: %s, isDir: %d, isFile: %d", + $relativePath, + $item->getType(), + $item->isDir(), + $item->isFile() + ); +} +sort($actual_items_leaves); +foreach($actual_items_leaves as $line) { + echo $line . "\n"; +} + +echo "\nIterating: $iteratePath (SELF_FIRST)\n"; +$iterator_self = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($iteratePath, FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), + RecursiveIteratorIterator::SELF_FIRST +); + +$actual_items_self = []; +foreach ($iterator_self as $item) { + $fullPath = str_replace('\\', '/', $item->getPathname()); + $relativePathOrSelf = $fullPath; + if (strpos($fullPath, $iteratePath . '/') === 0) { + $relativePathOrSelf = str_replace($iteratePath . '/', '', $fullPath); + } elseif ($fullPath === $iteratePath) { + $relativePathOrSelf = '.'; // Represent the directory itself + } + + $actual_items_self[] = sprintf("Path: %s, Type: %s, isDir: %d, isFile: %d", + $relativePathOrSelf, + $item->getType(), + $item->isDir(), + $item->isFile() + ); +} +// Do not sort $actual_items_self to preserve SELF_FIRST order for the parent +// but sort children to make EXPECTF stable for them. +$self_entry_output = ''; +$children_output_self = []; +if (!empty($actual_items_self)) { + $self_entry_output = array_shift($actual_items_self) . "\n"; // First entry (should be self) + sort($actual_items_self); // Sort remaining children + foreach($actual_items_self as $line) { + $children_output_self[] = $line . "\n"; + } +} +echo $self_entry_output; +foreach($children_output_self as $line) { + echo $line; +} + +?> diff --git a/tests/iterator_child_types.phpt b/tests/iterator_child_types.phpt new file mode 100644 index 0000000..78518a7 --- /dev/null +++ b/tests/iterator_child_types.phpt @@ -0,0 +1,101 @@ +--TEST-- +Check iterator child entry type correctness +--SKIPIF-- + +--FILE-- +getPathname())); + $actual_items_leaves[] = sprintf("Path: %s, Type: %s, isDir: %d, isFile: %d", + $relativePath, + $item->getType(), + $item->isDir(), + $item->isFile() + ); +} +sort($actual_items_leaves); +foreach($actual_items_leaves as $line) { + echo $line . "\n"; +} + +echo "\nIterating: $iteratePath (SELF_FIRST)\n"; +$iterator_self = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($iteratePath, FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS), + RecursiveIteratorIterator::SELF_FIRST +); + +$actual_items_self = []; +foreach ($iterator_self as $item) { + $fullPath = str_replace('\\', '/', $item->getPathname()); + $relativePathOrSelf = $fullPath; + if (strpos($fullPath, $iteratePath . '/') === 0) { + $relativePathOrSelf = str_replace($iteratePath . '/', '', $fullPath); + } elseif ($fullPath === $iteratePath) { + $relativePathOrSelf = '.'; // Represent the directory itself + } + + $actual_items_self[] = sprintf("Path: %s, Type: %s, isDir: %d, isFile: %d", + $relativePathOrSelf, + $item->getType(), + $item->isDir(), + $item->isFile() + ); +} +// Do not sort $actual_items_self to preserve SELF_FIRST order for the parent +// but sort children to make EXPECTF stable for them. +$self_entry_output = ''; +$children_output_self = []; +if (!empty($actual_items_self)) { + $self_entry_output = array_shift($actual_items_self) . "\n"; // First entry (should be self) + sort($actual_items_self); // Sort remaining children + foreach($actual_items_self as $line) { + $children_output_self[] = $line . "\n"; + } +} +echo $self_entry_output; +foreach($children_output_self as $line) { + echo $line; +} + +?> +--EXPECTF-- +Iterating: %s/instance/mixtype_test (LEAVES_ONLY) +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 + +Iterating: %s/instance/mixtype_test (SELF_FIRST) +Path: ., Type: dir, isDir: 1, isFile: 0 +Path: instance_dir, Type: dir, isDir: 1, isFile: 0 +Path: instance_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir, Type: dir, isDir: 1, isFile: 0 +Path: shared_dir/another_instance_file_in_shared_dir.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_instance_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_dir/shared_dir_template_file.txt, Type: file, isDir: 0, isFile: 1 +Path: shared_file.txt, Type: file, isDir: 0, isFile: 1 +Path: template_dir, Type: dir, isDir: 1, isFile: 0 +Path: template_dir/.gitkeep, Type: file, isDir: 0, isFile: 1 +Path: template_file.txt, Type: file, isDir: 0, isFile: 1 diff --git a/tests/iterator_child_types.sh b/tests/iterator_child_types.sh new file mode 100755 index 0000000..213434d --- /dev/null +++ b/tests/iterator_child_types.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +export HOSTNAME='bbf88a4ec298' +export PWD='/var/task/shadow' +export HOME='/root' +export SHLVL='0' +export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' +export _='/usr/bin/php' +export SSH_CLIENT='deleted' +export SSH_AUTH_SOCK='deleted' +export SSH_TTY='deleted' +export SSH_CONNECTION='deleted' +export TEMP='/tmp' +export SKIP_ONLINE_TESTS='1' +export TEST_PHP_EXECUTABLE='/usr/bin/php' +export TEST_PHP_EXECUTABLE_ESCAPED=''\''/usr/bin/php'\''' +export TEST_PHP_CGI_EXECUTABLE='/usr/bin/php-cgi' +export TEST_PHP_CGI_EXECUTABLE_ESCAPED=''\''/usr/bin/php-cgi'\''' +export TEST_PHPDBG_EXECUTABLE='' +export TEST_PHPDBG_EXECUTABLE_ESCAPED=''\'''\''' +export REDIRECT_STATUS='1' +export QUERY_STRING='' +export PATH_TRANSLATED='/app/tests/iterator_child_types.php' +export SCRIPT_FILENAME='/app/tests/iterator_child_types.php' +export REQUEST_METHOD='GET' +export CONTENT_TYPE='' +export CONTENT_LENGTH='' +export TZ='' +export TEST_PHP_EXTRA_ARGS=' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off"' +export HTTP_COOKIE='' + +case "$1" in +"gdb") + gdb --args '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_child_types.php" 2>&1 + ;; +"lldb") + lldb -- '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_child_types.php" 2>&1 + ;; +"valgrind") + USE_ZEND_ALLOC=0 valgrind $2 '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_child_types.php" 2>&1 + ;; +"rr") + rr record $2 '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_child_types.php" 2>&1 + ;; +*) + '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_child_types.php" 2>&1 + ;; +esac \ No newline at end of file diff --git a/tests/iterator_test.diff b/tests/iterator_test.diff new file mode 100644 index 0000000..03742e1 --- /dev/null +++ b/tests/iterator_test.diff @@ -0,0 +1,61 @@ + Iterating: %s/templatedir/api +002- Path: $template/api, isDir: 1, isFile: 0 + Path: $template/api/rest.php, isDir: 0, isFile: 1 +004- Count for %s/templatedir/api: 2 +003+ Count for /app/tests/fixtures/templatedir/api: 1 + + Iterating: /app/tests/fixtures/instance/qwe +007- Path: $instance/qwe, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules, isDir: 1, isFile: 0 +011+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +012+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +013+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +014+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts/.gitkeep, isDir: 0, isFile: 1 +015- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +016- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +017+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +018+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 +019+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +020+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +021+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +022+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases/.gitkeep, isDir: 0, isFile: 1 +019- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +020- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +021- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +022- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +023- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +024- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings/.gitkeep, isDir: 0, isFile: 1 +027+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +028+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +029+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +030+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +031+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +032+ Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages, isDir: 1, isFile: 0 + Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages/.gitkeep, isDir: 0, isFile: 1 +029- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +030- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 +031- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +032- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 +033- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +034- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +035- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +036- Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 +037- Count for %s/instance/qwe: 30 +035+ Count for /app/tests/fixtures/instance/qwe: 29 + + Iterating: /app/tests/fixtures/instance/api +040- Path: $instance/api, isDir: 1, isFile: 0 + Path: $instance/api/rest.php, isDir: 0, isFile: 1 +042- Count for %s/instance/api: 2 +039+ Count for /app/tests/fixtures/instance/api: 1 diff --git a/tests/iterator_test.exp b/tests/iterator_test.exp new file mode 100644 index 0000000..ba72999 --- /dev/null +++ b/tests/iterator_test.exp @@ -0,0 +1,42 @@ +Iterating: %s/templatedir/api +Path: $template/api, isDir: 1, isFile: 0 +Path: $template/api/rest.php, isDir: 0, isFile: 1 +Count for %s/templatedir/api: 2 + +Iterating: %s/instance/qwe +Path: $instance/qwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 +Count for %s/instance/qwe: 30 + +Iterating: %s/instance/api +Path: $instance/api, isDir: 1, isFile: 0 +Path: $instance/api/rest.php, isDir: 0, isFile: 1 +Count for %s/instance/api: 2 \ No newline at end of file diff --git a/tests/iterator_test.log b/tests/iterator_test.log new file mode 100644 index 0000000..e25f7e5 --- /dev/null +++ b/tests/iterator_test.log @@ -0,0 +1,85 @@ + +---- EXPECTED OUTPUT +Iterating: %s/templatedir/api +Path: $template/api, isDir: 1, isFile: 0 +Path: $template/api/rest.php, isDir: 0, isFile: 1 +Count for %s/templatedir/api: 2 + +Iterating: %s/instance/qwe +Path: $instance/qwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 +Count for %s/instance/qwe: 30 + +Iterating: %s/instance/api +Path: $instance/api, isDir: 1, isFile: 0 +Path: $instance/api/rest.php, isDir: 0, isFile: 1 +Count for %s/instance/api: 2 +---- ACTUAL OUTPUT +Iterating: /app/tests/fixtures/templatedir/api +Path: $template/api/rest.php, isDir: 0, isFile: 1 +Count for /app/tests/fixtures/templatedir/api: 1 + +Iterating: /app/tests/fixtures/instance/qwe +Path: $instance/qwe/modulebuilder, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages/.gitkeep, isDir: 0, isFile: 1 +Count for /app/tests/fixtures/instance/qwe: 29 + +Iterating: /app/tests/fixtures/instance/api +Path: $instance/api/rest.php, isDir: 0, isFile: 1 +Count for /app/tests/fixtures/instance/api: 1 +---- FAILED diff --git a/tests/iterator_test.out b/tests/iterator_test.out new file mode 100644 index 0000000..58970d7 --- /dev/null +++ b/tests/iterator_test.out @@ -0,0 +1,39 @@ +Iterating: /app/tests/fixtures/templatedir/api +Path: $template/api/rest.php, isDir: 0, isFile: 1 +Count for /app/tests/fixtures/templatedir/api: 1 + +Iterating: /app/tests/fixtures/instance/qwe +Path: $instance/qwe/modulebuilder, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages/.gitkeep, isDir: 0, isFile: 1 +Count for /app/tests/fixtures/instance/qwe: 29 + +Iterating: /app/tests/fixtures/instance/api +Path: $instance/api/rest.php, isDir: 0, isFile: 1 +Count for /app/tests/fixtures/instance/api: 1 \ No newline at end of file diff --git a/tests/iterator_test.php b/tests/iterator_test.php new file mode 100644 index 0000000..2f56257 --- /dev/null +++ b/tests/iterator_test.php @@ -0,0 +1,45 @@ +getPathname(); + if (strpos($displayPath, $template) === 0) { + $displayPath = '$template' . substr($displayPath, strlen($template)); + } elseif (strpos($displayPath, $instance) === 0) { + $displayPath = '$instance' . substr($displayPath, strlen($instance)); + } + // Normalize slashes + $displayPath = str_replace('\\', '/', $displayPath); + + + echo sprintf("Path: %s, isDir: %d, isFile: %d\n", + $displayPath, + $item->isDir(), + $item->isFile() + ); + } + echo "Count for $dirPath: $count\n\n"; +} + +?> diff --git a/tests/iterator_test.phpt b/tests/iterator_test.phpt new file mode 100644 index 0000000..bb224b5 --- /dev/null +++ b/tests/iterator_test.phpt @@ -0,0 +1,93 @@ +--TEST-- +Check iterators failure +--SKIPIF-- + +--FILE-- +getPathname(); + if (strpos($displayPath, $template) === 0) { + $displayPath = '$template' . substr($displayPath, strlen($template)); + } elseif (strpos($displayPath, $instance) === 0) { + $displayPath = '$instance' . substr($displayPath, strlen($instance)); + } + // Normalize slashes + $displayPath = str_replace('\\', '/', $displayPath); + + + echo sprintf("Path: %s, isDir: %d, isFile: %d\n", + $displayPath, + $item->isDir(), + $item->isFile() + ); + } + echo "Count for $dirPath: $count\n\n"; +} + +?> +--EXPECTF-- +Iterating: %s/templatedir/api +Path: $template/api, isDir: 1, isFile: 0 +Path: $template/api/rest.php, isDir: 0, isFile: 1 +Count for %s/templatedir/api: 2 + +Iterating: %s/instance/qwe +Path: $instance/qwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Accounts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Calls/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Cases/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Contacts/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Documents/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/ExternalUsers/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Meetings/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Messages/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Notes/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Project/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/PurchasedLineItems/.gitkeep, isDir: 0, isFile: 1 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks, isDir: 1, isFile: 0 +Path: $instance/qwe/modulebuilder/builds/qweqwe/SugarModules/modules/Tasks/.gitkeep, isDir: 0, isFile: 1 +Count for %s/instance/qwe: 30 + +Iterating: %s/instance/api +Path: $instance/api, isDir: 1, isFile: 0 +Path: $instance/api/rest.php, isDir: 0, isFile: 1 +Count for %s/instance/api: 2 diff --git a/tests/iterator_test.sh b/tests/iterator_test.sh new file mode 100755 index 0000000..f538ae5 --- /dev/null +++ b/tests/iterator_test.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +export HOSTNAME='37a4dccddad3' +export PWD='/var/task/shadow' +export HOME='/root' +export SHLVL='0' +export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' +export _='/usr/bin/php' +export SSH_CLIENT='deleted' +export SSH_AUTH_SOCK='deleted' +export SSH_TTY='deleted' +export SSH_CONNECTION='deleted' +export TEMP='/tmp' +export SKIP_ONLINE_TESTS='1' +export TEST_PHP_EXECUTABLE='/usr/bin/php' +export TEST_PHP_EXECUTABLE_ESCAPED=''\''/usr/bin/php'\''' +export TEST_PHP_CGI_EXECUTABLE='/usr/bin/php-cgi' +export TEST_PHP_CGI_EXECUTABLE_ESCAPED=''\''/usr/bin/php-cgi'\''' +export TEST_PHPDBG_EXECUTABLE='' +export TEST_PHPDBG_EXECUTABLE_ESCAPED=''\'''\''' +export REDIRECT_STATUS='1' +export QUERY_STRING='' +export PATH_TRANSLATED='/app/tests/iterator_test.php' +export SCRIPT_FILENAME='/app/tests/iterator_test.php' +export REQUEST_METHOD='GET' +export CONTENT_TYPE='' +export CONTENT_LENGTH='' +export TZ='' +export TEST_PHP_EXTRA_ARGS=' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off"' +export HTTP_COOKIE='' + +case "$1" in +"gdb") + gdb --args '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_test.php" 2>&1 + ;; +"lldb") + lldb -- '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_test.php" 2>&1 + ;; +"valgrind") + USE_ZEND_ALLOC=0 valgrind $2 '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_test.php" 2>&1 + ;; +"rr") + rr record $2 '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_test.php" 2>&1 + ;; +*) + '/usr/bin/php' -d "output_handler=" -d "open_basedir=" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=30719" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=0" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "serialize_precision=-1" -d "memory_limit=128M" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "opcache.revalidate_freq=0" -d "opcache.jit_hot_loop=1" -d "opcache.jit_hot_func=1" -d "opcache.jit_hot_return=1" -d "opcache.jit_hot_side_exit=1" -d "opcache.jit_max_root_traces=100000" -d "opcache.jit_max_side_traces=100000" -d "opcache.jit_max_exit_counters=100000" -d "opcache.protect_memory=1" -d "zend.assertions=1" -d "zend.exception_ignore_args=0" -d "zend.exception_string_param_max_len=15" -d "short_open_tag=0" -d "session.auto_start=0" -d "zlib.output_compression=Off" -f "/app/tests/iterator_test.php" 2>&1 + ;; +esac \ No newline at end of file