| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2009-03-30 23:05:48 +00:00
										 |  |  | from test.test_support import run_unittest, import_module, get_attribute | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | import os, struct | 
					
						
							| 
									
										
										
										
											2009-03-30 23:05:48 +00:00
										 |  |  | fcntl = import_module('fcntl') | 
					
						
							|  |  |  | termios = import_module('termios') | 
					
						
							|  |  |  | get_attribute(termios, 'TIOCGPGRP') #Can't run tests without this feature | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-20 04:33:16 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     tty = open("/dev/tty", "r") | 
					
						
							|  |  |  |     tty.close() | 
					
						
							|  |  |  | except IOError: | 
					
						
							| 
									
										
										
										
											2009-03-26 21:10:30 +00:00
										 |  |  |     raise unittest.SkipTest("Unable to open /dev/tty") | 
					
						
							| 
									
										
										
										
											2003-03-20 04:33:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-20 05:41:53 +00:00
										 |  |  | try: | 
					
						
							|  |  |  |     import pty | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     pty = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | class IoctlTests(unittest.TestCase): | 
					
						
							|  |  |  |     def test_ioctl(self): | 
					
						
							| 
									
										
										
										
											2005-09-14 18:09:42 +00:00
										 |  |  |         # If this process has been put into the background, TIOCGPGRP returns | 
					
						
							|  |  |  |         # the session ID instead of the process group id. | 
					
						
							|  |  |  |         ids = (os.getpgrp(), os.getsid(0)) | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  |         tty = open("/dev/tty", "r") | 
					
						
							|  |  |  |         r = fcntl.ioctl(tty, termios.TIOCGPGRP, "    ") | 
					
						
							| 
									
										
										
										
											2005-09-14 18:09:42 +00:00
										 |  |  |         rpgrp = struct.unpack("i", r)[0] | 
					
						
							| 
									
										
										
										
											2010-01-23 23:04:36 +00:00
										 |  |  |         self.assertIn(rpgrp, ids) | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_ioctl_mutate(self): | 
					
						
							|  |  |  |         import array | 
					
						
							|  |  |  |         buf = array.array('i', [0]) | 
					
						
							| 
									
										
										
										
											2005-09-14 18:09:42 +00:00
										 |  |  |         ids = (os.getpgrp(), os.getsid(0)) | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  |         tty = open("/dev/tty", "r") | 
					
						
							|  |  |  |         r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1) | 
					
						
							| 
									
										
										
										
											2005-09-14 18:09:42 +00:00
										 |  |  |         rpgrp = buf[0] | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  |         self.assertEquals(r, 0) | 
					
						
							| 
									
										
										
										
											2010-01-23 23:04:36 +00:00
										 |  |  |         self.assertIn(rpgrp, ids) | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-20 05:41:53 +00:00
										 |  |  |     def test_ioctl_signed_unsigned_code_param(self): | 
					
						
							|  |  |  |         if not pty: | 
					
						
							| 
									
										
										
										
											2009-03-26 21:10:30 +00:00
										 |  |  |             raise unittest.SkipTest('pty module required') | 
					
						
							| 
									
										
										
										
											2008-03-20 05:41:53 +00:00
										 |  |  |         mfd, sfd = pty.openpty() | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             if termios.TIOCSWINSZ < 0: | 
					
						
							|  |  |  |                 set_winsz_opcode_maybe_neg = termios.TIOCSWINSZ | 
					
						
							|  |  |  |                 set_winsz_opcode_pos = termios.TIOCSWINSZ & 0xffffffffL | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 set_winsz_opcode_pos = termios.TIOCSWINSZ | 
					
						
							|  |  |  |                 set_winsz_opcode_maybe_neg, = struct.unpack("i", | 
					
						
							|  |  |  |                         struct.pack("I", termios.TIOCSWINSZ)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             our_winsz = struct.pack("HHHH",80,25,0,0) | 
					
						
							|  |  |  |             # test both with a positive and potentially negative ioctl code | 
					
						
							|  |  |  |             new_winsz = fcntl.ioctl(mfd, set_winsz_opcode_pos, our_winsz) | 
					
						
							|  |  |  |             new_winsz = fcntl.ioctl(mfd, set_winsz_opcode_maybe_neg, our_winsz) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             os.close(mfd) | 
					
						
							|  |  |  |             os.close(sfd) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-03 12:29:42 +00:00
										 |  |  | def test_main(): | 
					
						
							|  |  |  |     run_unittest(IoctlTests) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     test_main() |