| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 2 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 3 | import unittest | 
 | 4 | import test_support | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 5 |  | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 6 | import socket | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 7 | import select | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 8 | import time | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 9 | import thread, threading | 
 | 10 | import Queue | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 11 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 12 | PORT = 50007 | 
 | 13 | HOST = 'localhost' | 
 | 14 | MSG = 'Michael Gilfix was here\n' | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 15 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 16 | class SocketTCPTest(unittest.TestCase): | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 17 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 18 |     def setUp(self): | 
 | 19 |         self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 | 20 |         self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | 
 | 21 |         self.serv.bind((HOST, PORT)) | 
 | 22 |         self.serv.listen(1) | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 23 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 24 |     def tearDown(self): | 
 | 25 |         self.serv.close() | 
 | 26 |         self.serv = None | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 27 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 28 | class SocketUDPTest(unittest.TestCase): | 
 | 29 |  | 
 | 30 |     def setUp(self): | 
 | 31 |         self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | 
 | 32 |         self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | 
 | 33 |         self.serv.bind((HOST, PORT)) | 
 | 34 |  | 
 | 35 |     def tearDown(self): | 
 | 36 |         self.serv.close() | 
 | 37 |         self.serv = None | 
 | 38 |  | 
 | 39 | class ThreadableTest: | 
 | 40 |  | 
 | 41 |     def __init__(self): | 
 | 42 |         # Swap the true setup function | 
 | 43 |         self.__setUp = self.setUp | 
 | 44 |         self.__tearDown = self.tearDown | 
 | 45 |         self.setUp = self._setUp | 
 | 46 |         self.tearDown = self._tearDown | 
 | 47 |  | 
 | 48 |     def _setUp(self): | 
 | 49 |         self.ready = threading.Event() | 
 | 50 |         self.done = threading.Event() | 
 | 51 |         self.queue = Queue.Queue(1) | 
 | 52 |  | 
 | 53 |         # Do some munging to start the client test. | 
