You are here

monitoring.ui.test in Monitoring 7

Contains \MonitoringUITest.

File

test/tests/monitoring.ui.test
View source
<?php

/**
 * @file
 * Contains \MonitoringUITest.
 */
use Drupal\monitoring\SensorRunner;

/**
 * Tests for the Monitoring UI.
 */
class MonitoringUITest extends MonitoringTestBase {
  public static function getInfo() {
    return array(
      'name' => 'Monitoring UI',
      'description' => 'Monitoring UI tests.',
      'group' => 'Monitoring',
    );
  }

  /**
   * {@inheritdoc}
   */
  public function setUp() {
    parent::setUp(array(
      'dblog',
    ));
  }

  /**
   * Test the sensor settings UI.
   */
  function testSensorSettingsUI() {
    $account = $this
      ->drupalCreateUser(array(
      'administer monitoring',
    ));
    $this
      ->drupalLogin($account);

    // The separate threshold settings tests have been split into separate
    // methods for better separation.
    $this
      ->checkExceedsThresholdSettings();
    $this
      ->checkFallsThresholdSettings();
    $this
      ->checkInnerThresholdSettings();
    $this
      ->checkOuterThresholdSettings();

    // Test that trying to access the sensors settings page of a non-existing
    // sensor results in a page not found response.
    $this
      ->drupalGet('admin/config/system/monitoring/sensors/non_existing_sensor');
    $this
      ->assertResponse(404);
  }

  /**
   * Tests the time interval settings UI of the database aggregator sensor.
   */
  function testAggregateSensorTimeIntervalConfig() {
    $account = $this
      ->drupalCreateUser(array(
      'administer monitoring',
      'monitoring reports',
    ));
    $this
      ->drupalLogin($account);

    // Visit the overview and make sure the sensor is displayed.
    $this
      ->drupalGet('admin/reports/monitoring');
    $this
      ->assertText('0 druplicons in 1 day');
    $form_key = monitoring_sensor_settings_key('db_aggregate_test');
    $sensor_info = $this->sensorManager
      ->getSensorInfoByName('db_aggregate_test');
    $this
      ->drupalGet('admin/config/system/monitoring/sensors/db_aggregate_test');

    // Test for the default value.
    $this
      ->assertFieldByName($form_key . '[time_interval_value]', $sensor_info
      ->getTimeIntervalValue());

    // Update the time interval and test for the updated value.
    $time_interval = 10800;
    $this
      ->drupalPost('admin/config/system/monitoring/sensors/db_aggregate_test', array(
      $form_key . '[time_interval_value]' => $time_interval,
    ), t('Save'));
    $this->sensorManager
      ->resetCache();
    $sensor_info = $this->sensorManager
      ->getSensorInfoByName('db_aggregate_test');
    $this
      ->assertEqual($sensor_info
      ->getTimeIntervalValue(), $time_interval);

    // Check the sensor overview to verify that the sensor result is
    // recalculated and the new sensor message is displayed.
    $this
      ->drupalGet('admin/reports/monitoring');
    $this
      ->assertText('0 druplicons in 3 hours');

    // Update the time interval and set it to no restriction.
    $time_interval = 0;
    $this
      ->drupalPost('admin/config/system/monitoring/sensors/db_aggregate_test', array(
      $form_key . '[time_interval_value]' => $time_interval,
    ), t('Save'));
    $this->sensorManager
      ->resetCache();
    $sensor_info = $this->sensorManager
      ->getSensorInfoByName('db_aggregate_test');
    $this
      ->assertEqual($sensor_info
      ->getTimeIntervalValue(), $time_interval);

    // Visit the overview and make sure that no time interval is displayed.
    $this
      ->drupalGet('admin/reports/monitoring');
    $this
      ->assertText('0 druplicons');
    $this
      ->assertNoText('0 druplicons in');
  }

