diff --git a/.travis.yml b/.travis.yml index b688592..3de3d13 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ language: php sudo: yes -dist: trusty +dist: bionic env: - - PHPVER="7.1.27" + - PHPVER="7.3.8" # This replaces the travis supplied phpbuild which defaults to ZTS enabled # builds. Since we are replacing using the same config, we don't have to add @@ -12,10 +12,7 @@ install: - rm -rf ~/.phpenv - sudo apt-get clean - sudo apt-get update - - sudo apt-get purge --auto-remove mysql-client-5.6 mysql-client-core-5.6 mysql-server-5.6 mysql-server-core-5.6 - - sudo rm -rf /var/lib/mysql - - sudo apt-get build-dep php5 - - sudo apt-get install git libmcrypt-dev libreadline-dev + - sudo apt-get install libzip-dev - curl -L http://git.io/phpenv-installer | bash - travis_wait phpenv install "${PHPVER}" - phpenv global "${PHPVER}" @@ -27,7 +24,6 @@ before_script: - ./configure - make - sed -i.stock -r -e 's/!mail_qa_team\(\$[[:alnum:]_]+,[[:space:]]*\$[[:alnum:]_]+,[[:space:]]*\$[[:alnum:]_]+\)/true/' run-tests.php - - sed -i.stock -e "s/\$ini_settings\['extension'\]\[\] = \$ext_dir \. DIRECTORY_SEPARATOR \. \$req_ext \. '\.' \. PHP_SHLIB_SUFFIX;/array_unshift\(\$ini_settings\['extension'\], \$ext_dir \. DIRECTORY_SEPARATOR \. \$req_ext \. '\.' \. PHP_SHLIB_SUFFIX\);/" run-tests.php - sed -i.stock -e 's/run-tests\.php/run-tests.php --show-diff/' Makefile script: diff --git a/README.md b/README.md index 4374399..71954a6 100644 --- a/README.md +++ b/README.md @@ -55,12 +55,12 @@ Configuration parameters php.ini parameters for shadow. Default is fine for most cases. -| Name | Default | Meaning | -|--------------------|---------|------------------------------------------------------| -| shadow.enabled | 1 | Shadowing enabled? | -| shadow.mkdir\_mask | 0755 | Mask used when creating new directories on instances | -| shadow.debug | 0 | Debug level (bitmask) | -| shadow.cache\_size | 10000 | Shadow cache size (in bytes, per process) | +| Name | Default | Meaning | +|--------------------|---------|-----------------------------------------------------------------| +| shadow.enabled | 1 | Shadowing enabled? | +| shadow.mkdir\_mask | 0755 | Mask used when creating implicitly new directories on instances | +| shadow.debug | 0 | Debug level (bitmask) | +| shadow.cache\_size | 10000 | Shadow cache size (in bytes, per process) | Debug level ----------- diff --git a/php_shadow.h b/php_shadow.h index 9729775..000d831 100644 --- a/php_shadow.h +++ b/php_shadow.h @@ -60,6 +60,7 @@ ZEND_BEGIN_MODULE_GLOBALS(shadow) HashTable cache; HashTable replaced_function_table; uint segment_id; + char *shadow_override_copy; ZEND_END_MODULE_GLOBALS(shadow) #ifdef ZTS @@ -68,7 +69,7 @@ ZEND_END_MODULE_GLOBALS(shadow) #define SHADOW_G(v) (shadow_globals.v) #endif -#define SHADOW_VERSION "0.8.2" +#define SHADOW_VERSION "0.9.0" ZEND_EXTERN_MODULE_GLOBALS(shadow) diff --git a/shadow.c b/shadow.c index 821170a..2f0eb18 100644 --- a/shadow.c +++ b/shadow.c @@ -28,8 +28,6 @@ ZEND_DECLARE_MODULE_GLOBALS(shadow) -static char *shadow_override_copy = NULL; - typedef struct _shadow_function { void (*orig_handler)(INTERNAL_FUNCTION_PARAMETERS); int argno; @@ -63,8 +61,8 @@ static php_stream_ops shadow_dirstream_ops = { NULL /* set_option */ }; -static php_stream_wrapper_ops *plain_ops; -zend_string *(*original_zend_resolve_path)(const char *filename, int filename_len); +static const php_stream_wrapper_ops *plain_ops; +zend_string *(*original_zend_resolve_path)(const char *filename, size_t filename_len); static void (*orig_touch)(INTERNAL_FUNCTION_PARAMETERS); static void (*orig_chmod)(INTERNAL_FUNCTION_PARAMETERS); static void (*orig_chdir)(INTERNAL_FUNCTION_PARAMETERS); @@ -73,7 +71,7 @@ static void (*orig_realpath)(INTERNAL_FUNCTION_PARAMETERS); static void (*orig_is_writable)(INTERNAL_FUNCTION_PARAMETERS); static void (*orig_glob)(INTERNAL_FUNCTION_PARAMETERS); -zend_string *shadow_resolve_path(const char *filename, int filename_len); +zend_string *shadow_resolve_path(const char *filename, size_t filename_len); static php_stream *shadow_stream_opener(php_stream_wrapper *wrapper, const char *filename, const char *mode, int options, zend_string **opened_path, php_stream_context *context STREAMS_DC); static int shadow_stat(php_stream_wrapper *wrapper, const char *url, int flags, php_stream_statbuf *ssb, @@ -115,7 +113,7 @@ const zend_function_entry shadow_functions[] = { static PHP_GINIT_FUNCTION(shadow) { memset(shadow_globals, 0, sizeof(zend_shadow_globals)); - zend_hash_init(&shadow_globals->cache, 10, NULL, ZVAL_PTR_DTOR, 1); // persistent! + zend_hash_init(&shadow_globals->cache, 10, NULL, ZVAL_INTERNAL_PTR_DTOR, 1); // persistent! zend_hash_init(&shadow_globals->replaced_function_table, 10, NULL, ZVAL_PTR_DTOR, 1); // initial size 10 here is a common sense - look at the number of overriden functions } @@ -169,6 +167,11 @@ PHP_INI_END() #define SHADOW_CONSTANT(C) REGISTER_LONG_CONSTANT(#C, C, CONST_CS | CONST_PERSISTENT) +/* {{{ SHADOW_OVERRIDE + * Use this macros to override php function with shadow analogue. E.g.: + * SHADOW_OVERRIDE(fread); + * It requires shadow_fread() function to be defined and have exactly the same signature as fread() function. + */ #define SHADOW_OVERRIDE(func) \ orig_##func = NULL; \ zend_string * key_##func = zend_string_init(#func, strlen(#func), 0);\ @@ -176,7 +179,8 @@ PHP_INI_END() orig_##func = orig->internal_function.handler; \ orig->internal_function.handler = shadow_##func; \ } \ - zend_string_release(key_##func); + zend_string_release_ex(key_##func, 0); +/* }}} */ #define SHADOW_ENABLED() (SHADOW_G(enabled) != 0 && SHADOW_G(instance) != NULL && SHADOW_G(template) != NULL) @@ -196,7 +200,7 @@ static void shadow_override_function(char *fname, size_t fname_len, int argno, i return; } - zend_string_release(fname_zs); + zend_string_release_ex(fname_zs, 0); table = &cls->function_table; fname = col+2; fname_len = strlen(fname); @@ -205,7 +209,7 @@ static void shadow_override_function(char *fname, size_t fname_len, int argno, i zend_string *fname_zs = zend_string_init(fname, strlen(fname), 0); if ((orig = zend_hash_find_ptr(table, fname_zs)) == NULL) { - zend_string_release(fname_zs); + zend_string_release_ex(fname_zs, 0); return; } @@ -216,8 +220,8 @@ static void shadow_override_function(char *fname, size_t fname_len, int argno, i orig->internal_function.handler = shadow_generic_override; - zend_string_release(fname_zs); - zend_string_release(fname_full); + zend_string_release_ex(fname_zs, 0); + zend_string_release_ex(fname_full, 1); } static void shadow_undo_override(char *fname, size_t fname_len, int argno, int argtype) @@ -236,7 +240,7 @@ static void shadow_undo_override(char *fname, size_t fname_len, int argno, int a return; } - zend_string_release(fname_zs); + zend_string_release_ex(fname_zs, 0); table = &cls->function_table; fname = col+2; fname_len = strlen(fname); @@ -245,12 +249,12 @@ static void shadow_undo_override(char *fname, size_t fname_len, int argno, int a zend_string *fname_zs = zend_string_init(fname, strlen(fname), 0); if ((orig = zend_hash_find_ptr(table, fname_zs)) == NULL) { - zend_string_release(fname_zs); + zend_string_release_ex(fname_zs, 0); return; } if ((override = zend_hash_find_ptr(&SHADOW_G(replaced_function_table), fname_full)) == NULL) { - zend_string_release(fname_zs); + zend_string_release_ex(fname_zs, 0); return; } @@ -259,8 +263,8 @@ static void shadow_undo_override(char *fname, size_t fname_len, int argno, int a zend_hash_del(&SHADOW_G(replaced_function_table), fname_full); pefree(override, 1); - zend_string_release(fname_full); - zend_string_release(fname_zs); + zend_string_release_ex(fname_full, 1); + zend_string_release_ex(fname_zs, 0); } @@ -321,7 +325,7 @@ PHP_MINIT_FUNCTION(shadow) int argno; int argtype; /* Save this for shutdown */ - shadow_override_copy = estrdup(SHADOW_G(override)); + SHADOW_G(shadow_override_copy) = estrdup(SHADOW_G(override)); while(*over) { char *next = strchr(over, ','); if(!next) { @@ -364,9 +368,9 @@ PHP_MINIT_FUNCTION(shadow) */ PHP_MSHUTDOWN_FUNCTION(shadow) { - if (shadow_override_copy != NULL) { + if (SHADOW_G(shadow_override_copy) != NULL) { /* Cleanup after our user-specified overrides. */ - char *over = shadow_override_copy; + char *over = SHADOW_G(shadow_override_copy); size_t over_len; char c; int argno; @@ -404,7 +408,7 @@ PHP_MSHUTDOWN_FUNCTION(shadow) break; } } - efree(shadow_override_copy); + efree(SHADOW_G(shadow_override_copy)); } UNREGISTER_INI_ENTRIES(); return SUCCESS; @@ -417,13 +421,17 @@ PHP_MSHUTDOWN_FUNCTION(shadow) PHP_RINIT_FUNCTION(shadow) { if(SHADOW_G(enabled)) { - php_unregister_url_stream_wrapper_volatile("file"); - php_register_url_stream_wrapper_volatile("file", &shadow_wrapper); + zend_string *protocol; + protocol = zend_string_init("file", strlen("file"), 0); + php_unregister_url_stream_wrapper_volatile(protocol); + php_register_url_stream_wrapper_volatile(protocol, &shadow_wrapper); + zend_string_release_ex(protocol, 0); } SHADOW_G(template) = NULL; SHADOW_G(instance) = NULL; SHADOW_G(curdir) = NULL; SHADOW_G(segment_id) = 0; + SHADOW_G(shadow_override_copy) = NULL; return SUCCESS; } /* }}} */ @@ -844,7 +852,7 @@ static void ensure_dir_exists(char *pathname, php_stream_wrapper *wrapper, php_s pathname[dir_len] = '/'; /* restore full path */ } -zend_string *shadow_resolve_path(const char *filename, int filename_len) +zend_string *shadow_resolve_path(const char *filename, size_t filename_len) { char *shadow_result = template_to_instance(filename, OPT_CHECK_EXISTS TSRMLS_CC); zend_string *result = NULL; @@ -1175,7 +1183,7 @@ static int shadow_call_replace_name_ex(zval *name, char *repname, void (*orig_fu Z_STR_P(name) = new_name; orig_func(INTERNAL_FUNCTION_PARAM_PASSTHRU); Z_STR_P(name) = old_name; - zend_string_release(new_name); + zend_string_release_ex(new_name, 1); return SUCCESS; } @@ -1565,7 +1573,7 @@ static void shadow_generic_override(INTERNAL_FUNCTION_PARAMETERS) } shadow_function *func; if ((func = zend_hash_find_ptr(&SHADOW_G(replaced_function_table), fname_full)) == NULL) { - zend_string_release(fname_full); + zend_string_release_ex(fname_full, 0); return; } zval *name; @@ -1574,20 +1582,20 @@ static void shadow_generic_override(INTERNAL_FUNCTION_PARAMETERS) if(!SHADOW_ENABLED()) { func->orig_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); - zend_string_release(fname_full); + zend_string_release_ex(fname_full, 0); return; } name = shadow_get_arg(func->argno TSRMLS_CC); if (!name || Z_TYPE_P(name) != IS_STRING) { func->orig_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); - zend_string_release(fname_full); + zend_string_release_ex(fname_full, 0); return; } /* not our path - don't mess with it */ if (!shadow_stream_check(Z_STRVAL_P(name))) { func->orig_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); - zend_string_release(fname_full); + zend_string_release_ex(fname_full, 0); return; } /* try to translate */ @@ -1602,11 +1610,11 @@ static void shadow_generic_override(INTERNAL_FUNCTION_PARAMETERS) /* we didn't find better name, use original */ if(!instname) { func->orig_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU); - zend_string_release(fname_full); + zend_string_release_ex(fname_full, 0); return; } shadow_call_replace_name_ex(name, instname, func->orig_handler, INTERNAL_FUNCTION_PARAM_PASSTHRU); - zend_string_release(fname_full); + zend_string_release_ex(fname_full, 0); } /* diff --git a/shadow_cache.c b/shadow_cache.c index 8c0d635..88a4dfb 100644 --- a/shadow_cache.c +++ b/shadow_cache.c @@ -45,7 +45,7 @@ void shadow_cache_set_id(zend_string *template, zend_string *instance TSRMLS_DC) } else { SHADOW_G(segment_id) = Z_LVAL_P(segment_zv); } - zend_string_release(segname_zs); + zend_string_release_ex(segname_zs, 1); efree(segname); } @@ -65,7 +65,7 @@ int shadow_cache_get(const char *name, char **entry TSRMLS_DC) namelen = shadow_cache_segmented_name(&segname, name TSRMLS_CC); zend_string *segname_zs = zend_string_init(segname, namelen, 0); if ((centry = zend_hash_find(&SHADOW_G(cache), segname_zs)) != NULL) { - zend_string_release(segname_zs); + zend_string_release_ex(segname_zs, 0); efree(segname); if(Z_STRLEN_P(centry) == 0){ *entry = NULL; @@ -75,7 +75,7 @@ int shadow_cache_get(const char *name, char **entry TSRMLS_DC) return SUCCESS; } else { *entry = NULL; - zend_string_release(segname_zs); + zend_string_release_ex(segname_zs, 0); efree(segname); return FAILURE; } @@ -85,7 +85,6 @@ void shadow_cache_put(const char *name, const char *entry TSRMLS_DC) { char *segname; int namelen; - zend_string * entry_zs; zval entry_zv; if(SHADOW_G(cache_size) == 0) { return; @@ -96,11 +95,10 @@ void shadow_cache_put(const char *name, const char *entry TSRMLS_DC) } namelen = shadow_cache_segmented_name(&segname, name TSRMLS_CC); zend_string *segname_zs = zend_string_init(segname, namelen, 1); - entry_zs = zend_string_init(entry, strlen(entry), 1); - ZVAL_STR(&entry_zv, entry_zs); + ZVAL_PSTRING(&entry_zv, entry); zend_hash_update(&SHADOW_G(cache), segname_zs, &entry_zv); efree(segname); - zend_string_release(segname_zs); + zend_string_release_ex(segname_zs, 1); } void shadow_cache_remove(const char *name TSRMLS_DC) diff --git a/tests/instance/cache/cache.txt b/tests/fixtures/instance/cache/cache.txt similarity index 100% rename from tests/instance/cache/cache.txt rename to tests/fixtures/instance/cache/cache.txt diff --git a/tests/instance/custom/instc.txt b/tests/fixtures/instance/custom/instc.txt similarity index 100% rename from tests/instance/custom/instc.txt rename to tests/fixtures/instance/custom/instc.txt diff --git a/tests/instance/custom/subcustom/instance.txt b/tests/fixtures/instance/custom/subcustom/instance.txt similarity index 100% rename from tests/instance/custom/subcustom/instance.txt rename to tests/fixtures/instance/custom/subcustom/instance.txt diff --git a/tests/instance/iinclude.php b/tests/fixtures/instance/iinclude.php similarity index 100% rename from tests/instance/iinclude.php rename to tests/fixtures/instance/iinclude.php diff --git a/tests/instance/instance_only.php b/tests/fixtures/instance/instance_only.php similarity index 100% rename from tests/instance/instance_only.php rename to tests/fixtures/instance/instance_only.php diff --git a/tests/instance/instdir/t.txt b/tests/fixtures/instance/instdir/t.txt similarity index 100% rename from tests/instance/instdir/t.txt rename to tests/fixtures/instance/instdir/t.txt diff --git a/tests/instance/manifest.php b/tests/fixtures/instance/manifest.php similarity index 100% rename from tests/instance/manifest.php rename to tests/fixtures/instance/manifest.php diff --git a/tests/instance/nowritedir/nowrite_instance.txt b/tests/fixtures/instance/nowritedir/nowrite_instance.txt similarity index 100% rename from tests/instance/nowritedir/nowrite_instance.txt rename to tests/fixtures/instance/nowritedir/nowrite_instance.txt diff --git a/tests/instance/test.php b/tests/fixtures/instance/test.php similarity index 100% rename from tests/instance/test.php rename to tests/fixtures/instance/test.php diff --git a/tests/instance/txt/ifile.txt b/tests/fixtures/instance/txt/ifile.txt similarity index 100% rename from tests/instance/txt/ifile.txt rename to tests/fixtures/instance/txt/ifile.txt diff --git a/tests/instance/txt/override.txt b/tests/fixtures/instance/txt/override.txt similarity index 100% rename from tests/instance/txt/override.txt rename to tests/fixtures/instance/txt/override.txt diff --git a/tests/instance/txt/tfile.txt b/tests/fixtures/instance/txt/tfile.txt similarity index 100% rename from tests/instance/txt/tfile.txt rename to tests/fixtures/instance/txt/tfile.txt diff --git a/tests/templatedir/custom/custom.txt b/tests/fixtures/templatedir/custom/custom.txt similarity index 100% rename from tests/templatedir/custom/custom.txt rename to tests/fixtures/templatedir/custom/custom.txt diff --git a/tests/templatedir/custom/ignore.txt b/tests/fixtures/templatedir/custom/ignore.txt similarity index 100% rename from tests/templatedir/custom/ignore.txt rename to tests/fixtures/templatedir/custom/ignore.txt diff --git a/tests/templatedir/custom/subcustom/ignore.txt b/tests/fixtures/templatedir/custom/subcustom/ignore.txt similarity index 100% rename from tests/templatedir/custom/subcustom/ignore.txt rename to tests/fixtures/templatedir/custom/subcustom/ignore.txt diff --git a/tests/templatedir/opcache-override-me.php b/tests/fixtures/templatedir/opcache-override-me.php similarity index 100% rename from tests/templatedir/opcache-override-me.php rename to tests/fixtures/templatedir/opcache-override-me.php diff --git a/tests/templatedir/template_only.php b/tests/fixtures/templatedir/template_only.php similarity index 100% rename from tests/templatedir/template_only.php rename to tests/fixtures/templatedir/template_only.php diff --git a/tests/templatedir/templdir/t.txt b/tests/fixtures/templatedir/templdir/t.txt similarity index 100% rename from tests/templatedir/templdir/t.txt rename to tests/fixtures/templatedir/templdir/t.txt diff --git a/tests/templatedir/templdir2/t.txt b/tests/fixtures/templatedir/templdir2/t.txt similarity index 100% rename from tests/templatedir/templdir2/t.txt rename to tests/fixtures/templatedir/templdir2/t.txt diff --git a/tests/templatedir/test.php b/tests/fixtures/templatedir/test.php similarity index 100% rename from tests/templatedir/test.php rename to tests/fixtures/templatedir/test.php diff --git a/tests/templatedir/tinclude.php b/tests/fixtures/templatedir/tinclude.php similarity index 100% rename from tests/templatedir/tinclude.php rename to tests/fixtures/templatedir/tinclude.php diff --git a/tests/templatedir/txt/override.txt b/tests/fixtures/templatedir/txt/override.txt similarity index 100% rename from tests/templatedir/txt/override.txt rename to tests/fixtures/templatedir/txt/override.txt diff --git a/tests/templatedir/unwritable.txt b/tests/fixtures/templatedir/unwritable.txt similarity index 100% rename from tests/templatedir/unwritable.txt rename to tests/fixtures/templatedir/unwritable.txt diff --git a/tests/glob.phpt b/tests/glob.phpt index 7230217..3f51476 100644 --- a/tests/glob.phpt +++ b/tests/glob.phpt @@ -105,89 +105,9 @@ array(9) { [8]=> string(3) "txt" } -array(42) { +array(2) { [0]=> - string(4) "TODO" - [1]=> - string(10) "chgrp.phpt" - [2]=> - string(10) "chmod.phpt" - [3]=> - string(10) "chown.phpt" - [4]=> - string(8) "dir.phpt" - [5]=> - string(9) "dirs.phpt" - [6]=> - string(11) "exists.phpt" - [7]=> - string(10) "fread.phpt" - [8]=> - string(14) "getconfig.phpt" - [9]=> - string(8) "glob.php" - [10]=> - string(9) "glob.phpt" - [11]=> string(8) "instance" - [12]=> - string(16) "is_writable.phpt" - [13]=> - string(12) "maindir.phpt" - [14]=> - string(10) "mkdir.phpt" - [15]=> - string(11) "mkdir2.phpt" - [16]=> - string(11) "mkdir3.phpt" - [17]=> - string(13) "override.phpt" - [18]=> - string(19) "override_class.phpt" - [19]=> - string(9) "read.phpt" - [20]=> - string(16) "read_custom.phpt" - [21]=> - string(12) "readdir.phpt" - [22]=> - string(18) "realpath-open.phpt" - [23]=> - string(11) "rename.phpt" - [24]=> - string(12) "require.phpt" - [25]=> - string(17) "require_once.phpt" - [26]=> - string(18) "require_once2.phpt" - [27]=> - string(18) "require_once3.phpt" - [28]=> - string(25) "require_once_opcache.phpt" - [29]=> - string(9) "setup.inc" - [30]=> - string(20) "shadow_settings.phpt" - [31]=> - string(11) "stream.phpt" - [32]=> + [1]=> string(11) "templatedir" - [33]=> - string(10) "touch.phpt" - [34]=> - string(11) "unlink.phpt" - [35]=> - string(12) "unlink2.phpt" - [36]=> - string(17) "write-rename.phpt" - [37]=> - string(10) "write.phpt" - [38]=> - string(17) "write_custom.phpt" - [39]=> - string(14) "write_new.phpt" - [40]=> - string(15) "write_new2.phpt" - [41]=> - string(19) "write_new_mask.phpt" } diff --git a/tests/mkdir3.phpt b/tests/mkdir3.phpt index 159baf9..eb46242 100644 --- a/tests/mkdir3.phpt +++ b/tests/mkdir3.phpt @@ -6,7 +6,7 @@ Check creating directories when shadow is not enabled } ?> --FILE-- - --FILE-- addEmptyDir("txt/"); $zip->addFile("txt/ifile.txt", "txt/ifile.txt"); $zip->close(); shadow("",""); -chdir(dirname(__FILE__)); +chdir($topdir); var_dump(file_exists("instance/instdir/test.zip")); $zip->open("instance/instdir/test.zip"); var_dump($zip->getNameIndex(0)); var_dump($zip->getNameIndex(1)); -unlink("instance/instdir/test.zip"); +unlink('instance/instdir/test.zip'); ?> --EXPECT-- bool(true) string(4) "txt/" string(13) "txt/ifile.txt" - diff --git a/tests/require_once_opcache.phpt b/tests/require_once_opcache.phpt index 210919b..7297574 100644 --- a/tests/require_once_opcache.phpt +++ b/tests/require_once_opcache.phpt @@ -3,7 +3,7 @@ Check require_once with opcache --DESCRIPTION-- This will optionally test with opcache enabled. To use it, install ZendOpcache if needed and then do this before running tests: -export TEST_PHP_ARGS="-d zend_extension=/usr/lib64/php/modules/opcache.so" +export TEST_PHP_ARGS="-d zend_extension=$(php-config --extension-dir)/opcache.so" --INI-- opcache.enable_cli=1 opcache.revalidate_path=1 diff --git a/tests/setup.inc b/tests/setup.inc index 3f290a2..d050b03 100644 --- a/tests/setup.inc +++ b/tests/setup.inc @@ -1,5 +1,5 @@ - ---XFAIL-- -nrh: 20150605: We belive this feature to be unimplemnted, see CRYS-959 --FILE-- --EXPECT-- -40755 -40755 -40755 -40755 -40755 +40777 40700 -bool(true) -bool(true)