aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2021-02-04 03:01:17 +0000
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-02-04 17:00:36 +0000
commitba23c3b3163192b85431a9b3975e4745664f0f27 (patch)
treee3f29555398002577ce6cb291fe7b9904444d56d
parent791d101d4dfbc976ffe0ae9069dfb79ef07117db (diff)
tests: Add argument to trim output to a reasonable size
The output of the "values" tshark glossary has over 1.3M lines. Writing this to stdout with some test failures is problematic in a number of ways. Also it's not helpful because stderr is written after stdout (not interleaved) so there is no output context to the error message. The error/warning message (from stderr, that triggered the test failure) needs to be sufficient to provide a good understaning of the test failure. The output is trimmed to first+last N lines. Some lines are kept as informational and because it may be useful if the program aborts. Fixes #17203.
-rw-r--r--test/subprocesstest.py26
-rw-r--r--test/suite_clopts.py2
2 files changed, 21 insertions, 7 deletions
diff --git a/test/subprocesstest.py b/test/subprocesstest.py
index 87a382303a..a3a27d33f6 100644
--- a/test/subprocesstest.py
+++ b/test/subprocesstest.py
@@ -55,6 +55,7 @@ class LoggingPopen(subprocess.Popen):
'''
def __init__(self, proc_args, *args, **kwargs):
self.log_fd = kwargs.pop('log_fd', None)
+ self.max_lines = kwargs.pop('max_lines', None)
kwargs['stdout'] = subprocess.PIPE
kwargs['stderr'] = subprocess.PIPE
# Make sure communicate() gives us bytes.
@@ -63,11 +64,24 @@ class LoggingPopen(subprocess.Popen):
super().__init__(proc_args, *args, **kwargs)
self.stdout_str = ''
self.stderr_str = ''
+
+ @staticmethod
+ def trim_output(out_log, max_lines):
+ lines = out_log.splitlines(True)
+ if not len(lines) > max_lines * 2 + 1:
+ return out_log
+ header = lines[:max_lines]
+ body = lines[max_lines:-max_lines]
+ body = "<<< trimmed {} lines of output >>>\n".format(len(body))
+ footer = lines[-max_lines:]
+ return ''.join(header) + body + ''.join(footer)
def wait_and_log(self):
'''Wait for the process to finish and log its output.'''
out_data, err_data = self.communicate(timeout=process_timeout)
out_log = out_data.decode('UTF-8', 'replace')
+ if self.max_lines and self.max_lines > 0:
+ out_log = self.trim_output(out_log, self.max_lines)
err_log = err_data.decode('UTF-8', 'replace')
self.log_fd.flush()
self.log_fd.write('-- Begin stdout for {} --\n'.format(self.cmd_str))
@@ -249,7 +263,7 @@ class SubprocessTestCase(unittest.TestCase):
return False
return True
- def startProcess(self, proc_args, stdin=None, env=None, shell=False, cwd=None):
+ def startProcess(self, proc_args, stdin=None, env=None, shell=False, cwd=None, max_lines=None):
'''Start a process in the background. Returns a subprocess.Popen object.
You typically wait for it using waitProcess() or assertWaitProcess().'''
@@ -261,7 +275,7 @@ class SubprocessTestCase(unittest.TestCase):
# fixture (via a test method parameter or class decorator).
assert not (env is None and hasattr(self, '_fixture_request')), \
"Decorate class with @fixtures.mark_usefixtures('test_env')"
- proc = LoggingPopen(proc_args, stdin=stdin, env=env, shell=shell, log_fd=self.log_fd, cwd=cwd)
+ proc = LoggingPopen(proc_args, stdin=stdin, env=env, shell=shell, log_fd=self.log_fd, cwd=cwd, max_lines=max_lines)
self.processes.append(proc)
return proc
@@ -278,14 +292,14 @@ class SubprocessTestCase(unittest.TestCase):
process.wait_and_log()
self.assertEqual(process.returncode, expected_return)
- def runProcess(self, args, env=None, shell=False, cwd=None):
+ def runProcess(self, args, env=None, shell=False, cwd=None, max_lines=None):
'''Start a process and wait for it to finish.'''
- process = self.startProcess(args, env=env, shell=shell, cwd=cwd)
+ process = self.startProcess(args, env=env, shell=shell, cwd=cwd, max_lines=max_lines)
process.wait_and_log()
return process
- def assertRun(self, args, env=None, shell=False, expected_return=0, cwd=None):
+ def assertRun(self, args, env=None, shell=False, expected_return=0, cwd=None, max_lines=None):
'''Start a process and wait for it to finish. Check its return code.'''
- process = self.runProcess(args, env=env, shell=shell, cwd=cwd)
+ process = self.runProcess(args, env=env, shell=shell, cwd=cwd, max_lines=max_lines)
self.assertEqual(process.returncode, expected_return)
return process
diff --git a/test/suite_clopts.py b/test/suite_clopts.py
index 8a25e2c4a0..b0f96232c2 100644
--- a/test/suite_clopts.py
+++ b/test/suite_clopts.py
@@ -165,7 +165,7 @@ class case_tshark_dump_glossaries(subprocesstest.SubprocessTestCase):
self.log_fd.truncate()
except Exception:
pass
- self.assertRun((cmd_tshark, '-G', glossary), env=base_env)
+ self.assertRun((cmd_tshark, '-G', glossary), env=base_env, max_lines=20)
self.assertEqual(self.countOutput(count_stdout=False, count_stderr=True), 0, 'Found error output while printing glossary ' + glossary)
def test_tshark_glossary_valid_utf8(self, cmd_tshark, base_env):