+2009-11-25 Eric Seidel <eric@webkit.org>
+
+ Reviewed by Adam Barth.
+
+ Abstract out capturing stdout/stderr into a new OutputCapture class for re-use among the various unit tests.
+ https://bugs.webkit.org/show_bug.cgi?id=31870
+
+ * Scripts/modules/commands/queries_unittest.py: Use the new class.
+ * Scripts/modules/multicommandtool_unittest.py: Ditto.
+ * Scripts/modules/outputcapture.py: Added.
+
2009-11-24 Dmitry Titov <dimich@chromium.org>
Reviewed by Eric Seidel.
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import unittest
-from StringIO import StringIO
from modules.commands.queries import *
from modules.mock_bugzillatool import *
+from modules.outputcapture import OutputCapture
class QueryCommandsTest(unittest.TestCase):
- def _capture_output_with_name(output_name):
- self.saved_outputs[output_name] = getattr(sys, output_name)
- setattr(sys, output_name, StringIO.StringIO())
-
- def _release_output_with_name(output_name):
- captured_output = getattr(sys, output_name).getvalue()
- setattr(sys, output_name, self.saved_outputs[output_name])
- del self.saved_outputs[output_name]
- return captured_output
-
- def _capture_output(self):
- self._capture_output_with_name("stdout")
- self._capture_output_with_name("stderr")
-
- def _restore_output(self):
- return (self._release_output_with_name("stdout"), self._release_output_with_name("stderr"))
-
def _assert_execute_outputs(self, command, command_args, expected_stdout, expected_stderr = ""):
- self._capture_output()
+ capture = OutputCapture()
+ capture.capture_output()
command.execute(None, command_args, MockBugzillaTool())
- (stdout_string, stderr_string) = self._restore_output()
+ (stdout_string, stderr_string) = capture.restore_output()
self.assertEqual(stdout_string, expected_stdout)
self.assertEqual(expected_stderr, expected_stderr)
import sys
import unittest
from multicommandtool import MultiCommandTool, Command
-from StringIO import StringIO
+from modules.outputcapture import OutputCapture
from optparse import make_option
class MultiCommandToolTest(unittest.TestCase):
- def _capture_stderr(self):
- self.saved_stderr = sys.stderr
- sys.stderr = StringIO()
-
- def _release_stderr(self):
- string = sys.stderr.getvalue()
- sys.stderr = self.saved_stderr
- self.saved_stderr = None
- return string
-
def _assert_split(self, args, expected_split):
self.assertEqual(MultiCommandTool._split_args(args), expected_split)
command_with_options = TrivialCommand(options=[make_option("--my_option")])
tool = TrivialTool(commands=[command_with_options])
- self._capture_stderr()
+ capture = OutputCapture()
+ capture.capture_output()
exit_code = tool.main(["tool", "help", "trivial"])
- help_text = self._release_stderr()
- expected_subcommand_help = " trivial [options] help text\nOptions:\n --my_option=MY_OPTION\n\n"
+ (stdout_string, stderr_string) = capture.restore_output()
+ expected_subcommand_help = "trivial [options] help text\nOptions:\n --my_option=MY_OPTION\n\n"
self.assertEqual(exit_code, 0)
- self.assertEqual(help_text, expected_subcommand_help)
+ self.assertEqual(stdout_string, "")
+ self.assertEqual(stderr_string, expected_subcommand_help)
if __name__ == "__main__":
--- /dev/null
+# Copyright (c) 2009, Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Class for unittest support. Used for capturing stderr/stdout.
+
+import sys
+from StringIO import StringIO
+
+class OutputCapture(object):
+ def __init__(self):
+ self.saved_outputs = dict()
+
+ def _capture_output_with_name(self, output_name):
+ self.saved_outputs[output_name] = getattr(sys, output_name)
+ setattr(sys, output_name, StringIO())
+
+ def _restore_output_with_name(self, output_name):
+ captured_output = getattr(sys, output_name).getvalue()
+ setattr(sys, output_name, self.saved_outputs[output_name])
+ del self.saved_outputs[output_name]
+ return captured_output
+
+ def capture_output(self):
+ self._capture_output_with_name("stdout")
+ self._capture_output_with_name("stderr")
+
+ def restore_output(self):
+ return (self._restore_output_with_name("stdout"), self._restore_output_with_name("stderr"))