| Guido van Rossum | ab65996 | 2002-06-12 21:29:43 +0000 | [diff] [blame^] | 54 |         test_method = getattr(self, '_' + self._TestCase__testMethodName) | 
 | 55 |         self.client_thread = thread.start_new_thread( | 
 | 56 |             self.clientRun, (test_method,)) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 57 |  | 
 | 58 |         self.__setUp() | 
 | 59 |         self.ready.wait() | 
 | 60 |  | 
 | 61 |     def _tearDown(self): | 
 | 62 |         self.__tearDown() | 
 | 63 |         self.done.wait() | 
 | 64 |  | 
 | 65 |         if not self.queue.empty(): | 
 | 66 |             msg = self.queue.get() | 
 | 67 |             self.fail(msg) | 
 | 68 |  | 
 | 69 |     def clientRun(self, test_func): | 
 | 70 |         self.ready.set() | 
 | 71 |         self.clientSetUp() | 
 | 72 |         if not callable(test_func): | 
 | 73 |             raise TypeError, "test_func must be a callable function" | 
 | 74 |         try: | 
 | 75 |             test_func() | 
 | 76 |         except Exception, strerror: | 
 | 77 |             self.queue.put(strerror) | 
 | 78 |         self.clientTearDown() | 
 | 79 |  | 
 | 80 |     def clientSetUp(self): | 
 | 81 |         raise NotImplementedError, "clientSetUp must be implemented." | 
 | 82 |  | 
 | 83 |     def clientTearDown(self): | 
 | 84 |         self.done.set() | 
 | 85 |         thread.exit() | 
 | 86 |  | 
 | 87 | class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest): | 
 | 88 |  | 
 | 89 |     def __init__(self, methodName='runTest'): | 
 | 90 |         SocketTCPTest.__init__(self, methodName=methodName) | 
 | 91 |         ThreadableTest.__init__(self) | 
 | 92 |  | 
 | 93 |     def clientSetUp(self): | 
 | 94 |         self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 | 95 |  | 
 | 96 |     def clientTearDown(self): | 
 | 97 |         self.cli.close() | 
 | 98 |         self.cli = None | 
 | 99 |         ThreadableTest.clientTearDown(self) | 
 | 100 |  | 
 | 101 | class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest): | 
 | 102 |  | 
 | 103 |     def __init__(self, methodName='runTest'): | 
 | 104 |         SocketUDPTest.__init__(self, methodName=methodName) | 
 | 105 |         ThreadableTest.__init__(self) | 
 | 106 |  | 
 | 107 |     def clientSetUp(self): | 
 | 108 |         self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | 
 | 109 |  | 
 | 110 | class SocketConnectedTest(ThreadedTCPSocketTest): | 
 | 111 |  | 
 | 112 |     def __init__(self, methodName='runTest'): | 
 | 113 |         ThreadedTCPSocketTest.__init__(self, methodName=methodName) | 
 | 114 |  | 
 | 115 |     def setUp(self): | 
 | 116 |         ThreadedTCPSocketTest.setUp(self) | 
 | 117 |         conn, addr = self.serv.accept() | 
 | 118 |         self.cli_conn = conn | 
 | 119 |  | 
 | 120 |     def tearDown(self): | 
 | 121 |         self.cli_conn.close() | 
 | 122 |         self.cli_conn = None | 
 | 123 |         ThreadedTCPSocketTest.tearDown(self) | 
 | 124 |  | 
 | 125 |     def clientSetUp(self): | 
 | 126 |         ThreadedTCPSocketTest.clientSetUp(self) | 
 | 127 |         self.cli.connect((HOST, PORT)) | 
 | 128 |         self.serv_conn = self.cli | 
 | 129 |  | 
 | 130 |     def clientTearDown(self): | 
 | 131 |         self.serv_conn.close() | 
 | 132 |         self.serv_conn = None | 
 | 133 |         ThreadedTCPSocketTest.clientTearDown(self) | 
 | 134 |  | 
 | 135 | ####################################################################### | 
 | 136 | ## Begin Tests | 
 | 137 |  | 
 | 138 | class GeneralModuleTests(unittest.TestCase): | 
 | 139 |  | 
 | 140 |     def testSocketError(self): | 
 | 141 |         """Testing that socket module exceptions.""" | 
 | 142 |         def raise_error(*args, **kwargs): | 
 | 143 |             raise socket.error | 
 | 144 |         def raise_herror(*args, **kwargs): | 
 | 145 |             raise socket.herror | 
 | 146 |         def raise_gaierror(*args, **kwargs): | 
 | 147 |             raise socket.gaierror | 
 | 148 |         self.failUnlessRaises(socket.error, raise_error, | 
 | 149 |                               "Error raising socket exception.") | 
 | 150 |         self.failUnlessRaises(socket.error, raise_herror, | 
 | 151 |                               "Error raising socket exception.") | 
 | 152 |         self.failUnlessRaises(socket.error, raise_gaierror, | 
 | 153 |                               "Error raising socket exception.") | 
 | 154 |  | 
 | 155 |     def testCrucialConstants(self): | 
 | 156 |         """Testing for mission critical constants.""" | 
 | 157 |         socket.AF_INET | 
 | 158 |         socket.SOCK_STREAM | 
 | 159 |         socket.SOCK_DGRAM | 
 | 160 |         socket.SOCK_RAW | 
 | 161 |         socket.SOCK_RDM | 
 | 162 |         socket.SOCK_SEQPACKET | 
 | 163 |         socket.SOL_SOCKET | 
 | 164 |         socket.SO_REUSEADDR | 
 | 165 |  | 
 | 166 |     def testNonCrucialConstants(self): | 
 | 167 |         """Testing for existance of non-crucial constants.""" | 
 | 168 |         for const in ( | 
 | 169 |                  "AF_UNIX", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 170 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 171 |                  "SO_DEBUG", "SO_ACCEPTCONN", "SO_REUSEADDR", "SO_KEEPALIVE", | 
 | 172 |                  "SO_DONTROUTE", "SO_BROADCAST", "SO_USELOOPBACK", "SO_LINGER", | 
 | 173 |                  "SO_OOBINLINE", "SO_REUSEPORT", "SO_SNDBUF", "SO_RCVBUF", | 
 | 174 |                  "SO_SNDLOWAT", "SO_RCVLOWAT", "SO_SNDTIMEO", "SO_RCVTIMEO", | 
 | 175 |                  "SO_ERROR", "SO_TYPE", "SOMAXCONN", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 176 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 177 |                  "MSG_OOB", "MSG_PEEK", "MSG_DONTROUTE", "MSG_EOR", | 
 | 178 |                  "MSG_TRUNC", "MSG_CTRUNC", "MSG_WAITALL", "MSG_BTAG", | 
 | 179 |                  "MSG_ETAG", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 180 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 181 |                  "SOL_SOCKET", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 182 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 183 |                  "IPPROTO_IP", "IPPROTO_ICMP", "IPPROTO_IGMP", | 
 | 184 |                  "IPPROTO_GGP", "IPPROTO_TCP", "IPPROTO_EGP", | 
 | 185 |                  "IPPROTO_PUP", "IPPROTO_UDP", "IPPROTO_IDP", | 
 | 186 |                  "IPPROTO_HELLO", "IPPROTO_ND", "IPPROTO_TP", | 
 | 187 |                  "IPPROTO_XTP", "IPPROTO_EON", "IPPROTO_BIP", | 
 | 188 |                  "IPPROTO_RAW", "IPPROTO_MAX", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 189 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 190 |                  "IPPORT_RESERVED", "IPPORT_USERRESERVED", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 191 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 192 |                  "INADDR_ANY", "INADDR_BROADCAST", "INADDR_LOOPBACK", | 
 | 193 |                  "INADDR_UNSPEC_GROUP", "INADDR_ALLHOSTS_GROUP", | 
 | 194 |                  "INADDR_MAX_LOCAL_GROUP", "INADDR_NONE", | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 195 |  | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 196 |                  "IP_OPTIONS", "IP_HDRINCL", "IP_TOS", "IP_TTL", | 
 | 197 |                  "IP_RECVOPTS", "IP_RECVRETOPTS", "IP_RECVDSTADDR", | 
 | 198 |                  "IP_RETOPTS", "IP_MULTICAST_IF", "IP_MULTICAST_TTL", | 
 | 199 |                  "IP_MULTICAST_LOOP", "IP_ADD_MEMBERSHIP", | 
 | 200 |                  "IP_DROP_MEMBERSHIP", | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 201 |                   ): | 
 | 202 |             try: | 
 | 203 |                 getattr(socket, const) | 
 | 204 |             except AttributeError: | 
 | 205 |                 pass | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 206 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 207 |     def testHostnameRes(self): | 
 | 208 |         """Testing hostname resolution mechanisms.""" | 
 | 209 |         hostname = socket.gethostname() | 
 | 210 |         ip = socket.gethostbyname(hostname) | 
 | 211 |         self.assert_(ip.find('.') >= 0, "Error resolving host to ip.") | 
 | 212 |         hname, aliases, ipaddrs = socket.gethostbyaddr(ip) | 
 | 213 |         all_host_names = [hname] + aliases | 
 | 214 |         fqhn = socket.getfqdn() | 
 | 215 |         if not fqhn in all_host_names: | 
 | 216 |             self.fail("Error testing host resolution mechanisms.") | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 217 |  | 
