| 
									
										
										
										
											1999-03-11 13:26:23 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  | """Test script for popen2.py""" | 
					
						
							| 
									
										
										
										
											1999-03-11 13:26:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-11 06:57:33 +00:00
										 |  |  | import warnings | 
					
						
							|  |  |  | warnings.filterwarnings("ignore", ".*popen2 module is deprecated.*", | 
					
						
							|  |  |  |                         DeprecationWarning) | 
					
						
							|  |  |  | warnings.filterwarnings("ignore", "os\.popen. is deprecated.*", | 
					
						
							|  |  |  |                         DeprecationWarning) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-08-28 17:20:05 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2001-01-30 18:35:32 +00:00
										 |  |  | import sys | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  | import unittest | 
					
						
							|  |  |  | import popen2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from test.test_support import TestSkipped, 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 TestSkipped("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" | 
					
						
							| 
									
										
										
										
											2000-08-28 17:20:05 +00:00
										 |  |  |     if os.name == "nt": | 
					
						
							|  |  |  |         cmd = "more" | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  |     teststr = "ab cd\n" | 
					
						
							| 
									
										
										
										
											2000-09-01 20:38:55 +00:00
										 |  |  |     # "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() | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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, "_active not empty") | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  |         reap_children() | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def validate_output(self, teststr, expected_out, r, w, e=None): | 
					
						
							|  |  |  |         w.write(teststr) | 
					
						
							|  |  |  |         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) | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  |     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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-25 06:30:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-16 21:13:35 +00:00
										 |  |  | def test_main(): | 
					
						
							|  |  |  |     run_unittest(Popen2Test) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |