monitoring.ui.test in Monitoring 7
Contains \MonitoringUITest.
File
test/tests/monitoring.ui.testView 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
Name | Description |
---|---|
MonitoringUITest | Tests for the Monitoring UI. |