|
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") |
|
10 |
|
11 try: |
|
12 tty = open("/dev/tty", "r") |
|
13 tty.close() |
|
14 except IOError: |
|
15 raise TestSkipped("Unable to open /dev/tty") |
|
16 |
|
17 try: |
|
18 import pty |
|
19 except ImportError: |
|
20 pty = None |
|
21 |
|
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)) |
|
31 |
|
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)) |
|
41 |
|
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)) |
|
54 |
|
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) |
|
62 |
|
63 def test_main(): |
|
64 run_unittest(IoctlTests) |
|
65 |
|
66 if __name__ == "__main__": |
|
67 test_main() |