| Guido van Rossum | 284a2cf | 2002-06-12 21:19:40 +0000 | [diff] [blame] | 218 |     def testRefCountGetNameInfo(self): | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 219 |         """Testing reference count for getnameinfo.""" | 
 | 220 |         import sys | 
| Guido van Rossum | 284a2cf | 2002-06-12 21:19:40 +0000 | [diff] [blame] | 221 |         if hasattr(sys, "getrefcount"): | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 222 |             try: | 
 | 223 |                 # On some versions, this loses a reference | 
 | 224 |                 orig = sys.getrefcount(__name__) | 
 | 225 |                 socket.getnameinfo(__name__,0) | 
 | 226 |             except SystemError: | 
 | 227 |                 if sys.getrefcount(__name__) <> orig: | 
 | 228 |                     self.fail("socket.getnameinfo loses a reference") | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 229 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 230 |     def testInterpreterCrash(self): | 
 | 231 |         """Making sure getnameinfo doesn't crash the interpreter.""" | 
 | 232 |         try: | 
 | 233 |             # On some versions, this crashes the interpreter. | 
 | 234 |             socket.getnameinfo(('x', 0, 0, 0), 0) | 
 | 235 |         except socket.error: | 
 | 236 |             pass | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 237 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 238 |     def testGetServByName(self): | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 239 |         """Testing getservbyname().""" | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 240 |         if hasattr(socket, 'getservbyname'): | 
 | 241 |             socket.getservbyname('telnet', 'tcp') | 
 | 242 |             try: | 
 | 243 |                 socket.getservbyname('telnet', 'udp') | 
 | 244 |             except socket.error: | 
 | 245 |                 pass | 
 | 246 |  | 
 | 247 |     def testSockName(self): | 
 | 248 |         """Testing getsockname().""" | 
 | 249 |         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 250 |         sock.bind(("0.0.0.0", PORT+1)) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 251 |         name = sock.getsockname() | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 252 |         self.assertEqual(name, ("0.0.0.0", PORT+1)) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 253 |  | 
 | 254 |     def testGetSockOpt(self): | 
 | 255 |         """Testing getsockopt().""" | 
 | 256 |         # We know a socket should start without reuse==0 | 
 | 257 |         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 | 258 |         reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) | 