  /**
   * Sensor over page tests coverage.
   */
  function testSensorOverviewPage() {
    $account = $this
      ->drupalCreateUser(array(
      'monitoring reports',
    ));
    $this
      ->drupalLogin($account);

    // Run the test_sensor and update the timestamp in the cache to make the
    // result the oldest.
    $this
      ->runSensor('test_sensor');
    $cid = 'monitoring_sensor_result:test_sensor';
    $cache = cache_get($cid);
    $cache->data['timestamp'] = $cache->data['timestamp'] - 1000;
    cache_set($cid, $cache->data, 'cache', REQUEST_TIME + 3600);
    $this
      ->drupalGet('admin/reports/monitoring');

    // Test if the Test sensor is listed as the oldest cached. We do not test
    // for the cached time as such test contains a risk of random fail.
    $this
      ->assertRaw(format_string('Sensor %sensor (%category) cached before', array(
      '%sensor' => 'Test sensor',
      '%category' => 'Test',
    )));

    // Test the overview table.
    $tbody = $this
      ->xpath('//table[@id="monitoring-sensors-overview"]/tbody');
    $rows = $tbody[0];
    $i = 0;
    foreach (monitoring_sensor_info_by_categories() as $category => $category_sensor_info) {
      $tr = $rows->tr[$i];
      $this
        ->assertEqual($category, $tr->td->h3);
      foreach ($category_sensor_info as $sensor_info) {
        $i++;
        $tr = $rows->tr[$i];
        $this
          ->assertEqual($tr->td[0]->span, $sensor_info
          ->getLabel());
      }
      $i++;
    }
  }

  /**
   * Tests the sensor detail page.
   */
  function testSensorDetailpage() {
    $account = $this
      ->drupalCreateUser(array(
      'monitoring reports',
      'monitoring verbose',
      'monitoring force run',
    ));
    $this
      ->drupalLogin($account);
    $this
      ->drupalCreateNode(array(
      'promote' => '1',
    ));
    $sensor_info = monitoring_sensor_manager()
      ->getSensorInfoByName('db_aggregate_test');
    $this
      ->drupalGet('admin/reports/monitoring/sensors/db_aggregate_test');
    $this
      ->assertTitle(t('@label (@category) | Drupal', array(
      '@label' => $sensor_info
        ->getLabel(),
      '@category' => $sensor_info
        ->getCategory(),
    )));

    // Make sure that all relevant information is displayed.
    // @todo: Assert position/order.
    // Cannot use $this->runSensor() as the cache needs to remain.
    $result = monitoring_sensor_run('db_aggregate_test');
    $this
      ->assertText(t('Description'));
    $this
      ->assertText($sensor_info
      ->getDescription());
    $this
      ->assertText(t('Status'));
    $this
      ->assertText('Warning');
    $this
      ->assertText(t('Message'));
    $this
      ->assertText('1 druplicons in 1 day, falls below 2');
    $this
      ->assertText(t('Execution time'));

    // The sensor is cached, so we have the same cached execution time.
    $this
      ->assertText($result
      ->getExecutionTime() . 'ms');
    $this
      ->assertText(t('Cache information'));
    $this
      ->assertText('Executed now, valid for 1 hour');
    $this
      ->assertRaw(t('Run again'));
    $this
      ->assertText(t('Verbose'));
    $this
      ->assertText(t('Query'));

    // Check that the query is there by looking for a part of it.
    $this
      ->assertRaw('(promote = :db_condition_placeholder_0) AND (created > :timestamp_value)');
    $this
      ->assertText(t('Arguments'));
    $this
      ->assertText(t('Settings'));

    // @todo Add asserts about displayed settings once we display them in a
    //   better way.
    $this
      ->assertText(t('Log'));

    // Check that the log table contains one result.
    $rows = $this
      ->xpath('//div[contains(@class, "view-monitoring-sensor-results")]//tbody/tr');
    $this
      ->assertEqual(count($rows), 1);
    $this
      ->assertEqual(trim((string) $rows[0]->td[1]), 'WARNING');
    $this
      ->assertEqual(trim((string) $rows[0]->td[2]), '1 druplicons in 1 day, falls below 2');

    // Create another node and run again.
    $this
      ->drupalCreateNode(array(
      'promote' => '1',
    ));
    $this
      ->drupalPost(NULL, array(), t('Run again'));
    $this
      ->assertText('OK');
    $this
      ->assertText('2 druplicons in 1 day');
    $rows = $this
      ->xpath('//div[contains(@class, "view-monitoring-sensor-results")]//tbody/tr');
    $this
      ->assertEqual(count($rows), 2);

    // The latest log result should be displayed first.
    $this
      ->assertEqual(trim((string) $rows[0]->td[1]), 'OK');
    $this
      ->assertEqual(trim((string) $rows[1]->td[1]), 'WARNING');

    // Refresh the page, this not run the sensor again.
    $this
      ->drupalGet('admin/reports/monitoring/sensors/db_aggregate_test');
    $this
      ->assertText('OK');
    $this
      ->assertText('2 druplicons in 1 day');
    $this
      ->assertText(t('Verbose output is not available for cached sensor results. Click force run to see verbose output.'));
    $rows = $this
      ->xpath('//div[contains(@class, "view-monitoring-sensor-results")]//tbody/tr');
    $this
      ->assertEqual(count($rows), 2);

    // Test that accessing a disabled or nisot-existing sensor results in a page
    // not found response.
    $this->sensorManager
      ->disableSensor('test_sensor');
    $this
      ->drupalGet('admin/reports/monitoring/sensors/test_sensor');
    $this
      ->assertResponse(404);
    $this
      ->drupalGet('admin/reports/monitoring/sensors/non_existing_sensor');
    $this
      ->assertResponse(404);
  }

