view test/test_run.py @ 165:c7ac67366492

Make treepkg.run.capture_output include the output in the SubprocessError exception raised when the command fails with an exit code != 0
author Bernhard Herzog <bh@intevation.de>
date Fri, 20 Jun 2008 14:40:29 +0000
parents a68a4e22549c
children 98de92b816d4
line wrap: on
line source
# Copyright (C) 2008 by Intevation GmbH
# Authors:
# Bernhard Herzog <bh@intevation.de>
#
# This program is free software under the GPL (>=v2)
# Read the file COPYING coming with the software for details.

"""Tests for treepkg.run"""

import sys
import os
import unittest

from treepkg.run import call, capture_output, SubprocessError



class TestCall(unittest.TestCase):

    def test_call_defaults(self):
        call([sys.executable, "-c", "pass"])

    def test_call_error(self):
        """Test call with a subprocess that exits with a non-zero exit code"""
        try:
            call([sys.executable, "-c", "import sys; sys.exit(1)"])
        except SubprocessError, exc:
            self.assertEquals(exc.returncode, 1)
        else:
            self.fail("call did not raise an exception")

    def test_call_extra_env(self):
        """Test call with the extra_env parameter"""
        subprocess_cmd = [sys.executable, "-c",
                          "import sys, os;"
                          "value = os.environ.get('TREEPKG_TEST');"
                          "sys.exit(int(value != 'xyzzy'))"
                          ]
        # sanity check that the extra environment variable we use for
        # the test is not set yet
        self.assertRaises(SubprocessError, call, subprocess_cmd)

        # the actual test
        try:
            call(subprocess_cmd, extra_env=dict(TREEPKG_TEST="xyzzy"))
        except SubprocessError, exc:
            self.fail("the extra_env variables were not set properly")
        else:
            # test OK
            pass

    def test_call_inputdata(self):
        """Test call with inputdata passed to the subprocesses stdin"""
        # FIXME: If the feature being tested is not implemented
        # properly, it's likely that the subprocess will wait
        # indefinitely waiting for input.
        data = "1"
        subprocess_cmd = [sys.executable, "-c",
                          "import sys; sys.exit(int(raw_input("")))"]
        try:
            call(subprocess_cmd, inputdata=data)
        except SubprocessError, exc:
            self.assertEquals(exc.returncode, 1)

class TestCaptureOutput(unittest.TestCase):

    def test_capture_output_stdout(self):
        text = "explicit is better than implicit"
        self.assertEquals(capture_output([sys.executable, "-c",
                                          "print %r" % text]),
                          text + "\n")

    def test_capture_output_stderr(self):
        self.assertEquals(capture_output([sys.executable, "-c",
                                          "import sys;"
                                          "print 'on stdout';"
                                          " sys.stdout.flush();"
                                          "print >>sys.stderr, 'on stderr'"]),
                          "on stdout\non stderr\n")

    def test_capture_output_exception(self):
        try:
            capture_output([sys.executable, "-c",
                            "import sys;"
                            "print 'Beautiful is better than ugly';"
                            " sys.exit(1)"])
        except SubprocessError, exc:
            self.assertEquals(exc.returncode, 1)
            self.assertEquals(exc.output, "Beautiful is better than ugly\n")
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)