Require implementations for warnings.showwarning() support the 'line' argument.
[python.git] / Lib / test / test_ioctl.py
blobd46b10d5d97d2997ab5ac00d210ad744d82747b9
1 import unittest
2 from test.test_support import TestSkipped, run_unittest
3 import os, struct
4 try:
5 import fcntl, termios
6 except ImportError:
7 raise TestSkipped("No fcntl or termios module")
8 if not hasattr(termios,'TIOCGPGRP'):
9 raise TestSkipped("termios module doesn't have TIOCGPGRP")
11 try:
12 tty = open("/dev/tty", "r")
13 tty.close()
14 except IOError:
15 raise TestSkipped("Unable to open /dev/tty")
17 try:
18 import pty
19 except ImportError:
20 pty = None
22 class IoctlTests(unittest.TestCase):
23 def test_ioctl(self):
24 # If this process has been put into the background, TIOCGPGRP returns
25 # the session ID instead of the process group id.
26 ids = (os.getpgrp(), os.getsid(0))
27 tty = open("/dev/tty", "r")
28 r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ")
29 rpgrp = struct.unpack("i", r)[0]
30 self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
32 def test_ioctl_mutate(self):
33 import array
34 buf = array.array('i', [0])
35 ids = (os.getpgrp(), os.getsid(0))
36 tty = open("/dev/tty", "r")
37 r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
38 rpgrp = buf[0]
39 self.assertEquals(r, 0)
40 self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
42 def test_ioctl_signed_unsigned_code_param(self):
43 if not pty:
44 raise TestSkipped('pty module required')
45 mfd, sfd = pty.openpty()
46 try:
47 if termios.TIOCSWINSZ < 0:
48 set_winsz_opcode_maybe_neg = termios.TIOCSWINSZ
49 set_winsz_opcode_pos = termios.TIOCSWINSZ & 0xffffffffL
50 else:
51 set_winsz_opcode_pos = termios.TIOCSWINSZ
52 set_winsz_opcode_maybe_neg, = struct.unpack("i",
53 struct.pack("I", termios.TIOCSWINSZ))
55 our_winsz = struct.pack("HHHH",80,25,0,0)
56 # test both with a positive and potentially negative ioctl code
57 new_winsz = fcntl.ioctl(mfd, set_winsz_opcode_pos, our_winsz)
58 new_winsz = fcntl.ioctl(mfd, set_winsz_opcode_maybe_neg, our_winsz)
59 finally:
60 os.close(mfd)
61 os.close(sfd)
63 def test_main():
64 run_unittest(IoctlTests)
66 if __name__ == "__main__":
67 test_main()