commit 619cb2186fe67414c4ce1e49e7eb07821bdf24c8 Author: Damian Johnson atagar@torproject.org Date: Sat Apr 9 21:48:37 2016 -0700
Test _draw_platform_section()
First test for our header panel. This requires our render() method to provide a draw context but other than that straight forward.
I'm not a fan of the new _sampling() function. I'll change that when we add tests for get_sampling(). --- nyx/panel/header.py | 91 ++++++++++++++++++++++++++------------------------ test/__init__.py | 17 ++++++++-- test/panel/__init__.py | 7 ++++ test/panel/header.py | 47 ++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 46 deletions(-)
diff --git a/nyx/panel/header.py b/nyx/panel/header.py index 8efbf8e..f49efe1 100644 --- a/nyx/panel/header.py +++ b/nyx/panel/header.py @@ -45,7 +45,7 @@ class HeaderPanel(nyx.panel.Panel, threading.Thread): threading.Thread.__init__(self) self.setDaemon(True)
- self._vals = get_sampling() + self._vals = _get_sampling()
self._last_width = 100 self._pause_condition = threading.Condition() @@ -181,7 +181,7 @@ class HeaderPanel(nyx.panel.Panel, threading.Thread): left_width = max(subwindow.width / 2, 77) if is_wide else subwindow.width right_width = subwindow.width - left_width
- self._draw_platform_section(subwindow, 0, 0, left_width, vals) + _draw_platform_section(subwindow, 0, 0, left_width, vals)
if vals.is_connected: self._draw_ports_section(subwindow, 0, 1, left_width, vals) @@ -212,35 +212,6 @@ class HeaderPanel(nyx.panel.Panel, threading.Thread): else: subwindow.addstr(0, subwindow.height - 1, 'Paused', HIGHLIGHT)
- def _draw_platform_section(self, subwindow, x, y, width, vals): - """ - Section providing the user's hostname, platform, and version information... - - nyx - odin (Linux 3.5.0-52-generic) Tor 0.2.5.1-alpha-dev (unrecommended) - |------ platform (40 characters) ------| |----------- tor version -----------| - """ - - initial_x, space_left = x, min(width, 40) - - x = subwindow.addstr(x, y, vals.format('nyx - {hostname}', space_left)) - space_left -= x - initial_x - - if space_left >= 10: - subwindow.addstr(x, y, ' (%s)' % vals.format('{platform}', space_left - 3)) - - x, space_left = initial_x + 43, width - 43 - - if vals.version != 'Unknown' and space_left >= 10: - x = subwindow.addstr(x, y, vals.format('Tor {version}', space_left)) - space_left -= x - 43 - initial_x - - if space_left >= 7 + len(vals.version_status): - version_color = CONFIG['attr.version_status_colors'].get(vals.version_status, WHITE) - - x = subwindow.addstr(x, y, ' (') - x = subwindow.addstr(x, y, vals.version_status, version_color) - subwindow.addstr(x, y, ')') - def _draw_ports_section(self, subwindow, x, y, width, vals): """ Section providing our nickname, address, and port information... @@ -435,7 +406,7 @@ class HeaderPanel(nyx.panel.Panel, threading.Thread):
def _update(self): previous_height = self.get_height() - self._vals = get_sampling(self._vals) + self._vals = _get_sampling(self._vals)
if self._vals.fd_used and self._vals.fd_limit != -1: fd_percent = 100 * self._vals.fd_used / self._vals.fd_limit @@ -466,7 +437,24 @@ class HeaderPanel(nyx.panel.Panel, threading.Thread): self.redraw(True) # just need to redraw ourselves
-def get_sampling(last_sampling = None): +def _sampling(**attr): + class Sampling(collections.namedtuple('Sampling', attr.keys())): + def __init__(self, **attr): + super(Sampling, self).__init__(**attr) + self._attr = attr + + def format(self, message, crop_width = None): + formatted_msg = message.format(**self._attr) + + if crop_width: + formatted_msg = str_tools.crop(formatted_msg, crop_width) + + return formatted_msg + + return Sampling(**attr) + + +def _get_sampling(last_sampling = None): controller = tor_controller() retrieved = time.time()
@@ -538,17 +526,34 @@ def get_sampling(last_sampling = None): 'platform': '%s %s' % (os.uname()[0], os.uname()[2]), # [platform name] [version] }
- class Sampling(collections.namedtuple('Sampling', attr.keys())): - def __init__(self, **attr): - super(Sampling, self).__init__(**attr) - self._attr = attr + return _sampling(**attr)
- def format(self, message, crop_width = None): - formatted_msg = message.format(**self._attr)
- if crop_width: - formatted_msg = str_tools.crop(formatted_msg, crop_width) +def _draw_platform_section(subwindow, x, y, width, vals): + """ + Section providing the user's hostname, platform, and version information...
- return formatted_msg + nyx - odin (Linux 3.5.0-52-generic) Tor 0.2.5.1-alpha-dev (unrecommended) + |------ platform (40 characters) ------| |----------- tor version -----------| + """
- return Sampling(**attr) + initial_x, space_left = x, min(width, 40) + + x = subwindow.addstr(x, y, vals.format('nyx - {hostname}', space_left)) + space_left -= x - initial_x + + if space_left >= 10: + subwindow.addstr(x, y, ' (%s)' % vals.format('{platform}', space_left - 3)) + + x, space_left = initial_x + 43, width - 43 + + if vals.version != 'Unknown' and space_left >= 10: + x = subwindow.addstr(x, y, vals.format('Tor {version}', space_left)) + space_left -= x - 43 - initial_x + + if space_left >= 7 + len(vals.version_status): + version_color = CONFIG['attr.version_status_colors'].get(vals.version_status, WHITE) + + x = subwindow.addstr(x, y, ' (') + x = subwindow.addstr(x, y, vals.version_status, version_color) + subwindow.addstr(x, y, ')') diff --git a/test/__init__.py b/test/__init__.py index b606b4a..23dda15 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -3,6 +3,7 @@ Unit tests for nyx. """
import collections +import inspect import time import unittest
@@ -55,7 +56,8 @@ def require_curses(func): def render(func, *args, **kwargs): """ Runs the given curses function, providing content that's rendered on the - screen. + screen. If the function starts with an argument named 'subwindow' then it's + provided one through :func:`~nyx.curses.draw`.
:param function func: draw function to be invoked
@@ -67,9 +69,18 @@ def render(func, *args, **kwargs): def draw_func(): nyx.curses.disable_acs() nyx.curses.CURSES_SCREEN.erase() - start_time = time.time() - attr['return_value'] = func(*args, **kwargs) + + func_args = inspect.getargspec(func).args + + if func_args and func_args[0] == 'subwindow': + def _draw(subwindow): + return func(subwindow, *args, **kwargs) + + attr['return_value'] = nyx.curses.draw(_draw) + else: + attr['return_value'] = func(*args, **kwargs) + attr['runtime'] = time.time() - start_time attr['content'] = nyx.curses.screenshot()
diff --git a/test/panel/__init__.py b/test/panel/__init__.py new file mode 100644 index 0000000..0050223 --- /dev/null +++ b/test/panel/__init__.py @@ -0,0 +1,7 @@ +""" +Unit tests for nyx's panel modules. +""" + +__all__ = [ + 'header', +] diff --git a/test/panel/header.py b/test/panel/header.py new file mode 100644 index 0000000..ee18eb6 --- /dev/null +++ b/test/panel/header.py @@ -0,0 +1,47 @@ +""" +Unit tests for nyx.panel.header. +""" + +import unittest + +import nyx.panel.header +import test + +from test import require_curses + + +class TestHeader(unittest.TestCase): + @require_curses + def test_draw_platform_section(self): + vals = nyx.panel.header._sampling( + hostname = 'odin', + platform = 'Linux 3.5.0-54-generic', + version = '0.2.8.1-alpha-dev', + version_status = 'unrecommended', + ) + + test_input = { + 80: 'nyx - odin (Linux 3.5.0-54-generic) Tor 0.2.8.1-alpha-dev', + 70: 'nyx - odin (Linux 3.5.0-54-generic) Tor 0.2.8.1-alpha-dev', + 60: 'nyx - odin (Linux 3.5.0-54-generic) Tor 0.2.8.1-al...', + 50: 'nyx - odin (Linux 3.5.0-54-generic)', + 40: 'nyx - odin (Linux 3.5.0-54-generic)', + 30: 'nyx - odin (Linux 3.5.0-54...)', + 20: 'nyx - odin (Linu...)', + 10: 'nyx - odin', + 0: 'nyx - odin', + } + + for width, expected in test_input.items(): + self.assertEqual(expected, test.render(nyx.panel.header._draw_platform_section, 0, 0, width, vals).content) + + @require_curses + def test_draw_platform_section_without_version(self): + vals = nyx.panel.header._sampling( + hostname = 'odin', + platform = 'Linux 3.5.0-54-generic', + version = 'Unknown', + ) + + rendered = test.render(nyx.panel.header._draw_platform_section, 0, 0, 80, vals) + self.assertEqual('nyx - odin (Linux 3.5.0-54-generic)', rendered.content)
tor-commits@lists.torproject.org