Prechádzať zdrojové kódy

tests: add context manager to catch stdout

This will avoid code duplication in tools tests.
Marek Marczykowski-Górecki 7 rokov pred
rodič
commit
4bfb523974
2 zmenil súbory, kde vykonal 52 pridanie a 4 odobranie
  1. 42 1
      qubes/tests/tools/__init__.py
  2. 10 3
      qubes/tools/__init__.py

+ 42 - 1
qubes/tests/tools/__init__.py

@@ -1 +1,42 @@
-# pylint: skip-file
+#!/usr/bin/python2 -O
+# vim: fileencoding=utf-8
+
+#
+# The Qubes OS Project, https://www.qubes-os.org/
+#
+# Copyright (C) 2015  Marek Marczykowski-Górecki
+#                                       <marmarek@invisiblethingslab.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+import sys
+try:
+    import StringIO
+except ImportError:
+    from io import StringIO
+
+
+class StdoutBuffer(object):
+    def __init__(self):
+        self.stdout = StringIO.StringIO()
+
+    def __enter__(self):
+        sys.stdout = self.stdout
+        return self.stdout
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        sys.stdout = sys.__stdout__
+        return False

+ 10 - 3
qubes/tools/__init__.py

@@ -525,6 +525,13 @@ def print_table(table):
     cmd = ['column', '-t', '-s', unit_separator]
     text_table = '\n'.join([unit_separator.join(row) for row in table])
 
-    p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
-    p.stdin.write(text_table)
-    p.communicate()
+    # for tests...
+    if sys.stdout != sys.__stdout__:
+        p = subprocess.Popen(cmd + ['-c', '80'], stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE)
+        p.stdin.write(text_table)
+        (out, _) = p.communicate()
+        sys.stdout.write(out)
+    else:
+        p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
+        p.communicate(text_table)