test_syslog.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. # Copyright (c) Twisted Matrix Laboratories.
  2. # See LICENSE for details.
  3. from twisted.trial.unittest import TestCase
  4. from twisted.python.failure import Failure
  5. try:
  6. import syslog as stdsyslog
  7. except ImportError:
  8. stdsyslog = None
  9. else:
  10. from twisted.python import syslog
  11. class SyslogObserverTests(TestCase):
  12. """
  13. Tests for L{SyslogObserver} which sends Twisted log events to the syslog.
  14. """
  15. events = None
  16. if stdsyslog is None:
  17. skip = "syslog is not supported on this platform"
  18. def setUp(self):
  19. self.patch(syslog.SyslogObserver, 'openlog', self.openlog)
  20. self.patch(syslog.SyslogObserver, 'syslog', self.syslog)
  21. self.observer = syslog.SyslogObserver('SyslogObserverTests')
  22. def openlog(self, prefix, options, facility):
  23. self.logOpened = (prefix, options, facility)
  24. self.events = []
  25. def syslog(self, options, message):
  26. self.events.append((options, message))
  27. def test_emitWithoutMessage(self):
  28. """
  29. L{SyslogObserver.emit} ignores events with an empty value for the
  30. C{'message'} key.
  31. """
  32. self.observer.emit({'message': (), 'isError': False, 'system': '-'})
  33. self.assertEqual(self.events, [])
  34. def test_emitCustomPriority(self):
  35. """
  36. L{SyslogObserver.emit} uses the value of the C{'syslogPriority'} as the
  37. syslog priority, if that key is present in the event dictionary.
  38. """
  39. self.observer.emit({
  40. 'message': ('hello, world',), 'isError': False, 'system': '-',
  41. 'syslogPriority': stdsyslog.LOG_DEBUG})
  42. self.assertEqual(
  43. self.events,
  44. [(stdsyslog.LOG_DEBUG, '[-] hello, world')])
  45. def test_emitErrorPriority(self):
  46. """
  47. L{SyslogObserver.emit} uses C{LOG_ALERT} if the event represents an
  48. error.
  49. """
  50. self.observer.emit({
  51. 'message': ('hello, world',), 'isError': True, 'system': '-',
  52. 'failure': Failure(Exception("foo"))})
  53. self.assertEqual(
  54. self.events,
  55. [(stdsyslog.LOG_ALERT, '[-] hello, world')])
  56. def test_emitCustomPriorityOverridesError(self):
  57. """
  58. L{SyslogObserver.emit} uses the value of the C{'syslogPriority'} key if
  59. it is specified even if the event dictionary represents an error.
  60. """
  61. self.observer.emit({
  62. 'message': ('hello, world',), 'isError': True, 'system': '-',
  63. 'syslogPriority': stdsyslog.LOG_NOTICE,
  64. 'failure': Failure(Exception("bar"))})
  65. self.assertEqual(
  66. self.events,
  67. [(stdsyslog.LOG_NOTICE, '[-] hello, world')])
  68. def test_emitCustomFacility(self):
  69. """
  70. L{SyslogObserver.emit} uses the value of the C{'syslogPriority'} as the
  71. syslog priority, if that key is present in the event dictionary.
  72. """
  73. self.observer.emit({
  74. 'message': ('hello, world',), 'isError': False, 'system': '-',
  75. 'syslogFacility': stdsyslog.LOG_CRON})
  76. self.assertEqual(
  77. self.events,
  78. [(stdsyslog.LOG_INFO | stdsyslog.LOG_CRON, '[-] hello, world')])
  79. def test_emitCustomSystem(self):
  80. """
  81. L{SyslogObserver.emit} uses the value of the C{'system'} key to prefix
  82. the logged message.
  83. """
  84. self.observer.emit({'message': ('hello, world',), 'isError': False,
  85. 'system': 'nonDefaultSystem'})
  86. self.assertEqual(
  87. self.events,
  88. [(stdsyslog.LOG_INFO, "[nonDefaultSystem] hello, world")])
  89. def test_emitMessage(self):
  90. """
  91. L{SyslogObserver.emit} logs the value of the C{'message'} key of the
  92. event dictionary it is passed to the syslog.
  93. """
  94. self.observer.emit({
  95. 'message': ('hello, world',), 'isError': False,
  96. 'system': '-'})
  97. self.assertEqual(
  98. self.events,
  99. [(stdsyslog.LOG_INFO, "[-] hello, world")])
  100. def test_emitMultilineMessage(self):
  101. """
  102. Each line of a multiline message is emitted separately to the syslog.
  103. """
  104. self.observer.emit({
  105. 'message': ('hello,\nworld',), 'isError': False,
  106. 'system': '-'})
  107. self.assertEqual(
  108. self.events,
  109. [(stdsyslog.LOG_INFO, '[-] hello,'),
  110. (stdsyslog.LOG_INFO, '[-] \tworld')])
  111. def test_emitStripsTrailingEmptyLines(self):
  112. """
  113. Trailing empty lines of a multiline message are omitted from the
  114. messages sent to the syslog.
  115. """
  116. self.observer.emit({
  117. 'message': ('hello,\nworld\n\n',), 'isError': False,
  118. 'system': '-'})
  119. self.assertEqual(
  120. self.events,
  121. [(stdsyslog.LOG_INFO, '[-] hello,'),
  122. (stdsyslog.LOG_INFO, '[-] \tworld')])