summaryrefslogtreecommitdiffstatshomepage
path: root/modules/simpletest/tests/upgrade/upgrade.test
diff options
context:
space:
mode:
Diffstat (limited to 'modules/simpletest/tests/upgrade/upgrade.test')
-rw-r--r--modules/simpletest/tests/upgrade/upgrade.test336
1 files changed, 0 insertions, 336 deletions
diff --git a/modules/simpletest/tests/upgrade/upgrade.test b/modules/simpletest/tests/upgrade/upgrade.test
deleted file mode 100644
index a802364fe03..00000000000
--- a/modules/simpletest/tests/upgrade/upgrade.test
+++ /dev/null
@@ -1,336 +0,0 @@
-<?php
-
-/**
- * Perform end-to-end tests of the upgrade path.
- */
-abstract class UpgradePathTestCase extends DrupalWebTestCase {
-
- /**
- * The file path(s) to the dumped database(s) to load into the child site.
- *
- * @var array
- */
- var $databaseDumpFiles = array();
-
- /**
- * Flag that indicates whether the child site has been upgraded.
- */
- var $upgradedSite = FALSE;
-
- /**
- * Array of errors triggered during the upgrade process.
- */
- var $upgradeErrors = array();
-
- /**
- * Array of modules loaded when the test starts.
- */
- var $loadedModules = array();
-
- /**
- * Override of DrupalWebTestCase::setUp() specialized for upgrade testing.
- */
- protected function setUp() {
- global $user, $language, $conf;
-
- // We are going to set a missing zlib requirement property for usage during
- // the performUpgrade() and tearDown() calls. Also set that the tests failed.
- if (!function_exists('gzopen')) {
- $this->missing_zlib_requirement = TRUE;
- parent::setUp();
- return;
- }
-
- // Load the Update API.
- require_once DRUPAL_ROOT . '/includes/update.inc';
-
- // Reset flags.
- $this->upgradedSite = FALSE;
- $this->upgradeErrors = array();
-
- $this->loadedModules = module_list();
-
- // Generate a temporary prefixed database to ensure that tests have a clean starting point.
- $this->databasePrefix = 'simpletest' . mt_rand(1000, 1000000);
- db_update('simpletest_test_id')
- ->fields(array('last_prefix' => $this->databasePrefix))
- ->condition('test_id', $this->testId)
- ->execute();
-
- // Clone the current connection and replace the current prefix.
- $connection_info = Database::getConnectionInfo('default');
- Database::renameConnection('default', 'simpletest_original_default');
- foreach ($connection_info as $target => $value) {
- $connection_info[$target]['prefix'] = array(
- 'default' => $value['prefix']['default'] . $this->databasePrefix,
- );
- }
- Database::addConnectionInfo('default', 'default', $connection_info['default']);
-
- // Store necessary current values before switching to prefixed database.
- $this->originalLanguage = $language;
- $this->originalLanguageDefault = variable_get('language_default');
- $this->originalFileDirectory = variable_get('file_public_path', conf_path() . '/files');
- $this->originalProfile = drupal_get_profile();
- $clean_url_original = variable_get('clean_url', 0);
-
- // Unregister the registry.
- // This is required to make sure that the database layer works properly.
- spl_autoload_unregister('drupal_autoload_class');
- spl_autoload_unregister('drupal_autoload_interface');
-
- // Create test directories ahead of installation so fatal errors and debug
- // information can be logged during installation process.
- // Use mock files directories with the same prefix as the database.
- $public_files_directory = $this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10);
- $private_files_directory = $public_files_directory . '/private';
- $temp_files_directory = $private_files_directory . '/temp';
-
- // Create the directories.
- file_prepare_directory($public_files_directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
- file_prepare_directory($private_files_directory, FILE_CREATE_DIRECTORY);
- file_prepare_directory($temp_files_directory, FILE_CREATE_DIRECTORY);
- $this->generatedTestFiles = FALSE;
-
- // Log fatal errors.
- ini_set('log_errors', 1);
- ini_set('error_log', $public_files_directory . '/error.log');
-
- // Reset all statics and variables to perform tests in a clean environment.
- $conf = array();
-
- // Load the database from the portable PHP dump.
- // The files can be gzipped.
- foreach ($this->databaseDumpFiles as $file) {
- if (substr($file, -3) == '.gz') {
- $file = "compress.zlib://$file";
- }
- require $file;
- }
-
- // Set path variables.
- $this->variable_set('file_public_path', $public_files_directory);
- $this->variable_set('file_private_path', $private_files_directory);
- $this->variable_set('file_temporary_path', $temp_files_directory);
-
- $this->pass('Finished loading the dump.');
-
- // Load user 1.
- $this->originalUser = $user;
- drupal_save_session(FALSE);
- $user = db_query('SELECT * FROM {users} WHERE uid = :uid', array(':uid' => 1))->fetchObject();
-
- // Generate and set a D6-compatible session cookie.
- $this->curlInitialize();
- $sid = drupal_hash_base64(uniqid(mt_rand(), TRUE) . drupal_random_bytes(55));
- curl_setopt($this->curlHandle, CURLOPT_COOKIE, rawurlencode(session_name()) . '=' . rawurlencode($sid));
-
- // Force our way into the session of the child site.
- drupal_save_session(TRUE);
- _drupal_session_write($sid, '');
- // Remove the temporarily added ssid column.
- drupal_save_session(FALSE);
-
- // Restore necessary variables.
- $this->variable_set('clean_url', $clean_url_original);
- $this->variable_set('site_mail', 'simpletest@example.com');
-
- drupal_set_time_limit($this->timeLimit);
- }
-
- /**
- * Override of DrupalWebTestCase::tearDown() specialized for upgrade testing.
- */
- protected function tearDown() {
- global $user, $language;
-
- if (!empty($this->missing_zlib_requirement)) {
- parent::tearDown();
- return;
- }
-
- // In case a fatal error occurred that was not in the test process read the
- // log to pick up any fatal errors.
- simpletest_log_read($this->testId, $this->databasePrefix, get_class($this), TRUE);
-
- // Delete temporary files directory.
- file_unmanaged_delete_recursive($this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10));
-
- // Get back to the original connection.
- Database::removeConnection('default');
- Database::renameConnection('simpletest_original_default', 'default');
-
- // Remove all prefixed tables.
- $tables = db_find_tables($this->databasePrefix . '%');
- foreach ($tables as $table) {
- db_drop_table($table);
- }
-
- // Return the user to the original one.
- $user = $this->originalUser;
- drupal_save_session(TRUE);
-
- // Ensure that internal logged in variable and cURL options are reset.
- $this->loggedInUser = FALSE;
- $this->additionalCurlOptions = array();
-
- // Reload module list and implementations to ensure that test module hooks
- // aren't called after tests.
- module_list(TRUE);
- module_implements_reset();
-
- // Reset the Field API.
- field_cache_clear();
-
- // Rebuild caches.
- parent::refreshVariables();
-
- // Reset language.
- $language = $this->originalLanguage;
- if ($this->originalLanguageDefault) {
- $GLOBALS['conf']['language_default'] = $this->originalLanguageDefault;
- }
-
- // Close the CURL handler.
- $this->curlClose();
- }
-
- /**
- * Specialized variable_set() that works even if the child site is not upgraded.
- *
- * @param $name
- * The name of the variable to set.
- * @param $value
- * The value to set. This can be any PHP data type; these functions take care
- * of serialization as necessary.
- */
- protected function variable_set($name, $value) {
- db_delete('variable')
- ->condition('name', $name)
- ->execute();
- db_insert('variable')
- ->fields(array(
- 'name' => $name,
- 'value' => serialize($value),
- ))
- ->execute();
-
- try {
- cache()->delete('variables');
- cache('bootstrap')->delete('variables');
- }
- // Since cache_bootstrap won't exist in a Drupal 6 site, ignore the
- // exception if the above fails.
- catch (Exception $e) {}
- }
-
- /**
- * Specialized refreshVariables().
- */
- protected function refreshVariables() {
- // No operation if the child has not been upgraded yet.
- if (!$this->upgradedSite) {
- return parent::refreshVariables();
- }
- }
-
- /**
- * Perform the upgrade.
- *
- * @param $register_errors
- * Register the errors during the upgrade process as failures.
- * @return
- * TRUE if the upgrade succeeded, FALSE otherwise.
- */
- protected function performUpgrade($register_errors = TRUE) {
- $update_url = $GLOBALS['base_url'] . '/update.php';
-
- if (!empty($this->missing_zlib_requirement)) {
- $this->fail(t('Missing zlib requirement for upgrade tests.'));
- return FALSE;
- }
-
- // Load the first update screen.
- $this->drupalGet($update_url, array('external' => TRUE));
- if (!$this->assertResponse(200)) {
- return FALSE;
- }
-
- // Continue.
- $this->drupalPost(NULL, array(), t('Continue'));
- if (!$this->assertResponse(200)) {
- return FALSE;
- }
-
- // Go!
- $this->drupalPost(NULL, array(), t('Apply pending updates'));
- if (!$this->assertResponse(200)) {
- return FALSE;
- }
-
- // Check for errors during the update process.
- foreach ($this->xpath('//li[@class=:class]', array(':class' => 'failure')) as $element) {
- $message = strip_tags($element->asXML());
- $this->upgradeErrors[] = $message;
- if ($register_errors) {
- $this->fail($message);
- }
- }
-
- if (!empty($this->upgradeErrors)) {
- // Upgrade failed, the installation might be in an inconsistent state,
- // don't process.
- return FALSE;
- }
-
- // Check if there still are pending updates.
- $this->drupalGet($update_url, array('external' => TRUE));
- $this->drupalPost(NULL, array(), t('Continue'));
- if (!$this->assertText(t('No pending updates.'), t('No pending updates at the end of the update process.'))) {
- return FALSE;
- }
-
- // Upgrade succeed, rebuild the environment so that we can call the API
- // of the child site directly from this request.
- $this->upgradedSite = TRUE;
-
- // Reload module list. For modules that are enabled in the test database,
- // but not on the test client, we need to load the code here.
- $new_modules = array_diff(module_list(TRUE), $this->loadedModules);
- foreach ($new_modules as $module) {
- drupal_load('module', $module);
- }
-
- // Reload hook implementations
- module_implements_reset();
-
- // Rebuild caches.
- drupal_static_reset();
- drupal_flush_all_caches();
-
- // Reload global $conf array and permissions.
- $this->refreshVariables();
- $this->checkPermissions(array(), TRUE);
-
- return TRUE;
- }
-
- /**
- * Force uninstall all modules from a test database, except those listed.
- *
- * @param $modules
- * The list of modules to keep installed. Required core modules will
- * always be kept.
- */
- protected function uninstallModulesExcept(array $modules) {
- $required_modules = array('block', 'dblog', 'filter', 'node', 'system', 'update', 'user');
-
- $modules = array_merge($required_modules, $modules);
-
- db_delete('system')
- ->condition('type', 'module')
- ->condition('name', $modules, 'NOT IN')
- ->execute();
- }
-
-}