view test/test_run.py @ 301:3fcebc5cf93c

Do not require subclassing of recipes.kde_enterprise_3_5.base.BaseRevisionPackager. Make usable as RevisionPackager directly by setting its source_packager_cls attribute to the BaseSourcePackager from the same module.
author Bernhard Herzog <bh@intevation.de>
date Tue, 24 Nov 2009 16:35:41 +0000
parents e3ab8aca2b08
children
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 filesupport import FileTestMixin

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 TestRunWithLogging(unittest.TestCase, FileTestMixin):

    def test_run_with_logfile(self):
        logfilename = self.temp_file_name("logfile")
        call([sys.executable, "-c", "print \"I'm a lumber jack and I'm OK\""],
             logfile=logfilename)
        self.check_file_contents(logfilename, "I'm a lumber jack and I'm OK\n")


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)