2008-03-21 20:49:44 -03:00
|
|
|
"""
|
|
|
|
Tests for kqueue wrapper.
|
|
|
|
"""
|
|
|
|
import socket
|
|
|
|
import errno
|
|
|
|
import time
|
|
|
|
import select
|
|
|
|
import sys
|
|
|
|
import unittest
|
|
|
|
|
|
|
|
from test import test_support
|
|
|
|
if not hasattr(select, "kqueue"):
|
|
|
|
raise test_support.TestSkipped("test works only on BSD")
|
|
|
|
|
|
|
|
class TestKQueue(unittest.TestCase):
|
|
|
|
def test_create_queue(self):
|
|
|
|
kq = select.kqueue()
|
|
|
|
self.assert_(kq.fileno() > 0, kq.fileno())
|
|
|
|
self.assert_(not kq.closed)
|
|
|
|
kq.close()
|
|
|
|
self.assert_(kq.closed)
|
|
|
|
self.assertRaises(ValueError, kq.fileno)
|
|
|
|
|
|
|
|
def test_create_event(self):
|
|
|
|
fd = sys.stderr.fileno()
|
|
|
|
ev = select.kevent(fd)
|
|
|
|
other = select.kevent(1000)
|
|
|
|
self.assertEqual(ev.ident, fd)
|
|
|
|
self.assertEqual(ev.filter, select.KQ_FILTER_READ)
|
|
|
|
self.assertEqual(ev.flags, select.KQ_EV_ADD)
|
|
|
|
self.assertEqual(ev.fflags, 0)
|
|
|
|
self.assertEqual(ev.data, 0)
|
|
|
|
self.assertEqual(ev.udata, 0)
|
|
|
|
self.assertEqual(ev, ev)
|
|
|
|
self.assertNotEqual(ev, other)
|
|
|
|
self.assertEqual(cmp(ev, other), -1)
|
|
|
|
self.assert_(ev < other)
|
|
|
|
self.assert_(other >= ev)
|
|
|
|
self.assertRaises(TypeError, cmp, ev, None)
|
|
|
|
self.assertRaises(TypeError, cmp, ev, 1)
|
|
|
|
self.assertRaises(TypeError, cmp, ev, "ev")
|
|
|
|
|
|
|
|
ev = select.kevent(fd, select.KQ_FILTER_WRITE)
|
|
|
|
self.assertEqual(ev.ident, fd)
|
|
|
|
self.assertEqual(ev.filter, select.KQ_FILTER_WRITE)
|
|
|
|
self.assertEqual(ev.flags, select.KQ_EV_ADD)
|
|
|
|
self.assertEqual(ev.fflags, 0)
|
|
|
|
self.assertEqual(ev.data, 0)
|
|
|
|
self.assertEqual(ev.udata, 0)
|
|
|
|
self.assertEqual(ev, ev)
|
|
|
|
self.assertNotEqual(ev, other)
|
|
|
|
|
|
|
|
ev = select.kevent(fd, select.KQ_FILTER_WRITE, select.KQ_EV_ONESHOT)
|
|
|
|
self.assertEqual(ev.ident, fd)
|
|
|
|
self.assertEqual(ev.filter, select.KQ_FILTER_WRITE)
|
|
|
|
self.assertEqual(ev.flags, select.KQ_EV_ONESHOT)
|
|
|
|
self.assertEqual(ev.fflags, 0)
|
|
|
|
self.assertEqual(ev.data, 0)
|
|
|
|
self.assertEqual(ev.udata, 0)
|
|
|
|
self.assertEqual(ev, ev)
|
|
|
|
self.assertNotEqual(ev, other)
|
|
|
|
|
|
|
|
ev = select.kevent(1, 2, 3, 4, 5, 6)
|
|
|
|
self.assertEqual(ev.ident, 1)
|
|
|
|
self.assertEqual(ev.filter, 2)
|
|
|
|
self.assertEqual(ev.flags, 3)
|
|
|
|
self.assertEqual(ev.fflags, 4)
|
|
|
|
self.assertEqual(ev.data, 5)
|
|
|
|
self.assertEqual(ev.udata, 6)
|
|
|
|
self.assertEqual(ev, ev)
|
|
|
|
self.assertNotEqual(ev, other)
|
|
|
|
|
|
|
|
def test_queue_event(self):
|
|
|
|
serverSocket = socket.socket()
|
|
|
|
serverSocket.bind(('127.0.0.1', 0))
|
|
|
|
serverSocket.listen(1)
|
|
|
|
client = socket.socket()
|
|
|
|
client.setblocking(False)
|
|
|
|
try:
|
|
|
|
client.connect(('127.0.0.1', serverSocket.getsockname()[1]))
|
|
|
|
except socket.error, e:
|
|
|
|
self.assertEquals(e.args[0], errno.EINPROGRESS)
|
|
|
|
else:
|
|
|
|
#raise AssertionError("Connect should have raised EINPROGRESS")
|
|
|
|
pass # FreeBSD doesn't raise an exception here
|
|
|
|
server, addr = serverSocket.accept()
|
|
|
|
|
|
|
|
if sys.platform.startswith("darwin"):
|
|
|
|
flags = select.KQ_EV_ADD | select.KQ_EV_ENABLE
|
|
|
|
else:
|
|
|
|
flags = 0
|
|
|
|
|
|
|
|
kq = select.kqueue()
|
|
|
|
kq2 = select.kqueue.fromfd(kq.fileno())
|
|
|
|
|
|
|
|
ev = select.kevent(server.fileno(),
|
|
|
|
select.KQ_FILTER_WRITE,
|
|
|
|
select.KQ_EV_ADD | select.KQ_EV_ENABLE)
|
|
|
|
kq.control([ev], 0)
|
|
|
|
ev = select.kevent(server.fileno(),
|
|
|
|
select.KQ_FILTER_READ,
|
|
|
|
select.KQ_EV_ADD | select.KQ_EV_ENABLE)
|
|
|
|
kq.control([ev], 0)
|
|
|
|
ev = select.kevent(client.fileno(),
|
|
|
|
select.KQ_FILTER_WRITE,
|
|
|
|
select.KQ_EV_ADD | select.KQ_EV_ENABLE)
|
|
|
|
kq2.control([ev], 0)
|
|
|
|
ev = select.kevent(client.fileno(),
|
|
|
|
select.KQ_FILTER_READ,
|
|
|
|
select.KQ_EV_ADD | select.KQ_EV_ENABLE)
|
|
|
|
kq2.control([ev], 0)
|
|
|
|
|
|
|
|
events = kq.control(None, 4, 1)
|
|
|
|
events = [(e.ident, e.filter, e.flags) for e in events]
|
|
|
|
events.sort()
|
|
|
|
self.assertEquals(events, [
|
|
|
|
(client.fileno(), select.KQ_FILTER_WRITE, flags),
|
|
|
|
(server.fileno(), select.KQ_FILTER_WRITE, flags)])
|
|
|
|
|
|
|
|
client.send("Hello!")
|
|
|
|
server.send("world!!!")
|
|
|
|
|
|
|
|
# We may need to call it several times
|
2009-01-24 12:20:50 -04:00
|
|
|
for i in range(10):
|
|
|
|
events = kq.control(None, 4, 1)
|
2008-03-21 20:49:44 -03:00
|
|
|
if len(events) == 4:
|
|
|
|
break
|
2009-01-24 12:20:50 -04:00
|
|
|
time.sleep(1.0)
|
|
|
|
else:
|
|
|
|
self.fail('timeout waiting for event notifications')
|
|
|
|
|
2008-03-21 20:49:44 -03:00
|
|
|
events = [(e.ident, e.filter, e.flags) for e in events]
|
|
|
|
events.sort()
|
|
|
|
|
|
|
|
self.assertEquals(events, [
|
|
|
|
(client.fileno(), select.KQ_FILTER_WRITE, flags),
|
|
|
|
(client.fileno(), select.KQ_FILTER_READ, flags),
|
|
|
|
(server.fileno(), select.KQ_FILTER_WRITE, flags),
|
|
|
|
(server.fileno(), select.KQ_FILTER_READ, flags)])
|
|
|
|
|
|
|
|
# Remove completely client, and server read part
|
|
|
|
ev = select.kevent(client.fileno(),
|
|
|
|
select.KQ_FILTER_WRITE,
|
|
|
|
select.KQ_EV_DELETE)
|
|
|
|
kq.control([ev], 0)
|
|
|
|
ev = select.kevent(client.fileno(),
|
|
|
|
select.KQ_FILTER_READ,
|
|
|
|
select.KQ_EV_DELETE)
|
|
|
|
kq.control([ev], 0)
|
|
|
|
ev = select.kevent(server.fileno(),
|
|
|
|
select.KQ_FILTER_READ,
|
|
|
|
select.KQ_EV_DELETE)
|
|
|
|
kq.control([ev], 0, 0)
|
|
|
|
|
|
|
|
events = kq.control([], 4, 0.99)
|
|
|
|
events = [(e.ident, e.filter, e.flags) for e in events]
|
|
|
|
events.sort()
|
|
|
|
self.assertEquals(events, [
|
|
|
|
(server.fileno(), select.KQ_FILTER_WRITE, flags)])
|
|
|
|
|
|
|
|
client.close()
|
|
|
|
server.close()
|
|
|
|
serverSocket.close()
|
|
|
|
|
Merged revisions 73206,73232,73299,73683,74020,74185,74544,74643,74647,74817,74838-74839,74865,74946,75402,75459,75604,75696 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r73206 | georg.brandl | 2009-06-04 11:15:12 +0200 (Do, 04 Jun 2009) | 1 line
#3584: ignore trailing newlines when placing the caret for a SyntaxError location.
........
r73232 | georg.brandl | 2009-06-04 20:59:58 +0200 (Do, 04 Jun 2009) | 1 line
Add test for #3684.
........
r73299 | georg.brandl | 2009-06-08 20:41:36 +0200 (Mo, 08 Jun 2009) | 1 line
Typo fix.
........
r73683 | georg.brandl | 2009-06-29 16:44:49 +0200 (Mo, 29 Jun 2009) | 1 line
Fix error handling in PyCode_Optimize, by Alexander Schremmer at EuroPython sprint.
........
r74020 | georg.brandl | 2009-07-16 09:18:07 +0200 (Do, 16 Jul 2009) | 1 line
#5910: fix kqueue for calls with more than one event.
........
r74185 | georg.brandl | 2009-07-23 11:17:09 +0200 (Do, 23 Jul 2009) | 1 line
Fix the "pylocals" gdb command.
........
r74544 | georg.brandl | 2009-08-24 19:12:30 +0200 (Mo, 24 Aug 2009) | 1 line
#6775: fix python.org URLs in README.
........
r74643 | georg.brandl | 2009-09-04 08:59:20 +0200 (Fr, 04 Sep 2009) | 2 lines
Issue #2666: Handle BROWSER environment variable properly for unknown browser names in the webbrowser module.
........
r74647 | georg.brandl | 2009-09-04 10:17:04 +0200 (Fr, 04 Sep 2009) | 2 lines
Issue #5275: In Cookie's Cookie.load(), properly handle non-string arguments as documented.
........
r74817 | georg.brandl | 2009-09-16 11:05:11 +0200 (Mi, 16 Sep 2009) | 1 line
Make deprecation notices as visible as warnings are right now.
........
r74838 | georg.brandl | 2009-09-16 18:22:12 +0200 (Mi, 16 Sep 2009) | 1 line
Remove some more boilerplate from the actual tests in test_pdb.
........
r74839 | georg.brandl | 2009-09-16 18:36:39 +0200 (Mi, 16 Sep 2009) | 1 line
Make the pdb displayhook compatible with the standard displayhook: do not print Nones. Add a test for that.
........
r74865 | georg.brandl | 2009-09-17 09:49:37 +0200 (Do, 17 Sep 2009) | 1 line
#6912: add "with" block support to pindent.
........
r74946 | georg.brandl | 2009-09-19 10:43:16 +0200 (Sa, 19 Sep 2009) | 1 line
Update bug tracker reference.
........
r75402 | georg.brandl | 2009-10-14 17:51:48 +0200 (Mi, 14 Okt 2009) | 1 line
#7125: fix typo.
........
r75459 | georg.brandl | 2009-10-17 10:57:43 +0200 (Sa, 17 Okt 2009) | 1 line
Fix refleaks in _ctypes PyCSimpleType_New, which fixes the refleak seen in test___all__.
........
r75604 | georg.brandl | 2009-10-22 13:36:50 +0200 (Do, 22 Okt 2009) | 1 line
Fix stylesheet for multi-paragraph impl-details.
........
r75696 | georg.brandl | 2009-10-25 21:25:43 +0100 (So, 25 Okt 2009) | 1 line
Fix a demo.
........
2009-10-27 12:39:53 -03:00
|
|
|
def testPair(self):
|
|
|
|
kq = select.kqueue()
|
|
|
|
a, b = socket.socketpair()
|
|
|
|
|
|
|
|
a.send(b'foo')
|
|
|
|
event1 = select.kevent(a, select.KQ_FILTER_READ, select.KQ_EV_ADD | select.KQ_EV_ENABLE)
|
|
|
|
event2 = select.kevent(b, select.KQ_FILTER_READ, select.KQ_EV_ADD | select.KQ_EV_ENABLE)
|
|
|
|
r = kq.control([event1, event2], 1, 1)
|
|
|
|
self.assertTrue(r)
|
|
|
|
self.assertFalse(r[0].flags & select.KQ_EV_ERROR)
|
|
|
|
self.assertEquals(b.recv(r[0].data), b'foo')
|
|
|
|
|
|
|
|
a.close()
|
|
|
|
b.close()
|
|
|
|
kq.close()
|
|
|
|
|
2008-03-21 20:49:44 -03:00
|
|
|
def test_main():
|
|
|
|
test_support.run_unittest(TestKQueue)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
test_main()
|