blob: 2b127e2b4a95f94104ed909d0486ba8a04f3f10f [file] [log] [blame]
Michael W. Hudsonf0089982003-03-03 12:29:42 +00001import unittest
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +00002from test.test_support import TestSkipped, run_unittest
Michael W. Hudsonf0089982003-03-03 12:29:42 +00003import os, struct
4try:
5 import fcntl, termios
6except ImportError:
7 raise TestSkipped("No fcntl or termios module")
8if not hasattr(termios,'TIOCGPGRP'):
9 raise TestSkipped("termios module doesn't have TIOCGPGRP")
10
Neal Norwitz26f42f62003-03-20 04:33:16 +000011try:
12 tty = open("/dev/tty", "r")
13 tty.close()
14except IOError:
15 raise TestSkipped("Unable to open /dev/tty")
16
Michael W. Hudsonf0089982003-03-03 12:29:42 +000017class IoctlTests(unittest.TestCase):
18 def test_ioctl(self):
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000019 # If this process has been put into the background, TIOCGPGRP returns
20 # the session ID instead of the process group id.
21 ids = (os.getpgrp(), os.getsid(0))
Michael W. Hudsonf0089982003-03-03 12:29:42 +000022 tty = open("/dev/tty", "r")
23 r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ")
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000024 rpgrp = struct.unpack("i", r)[0]
25 self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
Michael W. Hudsonf0089982003-03-03 12:29:42 +000026
27 def test_ioctl_mutate(self):
28 import array
29 buf = array.array('i', [0])
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000030 ids = (os.getpgrp(), os.getsid(0))
Michael W. Hudsonf0089982003-03-03 12:29:42 +000031 tty = open("/dev/tty", "r")
32 r = fcntl.ioctl(tty, termios.TIOCGPGRP, buf, 1)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000033 rpgrp = buf[0]
Michael W. Hudsonf0089982003-03-03 12:29:42 +000034 self.assertEquals(r, 0)
Guido van Rossum8ee3e5a2005-09-14 18:09:42 +000035 self.assert_(rpgrp in ids, "%s not in %s" % (rpgrp, ids))
Michael W. Hudsonf0089982003-03-03 12:29:42 +000036
37def test_main():
38 run_unittest(IoctlTests)
39
40if __name__ == "__main__":
41 test_main()