blob: 0e0c0f4631605a77b75a37c465092aef07de0c12 [file] [log] [blame]
Guido van Rossum59e4f371999-03-11 13:26:23 +00001#! /usr/bin/env python
Collin Winter1b4145d2007-03-16 21:13:35 +00002"""Test script for popen2.py"""
Guido van Rossum59e4f371999-03-11 13:26:23 +00003
Neal Norwitz42dd86b2007-05-11 06:57:33 +00004import warnings
5warnings.filterwarnings("ignore", ".*popen2 module is deprecated.*",
6 DeprecationWarning)
7warnings.filterwarnings("ignore", "os\.popen. is deprecated.*",
8 DeprecationWarning)
9
Fred Drake31f182e2000-08-28 17:20:05 +000010import os
Moshe Zadkafc3fc332001-01-30 18:35:32 +000011import sys
Collin Winter1b4145d2007-03-16 21:13:35 +000012import unittest
13import popen2
Fred Drake31f182e2000-08-28 17:20:05 +000014
Benjamin Peterson888a39b2009-03-26 20:48:25 +000015from test.test_support import SkipTest, run_unittest, reap_children
Guido van Rossum59e4f371999-03-11 13:26:23 +000016
Collin Winter1b4145d2007-03-16 21:13:35 +000017if 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.
Benjamin Peterson888a39b2009-03-26 20:48:25 +000021 raise SkipTest("popen2() doesn't work on " + sys.platform)
Guido van Rossum59e4f371999-03-11 13:26:23 +000022
Collin Winter1b4145d2007-03-16 21:13:35 +000023# if we don't have os.popen, check that
24# we have os.fork. if not, skip the test
25# (by raising an ImportError)
26try:
27 from os import popen
28 del popen
29except ImportError:
30 from os import fork
31 del fork
Guido van Rossum59e4f371999-03-11 13:26:23 +000032
Collin Winter1b4145d2007-03-16 21:13:35 +000033class Popen2Test(unittest.TestCase):
34 cmd = "cat"
Fred Drake31f182e2000-08-28 17:20:05 +000035 if os.name == "nt":
36 cmd = "more"
Collin Winter1b4145d2007-03-16 21:13:35 +000037 teststr = "ab cd\n"
Tim Peters36208572000-09-01 20:38:55 +000038 # "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()
Fred Drake31f182e2000-08-28 17:20:05 +000042
Collin Winter1b4145d2007-03-16 21:13:35 +000043 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, "_active not empty")
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000054 reap_children()
Collin Winter1b4145d2007-03-16 21:13:35 +000055
56 def validate_output(self, teststr, expected_out, r, w, e=None):
57 w.write(teststr)
58 w.close()
59 got = r.read()
60 self.assertEquals(expected_out, got.strip(), "wrote %r read %r" %
61 (teststr, got))
62
63 if e is not None:
64 got = e.read()
65 self.assertFalse(got, "unexpected %r on stderr" % got)
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000066
Collin Winter1b4145d2007-03-16 21:13:35 +000067 def test_popen2(self):
68 r, w = popen2.popen2(self.cmd)
69 self.validate_output(self.teststr, self.expected, r, w)
70
71 def test_popen3(self):
72 if os.name == 'posix':
73 r, w, e = popen2.popen3([self.cmd])
74 self.validate_output(self.teststr, self.expected, r, w, e)
75
76 r, w, e = popen2.popen3(self.cmd)
77 self.validate_output(self.teststr, self.expected, r, w, e)
78
79 def test_os_popen2(self):
80 # same test as test_popen2(), but using the os.popen*() API
81 w, r = os.popen2(self.cmd)
82 self.validate_output(self.teststr, self.expected, r, w)
83
84 def test_os_popen3(self):
85 # same test as test_popen3(), but using the os.popen*() API
86 if os.name == 'posix':
87 w, r, e = os.popen3([self.cmd])
88 self.validate_output(self.teststr, self.expected, r, w, e)
89
90 w, r, e = os.popen3(self.cmd)
91 self.validate_output(self.teststr, self.expected, r, w, e)
92
Neal Norwitz0d4c06e2007-04-25 06:30:05 +000093
Collin Winter1b4145d2007-03-16 21:13:35 +000094def test_main():
95 run_unittest(Popen2Test)
96
97if __name__ == "__main__":
98 test_main()