  /**
   * Tests the force execute all and sensor specific force execute links.
   */
  function testForceExecute() {
    $account = $this
      ->drupalCreateUser(array(
      'monitoring force run',
      'monitoring reports',
    ));
    $this
      ->drupalLogin($account);

    // Set a specific test sensor result to look for.
    $test_sensor_result_data = array(
      'sensor_message' => 'First message',
    );
    variable_set('test_sensor_result_data', $test_sensor_result_data);
    $this
      ->drupalGet('admin/reports/monitoring');
    $this
      ->assertText('First message');

    // Update the sensor message.
    $test_sensor_result_data['sensor_message'] = 'Second message';
    variable_set('test_sensor_result_data', $test_sensor_result_data);

    // Access the page again, we should still see the first message because the
    // cached result is returned.
    $this
      ->drupalGet('admin/reports/monitoring');
    $this
      ->assertText('First message');

    // Force sensor execution, the changed message should be displayed now.
    $this
      ->clickLink(t('Force execute all'));
    $this
      ->assertNoText('First message');
    $this
      ->assertText('Second message');

    // Update the sensor message again.
    $test_sensor_result_data['sensor_message'] = 'Third message';
    variable_set('test_sensor_result_data', $test_sensor_result_data);

    // Simulate a click on Force execution, there are many of those so we just
    // verify that such links exist and visit the path manually.
    $this
      ->assertLink(t('Force execution'));
    $this
      ->drupalGet('monitoring/sensors/force/test_sensor');
    $this
      ->assertNoText('Second message');
    $this
      ->assertText('Third message');
  }

  /**
   * Submits a threshold settings form for a given sensor.
   *
   * @param string $sensor_name
   *   The sensor name for the sensor that should be submitted.
   * @param array $thresholds
   *   Array of threshold values, keyed by the status, the value can be an
   *   integer or an array of integers for threshold types that need multiple
   *   values.
   */
  protected function submitThresholdSettings($sensor_name, array $thresholds) {
    $data = array();
    $sensor_info = $this->sensorManager
      ->getSensorInfoByName($sensor_name);
    foreach ($thresholds as $key => $value) {
      $form_field_name = monitoring_sensor_settings_key($sensor_info
        ->getName()) . '[thresholds][' . $key . ']';
      $data[$form_field_name] = $value;
    }
    $this
      ->drupalPost('admin/config/system/monitoring/sensors/' . $sensor_info
      ->getName(), $data, t('Save'));
  }

