mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Patch #1676994: Refactor test_popen2 to use unittest.
This commit is contained in:
		
							parent
							
								
									dd2cf1cb84
								
							
						
					
					
						commit
						1b4145dbb3
					
				
					 2 changed files with 77 additions and 105 deletions
				
			
		|  | @ -200,45 +200,3 @@ def popen4(cmd, bufsize=-1, mode='t'): | ||||||
|         return inst.fromchild, inst.tochild |         return inst.fromchild, inst.tochild | ||||||
| 
 | 
 | ||||||
|     __all__.extend(["Popen3", "Popen4"]) |     __all__.extend(["Popen3", "Popen4"]) | ||||||
| 
 |  | ||||||
| def _test(): |  | ||||||
|     # When the test runs, there shouldn't be any open pipes |  | ||||||
|     _cleanup() |  | ||||||
|     assert not _active, "Active pipes when test starts " + repr([c.cmd for c in _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..." |  | ||||||
|     r, w = 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: |  | ||||||
|         r, w, e = popen3([cmd]) |  | ||||||
|     except: |  | ||||||
|         r, w, e = 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 _active[:]: |  | ||||||
|         inst.wait() |  | ||||||
|     _cleanup() |  | ||||||
|     if _active: |  | ||||||
|         raise ValueError("_active not empty") |  | ||||||
|     print "All OK" |  | ||||||
| 
 |  | ||||||
| if __name__ == '__main__': |  | ||||||
|     _test() |  | ||||||
|  |  | ||||||
|  | @ -1,78 +1,92 @@ | ||||||
| #! /usr/bin/env python | #! /usr/bin/env python | ||||||
| """Test script for popen2.py | """Test script for popen2.py""" | ||||||
|    Christian Tismer |  | ||||||
| """ |  | ||||||
| 
 | 
 | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
| from test.test_support import TestSkipped, reap_children | import unittest | ||||||
|  | import popen2 | ||||||
| 
 | 
 | ||||||
| # popen2 contains its own testing routine | from test.test_support import TestSkipped, run_unittest, reap_children | ||||||
| # which is especially useful to see if open files |  | ||||||
| # like stdin can be read successfully by a forked |  | ||||||
| # subprocess. |  | ||||||
| 
 | 
 | ||||||
| def main(): | if sys.platform[:4] == 'beos' or sys.platform[:6] == 'atheos': | ||||||
|     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 |     #  Locks get messed up or something.  Generally we're supposed | ||||||
|     #  to avoid mixing "posix" fork & exec with native threads, and |     #  to avoid mixing "posix" fork & exec with native threads, and | ||||||
|     #  they may be right about that after all. |     #  they may be right about that after all. | ||||||
|         raise TestSkipped, "popen2() doesn't work during import on " + sys.platform |     raise TestSkipped("popen2() doesn't work on " + sys.platform) | ||||||
|     try: | 
 | ||||||
|  | # 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 |     from os import popen | ||||||
|     except ImportError: |     del popen | ||||||
|         # if we don't have os.popen, check that | except ImportError: | ||||||
|         # we have os.fork.  if not, skip the test |  | ||||||
|         # (by raising an ImportError) |  | ||||||
|     from os import fork |     from os import fork | ||||||
|     import popen2 |     del fork | ||||||
|     popen2._test() |  | ||||||
| 
 | 
 | ||||||
| 
 | class Popen2Test(unittest.TestCase): | ||||||
| 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" |     cmd = "cat" | ||||||
|     teststr = "ab cd\n" |  | ||||||
|     if os.name == "nt": |     if os.name == "nt": | ||||||
|         cmd = "more" |         cmd = "more" | ||||||
|  |     teststr = "ab cd\n" | ||||||
|     # "more" doesn't act the same way across Windows flavors, |     # "more" doesn't act the same way across Windows flavors, | ||||||
|     # sometimes adding an extra newline at the start or the |     # sometimes adding an extra newline at the start or the | ||||||
|     # end.  So we strip whitespace off both ends for comparison. |     # end.  So we strip whitespace off both ends for comparison. | ||||||
|     expected = teststr.strip() |     expected = teststr.strip() | ||||||
|     print "testing popen2..." | 
 | ||||||
|     w, r = os.popen2(cmd) |     def setUp(self): | ||||||
|     w.write(teststr) |         popen2._cleanup() | ||||||
|     w.close() |         # When the test runs, there shouldn't be any open pipes | ||||||
|     got = r.read() |         self.assertFalse(popen2._active, "Active pipes when test starts" + | ||||||
|     if got.strip() != expected: |             repr([c.cmd for c in popen2._active])) | ||||||
|         raise ValueError("wrote %r read %r" % (teststr, got)) | 
 | ||||||
|     print "testing popen3..." |     def tearDown(self): | ||||||
|     try: |         for inst in popen2._active: | ||||||
|         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() |             inst.wait() | ||||||
|         popen2._cleanup() |         popen2._cleanup() | ||||||
|     if popen2._active: |         self.assertFalse(popen2._active, "_active not empty") | ||||||
|         raise ValueError("_active not empty") |         reap_children()         | ||||||
|     print "All OK" |  | ||||||
| 
 | 
 | ||||||
| main() |     def validate_output(self, teststr, expected_out, r, w, e=None): | ||||||
| _test() |         w.write(teststr) | ||||||
| reap_children() |         w.close() | ||||||
|  |         got = r.read() | ||||||
|  |         self.assertEquals(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 | ||||||
|  |         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(self.cmd) | ||||||
|  |         self.validate_output(self.teststr, self.expected, r, w, e) | ||||||
|  | 
 | ||||||
|  |          | ||||||
|  | def test_main(): | ||||||
|  |     run_unittest(Popen2Test) | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     test_main() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Collin Winter
						Collin Winter