diff -r 07239de796bb -r e756a8c72c3d cms/drupal/modules/simpletest/tests/system_test.module --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/drupal/modules/simpletest/tests/system_test.module Fri Sep 08 12:04:06 2017 +0200 @@ -0,0 +1,571 @@ + 'system_test_sleep', + 'page arguments' => array(2), + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + $items['system-test/auth'] = array( + 'page callback' => 'system_test_basic_auth_page', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + $items['system-test/authorize-init/%'] = array( + 'page callback' => 'system_test_authorize_init_page', + 'page arguments' => array(2), + 'access arguments' => array('administer software updates'), + 'type' => MENU_CALLBACK, + ); + $items['system-test/redirect/%'] = array( + 'title' => 'Redirect', + 'page callback' => 'system_test_redirect', + 'page arguments' => array(2), + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['system-test/multiple-redirects/%'] = array( + 'title' => 'Redirect', + 'page callback' => 'system_test_multiple_redirects', + 'page arguments' => array(2), + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['system-test/set-header'] = array( + 'page callback' => 'system_test_set_header', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['system-test/redirect-noscheme'] = array( + 'page callback' => 'system_test_redirect_noscheme', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['system-test/redirect-noparse'] = array( + 'page callback' => 'system_test_redirect_noparse', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + $items['system-test/redirect-invalid-scheme'] = array( + 'page callback' => 'system_test_redirect_invalid_scheme', + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + + $items['system-test/variable-get'] = array( + 'title' => 'Variable Get', + 'page callback' => 'variable_get', + 'page arguments' => array('simpletest_bootstrap_variable_test', NULL), + 'access arguments' => array('access content'), + 'type' => MENU_CALLBACK, + ); + + $items['system-test/lock-acquire'] = array( + 'title' => 'Lock acquire', + 'page callback' => 'system_test_lock_acquire', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/lock-exit'] = array( + 'title' => 'Lock acquire then exit', + 'page callback' => 'system_test_lock_exit', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/drupal-set-message'] = array( + 'title' => 'Set messages with drupal_set_message()', + 'page callback' => 'system_test_drupal_set_message', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/main-content-handling'] = array( + 'title' => 'Test main content handling', + 'page callback' => 'system_test_main_content_fallback', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/main-content-fallback'] = array( + 'title' => 'Test main content fallback', + 'page callback' => 'system_test_main_content_fallback', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/main-content-duplication'] = array( + 'title' => 'Test main content duplication', + 'page callback' => 'system_test_main_content_fallback', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/shutdown-functions'] = array( + 'title' => 'Test main content duplication', + 'page callback' => 'system_test_page_shutdown_functions', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/get-destination'] = array( + 'title' => 'Test $_GET[\'destination\']', + 'page callback' => 'system_test_get_destination', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/request-destination'] = array( + 'title' => 'Test $_REQUEST[\'destination\']', + 'page callback' => 'system_test_request_destination', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/drupal-get-filename'] = array( + 'title' => 'Test drupal_get_filename()', + 'page callback' => 'system_test_drupal_get_filename', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + $items['system-test/drupal-get-filename-with-schema-rebuild'] = array( + 'title' => 'Test drupal_get_filename() with a schema rebuild', + 'page callback' => 'system_test_drupal_get_filename_with_schema_rebuild', + 'access callback' => TRUE, + 'type' => MENU_CALLBACK, + ); + + return $items; +} + +function system_test_sleep($seconds) { + sleep($seconds); +} + +function system_test_basic_auth_page() { + // The Authorization HTTP header is forwarded via Drupal's .htaccess file even + // for PHP CGI SAPIs. + if (isset($_SERVER['HTTP_AUTHORIZATION'])) { + $authorization_header = $_SERVER['HTTP_AUTHORIZATION']; + } + // If using CGI on Apache with mod_rewrite, the forwarded HTTP header appears + // in the redirected HTTP headers. See + // https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpFoundation/ServerBag.php#L61 + elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { + $authorization_header = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; + } + // Resemble PHP_AUTH_USER and PHP_AUTH_PW for a Basic authentication from + // the HTTP_AUTHORIZATION header. See + // http://www.php.net/manual/features.http-auth.php + list($user, $pw) = explode(':', base64_decode(substr($authorization_header, 6))); + $output = t('Username is @username.', array('@username' => $user)); + $output .= t('Password is @password.', array('@password' => $pw)); + return $output; +} + +function system_test_redirect($code) { + $code = (int) $code; + if ($code != 200) { + // Header names are case-insensitive. + header("locaTION: " . url('system-test/redirect/200', array('absolute' => TRUE)), TRUE, $code); + exit; + } + return ''; +} + +/** + * Menu callback; sends a redirect header to itself until $count argument is 0. + * + * Emulates the variable number of redirects (given by initial $count argument) + * to the final destination URL by continuous sending of 301 HTTP redirect + * headers to itself together with decrementing the $count parameter until the + * $count parameter reaches 0. After that it returns an empty string to render + * the final destination page. + * + * @param $count + * The count of redirects left until the final destination page. + * + * @returns + * The location redirect if the $count > 0, otherwise an empty string. + */ +function system_test_multiple_redirects($count) { + $count = (int) $count; + if ($count > 0) { + header("location: " . url('system-test/multiple-redirects/' . --$count, array('absolute' => TRUE)), TRUE, 301); + exit; + } + return ''; +} + +function system_test_set_header() { + drupal_add_http_header($_GET['name'], $_GET['value']); + return t('The following header was set: %name: %value', array('%name' => $_GET['name'], '%value' => $_GET['value'])); +} + +function system_test_redirect_noscheme() { + header("Location: localhost/path", TRUE, 301); + exit; +} + +function system_test_redirect_noparse() { + header("Location: http:///path", TRUE, 301); + exit; +} + +function system_test_redirect_invalid_scheme() { + header("Location: ftp://localhost/path", TRUE, 301); + exit; +} + +/** + * Implements hook_modules_installed(). + */ +function system_test_modules_installed($modules) { + if (variable_get('test_verbose_module_hooks')) { + foreach ($modules as $module) { + drupal_set_message(t('hook_modules_installed fired for @module', array('@module' => $module))); + } + } +} + +/** + * Implements hook_modules_enabled(). + */ +function system_test_modules_enabled($modules) { + if (variable_get('test_verbose_module_hooks')) { + foreach ($modules as $module) { + drupal_set_message(t('hook_modules_enabled fired for @module', array('@module' => $module))); + } + } +} + +/** + * Implements hook_modules_disabled(). + */ +function system_test_modules_disabled($modules) { + if (variable_get('test_verbose_module_hooks')) { + foreach ($modules as $module) { + drupal_set_message(t('hook_modules_disabled fired for @module', array('@module' => $module))); + } + } +} + +/** + * Implements hook_modules_uninstalled(). + */ +function system_test_modules_uninstalled($modules) { + if (variable_get('test_verbose_module_hooks')) { + foreach ($modules as $module) { + drupal_set_message(t('hook_modules_uninstalled fired for @module', array('@module' => $module))); + } + } +} + +/** + * Implements hook_boot(). + */ +function system_test_boot() { + watchdog('system_test', 'hook_boot'); +} + +/** + * Implements hook_init(). + */ +function system_test_init() { + // Used by FrontPageTestCase to get the results of drupal_is_front_page(). + if (variable_get('front_page_output', 0) && drupal_is_front_page()) { + drupal_set_message(t('On front page.')); + } +} + +/** + * Implements hook_exit(). + */ +function system_test_exit() { + watchdog('system_test', 'hook_exit'); +} + +/** + * Implements hook_system_info_alter(). + */ +function system_test_system_info_alter(&$info, $file, $type) { + // We need a static otherwise the last test will fail to alter common_test. + static $test; + if (($dependencies = variable_get('dependencies', array())) || $test) { + if ($file->name == 'module_test') { + $info['hidden'] = FALSE; + $info['dependencies'][] = array_shift($dependencies); + variable_set('dependencies', $dependencies); + $test = TRUE; + } + if ($file->name == 'common_test') { + $info['hidden'] = FALSE; + $info['version'] = '7.x-2.4-beta3'; + } + } + + if ($file->name == 'system_project_namespace_test') { + $info['hidden'] = FALSE; + } + // Make the system_dependencies_test visible by default. + if ($file->name == 'system_dependencies_test') { + $info['hidden'] = FALSE; + } + if (in_array($file->name, array( + 'system_incompatible_module_version_dependencies_test', + 'system_incompatible_core_version_dependencies_test', + 'system_incompatible_module_version_test', + 'system_incompatible_core_version_test', + ))) { + $info['hidden'] = FALSE; + } + if ($file->name == 'requirements1_test' || $file->name == 'requirements2_test') { + $info['hidden'] = FALSE; + } +} + +/** + * Try to acquire a named lock and report the outcome. + */ +function system_test_lock_acquire() { + if (lock_acquire('system_test_lock_acquire')) { + lock_release('system_test_lock_acquire'); + return 'TRUE: Lock successfully acquired in system_test_lock_acquire()'; + } + else { + return 'FALSE: Lock not acquired in system_test_lock_acquire()'; + } +} + +/** + * Try to acquire a specific lock, and then exit. + */ +function system_test_lock_exit() { + if (lock_acquire('system_test_lock_exit', 900)) { + echo 'TRUE: Lock successfully acquired in system_test_lock_exit()'; + // The shut-down function should release the lock. + exit(); + } + else { + return 'FALSE: Lock not acquired in system_test_lock_exit()'; + } +} + +/** + * Implements hook_page_build(). + */ +function system_test_page_build(&$page) { + $menu_item = menu_get_item(); + $main_content_display = &drupal_static('system_main_content_added', FALSE); + + if ($menu_item['path'] == 'system-test/main-content-handling') { + $page['footer'] = drupal_set_page_content(); + $page['footer']['main']['#markup'] = '
' . $page['footer']['main']['#markup'] . '
'; + } + elseif ($menu_item['path'] == 'system-test/main-content-fallback') { + drupal_set_page_content(); + $main_content_display = FALSE; + } + elseif ($menu_item['path'] == 'system-test/main-content-duplication') { + drupal_set_page_content(); + } +} + +/** + * Menu callback to test main content fallback(). + */ +function system_test_main_content_fallback() { + return t('Content to test main content fallback'); +} + +/** + * A simple page callback which adds a register shutdown function. + */ +function system_test_page_shutdown_functions($arg1, $arg2) { + drupal_register_shutdown_function('_system_test_first_shutdown_function', $arg1, $arg2); +} + +/** + * Dummy shutdown function which registers another shutdown function. + */ +function _system_test_first_shutdown_function($arg1, $arg2) { + // Output something, page has already been printed and the session stored + // so we can't use drupal_set_message. + print t('First shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2)); + drupal_register_shutdown_function('_system_test_second_shutdown_function', $arg1, $arg2); +} + +/** + * Dummy shutdown function. + */ +function _system_test_second_shutdown_function($arg1, $arg2) { + // Output something, page has already been printed and the session stored + // so we can't use drupal_set_message. + print t('Second shutdown function, arg1 : @arg1, arg2: @arg2', array('@arg1' => $arg1, '@arg2' => $arg2)); + + // Throw an exception with an HTML tag. Since this is called in a shutdown + // function, it will not bubble up to the default exception handler but will + // be caught in _drupal_shutdown_function() and be displayed through + // _drupal_render_exception_safe(). + throw new Exception('Drupal is awesome.'); +} + +/** + * Implements hook_filetransfer_info(). + */ +function system_test_filetransfer_info() { + return array( + 'system_test' => array( + 'title' => t('System Test FileTransfer'), + 'file' => 'system_test.module', // Should be a .inc, but for test, ok. + 'class' => 'SystemTestFileTransfer', + 'weight' => -10, + ), + ); +} + +/** + * Mock FileTransfer object to test the settings form functionality. + */ +class SystemTestFileTransfer { + public static function factory() { + return new SystemTestFileTransfer; + } + + public function getSettingsForm() { + $form = array(); + $form['system_test_username'] = array( + '#type' => 'textfield', + '#title' => t('System Test Username'), + ); + return $form; + } +} + +/** + * Page callback to initialize authorize.php during testing. + * + * @see system_authorized_init(). + */ +function system_test_authorize_init_page($page_title) { + $authorize_url = $GLOBALS['base_url'] . '/authorize.php'; + system_authorized_init('system_test_authorize_run', drupal_get_path('module', 'system_test') . '/system_test.module', array(), $page_title); + drupal_goto($authorize_url); +} + +/** + * Sets two messages and removes the first one before the messages are displayed. + */ +function system_test_drupal_set_message() { + // Set two messages. + drupal_set_message('First message (removed).'); + drupal_set_message('Second message (not removed).'); + + // Remove the first. + unset($_SESSION['messages']['status'][0]); + + return ''; +} + +/** + * Page callback to print out $_GET['destination'] for testing. + */ +function system_test_get_destination() { + if (isset($_GET['destination'])) { + print $_GET['destination']; + } + // No need to render the whole page, we are just interested in this bit of + // information. + exit; +} + +/** + * Page callback to print out $_REQUEST['destination'] for testing. + */ +function system_test_request_destination() { + if (isset($_REQUEST['destination'])) { + print $_REQUEST['destination']; + } + // No need to render the whole page, we are just interested in this bit of + // information. + exit; +} + +/** + * Page callback to run drupal_get_filename() on a particular module. + */ +function system_test_drupal_get_filename() { + // Prevent SimpleTest from failing as a result of the expected PHP warnings + // this function causes. Any warnings will be recorded in the database logs + // for examination by the tests. + define('SIMPLETEST_COLLECT_ERRORS', FALSE); + + $module_name = variable_get('system_test_drupal_get_filename_test_module_name'); + drupal_get_filename('module', $module_name); + + return ''; +} + +/** + * Page callback to run drupal_get_filename() and do a schema rebuild. + */ +function system_test_drupal_get_filename_with_schema_rebuild() { + // Prevent SimpleTest from failing as a result of the expected PHP warnings + // this function causes. + define('SIMPLETEST_COLLECT_ERRORS', FALSE); + + // Record the original database tables from drupal_get_schema(). + variable_set('system_test_drupal_get_filename_with_schema_rebuild_original_tables', array_keys(drupal_get_schema(NULL, TRUE))); + + // Trigger system_test_schema() and system_test_watchdog() to perform an + // attempted recursive rebuild when drupal_get_schema() is called. See + // BootstrapGetFilenameWebTestCase::testRecursiveRebuilds(). + variable_set('system_test_drupal_get_filename_attempt_recursive_rebuild', TRUE); + drupal_get_schema(NULL, TRUE); + + return ''; +} + +/** + * Implements hook_watchdog(). + */ +function system_test_watchdog($log_entry) { + // If an attempted recursive schema rebuild has been triggered by + // system_test_drupal_get_filename_with_schema_rebuild(), perform the rebuild + // in response to the missing file message triggered by system_test_schema(). + if (!variable_get('system_test_drupal_get_filename_attempt_recursive_rebuild')) { + return; + } + if ($log_entry['type'] != 'php' || $log_entry['severity'] != WATCHDOG_WARNING) { + return; + } + $module_name = variable_get('system_test_drupal_get_filename_test_module_name'); + if (!isset($log_entry['variables']['!message']) || strpos($log_entry['variables']['!message'], format_string('The following module is missing from the file system: %name', array('%name' => $module_name))) === FALSE) { + return; + } + variable_set('system_test_drupal_get_filename_with_schema_rebuild_final_tables', array_keys(drupal_get_schema())); +} + +/** + * Implements hook_module_implements_alter(). + */ +function system_test_module_implements_alter(&$implementations, $hook) { + // For BootstrapGetFilenameWebTestCase::testRecursiveRebuilds() to work + // correctly, this module's hook_schema() implementation cannot be either the + // first implementation (since that would trigger a potential recursive + // rebuild before anything is in the drupal_get_schema() cache) or the last + // implementation (since that would trigger a potential recursive rebuild + // after the cache is already complete). So put it somewhere in the middle. + if ($hook == 'schema') { + $group = $implementations['system_test']; + unset($implementations['system_test']); + $count = count($implementations); + $implementations = array_merge(array_slice($implementations, 0, $count / 2, TRUE), array('system_test' => $group), array_slice($implementations, $count / 2, NULL, TRUE)); + } +}