| Guido van Rossum | 733632a | 2002-06-12 20:46:49 +0000 | [diff] [blame] | 259 |         self.failIf(reuse != 0, "initial mode is reuse") | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 260 |  | 
 | 261 |     def testSetSockOpt(self): | 
 | 262 |         """Testing setsockopt().""" | 
 | 263 |         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
 | 264 |         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | 
 | 265 |         reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) | 
| Guido van Rossum | 733632a | 2002-06-12 20:46:49 +0000 | [diff] [blame] | 266 |         self.failIf(reuse == 0, "failed to set reuse mode") | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 267 |  | 
 | 268 | class BasicTCPTest(SocketConnectedTest): | 
 | 269 |  | 
 | 270 |     def __init__(self, methodName='runTest'): | 
 | 271 |         SocketConnectedTest.__init__(self, methodName=methodName) | 
 | 272 |  | 
 | 273 |     def testRecv(self): | 
 | 274 |         """Testing large receive over TCP.""" | 
 | 275 |         msg = self.cli_conn.recv(1024) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 276 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 277 |  | 
 | 278 |     def _testRecv(self): | 
 | 279 |         self.serv_conn.send(MSG) | 
 | 280 |  | 
 | 281 |     def testOverFlowRecv(self): | 
 | 282 |         """Testing receive in chunks over TCP.""" | 
 | 283 |         seg1 = self.cli_conn.recv(len(MSG) - 3) | 
 | 284 |         seg2 = self.cli_conn.recv(1024) | 
| Guido van Rossum | ab65996 | 2002-06-12 21:29:43 +0000 | [diff] [blame^] | 285 |         msg = seg1 + seg2 | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 286 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 287 |  | 
 | 288 |     def _testOverFlowRecv(self): | 
 | 289 |         self.serv_conn.send(MSG) | 
 | 290 |  | 
 | 291 |     def testRecvFrom(self): | 
 | 292 |         """Testing large recvfrom() over TCP.""" | 
 | 293 |         msg, addr = self.cli_conn.recvfrom(1024) | 
 | 294 |         hostname, port = addr | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 295 |         ##self.assertEqual(hostname, socket.gethostbyname('localhost')) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 296 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 297 |  | 
 | 298 |     def _testRecvFrom(self): | 
 | 299 |         self.serv_conn.send(MSG) | 
 | 300 |  | 
 | 301 |     def testOverFlowRecvFrom(self): | 
 | 302 |         """Testing recvfrom() in chunks over TCP.""" | 
 | 303 |         seg1, addr = self.cli_conn.recvfrom(len(MSG)-3) | 
 | 304 |         seg2, addr = self.cli_conn.recvfrom(1024) | 
