1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
"""
Unit tests for nyx.panel.log.
"""
import time
import unittest
import nyx.panel.log
import test
from nyx.log import LogEntry, LogFilters
from test import require_curses
try:
# added in python 3.3
from unittest.mock import Mock, patch
except ImportError:
from mock import Mock, patch
EXPECTED_WRAPPED_MSG = """\
16:41:37 [NOTICE] ho hum, ho hum, ho hum, ho hum, ho hum, ho hum, ho hum, ho
hum, ho hum, ho hum, ho hum, ho hum, ho hum, ho hum, ho hum, ho hum, ho hum,
ho hum, ho hum, ho hum, ho hum...
""".rstrip()
EXPECTED_ENTRIES = """\
16:41:37 [NYX_WARNING] Tor's geoip database is unavailable.
16:41:37 [NYX_NOTICE] No nyxrc loaded, using defaults. You can customize nyx by
placing a configuration file at /home/atagar/.nyx/nyxrc (see the nyxrc.sample
for its options).
16:41:37 [NOTICE] New control connection opened from 127.0.0.1.
16:41:37 [NOTICE] Opening OR listener on 0.0.0.0:7000
16:41:37 [NOTICE] Opening Control listener on 127.0.0.1:9051
16:41:37 [NOTICE] Opening Socks listener on 127.0.0.1:9050
16:41:37 [NOTICE] Tor v0.2.9.0-alpha-dev (git-44ea3dc3311564a9) running on
Linux with Libevent 2.0.16-stable, OpenSSL 1.0.1 and Zlib 1.2.3.4.
16:41:37 [NOTICE] Tor 0.2.9.0-alpha-dev (git-44ea3dc3311564a9) opening log
file.
""".rstrip()
EXPECTED_ENTRIES_WITH_BORDER = """\
+-October 26, 2011-------------------------------------------------------------+
|16:41:37 [NYX_WARNING] Tor's geoip database is unavailable. |
|16:41:37 [NYX_NOTICE] No nyxrc loaded, using defaults. You can customize nyx |
| by placing a configuration file at /home/atagar/.nyx/nyxrc (see the |
| nyxrc.sample for its options). |
|16:41:37 [NOTICE] New control connection opened from 127.0.0.1. |
|16:41:37 [NOTICE] Opening OR listener on 0.0.0.0:7000 |
|16:41:37 [NOTICE] Opening Control listener on 127.0.0.1:9051 |
|16:41:37 [NOTICE] Opening Socks listener on 127.0.0.1:9050 |
|16:41:37 [NOTICE] Tor v0.2.9.0-alpha-dev (git-44ea3dc3311564a9) running on |
| Linux with Libevent 2.0.16-stable, OpenSSL 1.0.1 and Zlib 1.2.3.4. |
|16:41:37 [NOTICE] Tor 0.2.9.0-alpha-dev (git-44ea3dc3311564a9) opening log |
| file. |
+------------------------------------------------------------------------------+
""".rstrip()
NOW = 467656897.08663
TIME_STRUCT = time.gmtime(NOW)
def entries():
return [
LogEntry(NOW, 'NYX_WARNING', "Tor's geoip database is unavailable."),
LogEntry(NOW, 'NYX_NOTICE', 'No nyxrc loaded, using defaults. You can customize nyx by placing a configuration file at /home/atagar/.nyx/nyxrc (see the nyxrc.sample for its options).'),
LogEntry(NOW, 'NOTICE', 'New control connection opened from 127.0.0.1.'),
LogEntry(NOW, 'NOTICE', 'Opening OR listener on 0.0.0.0:7000'),
LogEntry(NOW, 'NOTICE', 'Opening Control listener on 127.0.0.1:9051'),
LogEntry(NOW, 'NOTICE', 'Opening Socks listener on 127.0.0.1:9050'),
LogEntry(NOW, 'NOTICE', 'Tor v0.2.9.0-alpha-dev (git-44ea3dc3311564a9) running on Linux with Libevent 2.0.16-stable, OpenSSL 1.0.1 and Zlib 1.2.3.4.'),
LogEntry(NOW, 'NOTICE', 'Tor 0.2.9.0-alpha-dev (git-44ea3dc3311564a9) opening log file.'),
]
class TestLogPanel(unittest.TestCase):
@require_curses
def test_draw_title(self):
rendered = test.render(nyx.panel.log._draw_title, ['NOTICE', 'WARN', 'ERR'], LogFilters())
self.assertEqual('Events (NOTICE-ERR):', rendered.content)
rendered = test.render(nyx.panel.log._draw_title, ['NYX_NOTICE', 'NYX_WARNING', 'NYX_ERROR', 'NOTICE', 'WARN', 'ERR'], LogFilters())
self.assertEqual('Events (TOR/NYX NOTICE-ERR):', rendered.content)
rendered = test.render(nyx.panel.log._draw_title, ['NYX_DEBUG', 'NYX_INFO', 'NYX_NOTICE', 'NYX_WARNING', 'NYX_ERROR', 'NOTICE', 'WARN', 'ERR'], LogFilters())
self.assertEqual('Events (NOTICE-ERR, NYX DEBUG-ERR):', rendered.content)
@require_curses
def test_draw_title_with_filter(self):
log_filter = LogFilters()
log_filter.select('stuff*')
rendered = test.render(nyx.panel.log._draw_title, ['NOTICE', 'WARN', 'ERR'], log_filter)
self.assertEqual('Events (NOTICE-ERR, filter: stuff*):', rendered.content)
@require_curses
@patch('time.localtime', Mock(return_value = TIME_STRUCT))
def test_draw_entry(self):
entry = LogEntry(NOW, 'NOTICE', 'feeding sulfur to baby dragons is just mean...')
rendered = test.render(nyx.panel.log._draw_entry, 0, 0, 80, entry, True)
self.assertEqual('16:41:37 [NOTICE] feeding sulfur to baby dragons is just mean...', rendered.content)
@require_curses
@patch('time.localtime', Mock(return_value = TIME_STRUCT))
def test_draw_entry_that_wraps(self):
entry = LogEntry(NOW, 'NOTICE', 'ho hum%s...' % (', ho hum' * 20))
rendered = test.render(nyx.panel.log._draw_entry, 0, 0, 80, entry, True)
self.assertEqual(EXPECTED_WRAPPED_MSG, rendered.content)
@require_curses
@patch('time.localtime', Mock(return_value = TIME_STRUCT))
def test_draw_entry_with_duplicates(self):
entry = LogEntry(NOW, 'NOTICE', 'feeding sulfur to baby dragons is just mean...')
entry.duplicates = [1, 2] # only care about the count, not the content
rendered = test.render(nyx.panel.log._draw_entry, 0, 0, 80, entry, True)
self.assertEqual('16:41:37 [NOTICE] feeding sulfur to baby dragons is just mean...', rendered.content)
rendered = test.render(nyx.panel.log._draw_entry, 0, 0, 80, entry, False)
self.assertEqual('16:41:37 [NOTICE] feeding sulfur to baby dragons is just mean... [1 duplicate\n hidden]', rendered.content)
entry.duplicates = [1, 2, 3, 4, 5, 6]
rendered = test.render(nyx.panel.log._draw_entry, 0, 0, 80, entry, False)
self.assertEqual('16:41:37 [NOTICE] feeding sulfur to baby dragons is just mean... [5 duplicates\n hidden]', rendered.content)
@require_curses
@patch('time.localtime', Mock(return_value = TIME_STRUCT))
@patch('nyx.log.day_count', Mock(return_value = 5))
def test_draw_entries(self):
rendered = test.render(nyx.panel.log._draw_entries, 0, 0, entries(), True)
self.assertEqual(EXPECTED_ENTRIES, rendered.content)
@require_curses
@patch('time.localtime', Mock(return_value = TIME_STRUCT))
@patch('time.strftime', Mock(return_value = 'October 26, 2011'))
def test_draw_entries_day_dividers(self):
rendered = test.render(nyx.panel.log._draw_entries, 0, 0, entries(), True)
self.assertEqual(EXPECTED_ENTRIES_WITH_BORDER, rendered.content)
|