PageRenderTime 52ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Tests/DevelErrorHandlerTest.php

https://gitlab.com/Drulenium-bot/devel
PHP | 213 lines | 130 code | 26 blank | 57 comment | 0 complexity | 9dcc30107d6efa859fea28f194e20499 MD5 | raw file
  1. <?php
  2. namespace Drupal\devel\Tests;
  3. use Drupal\Component\Render\FormattableMarkup;
  4. use Drupal\simpletest\WebTestBase;
  5. /**
  6. * Tests devel error handler.
  7. *
  8. * @group devel
  9. */
  10. class DevelErrorHandlerTest extends WebTestBase {
  11. /**
  12. * Modules to enable.
  13. *
  14. * @var array
  15. */
  16. public static $modules = ['devel'];
  17. /**
  18. * Tests devel error handler.
  19. */
  20. public function testErrorHandler() {
  21. $error_notice = [
  22. '%type' => 'Notice',
  23. '@message' => 'Undefined variable: undefined',
  24. '%function' => 'Drupal\devel\Form\SettingsForm->demonstrateErrorHandlers()',
  25. ];
  26. $error_warning = [
  27. '%type' => 'Warning',
  28. '@message' => 'Division by zero',
  29. '%function' => 'Drupal\devel\Form\SettingsForm->demonstrateErrorHandlers()',
  30. ];
  31. $config = $this->config('system.logging');
  32. $config->set('error_level', ERROR_REPORTING_DISPLAY_VERBOSE)->save();
  33. $admin_user = $this->drupalCreateUser(['administer site configuration', 'access devel information']);
  34. $this->drupalLogin($admin_user);
  35. // Ensures that the error handler config is present on the config page and
  36. // by default the standard error handler is selected.
  37. $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
  38. $this->assertEqual($error_handlers, [DEVEL_ERROR_HANDLER_STANDARD => DEVEL_ERROR_HANDLER_STANDARD]);
  39. $this->drupalGet('admin/config/development/devel');
  40. $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_STANDARD);
  41. // Ensures that selecting the DEVEL_ERROR_HANDLER_NONE option no error
  42. // (raw or message) is shown on the site in case of php errors.
  43. $edit = [
  44. 'error_handlers[]' => DEVEL_ERROR_HANDLER_NONE,
  45. ];
  46. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  47. $this->assertText(t('The configuration options have been saved.'));
  48. $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
  49. $this->assertEqual($error_handlers, [DEVEL_ERROR_HANDLER_NONE => DEVEL_ERROR_HANDLER_NONE]);
  50. $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_NONE);
  51. $this->clickLink('notice+warning');
  52. $this->assertResponse(200, 'Received expected HTTP status code.');
  53. $this->assertNoRawErrorMessage($error_notice);
  54. $this->assertNoRawErrorMessage($error_warning);
  55. $this->assertNoErrorMessage($error_notice);
  56. $this->assertNoErrorMessage($error_warning);
  57. // Ensures that selecting the DEVEL_ERROR_HANDLER_BACKTRACE_KINT option a
  58. // backtrace above the rendered page is shown on the site in case of php
  59. // errors.
  60. $edit = [
  61. 'error_handlers[]' => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
  62. ];
  63. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  64. $this->assertText(t('The configuration options have been saved.'));
  65. $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
  66. $this->assertEqual($error_handlers, [DEVEL_ERROR_HANDLER_BACKTRACE_KINT => DEVEL_ERROR_HANDLER_BACKTRACE_KINT]);
  67. $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_KINT);
  68. $this->clickLink('notice+warning');
  69. $this->assertResponse(200, 'Received expected HTTP status code.');
  70. $this->assertRawErrorMessage($error_notice);
  71. $this->assertRawErrorMessage($error_warning);
  72. // Ensures that selecting the DEVEL_ERROR_HANDLER_BACKTRACE_DPM option a
  73. // backtrace in the message area is shown on the site in case of php errors.
  74. $edit = [
  75. 'error_handlers[]' => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
  76. ];
  77. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  78. $this->assertText(t('The configuration options have been saved.'));
  79. $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
  80. $this->assertEqual($error_handlers, [DEVEL_ERROR_HANDLER_BACKTRACE_DPM => DEVEL_ERROR_HANDLER_BACKTRACE_DPM]);
  81. $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_DPM);
  82. $this->clickLink('notice+warning');
  83. $this->assertResponse(200, 'Received expected HTTP status code.');
  84. $this->assertErrorMessage($error_notice);
  85. $this->assertErrorMessage($error_warning);
  86. // Ensures that when multiple handlers are selected, the output produced by
  87. // every handler is shown on the site in case of php errors.
  88. $edit = [
  89. 'error_handlers[]' => [
  90. DEVEL_ERROR_HANDLER_BACKTRACE_DPM => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
  91. DEVEL_ERROR_HANDLER_BACKTRACE_KINT => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
  92. ]
  93. ];
  94. $this->drupalPostForm('admin/config/development/devel', $edit, t('Save configuration'));
  95. $this->assertText(t('The configuration options have been saved.'));
  96. $error_handlers = \Drupal::config('devel.settings')->get('error_handlers');
  97. $this->assertEqual($error_handlers, [
  98. DEVEL_ERROR_HANDLER_BACKTRACE_DPM => DEVEL_ERROR_HANDLER_BACKTRACE_DPM,
  99. DEVEL_ERROR_HANDLER_BACKTRACE_KINT => DEVEL_ERROR_HANDLER_BACKTRACE_KINT,
  100. ]);
  101. $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_DPM);
  102. $this->assertOptionSelected('edit-error-handlers', DEVEL_ERROR_HANDLER_BACKTRACE_KINT);
  103. $this->clickLink('notice+warning');
  104. $this->assertResponse(200, 'Received expected HTTP status code.');
  105. $this->assertRawErrorMessage($error_notice);
  106. $this->assertRawErrorMessage($error_warning);
  107. $this->assertErrorMessage($error_notice);
  108. $this->assertErrorMessage($error_warning);
  109. // Ensures that setting the error reporting to all the output produced by
  110. // handlers is shown on the site in case of php errors.
  111. $config->set('error_level', ERROR_REPORTING_DISPLAY_ALL)->save();
  112. $this->clickLink('notice+warning');
  113. $this->assertResponse(200, 'Received expected HTTP status code.');
  114. $this->assertRawErrorMessage($error_notice);
  115. $this->assertRawErrorMessage($error_warning);
  116. $this->assertErrorMessage($error_notice);
  117. $this->assertErrorMessage($error_warning);
  118. // Ensures that setting the error reporting to some the output produced by
  119. // handlers is shown on the site in case of php errors.
  120. $config->set('error_level', ERROR_REPORTING_DISPLAY_SOME)->save();
  121. $this->assertResponse(200, 'Received expected HTTP status code.');
  122. $this->clickLink('notice+warning');
  123. $this->assertRawErrorMessage($error_notice);
  124. $this->assertRawErrorMessage($error_warning);
  125. $this->assertErrorMessage($error_notice);
  126. $this->assertErrorMessage($error_warning);
  127. // Ensures that setting the error reporting to none the output produced by
  128. // handlers is not shown on the site in case of php errors.
  129. $config->set('error_level', ERROR_REPORTING_HIDE)->save();
  130. $this->clickLink('notice+warning');
  131. $this->assertResponse(200, 'Received expected HTTP status code.');
  132. $this->assertNoRawErrorMessage($error_notice);
  133. $this->assertNoRawErrorMessage($error_warning);
  134. $this->assertNoErrorMessage($error_notice);
  135. $this->assertNoErrorMessage($error_warning);
  136. // The errors are expected. Do not interpret them as a test failure.
  137. // Not using File API; a potential error must trigger a PHP warning.
  138. unlink(\Drupal::root() . '/' . $this->siteDirectory . '/error.log');
  139. }
  140. /**
  141. * Helper function: assert that the error message is found.
  142. *
  143. * @param array $error
  144. * The error to check.
  145. */
  146. protected function assertRawErrorMessage(array $error) {
  147. $message = new FormattableMarkup('%type: @message in %function (line ', $error);
  148. $this->assertRaw($message, new FormattableMarkup('Found raw error message: @message.', ['@message' => $message]));
  149. }
  150. /**
  151. * Helper function: assert that the error message is not found.
  152. *
  153. *
  154. * @param array $error
  155. * The error to check.
  156. */
  157. protected function assertNoRawErrorMessage(array $error) {
  158. $message = new FormattableMarkup('%type: @message in %function (line ', $error);
  159. $this->assertNoRaw($message, new FormattableMarkup('Did not find raw error message: @message.', ['@message' => $message]));
  160. }
  161. /**
  162. * Helper function: assert that the error message is found.
  163. *
  164. * @param array $error
  165. * The error to check.
  166. */
  167. protected function assertErrorMessage(array $error) {
  168. $pattern = '//div[contains(@class, "messages--warning")]//pre[contains(., :content)]';
  169. $message = new FormattableMarkup('%type: @message in %function (line ', $error);
  170. $message = html_entity_decode(strip_tags((string) $message));
  171. $xpath = $this->xpath($pattern, [':content' => $message]);
  172. $this->assertTrue(!empty($xpath), new FormattableMarkup('Found error message: @message.', ['@message' => $message]));
  173. }
  174. /**
  175. * Helper function: assert that the error message is not found.
  176. *
  177. * @param array $error
  178. * The error to check.
  179. */
  180. protected function assertNoErrorMessage(array $error) {
  181. $pattern = '//div[contains(@class, "messages--warning")]//pre[contains(., :content)]';
  182. $message = new FormattableMarkup('%type: @message in %function (line ', $error);
  183. $message = html_entity_decode(strip_tags((string) $message));
  184. $xpath = $this->xpath($pattern, [':content' => $message]);
  185. $this->assertTrue(empty($xpath), new FormattableMarkup('Found error message: @message.', ['@message' => $message]));
  186. }
  187. }