Kaydet (Commit) 24e4af8c authored tarafından Guido van Rossum's avatar Guido van Rossum

New test suite for the socket module by Michael Gilfix.

Changed test_timeout.py to conform to the guidelines in Lib/test/README.
üst e3fdc975
# Not tested: #!/usr/bin/env python
# socket.fromfd()
# sktobj.getsockopt()
# sktobj.recvfrom()
# sktobj.sendto()
# sktobj.setblocking()
# sktobj.setsockopt()
# sktobj.shutdown()
import unittest
import test_support
from test_support import verbose, TestFailed
import socket import socket
import os import select
import time import time
import thread, threading
import Queue
def missing_ok(str): PORT = 50007
try: HOST = 'localhost'
getattr(socket, str) MSG = 'Michael Gilfix was here\n'
except AttributeError:
pass class SocketTCPTest(unittest.TestCase):
def setUp(self):
self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.serv.bind((HOST, PORT))
self.serv.listen(1)
def tearDown(self):
self.serv.close()
self.serv = None
class SocketUDPTest(unittest.TestCase):
def setUp(self):
self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.serv.bind((HOST, PORT))
def tearDown(self):
self.serv.close()
self.serv = None
class ThreadableTest:
def __init__(self):
# Swap the true setup function
self.__setUp = self.setUp
self.__tearDown = self.tearDown
self.setUp = self._setUp
self.tearDown = self._tearDown
def _setUp(self):
self.ready = threading.Event()
self.done = threading.Event()
self.queue = Queue.Queue(1)
# Do some munging to start the client test.
test_method = getattr(self, ''.join(('_', self._TestCase__testMethodName)))
self.client_thread = thread.start_new_thread(self.clientRun, (test_method, ))
self.__setUp()
self.ready.wait()
def _tearDown(self):
self.__tearDown()
self.done.wait()
if not self.queue.empty():
msg = self.queue.get()
self.fail(msg)
def clientRun(self, test_func):
self.ready.set()
self.clientSetUp()
if not callable(test_func):
raise TypeError, "test_func must be a callable function"
try:
test_func()
except Exception, strerror:
self.queue.put(strerror)
self.clientTearDown()
def clientSetUp(self):
raise NotImplementedError, "clientSetUp must be implemented."
def clientTearDown(self):
self.done.set()
thread.exit()
class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
def __init__(self, methodName='runTest'):
SocketTCPTest.__init__(self, methodName=methodName)
ThreadableTest.__init__(self)
def clientSetUp(self):
self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def clientTearDown(self):
self.cli.close()
self.cli = None
ThreadableTest.clientTearDown(self)
try: raise socket.error class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
except socket.error: print "socket.error"
socket.AF_INET def __init__(self, methodName='runTest'):
SocketUDPTest.__init__(self, methodName=methodName)
ThreadableTest.__init__(self)
socket.SOCK_STREAM def clientSetUp(self):
socket.SOCK_DGRAM self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
for optional in ("AF_UNIX", class SocketConnectedTest(ThreadedTCPSocketTest):
def __init__(self, methodName='runTest'):
ThreadedTCPSocketTest.__init__(self, methodName=methodName)
def setUp(self):
ThreadedTCPSocketTest.setUp(self)
conn, addr = self.serv.accept()
self.cli_conn = conn
def tearDown(self):
self.cli_conn.close()
self.cli_conn = None
ThreadedTCPSocketTest.tearDown(self)
def clientSetUp(self):
ThreadedTCPSocketTest.clientSetUp(self)
self.cli.connect((HOST, PORT))
self.serv_conn = self.cli
def clientTearDown(self):
self.serv_conn.close()
self.serv_conn = None
ThreadedTCPSocketTest.clientTearDown(self)
#######################################################################
## Begin Tests
class GeneralModuleTests(unittest.TestCase):
def testSocketError(self):
"""Testing that socket module exceptions."""
def raise_error(*args, **kwargs):
raise socket.error
def raise_herror(*args, **kwargs):
raise socket.herror
def raise_gaierror(*args, **kwargs):
raise socket.gaierror
self.failUnlessRaises(socket.error, raise_error,
"Error raising socket exception.")
self.failUnlessRaises(socket.error, raise_herror,
"Error raising socket exception.")
self.failUnlessRaises(socket.error, raise_gaierror,
"Error raising socket exception.")
def testCrucialConstants(self):
"""Testing for mission critical constants."""
socket.AF_INET
socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET
socket.SOL_SOCKET
socket.SO_REUSEADDR
def testNonCrucialConstants(self):
"""Testing for existance of non-crucial constants."""
for const in (
"AF_UNIX",
"SO_DEBUG", "SO_ACCEPTCONN", "SO_REUSEADDR", "SO_KEEPALIVE", "SO_DEBUG", "SO_ACCEPTCONN", "SO_REUSEADDR", "SO_KEEPALIVE",
"SO_DONTROUTE", "SO_BROADCAST", "SO_USELOOPBACK", "SO_LINGER", "SO_DONTROUTE", "SO_BROADCAST", "SO_USELOOPBACK", "SO_LINGER",
...@@ -62,147 +197,319 @@ for optional in ("AF_UNIX", ...@@ -62,147 +197,319 @@ for optional in ("AF_UNIX",
"IP_RETOPTS", "IP_MULTICAST_IF", "IP_MULTICAST_TTL", "IP_RETOPTS", "IP_MULTICAST_IF", "IP_MULTICAST_TTL",
"IP_MULTICAST_LOOP", "IP_ADD_MEMBERSHIP", "IP_MULTICAST_LOOP", "IP_ADD_MEMBERSHIP",
"IP_DROP_MEMBERSHIP", "IP_DROP_MEMBERSHIP",
): ):
missing_ok(optional) try:
getattr(socket, const)
socktype = socket.SocketType except AttributeError:
hostname = socket.gethostname() pass
ip = socket.gethostbyname(hostname)
hname, aliases, ipaddrs = socket.gethostbyaddr(ip) def testHostnameRes(self):
all_host_names = [hname] + aliases """Testing hostname resolution mechanisms."""
hostname = socket.gethostname()
if verbose: ip = socket.gethostbyname(hostname)
print hostname self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
print ip hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
print hname, aliases, ipaddrs all_host_names = [hname] + aliases
print all_host_names fqhn = socket.getfqdn()
if not fqhn in all_host_names:
for name in all_host_names: self.fail("Error testing host resolution mechanisms.")
if name.find('.'):
break def testJavaRef(self):
else: """Testing reference count for getnameinfo."""
print 'FQDN not found' import sys
if not sys.platform.startswith('java'):
if hasattr(socket, 'getservbyname'): try:
print socket.getservbyname('telnet', 'tcp') # On some versions, this loses a reference
try: orig = sys.getrefcount(__name__)
socket.getservbyname('telnet', 'udp') socket.getnameinfo(__name__,0)
except socket.error: except SystemError:
if sys.getrefcount(__name__) <> orig:
self.fail("socket.getnameinfo loses a reference")
def testInterpreterCrash(self):
"""Making sure getnameinfo doesn't crash the interpreter."""
try:
# On some versions, this crashes the interpreter.
socket.getnameinfo(('x', 0, 0, 0), 0)
except socket.error:
pass
def testGetServByName(self):
"""Testing getservbyname."""
if hasattr(socket, 'getservbyname'):
socket.getservbyname('telnet', 'tcp')
try:
socket.getservbyname('telnet', 'udp')
except socket.error:
pass
def testSockName(self):
"""Testing getsockname()."""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
name = sock.getsockname()
def testGetSockOpt(self):
"""Testing getsockopt()."""
# We know a socket should start without reuse==0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
self.assert_(reuse == 0, "Error performing getsockopt.")
def testSetSockOpt(self):
"""Testing setsockopt()."""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
self.assert_(reuse == 1, "Error performing setsockopt.")
class BasicTCPTest(SocketConnectedTest):
def __init__(self, methodName='runTest'):
SocketConnectedTest.__init__(self, methodName=methodName)
def testRecv(self):
"""Testing large receive over TCP."""
msg = self.cli_conn.recv(1024)
self.assertEqual(msg, MSG, "Error performing recv.")
def _testRecv(self):
self.serv_conn.send(MSG)
def testOverFlowRecv(self):
"""Testing receive in chunks over TCP."""
seg1 = self.cli_conn.recv(len(MSG) - 3)
seg2 = self.cli_conn.recv(1024)
msg = ''.join ((seg1, seg2))
self.assertEqual(msg, MSG, "Error performing recv in chunks.")
def _testOverFlowRecv(self):
self.serv_conn.send(MSG)
def testRecvFrom(self):
"""Testing large recvfrom() over TCP."""
msg, addr = self.cli_conn.recvfrom(1024)
hostname, port = addr
self.assertEqual (hostname, socket.gethostbyname('localhost'),
"Wrong address from recvfrom.")
self.assertEqual(msg, MSG, "Error performing recvfrom.")
def _testRecvFrom(self):
self.serv_conn.send(MSG)
def testOverFlowRecvFrom(self):
"""Testing recvfrom() in chunks over TCP."""
seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
seg2, addr = self.cli_conn.recvfrom(1024)
msg = ''.join((seg1, seg2))
hostname, port = addr
self.assertEqual(hostname, socket.gethostbyname('localhost'),
"Wrong address from recvfrom.")
self.assertEqual(msg, MSG, "Error performing recvfrom in chunks.")
def _testOverFlowRecvFrom(self):
self.serv_conn.send(MSG)
def testSendAll(self):
"""Testing sendall() with a 2048 byte string over TCP."""
while 1:
read = self.cli_conn.recv(1024)
if not read:
break
self.assert_(len(read) == 1024, "Error performing sendall.")
read = filter(lambda x: x == 'f', read)
self.assert_(len(read) == 1024, "Error performing sendall.")
def _testSendAll(self):
big_chunk = ''.join([ 'f' ] * 2048)
self.serv_conn.sendall(big_chunk)
def testFromFd(self):
"""Testing fromfd()."""
fd = self.cli_conn.fileno()
sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
msg = sock.recv(1024)
self.assertEqual(msg, MSG, "Error creating socket using fromfd.")
def _testFromFd(self):
self.serv_conn.send(MSG)
def testShutdown(self):
"""Testing shutdown()."""
msg = self.cli_conn.recv(1024)
self.assertEqual(msg, MSG, "Error testing shutdown.")
def _testShutdown(self):
self.serv_conn.send(MSG)
self.serv_conn.shutdown(2)
class BasicUDPTest(ThreadedUDPSocketTest):
def __init__(self, methodName='runTest'):
ThreadedUDPSocketTest.__init__(self, methodName=methodName)
def testSendtoAndRecv(self):
"""Testing sendto() and Recv() over UDP."""
msg = self.serv.recv(len(MSG))
self.assertEqual(msg, MSG, "Error performing sendto")
def _testSendtoAndRecv(self):
self.cli.sendto(MSG, 0, (HOST, PORT))
def testRecvfrom(self):
"""Testing recfrom() over UDP."""
msg, addr = self.serv.recvfrom(len(MSG))
hostname, port = addr
self.assertEqual(hostname, socket.gethostbyname('localhost'),
"Wrong address from recvfrom.")
self.assertEqual(msg, MSG, "Error performing recvfrom in chunks.")
def _testRecvfrom(self):
self.cli.sendto(MSG, 0, (HOST, PORT))
class NonBlockingTCPTests(ThreadedTCPSocketTest):
def __init__(self, methodName='runTest'):
ThreadedTCPSocketTest.__init__(self, methodName=methodName)
def testSetBlocking(self):
"""Testing whether set blocking works."""
self.serv.setblocking(0)
start = time.time()
try:
self.serv.accept()
except socket.error:
pass
end = time.time()
self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
def _testSetBlocking(self):
pass pass
import sys def testAccept(self):
if not sys.platform.startswith('java'): """Testing non-blocking accept."""
try: self.serv.setblocking(0)
# On some versions, this loses a reference try:
orig = sys.getrefcount(__name__) conn, addr = self.serv.accept()
socket.getnameinfo(__name__,0) except socket.error:
except SystemError: pass
if sys.getrefcount(__name__) <> orig: else:
raise TestFailed,"socket.getnameinfo loses a reference" self.fail("Error trying to do non-blocking accept.")
read, write, err = select.select([self.serv], [], [])
try: if self.serv in read:
# On some versions, this crashes the interpreter. conn, addr = self.serv.accept()
socket.getnameinfo(('x', 0, 0, 0), 0) else:
except socket.error: self.fail("Error trying to do accept after select.")
pass
def _testAccept(self):
canfork = hasattr(os, 'fork') time.sleep(1)
try: self.cli.connect((HOST, PORT))
PORT = 50007
msg = 'socket test\n' def testConnect(self):
if not canfork or os.fork(): """Testing non-blocking connect."""
# parent is server time.sleep(1)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) conn, addr = self.serv.accept()
s.bind(("127.0.0.1", PORT))
s.listen(1) def _testConnect(self):
if verbose: self.cli.setblocking(0)
print 'parent accepting'
if canfork:
conn, addr = s.accept()
if verbose:
print 'connected by', addr
# couple of interesting tests while we've got a live socket
f = conn.fileno()
if verbose:
print 'fileno:', f
p = conn.getpeername()
if verbose:
print 'peer:', p
n = conn.getsockname()
if verbose:
print 'sockname:', n
f = conn.makefile()
if verbose:
print 'file obj:', f
data = conn.recv(1024)
if verbose:
print 'received:', data
conn.sendall(data)
# Perform a few tests on the windows file object
if verbose:
print "Staring _fileobject tests..."
f = socket._fileobject (conn, 'rb', 8192)
first_seg = f.read(7)
second_seg = f.read(5)
if not first_seg == 'socket ' or not second_seg == 'test\n':
print "Error performing read with the python _fileobject class"
os._exit (1)
elif verbose:
print "_fileobject buffered read works"
f.write (data)
f.flush ()
buf = ''
while 1:
char = f.read(1)
if not char:
print "Error performing unbuffered read with the python ", \
"_fileobject class"
os._exit (1)
buf += char
if buf == msg:
if verbose:
print "__fileobject unbuffered read works"
break
if verbose:
# If we got this far, write() must work as well
print "__fileobject write works"
f.write(buf)
f.flush()
line = f.readline()
if not line == msg:
print "Error perferming readline with the python _fileobject class"
os._exit (1)
f.write(line)
f.flush()
if verbose:
print "__fileobject readline works"
conn.close()
else:
try: try:
# child is client self.cli.connect((HOST, PORT))
time.sleep(5) except socket.error:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) pass
if verbose: else:
print 'child connecting' self.fail("Error trying to do non-blocking connect.")
s.connect(("127.0.0.1", PORT)) read, write, err = select.select([self.cli], [], [])
if self.cli in read:
iteration = 0 self.cli.connect((HOST, PORT))
while 1: else:
s.send(msg) self.fail("Error trying to do connect after select.")
data = s.recv(12)
if not data: def testRecv(self):
break """Testing non-blocking recv."""
if msg != data: conn, addr = self.serv.accept()
print "parent/client mismatch. Failed in %s iteration. Received: [%s]" \ conn.setblocking(0)
%(iteration, data) try:
time.sleep (1) msg = conn.recv(len(MSG))
iteration += 1 except socket.error:
s.close() pass
finally: else:
os._exit(1) self.fail("Error trying to do non-blocking recv.")
except socket.error, msg: read, write, err = select.select([conn], [], [])
raise TestFailed, msg if conn in read:
msg = conn.recv(len(MSG))
self.assertEqual(msg, MSG, "Error performing non-blocking recv.")
else:
self.fail("Error during select call to non-blocking socket.")
def _testRecv(self):
self.cli.connect((HOST, PORT))
time.sleep(1)
self.cli.send(MSG)
class FileObjectClassTestCase(SocketConnectedTest):
def __init__(self, methodName='runTest'):
SocketConnectedTest.__init__(self, methodName=methodName)
def setUp(self):
SocketConnectedTest.setUp(self)
self.serv_file = socket._fileobject(self.cli_conn, 'rb', 8192)
def tearDown(self):
self.serv_file.close()
self.serv_file = None
SocketConnectedTest.tearDown(self)
def clientSetUp(self):
SocketConnectedTest.clientSetUp(self)
self.cli_file = socket._fileobject(self.serv_conn, 'rb', 8192)
def clientTearDown(self):
self.cli_file.close()
self.cli_file = None
SocketConnectedTest.clientTearDown(self)
def testSmallRead(self):
"""Performing small file read test."""
first_seg = self.serv_file.read(len(MSG)-3)
second_seg = self.serv_file.read(3)
msg = ''.join((first_seg, second_seg))
self.assertEqual(msg, MSG, "Error performing small read.")
def _testSmallRead(self):
self.cli_file.write(MSG)
self.cli_file.flush()
def testUnbufferedRead(self):
"""Performing unbuffered file read test."""
buf = ''
while 1:
char = self.serv_file.read(1)
self.failIf(not char, "Error performing unbuffered read.")
buf += char
if buf == MSG:
break
def _testUnbufferedRead(self):
self.cli_file.write(MSG)
self.cli_file.flush()
def testReadline(self):
"""Performing file readline test."""
line = self.serv_file.readline()
self.assertEqual(line, MSG, "Error performing readline.")
def _testReadline(self):
self.cli_file.write(MSG)
self.cli_file.flush()
def test_main():
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(GeneralModuleTests))
suite.addTest(unittest.makeSuite(BasicTCPTest))
suite.addTest(unittest.makeSuite(BasicUDPTest))
suite.addTest(unittest.makeSuite(NonBlockingTCPTests))
suite.addTest(unittest.makeSuite(FileObjectClassTestCase))
test_support.run_suite(suite)
if __name__ == "__main__":
test_main()
#!/home/bernie/src/python23/dist/src/python #!/home/bernie/src/python23/dist/src/python
import unittest import unittest
import test_support
import time import time
import socket import socket
class creationTestCase(unittest.TestCase): class CreationTestCase(unittest.TestCase):
"""Test Case for socket.gettimeout() and socket.settimeout()""" """Test Case for socket.gettimeout() and socket.settimeout()"""
def setUp(self): def setUp(self):
self.__s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...@@ -15,17 +16,17 @@ class creationTestCase(unittest.TestCase): ...@@ -15,17 +16,17 @@ class creationTestCase(unittest.TestCase):
def testObjectCreation(self): def testObjectCreation(self):
"Test Socket creation" "Test Socket creation"
self.assertEqual(self.__s.gettimeout(), None, self.assertEqual(self.__s.gettimeout(), None,
"Timeout socket not default to disable (None)") "Timeout socket not default to disable (None)")
def testFloatReturnValue(self): def testFloatReturnValue(self):
"Test return value of getter/setter" "Test return value of getter/setter"
self.__s.settimeout(7.345) self.__s.settimeout(7.345)
self.assertEqual(self.__s.gettimeout(), 7.345, self.assertEqual(self.__s.gettimeout(), 7.345,
"settimeout() and gettimeout() return different result") "settimeout() and gettimeout() return different result")
self.__s.settimeout(3) self.__s.settimeout(3)
self.assertEqual(self.__s.gettimeout(), 3, self.assertEqual(self.__s.gettimeout(), 3,
"settimeout() and gettimeout() return different result") "settimeout() and gettimeout() return different result")
def testReturnType(self): def testReturnType(self):
...@@ -39,7 +40,7 @@ class creationTestCase(unittest.TestCase): ...@@ -39,7 +40,7 @@ class creationTestCase(unittest.TestCase):
"return type of gettimeout() is not FloatType") "return type of gettimeout() is not FloatType")
class timeoutTestCase(unittest.TestCase): class TimeoutTestCase(unittest.TestCase):
"""Test Case for socket.socket() timeout functions""" """Test Case for socket.socket() timeout functions"""
def setUp(self): def setUp(self):
self.__s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.__s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...@@ -76,7 +77,7 @@ class timeoutTestCase(unittest.TestCase): ...@@ -76,7 +77,7 @@ class timeoutTestCase(unittest.TestCase):
_delta = abs(_t1 - _t2) _delta = abs(_t1 - _t2)
self.assert_(_delta < _timeout + 0.5, self.assert_(_delta < _timeout + 0.5,
"timeout (%f) is 0.5 seconds more than required (%f)" "timeout (%f) is 0.5 seconds more than required (%f)"
%(_delta, _timeout)) %(_delta, _timeout))
def testAcceptTimeout(self): def testAcceptTimeout(self):
...@@ -92,7 +93,7 @@ class timeoutTestCase(unittest.TestCase): ...@@ -92,7 +93,7 @@ class timeoutTestCase(unittest.TestCase):
_delta = abs(_t1 - _t2) _delta = abs(_t1 - _t2)
self.assert_(_delta < _timeout + 0.5, self.assert_(_delta < _timeout + 0.5,
"timeout (%f) is 0.5 seconds more than required (%f)" "timeout (%f) is 0.5 seconds more than required (%f)"
%(_delta, _timeout)) %(_delta, _timeout))
def testRecvfromTimeout(self): def testRecvfromTimeout(self):
...@@ -108,7 +109,7 @@ class timeoutTestCase(unittest.TestCase): ...@@ -108,7 +109,7 @@ class timeoutTestCase(unittest.TestCase):
_delta = abs(_t1 - _t2) _delta = abs(_t1 - _t2)
self.assert_(_delta < _timeout + 0.5, self.assert_(_delta < _timeout + 0.5,
"timeout (%f) is 0.5 seconds more than required (%f)" "timeout (%f) is 0.5 seconds more than required (%f)"
%(_delta, _timeout)) %(_delta, _timeout))
def testSend(self): def testSend(self):
...@@ -127,10 +128,11 @@ class timeoutTestCase(unittest.TestCase): ...@@ -127,10 +128,11 @@ class timeoutTestCase(unittest.TestCase):
pass pass
def suite(): def test_main():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(CreationTestCase))
return suite suite.addTest(unittest.makeSuite(TimeoutTestCase))
test_support.run_suite(suite)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() test_main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment