update_test.module

Module for testing Update Manager functionality.

File

drupal/core/modules/update/tests/modules/update_test/update_test.module
View source
<?php

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

/**
 * @file
 * Module for testing Update Manager functionality.
 */

/**
 * Implements hook_system_theme_info().
 */
function update_test_system_theme_info() {
  $themes['update_test_basetheme'] = drupal_get_path('module', 'update') . '/tests/themes/update_test_basetheme/update_test_basetheme.info.yml';
  $themes['update_test_subtheme'] = drupal_get_path('module', 'update') . '/tests/themes/update_test_subtheme/update_test_subtheme.info.yml';
  return $themes;
}

/**
 * Implements hook_menu().
 */
function update_test_menu() {
  $items = array();
  $items['update-test'] = array(
    'title' => t('Update test'),
    'page callback' => 'update_test_mock_page',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  $items['503-error'] = array(
    'title' => t('503 Service unavailable'),
    'page callback' => 'update_callback_service_unavailable',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  return $items;
}

/**
 * Implements hook_system_info_alter().
 *
 * Checks the 'update_test.settings:system_info' configuration and sees if we
 * need to alter the system info for the given $file based on the setting. The
 * setting is expected to be a nested associative array. If the key '#all' is
 * defined, its subarray will include .info.yml keys and values for all modules
 * and themes on the system. Otherwise, the settings array is keyed by the
 * module or theme short name ($file->name) and the subarrays contain settings
 * just for that module or theme.
 */
function update_test_system_info_alter(&$info, $file) {
  $setting = config('update_test.settings')
    ->get('system_info');
  foreach (array(
    '#all',
    $file->name,
  ) as $id) {
    if (!empty($setting[$id])) {
      foreach ($setting[$id] as $key => $value) {
        $info[$key] = $value;
      }
    }
  }
}

/**
 * Implements hook_update_status_alter().
 *
 * Checks the 'update_test.settings:update_status' configuration and sees if we
 * need to alter the update status for the given project based on the setting.
 * The setting is expected to be a nested associative array. If the key '#all'
 * is defined, its subarray will include .info.yml keys and values for all modules
 * and themes on the system. Otherwise, the settings array is keyed by the
 * module or theme short name and the subarrays contain settings just for that
 * module or theme.
 */
function update_test_update_status_alter(&$projects) {
  $setting = config('update_test.settings')
    ->get('update_status');
  if (!empty($setting)) {
    foreach ($projects as $project_name => &$project) {
      foreach (array(
        '#all',
        $project_name,
      ) as $id) {
        if (!empty($setting[$id])) {
          foreach ($setting[$id] as $key => $value) {
            $project[$key] = $value;
          }
        }
      }
    }
  }
}

/**
 * Page callback: Prints mock XML for the Update Manager module.
 *
 * The specific XML file to print depends on two things: the project we're
 * trying to fetch data for, and the desired "availability scenario" for that
 * project which we're trying to test. Before attempting to fetch this data (by
 * checking for updates on the available updates report), callers need to define
 * the 'update_test_xml_map' variable as an array, keyed by project name,
 * indicating which availability scenario to use for that project.
 *
 * @param $project_name
 *   The project short name the update manager is trying to fetch data for (the
 *   fetch URLs are of the form: [base_url]/[project_name]/[core_version]).
 *
 * @return BinaryFileResponse|Response
 *   A BinaryFileResponse object containing the content of the XML release file
 *   for the specified project if one is available; a Response object with no
 *   content otherwise.
 *
 * @see update_test_menu()
 */
function update_test_mock_page($project_name) {
  $xml_map = config('update_test.settings')
    ->get('xml_map');
  if (isset($xml_map[$project_name])) {
    $availability_scenario = $xml_map[$project_name];
  }
  elseif (isset($xml_map['#all'])) {
    $availability_scenario = $xml_map['#all'];
  }
  else {

    // The test didn't specify (for example, the webroot has other modules and
    // themes installed but they're disabled by the version of the site
    // running the test. So, we default to a file we know won't exist, so at
    // least we'll get an empty xml response instead of a bunch of Drupal page
    // output.
    $availability_scenario = '#broken#';
  }
  $path = drupal_get_path('module', 'update_test');
  $file = "{$path}/{$project_name}.{$availability_scenario}.xml";
  $headers = array(
    'Content-Type' => 'text/xml; charset=utf-8',
  );
  if (!is_file($file)) {

    // Return an empty response.
    return new Response('', 200, $headers);
  }
  return new BinaryFileResponse($file, 200, $headers);
}

/**
 * Implements hook_archiver_info_alter().
 */
function update_test_archiver_info_alter(&$definitions) {

  // We only care about the extensions for now and the only way to add a new
  // extension without a class is via alter. This definition is bogus, real
  // archivers have a class and the definition goes in the annotation of the
  // class.
  $definitions['update_test_archiver'] = array(
    'extensions' => array(
      'update-test-extension',
    ),
  );
}

/**
 * Implements hook_filetransfer_info().
 */
function update_test_filetransfer_info() {

  // Define a mock file transfer method, to ensure that there will always be
  // at least one method available in the user interface (regardless of the
  // environment in which the update manager tests are run).
  return array(
    'system_test' => array(
      'title' => t('Update Test FileTransfer'),
      'class' => 'Drupal\\update_test\\MockFileTransfer',
      'weight' => -20,
    ),
  );
}

/**
 * Page callback: Displays an Error 503 (Service unavailable) page.
 *
 * @see update_test_menu()
 */
function update_callback_service_unavailable() {
  drupal_add_http_header('Status', '503 Service unavailable');
  print "503 Service Temporarily Unavailable";
}

Functions

Namesort descending Description
update_callback_service_unavailable Page callback: Displays an Error 503 (Service unavailable) page.
update_test_archiver_info_alter Implements hook_archiver_info_alter().
update_test_filetransfer_info Implements hook_filetransfer_info().
update_test_menu Implements hook_menu().
update_test_mock_page Page callback: Prints mock XML for the Update Manager module.
update_test_system_info_alter Implements hook_system_info_alter().
update_test_system_theme_info Implements hook_system_theme_info().
update_test_update_status_alter Implements hook_update_status_alter().