1 #! /usr/bin/env python 2 """Test script for popen2.py""" 3 4 import warnings 5 warnings.filterwarnings("ignore", ".*popen2 module is deprecated.*", 6 DeprecationWarning) 7 warnings.filterwarnings("ignore", "os\.popen. is deprecated.*", 8 DeprecationWarning) 9 10 import os 11 import sys 12 import unittest 13 import popen2 14 15 from test.test_support import run_unittest, reap_children 16 17 if sys.platform[:4] == 'beos' or sys.platform[:6] == 'atheos': 18 # Locks get messed up or something. Generally we're supposed 19 # to avoid mixing "posix" fork & exec with native threads, and 20 # they may be right about that after all. 21 raise unittest.SkipTest("popen2() doesn't work on " + sys.platform) 22 23 # if we don't have os.popen, check that 24 # we have os.fork. if not, skip the test 25 # (by raising an ImportError) 26 try: 27 from os import popen 28 del popen 29 except ImportError: 30 from os import fork 31 del fork 32 33 class Popen2Test(unittest.TestCase): 34 cmd = "cat" 35 if os.name == "nt": 36 cmd = "more" 37 teststr = "ab cd\n" 38 # "more" doesn't act the same way across Windows flavors, 39 # sometimes adding an extra newline at the start or the 40 # end. So we strip whitespace off both ends for comparison. 41 expected = teststr.strip() 42 43 def setUp(self): 44 popen2._cleanup() 45 # When the test runs, there shouldn't be any open pipes 46 self.assertFalse(popen2._active, "Active pipes when test starts" + 47 repr([c.cmd for c in popen2._active])) 48 49 def tearDown(self): 50 for inst in popen2._active: 51 inst.wait() 52 popen2._cleanup() 53 self.assertFalse(popen2._active, "popen2._active not empty") 54 # The os.popen*() API delegates to the subprocess module (on Unix) 55 import subprocess 56 for inst in subprocess._active: 57 inst.wait() 58 subprocess._cleanup() 59 self.assertFalse(subprocess._active, "subprocess._active not empty") 60 reap_children() 61 62 def validate_output(self, teststr, expected_out, r, w, e=None): 63 w.write(teststr) 64 w.close() 65 got = r.read() 66 self.assertEqual(expected_out, got.strip(), "wrote %r read %r" % 67 (teststr, got)) 68 69 if e is not None: 70 got = e.read() 71 self.assertFalse(got, "unexpected %r on stderr" % got) 72 73 def test_popen2(self): 74 r, w = popen2.popen2(self.cmd) 75 self.validate_output(self.teststr, self.expected, r, w) 76 77 def test_popen3(self): 78 if os.name == 'posix': 79 r, w, e = popen2.popen3([self.cmd]) 80 self.validate_output(self.teststr, self.expected, r, w, e) 81 82 r, w, e = popen2.popen3(self.cmd) 83 self.validate_output(self.teststr, self.expected, r, w, e) 84 85 def test_os_popen2(self): 86 # same test as test_popen2(), but using the os.popen*() API 87 if os.name == 'posix': 88 w, r = os.popen2([self.cmd]) 89 self.validate_output(self.teststr, self.expected, r, w) 90 91 w, r = os.popen2(["echo", self.teststr]) 92 got = r.read() 93 self.assertEqual(got, self.teststr + "\n") 94 95 w, r = os.popen2(self.cmd) 96 self.validate_output(self.teststr, self.expected, r, w) 97 98 def test_os_popen3(self): 99 # same test as test_popen3(), but using the os.popen*() API 100 if os.name == 'posix': 101 w, r, e = os.popen3([self.cmd]) 102 self.validate_output(self.teststr, self.expected, r, w, e) 103 104 w, r, e = os.popen3(["echo", self.teststr]) 105 got = r.read() 106 self.assertEqual(got, self.teststr + "\n") 107 got = e.read() 108 self.assertFalse(got, "unexpected %r on stderr" % got) 109 110 w, r, e = os.popen3(self.cmd) 111 self.validate_output(self.teststr, self.expected, r, w, e) 112 113 def test_os_popen4(self): 114 if os.name == 'posix': 115 w, r = os.popen4([self.cmd]) 116 self.validate_output(self.teststr, self.expected, r, w) 117 118 w, r = os.popen4(["echo", self.teststr]) 119 got = r.read() 120 self.assertEqual(got, self.teststr + "\n") 121 122 w, r = os.popen4(self.cmd) 123 self.validate_output(self.teststr, self.expected, r, w) 124 125 126 def test_main(): 127 run_unittest(Popen2Test) 128 129 if __name__ == "__main__": 130 test_main() 131