#! /usr/bin/env python """Test script for popen2.py""" import warnings warnings.filterwarnings("ignore", ".*popen2 module is deprecated.*", DeprecationWarning) warnings.filterwarnings("ignore", "os\.popen. is deprecated.*", DeprecationWarning) import os import sys import unittest import popen2 from test.test_support import run_unittest, reap_children if sys.platform[:4] == 'beos' or sys.platform[:6] == 'atheos': # Locks get messed up or something. Generally we're supposed # to avoid mixing "posix" fork & exec with native threads, and # they may be right about that after all. raise unittest.SkipTest("popen2() doesn't work on " + sys.platform) # if we don't have os.popen, check that # we have os.fork. if not, skip the test # (by raising an ImportError) try: from os import popen del popen except ImportError: from os import fork del fork class Popen2Test(unittest.TestCase): cmd = "cat" if os.name == "nt": cmd = "more" teststr = "ab cd\n" # "more" doesn't act the same way across Windows flavors, # sometimes adding an extra newline at the start or the # end. So we strip whitespace off both ends for comparison. expected = teststr.strip() def setUp(self): popen2._cleanup() # When the test runs, there shouldn't be any open pipes self.assertFalse(popen2._active, "Active pipes when test starts" + repr([c.cmd for c in popen2._active])) def tearDown(self): for inst in popen2._active: inst.wait() popen2._cleanup() self.assertFalse(popen2._active, "popen2._active not empty") # The os.popen*() API delegates to the subprocess module (on Unix) import subprocess for inst in subprocess._active: inst.wait() subprocess._cleanup() self.assertFalse(subprocess._active, "subprocess._active not empty") reap_children() def validate_output(self, teststr, expected_out, r, w, e=None): w.write(teststr) w.close() got = r.read() self.assertEqual(expected_out, got.strip(), "wrote %r read %r" % (teststr, got)) if e is not None: got = e.read() self.assertFalse(got, "unexpected %r on stderr" % got) def test_popen2(self): r, w = popen2.popen2(self.cmd) self.validate_output(self.teststr, self.expected, r, w) def test_popen3(self): if os.name == 'posix': r, w, e = popen2.popen3([self.cmd]) self.validate_output(self.teststr, self.expected, r, w, e) r, w, e = popen2.popen3(self.cmd) self.validate_output(self.teststr, self.expected, r, w, e) def test_os_popen2(self): # same test as test_popen2(), but using the os.popen*() API if os.name == 'posix': w, r = os.popen2([self.cmd]) self.validate_output(self.teststr, self.expected, r, w) w, r = os.popen2(["echo", self.teststr]) got = r.read() self.assertEqual(got, self.teststr + "\n") w, r = os.popen2(self.cmd) self.validate_output(self.teststr, self.expected, r, w) def test_os_popen3(self): # same test as test_popen3(), but using the os.popen*() API if os.name == 'posix': w, r, e = os.popen3([self.cmd]) self.validate_output(self.teststr, self.expected, r, w, e) w, r, e = os.popen3(["echo", self.teststr]) got = r.read() self.assertEqual(got, self.teststr + "\n") got = e.read() self.assertFalse(got, "unexpected %r on stderr" % got) w, r, e = os.popen3(self.cmd) self.validate_output(self.teststr, self.expected, r, w, e) def test_os_popen4(self): if os.name == 'posix': w, r = os.popen4([self.cmd]) self.validate_output(self.teststr, self.expected, r, w) w, r = os.popen4(["echo", self.teststr]) got = r.read() self.assertEqual(got, self.teststr + "\n") w, r = os.popen4(self.cmd) self.validate_output(self.teststr, self.expected, r, w) def test_main(): run_unittest(Popen2Test) if __name__ == "__main__": test_main()