#! /usr/bin/env python """Test script for popen2.py Christian Tismer """ import os import sys from test.test_support import TestSkipped, reap_children # popen2 contains its own testing routine # which is especially useful to see if open files # like stdin can be read successfully by a forked # subprocess. def main(): print("Test popen2 module:") if (sys.platform[:4] == 'beos' or sys.platform[:6] == 'atheos') \ and __name__ != '__main__': # 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 TestSkipped, "popen2() doesn't work during import on " + sys.platform try: from os import popen except ImportError: # if we don't have os.popen, check that # we have os.fork. if not, skip the test # (by raising an ImportError) from os import fork import popen2 popen2._test() def _test(): # same test as popen2._test(), but using the os.popen*() API print("Testing os module:") import popen2 # When the test runs, there shouldn't be any open pipes popen2._cleanup() assert not popen2._active, "Active pipes when test starts " + repr([c.cmd for c in popen2._active]) cmd = "cat" teststr = "ab cd\n" if os.name == "nt": cmd = "more" # "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() print("testing popen2...") w, r = os.popen2(cmd) w.write(teststr) w.close() got = r.read() if got.strip() != expected: raise ValueError("wrote %r read %r" % (teststr, got)) print("testing popen3...") try: w, r, e = os.popen3([cmd]) except: w, r, e = os.popen3(cmd) w.write(teststr) w.close() got = r.read() if got.strip() != expected: raise ValueError("wrote %r read %r" % (teststr, got)) got = e.read() if got: raise ValueError("unexpected %r on stderr" % (got,)) for inst in popen2._active[:]: inst.wait() popen2._cleanup() if popen2._active: raise ValueError("_active not empty") print("All OK") main() _test() reap_children()