| Guido van Rossum | ab65996 | 2002-06-12 21:29:43 +0000 | [diff] [blame^] | 305 |         msg = seg1 + seg2 | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 306 |         hostname, port = addr | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 307 |         ##self.assertEqual(hostname, socket.gethostbyname('localhost')) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 308 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 309 |  | 
 | 310 |     def _testOverFlowRecvFrom(self): | 
 | 311 |         self.serv_conn.send(MSG) | 
 | 312 |  | 
 | 313 |     def testSendAll(self): | 
 | 314 |         """Testing sendall() with a 2048 byte string over TCP.""" | 
 | 315 |         while 1: | 
 | 316 |             read = self.cli_conn.recv(1024) | 
 | 317 |             if not read: | 
 | 318 |                 break | 
 | 319 |             self.assert_(len(read) == 1024, "Error performing sendall.") | 
 | 320 |             read = filter(lambda x: x == 'f', read) | 
 | 321 |             self.assert_(len(read) == 1024, "Error performing sendall.") | 
 | 322 |  | 
 | 323 |     def _testSendAll(self): | 
| Guido van Rossum | ab65996 | 2002-06-12 21:29:43 +0000 | [diff] [blame^] | 324 |         big_chunk = 'f' * 2048 | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 325 |         self.serv_conn.sendall(big_chunk) | 
 | 326 |  | 
 | 327 |     def testFromFd(self): | 
 | 328 |         """Testing fromfd().""" | 
| Guido van Rossum | 8e95ca8 | 2002-06-12 20:55:17 +0000 | [diff] [blame] | 329 |         if not hasattr(socket, "fromfd"): | 
| Guido van Rossum | 6fb3d5e | 2002-06-12 20:48:59 +0000 | [diff] [blame] | 330 |             return # On Windows, this doesn't exist | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 331 |         fd = self.cli_conn.fileno() | 
 | 332 |         sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM) | 
 | 333 |         msg = sock.recv(1024) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 334 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 335 |  | 
 | 336 |     def _testFromFd(self): | 
 | 337 |         self.serv_conn.send(MSG) | 
 | 338 |  | 
 | 339 |     def testShutdown(self): | 
 | 340 |         """Testing shutdown().""" | 
 | 341 |         msg = self.cli_conn.recv(1024) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 342 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 343 |  | 
 | 344 |     def _testShutdown(self): | 
 | 345 |         self.serv_conn.send(MSG) | 
 | 346 |         self.serv_conn.shutdown(2) | 
 | 347 |  | 
 | 348 | class BasicUDPTest(ThreadedUDPSocketTest): | 
 | 349 |  | 
 | 350 |     def __init__(self, methodName='runTest'): | 
 | 351 |         ThreadedUDPSocketTest.__init__(self, methodName=methodName) | 
 | 352 |  | 
 | 353 |     def testSendtoAndRecv(self): | 
 | 354 |         """Testing sendto() and Recv() over UDP.""" | 
 | 355 |         msg = self.serv.recv(len(MSG)) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 356 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 357 |  | 
 | 358 |     def _testSendtoAndRecv(self): | 
 | 359 |         self.cli.sendto(MSG, 0, (HOST, PORT)) | 
 | 360 |  | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 361 |     def testRecvFrom(self): | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 362 |         """Testing recfrom() over UDP.""" | 
 | 363 |         msg, addr = self.serv.recvfrom(len(MSG)) | 
 | 364 |         hostname, port = addr | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 365 |         ##self.assertEqual(hostname, socket.gethostbyname('localhost')) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 366 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 367 |  | 