  /**
   * Asserts that defaults are set correctly in the settings form.
   *
   * @param string $sensor_name
   *   The sensor name for the sensor that should be submitted.
   * @param array $thresholds
   *   Array of threshold values, keyed by the status, the value can be an
   *   integer or an array of integers for threshold types that need multiple
   *   values.
   */
  protected function assertThresholdSettingsUIDefaults($sensor_name, $thresholds) {
    $sensor_info = $this->sensorManager
      ->getSensorInfoByName($sensor_name);
    $this
      ->drupalGet('admin/config/system/monitoring/sensors/' . $sensor_name);
    $this
      ->assertTitle(t('@label settings (@category) | Drupal', array(
      '@label' => $sensor_info
        ->getLabel(),
      '@category' => $sensor_info
        ->getCategory(),
    )));
    foreach ($thresholds as $key => $value) {
      $form_field_name = monitoring_sensor_settings_key($sensor_name) . '[thresholds][' . $key . ']';
      $this
        ->assertFieldByName($form_field_name, $value);
    }
  }

  /**
   * Tests exceeds threshold settings UI and validation.
   */
  protected function checkExceedsThresholdSettings() {

    // Test with valid values.
    $thresholds = array(
      'critical' => 11,
      'warning' => 6,
    );
    $this
      ->submitThresholdSettings('test_sensor_exceeds', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_exceeds', $thresholds);

    // Make sure that it is possible to save empty thresholds.
    $thresholds = array(
      'critical' => '',
      'warning' => '',
    );
    $this
      ->submitThresholdSettings('test_sensor_exceeds', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_exceeds', $thresholds);
    $this->sensorManager
      ->resetCache();
    SensorRunner::resetCache();
    $sensor_result = $this
      ->runSensor('test_sensor_exceeds');
    $this
      ->assertTrue($sensor_result
      ->isOk());

    // Test validation.
    $thresholds = array(
      'critical' => 5,
      'warning' => 10,
    );
    $this
      ->submitThresholdSettings('test_sensor_exceeds', $thresholds);
    $this
      ->assertText('Warning must be lower than critical or empty.');
    $thresholds = array(
      'critical' => 5,
      'warning' => 5,
    );
    $this
      ->submitThresholdSettings('test_sensor_exceeds', $thresholds);
    $this
      ->assertText('Warning must be lower than critical or empty.');
    $thresholds = array(
      'critical' => 'alphanumeric',
      'warning' => 'alphanumeric',
    );
    $this
      ->submitThresholdSettings('test_sensor_exceeds', $thresholds);
    $this
      ->assertText('Warning must be a number.');
    $this
      ->assertText('Critical must be a number.');
    return $thresholds;
  }

  /**
   * Tests falls threshold settings UI and validation.
   */
  protected function checkFallsThresholdSettings() {

    // Test with valid values.
    $thresholds = array(
      'critical' => 6,
      'warning' => 11,
    );
    $this
      ->submitThresholdSettings('test_sensor_falls', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_falls', $thresholds);

    // Make sure that it is possible to save empty thresholds.
    $thresholds = array(
      'critical' => '',
      'warning' => '',
    );
    $this
      ->submitThresholdSettings('test_sensor_falls', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_falls', $thresholds);

    // Test validation.
    $thresholds = array(
      'critical' => 50,
      'warning' => 45,
    );
    $this
      ->submitThresholdSettings('test_sensor_falls', $thresholds);
    $this
      ->assertText('Warning must be higher than critical or empty.');
    $thresholds = array(
      'critical' => 5,
      'warning' => 5,
    );
    $this
      ->submitThresholdSettings('test_sensor_falls', $thresholds);
    $this
      ->assertText('Warning must be higher than critical or empty.');
    $thresholds = array(
      'critical' => 'alphanumeric',
      'warning' => 'alphanumeric',
    );
    $this
      ->submitThresholdSettings('test_sensor_falls', $thresholds);
    $this
      ->assertText('Warning must be a number.');
    $this
      ->assertText('Critical must be a number.');
    return $thresholds;
  }

  /**
   * Tests inner threshold settings UI and validation.
   */
  protected function checkInnerThresholdSettings() {

    // Test with valid values.
    $thresholds = array(
      'critical_low' => 5,
      'warning_low' => 1,
      'critical_high' => 10,
      'warning_high' => 15,
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_inner', $thresholds);

    // Make sure that it is possible to save empty inner thresholds.
    $thresholds = array(
      'critical_low' => '',
      'warning_low' => '',
      'critical_high' => '',
      'warning_high' => '',
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_inner', $thresholds);

    // Test validation.
    $thresholds = array(
      'critical_low' => 5,
      'warning_low' => 15,
      'critical_high' => 10,
      'warning_high' => 20,
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText('Warning low must be lower than critical low or empty.');
    $thresholds = array(
      'critical_low' => 5,
      'warning_low' => 5,
      'critical_high' => 5,
      'warning_high' => 5,
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText('Warning low must be lower than warning high or empty.');
    $thresholds = array(
      'critical_low' => 50,
      'warning_low' => 95,
      'critical_high' => 55,
      'warning_high' => 100,
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText('Warning low must be lower than critical low or empty.');
    $thresholds = array(
      'critical_low' => 'alphanumeric',
      'warning_low' => 'alphanumeric',
      'critical_high' => 'alphanumeric',
      'warning_high' => 'alphanumeric',
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText('Warning low must be a number.');
    $this
      ->assertText('Warning high must be a number.');
    $this
      ->assertText('Critical low must be a number.');
    $this
      ->assertText('Critical high must be a number.');
    $thresholds = array(
      'critical_low' => 45,
      'warning_low' => 35,
      'critical_high' => 50,
      'warning_high' => 40,
    );
    $this
      ->submitThresholdSettings('test_sensor_inner', $thresholds);
    $this
      ->assertText('Warning high must be higher than critical high or empty.');
    return $thresholds;
  }

  /**
   * Tests outer threshold settings UI and validation.
   */
  protected function checkOuterThresholdSettings() {

    // Test with valid values.
    $thresholds = array(
      'critical_low' => 5,
      'warning_low' => 6,
      'critical_high' => 15,
      'warning_high' => 14,
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_outer', $thresholds);

    // Make sure that it is possible to save empty outer thresholds.
    $thresholds = array(
      'critical_low' => '',
      'warning_low' => '',
      'critical_high' => '',
      'warning_high' => '',
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText(t('Sensor settings saved.'));
    $this
      ->assertThresholdSettingsUIDefaults('test_sensor_outer', $thresholds);

    // Test validation.
    $thresholds = array(
      'critical_low' => 5,
      'warning_low' => 15,
      'critical_high' => 10,
      'warning_high' => 20,
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText('Warning high must be lower than critical high or empty.');
    $thresholds = array(
      'critical_low' => 5,
      'warning_low' => 5,
      'critical_high' => 5,
      'warning_high' => 5,
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText('Warning low must be lower than warning high or empty.');
    $thresholds = array(
      'critical_low' => 'alphanumeric',
      'warning_low' => 'alphanumeric',
      'critical_high' => 'alphanumeric',
      'warning_high' => 'alphanumeric',
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText('Warning low must be a number.');
    $this
      ->assertText('Warning high must be a number.');
    $this
      ->assertText('Critical low must be a number.');
    $this
      ->assertText('Critical high must be a number.');
    $thresholds = array(
      'critical_low' => 45,
      'warning_low' => 35,
      'critical_high' => 45,
      'warning_high' => 35,
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText('Warning low must be lower than warning high or empty.');
    $thresholds = array(
      'critical_low' => 50,
      'warning_low' => 95,
      'critical_high' => 55,
      'warning_high' => 100,
    );
    $this
      ->submitThresholdSettings('test_sensor_outer', $thresholds);
    $this
      ->assertText('Warning high must be lower than critical high or empty.');
  }

}

Classes

Namesort descending Description
MonitoringUITest Tests for the Monitoring UI.