HAVE_SOCKET_VSOCK = _have_socket_vsock()
+HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
+
# Size in bytes of the int type
SIZEOF_INT = array.array("i").itemsize
self.serv.close()
self.serv = None
+class SocketUDPLITETest(SocketUDPTest):
+
+ def setUp(self):
+ self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
+ self.port = support.bind_port(self.serv)
+
class ThreadSafeCleanupTestCase(unittest.TestCase):
"""Subclass of unittest.TestCase with thread-safe cleanup methods.
self.cli = None
ThreadableTest.clientTearDown(self)
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
+
+ def __init__(self, methodName='runTest'):
+ SocketUDPLITETest.__init__(self, methodName=methodName)
+ ThreadableTest.__init__(self)
+
+ def clientSetUp(self):
+ self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
+
+ def clientTearDown(self):
+ self.cli.close()
+ self.cli = None
+ ThreadableTest.clientTearDown(self)
+
class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
def __init__(self, methodName='runTest'):
def newSocket(self):
return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+class UDPLITETestBase(InetTestBase):
+ """Base class for UDPLITE-over-IPv4 tests."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
+
class SCTPStreamBase(InetTestBase):
"""Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
def newSocket(self):
return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
+class UDPLITE6TestBase(Inet6TestBase):
+ """Base class for UDPLITE-over-IPv6 tests."""
+
+ def newSocket(self):
+ return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
+
# Test-skipping decorators for use with ThreadableTest.
def _testRecvFromNegative(self):
self.cli.sendto(MSG, 0, (HOST, self.port))
+
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+class BasicUDPLITETest(ThreadedUDPLITESocketTest):
+
+ def __init__(self, methodName='runTest'):
+ ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
+
+ def testSendtoAndRecv(self):
+ # Testing sendto() and Recv() over UDPLITE
+ msg = self.serv.recv(len(MSG))
+ self.assertEqual(msg, MSG)
+
+ def _testSendtoAndRecv(self):
+ self.cli.sendto(MSG, 0, (HOST, self.port))
+
+ def testRecvFrom(self):
+ # Testing recvfrom() over UDPLITE
+ msg, addr = self.serv.recvfrom(len(MSG))
+ self.assertEqual(msg, MSG)
+
+ def _testRecvFrom(self):
+ self.cli.sendto(MSG, 0, (HOST, self.port))
+
+ def testRecvFromNegative(self):
+ # Negative lengths passed to recvfrom should give ValueError.
+ self.assertRaises(ValueError, self.serv.recvfrom, -1)
+
+ def _testRecvFromNegative(self):
+ self.cli.sendto(MSG, 0, (HOST, self.port))
+
# Tests for the sendmsg()/recvmsg() interface. Where possible, the
# same test code is used with different families and types of socket
# (e.g. stream, datagram), and tests using recvmsg() are repeated
pass
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
+ SendrecvmsgConnectionlessBase,
+ ThreadedSocketTestMixin, UDPLITETestBase):
+ pass
+
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireAttrs(socket.socket, "sendmsg")
+class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
+ pass
+
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireAttrs(socket.socket, "recvmsg")
+class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
+ pass
+
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireAttrs(socket.socket, "recvmsg_into")
+class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
+ pass
+
+
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
+ SendrecvmsgConnectionlessBase,
+ ThreadedSocketTestMixin, UDPLITE6TestBase):
+
+ def checkRecvmsgAddress(self, addr1, addr2):
+ # Called to compare the received address with the address of
+ # the peer, ignoring scope ID
+ self.assertEqual(addr1[:-1], addr2[:-1])
+
+@requireAttrs(socket.socket, "sendmsg")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireAttrs(socket, "IPPROTO_IPV6")
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
+ SendrecvmsgUDPLITE6TestBase):
+ pass
+
+@requireAttrs(socket.socket, "recvmsg_into")
+@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+@requireAttrs(socket, "IPPROTO_IPV6")
+@requireSocket("AF_INET6", "SOCK_DGRAM")
+class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
+ RFC3542AncillaryTest,
+ SendrecvmsgUDPLITE6TestBase):
+ pass
+
+
class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
ConnectedStreamTestMixin, TCPTestBase):
pass
if not ok:
self.fail("recv() returned success when we did not expect it")
+@unittest.skipUnless(HAVE_SOCKET_UDPLITE,
+ 'UDPLITE sockets required for this test.')
+class UDPLITETimeoutTest(SocketUDPLITETest):
+
+ def testUDPLITETimeout(self):
+ def raise_timeout(*args, **kwargs):
+ self.serv.settimeout(1.0)
+ self.serv.recv(1024)
+ self.assertRaises(socket.timeout, raise_timeout,
+ "Error generating a timeout exception (UDPLITE)")
+
+ def testTimeoutZero(self):
+ ok = False
+ try:
+ self.serv.settimeout(0.0)
+ foo = self.serv.recv(1024)
+ except socket.timeout:
+ self.fail("caught timeout instead of error (UDPLITE)")
+ except OSError:
+ ok = True
+ except:
+ self.fail("caught unexpected exception (UDPLITE)")
+ if not ok:
+ self.fail("recv() returned success when we did not expect it")
+
class TestExceptions(unittest.TestCase):
def testExceptionTree(self):
RecvmsgRFC3542AncillaryUDP6Test,
RecvmsgIntoRFC3542AncillaryUDP6Test,
RecvmsgIntoUDP6Test,
+ SendmsgUDPLITETest,
+ RecvmsgUDPLITETest,
+ RecvmsgIntoUDPLITETest,
+ SendmsgUDPLITE6Test,
+ RecvmsgUDPLITE6Test,
+ RecvmsgRFC3542AncillaryUDPLITE6Test,
+ RecvmsgIntoRFC3542AncillaryUDPLITE6Test,
+ RecvmsgIntoUDPLITE6Test,
SendmsgTCPTest,
RecvmsgTCPTest,
RecvmsgIntoTCPTest,