| Guido van Rossum | 1c93801 | 2002-06-12 21:17:20 +0000 | [diff] [blame] | 368 |     def _testRecvFrom(self): | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 369 |         self.cli.sendto(MSG, 0, (HOST, PORT)) | 
 | 370 |  | 
 | 371 | class NonBlockingTCPTests(ThreadedTCPSocketTest): | 
 | 372 |  | 
 | 373 |     def __init__(self, methodName='runTest'): | 
 | 374 |         ThreadedTCPSocketTest.__init__(self, methodName=methodName) | 
 | 375 |  | 
 | 376 |     def testSetBlocking(self): | 
 | 377 |         """Testing whether set blocking works.""" | 
 | 378 |         self.serv.setblocking(0) | 
 | 379 |         start = time.time() | 
 | 380 |         try: | 
 | 381 |             self.serv.accept() | 
 | 382 |         except socket.error: | 
 | 383 |             pass | 
 | 384 |         end = time.time() | 
 | 385 |         self.assert_((end - start) < 1.0, "Error setting non-blocking mode.") | 
 | 386 |  | 
 | 387 |     def _testSetBlocking(self): | 
| Barry Warsaw | 6870bba | 2001-03-23 17:40:16 +0000 | [diff] [blame] | 388 |         pass | 
| Barry Warsaw | cf3d4b5 | 1997-01-03 20:03:32 +0000 | [diff] [blame] | 389 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 390 |     def testAccept(self): | 
 | 391 |         """Testing non-blocking accept.""" | 
 | 392 |         self.serv.setblocking(0) | 
| Guido van Rossum | 41360a4 | 1998-03-26 19:42:58 +0000 | [diff] [blame] | 393 |         try: | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 394 |             conn, addr = self.serv.accept() | 
 | 395 |         except socket.error: | 
 | 396 |             pass | 
 | 397 |         else: | 
 | 398 |             self.fail("Error trying to do non-blocking accept.") | 
 | 399 |         read, write, err = select.select([self.serv], [], []) | 
 | 400 |         if self.serv in read: | 
 | 401 |             conn, addr = self.serv.accept() | 
 | 402 |         else: | 
 | 403 |             self.fail("Error trying to do accept after select.") | 
| Guido van Rossum | 67f7a38 | 2002-06-06 21:08:16 +0000 | [diff] [blame] | 404 |  | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 405 |     def _testAccept(self): | 
 | 406 |         time.sleep(1) | 
 | 407 |         self.cli.connect((HOST, PORT)) | 
 | 408 |  | 
 | 409 |     def testConnect(self): | 
 | 410 |         """Testing non-blocking connect.""" | 
 | 411 |         time.sleep(1) | 
 | 412 |         conn, addr = self.serv.accept() | 
 | 413 |  | 
 | 414 |     def _testConnect(self): | 
 | 415 |         self.cli.setblocking(0) | 
 | 416 |         try: | 
 | 417 |             self.cli.connect((HOST, PORT)) | 
 | 418 |         except socket.error: | 
 | 419 |             pass | 
 | 420 |         else: | 
 | 421 |             self.fail("Error trying to do non-blocking connect.") | 
 | 422 |         read, write, err = select.select([self.cli], [], []) | 
 | 423 |         if self.cli in read: | 
 | 424 |             self.cli.connect((HOST, PORT)) | 
 | 425 |         else: | 
 | 426 |             self.fail("Error trying to do connect after select.") | 
 | 427 |  | 
 | 428 |     def testRecv(self): | 
 | 429 |         """Testing non-blocking recv.""" | 
 | 430 |         conn, addr = self.serv.accept() | 
 | 431 |         conn.setblocking(0) | 
 | 432 |         try: | 
 | 433 |             msg = conn.recv(len(MSG)) | 
 | 434 |         except socket.error: | 
 | 435 |             pass | 
 | 436 |         else: | 
 | 437 |             self.fail("Error trying to do non-blocking recv.") | 
 | 438 |         read, write, err = select.select([conn], [], []) | 
 | 439 |         if conn in read: | 
 | 440 |             msg = conn.recv(len(MSG)) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 441 |             self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 442 |         else: | 
 | 443 |             self.fail("Error during select call to non-blocking socket.") | 
 | 444 |  | 
 | 445 |     def _testRecv(self): | 
 | 446 |         self.cli.connect((HOST, PORT)) | 
 | 447 |         time.sleep(1) | 
 | 448 |         self.cli.send(MSG) | 
 | 449 |  | 
 | 450 | class FileObjectClassTestCase(SocketConnectedTest): | 
 | 451 |  | 
 | 452 |     def __init__(self, methodName='runTest'): | 
 | 453 |         SocketConnectedTest.__init__(self, methodName=methodName) | 
 | 454 |  | 
 | 455 |     def setUp(self): | 
 | 456 |         SocketConnectedTest.setUp(self) | 
 | 457 |         self.serv_file = socket._fileobject(self.cli_conn, 'rb', 8192) | 
 | 458 |  | 
 | 459 |     def tearDown(self): | 
 | 460 |         self.serv_file.close() | 
 | 461 |         self.serv_file = None | 
 | 462 |         SocketConnectedTest.tearDown(self) | 
 | 463 |  | 
 | 464 |     def clientSetUp(self): | 
 | 465 |         SocketConnectedTest.clientSetUp(self) | 
 | 466 |         self.cli_file = socket._fileobject(self.serv_conn, 'rb', 8192) | 
 | 467 |  | 
 | 468 |     def clientTearDown(self): | 
 | 469 |         self.cli_file.close() | 
 | 470 |         self.cli_file = None | 
 | 471 |         SocketConnectedTest.clientTearDown(self) | 
 | 472 |  | 
 | 473 |     def testSmallRead(self): | 
 | 474 |         """Performing small file read test.""" | 
 | 475 |         first_seg = self.serv_file.read(len(MSG)-3) | 
 | 476 |         second_seg = self.serv_file.read(3) | 
| Guido van Rossum | ab65996 | 2002-06-12 21:29:43 +0000 | [diff] [blame^] | 477 |         msg = first_seg + second_seg | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 478 |         self.assertEqual(msg, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 479 |  | 
 | 480 |     def _testSmallRead(self): | 
 | 481 |         self.cli_file.write(MSG) | 
 | 482 |         self.cli_file.flush() | 
 | 483 |  | 
 | 484 |     def testUnbufferedRead(self): | 
 | 485 |         """Performing unbuffered file read test.""" | 
 | 486 |         buf = '' | 
 | 487 |         while 1: | 
 | 488 |             char = self.serv_file.read(1) | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 489 |             self.failIf(not char) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 490 |             buf += char | 
 | 491 |             if buf == MSG: | 
 | 492 |                 break | 
 | 493 |  | 
 | 494 |     def _testUnbufferedRead(self): | 
 | 495 |         self.cli_file.write(MSG) | 
 | 496 |         self.cli_file.flush() | 
 | 497 |  | 
 | 498 |     def testReadline(self): | 
 | 499 |         """Performing file readline test.""" | 
 | 500 |         line = self.serv_file.readline() | 
| Guido van Rossum | 7648968 | 2002-06-12 20:38:30 +0000 | [diff] [blame] | 501 |         self.assertEqual(line, MSG) | 
| Guido van Rossum | 24e4af8 | 2002-06-12 19:18:08 +0000 | [diff] [blame] | 502 |  | 
 | 503 |     def _testReadline(self): | 
 | 504 |         self.cli_file.write(MSG) | 
 | 505 |         self.cli_file.flush() | 
 | 506 |  | 
 | 507 | def test_main(): | 
 | 508 |     suite = unittest.TestSuite() | 
 | 509 |     suite.addTest(unittest.makeSuite(GeneralModuleTests)) | 
 | 510 |     suite.addTest(unittest.makeSuite(BasicTCPTest)) | 
 | 511 |     suite.addTest(unittest.makeSuite(BasicUDPTest)) | 
 | 512 |     suite.addTest(unittest.makeSuite(NonBlockingTCPTests)) | 
 | 513 |     suite.addTest(unittest.makeSuite(FileObjectClassTestCase)) | 
 | 514 |     test_support.run_suite(suite) | 
 | 515 |  | 
 | 516 | if __name__ == "__main__": | 
 | 517 |     test_main() |