From: <am...@us...> - 2008-09-13 18:10:01
|
Revision: 5324 http://jython.svn.sourceforge.net/jython/?rev=5324&view=rev Author: amak Date: 2008-09-13 18:09:58 +0000 (Sat, 13 Sep 2008) Log Message: ----------- Checking in fixes for 3 bugs http://bugs.jython.org/issue1119 - socket module has no attribute SO_ERROR http://bugs.jython.org/issue1120 - invalid socket shutdown gives AssertionError, should be "transport endpoint not connected" socket.error http://bugs.jython.org/issue1121 - listening socket shutdown expects the wrong kind of socket Modified Paths: -------------- trunk/jython/Lib/socket.py trunk/jython/Lib/test/test_socket.py Modified: trunk/jython/Lib/socket.py =================================================================== --- trunk/jython/Lib/socket.py 2008-09-13 17:04:58 UTC (rev 5323) +++ trunk/jython/Lib/socket.py 2008-09-13 18:09:58 UTC (rev 5324) @@ -149,7 +149,7 @@ __all__ = ['AF_UNSPEC', 'AF_INET', 'AF_INET6', 'AI_PASSIVE', 'SOCK_DGRAM', 'SOCK_RAW', 'SOCK_RDM', 'SOCK_SEQPACKET', 'SOCK_STREAM', 'SOL_SOCKET', - 'SO_BROADCAST', 'SO_KEEPALIVE', 'SO_LINGER', 'SO_OOBINLINE', + 'SO_BROADCAST', 'SO_ERROR', 'SO_KEEPALIVE', 'SO_LINGER', 'SO_OOBINLINE', 'SO_RCVBUF', 'SO_REUSEADDR', 'SO_SNDBUF', 'SO_TIMEOUT', 'TCP_NODELAY', 'SocketType', 'error', 'herror', 'gaierror', 'timeout', 'getfqdn', 'gethostbyaddr', 'gethostbyname', 'gethostname', @@ -183,6 +183,23 @@ TCP_NODELAY = 256 +# Options with negative constants are not supported +# They are being added here so that code that refers to them +# will not break with an AttributeError + +SO_ACCEPTCONN = -1 +SO_DEBUG = -2 +SO_DONTROUTE = -4 +SO_ERROR = -8 +SO_EXCLUSIVEADDRUSE = -16 +SO_RCVLOWAT = -32 +SO_RCVTIMEO = -64 +SO_REUSEPORT = -128 +SO_SNDLOWAT = -256 +SO_SNDTIMEO = -512 +SO_TYPE = -1024 +SO_USELOOPBACK = -2048 + class _nio_impl: timeout = None @@ -240,12 +257,16 @@ def shutdownInput(self): try: self.jsocket.shutdownInput() + except AttributeError, ax: + raise error(errno.ENOTCONN, "Transport endpoint is not connected") except java.lang.Exception, jlx: raise _map_exception(jlx) def shutdownOutput(self): try: self.jsocket.shutdownOutput() + except AttributeError, ax: + raise error(errno.ENOTCONN, "Transport endpoint is not connected") except java.lang.Exception, jlx: raise _map_exception(jlx) @@ -806,8 +827,9 @@ raise _map_exception(jlx) def shutdown(self, how): + if not self.sock_impl: + raise error(errno.ENOTCONN, "Transport endpoint is not connected") assert how in (SHUT_RD, SHUT_WR, SHUT_RDWR) - assert self.sock_impl if how in (SHUT_RD, SHUT_RDWR): self.sock_impl.shutdownInput() if how in (SHUT_WR, SHUT_RDWR): Modified: trunk/jython/Lib/test/test_socket.py =================================================================== --- trunk/jython/Lib/test/test_socket.py 2008-09-13 17:04:58 UTC (rev 5323) +++ trunk/jython/Lib/test/test_socket.py 2008-09-13 18:09:58 UTC (rev 5324) @@ -567,8 +567,10 @@ else: self.fail("Setting unsupported option should have raised an exception") +class TestSupportedOptions(TestSocketOptions): + def testSO_BROADCAST(self): - self.test_udp = 1 ; + self.test_udp = 1 self._testOption(socket.SO_BROADCAST, [0, 1]) def testSO_KEEPALIVE(self): @@ -612,28 +614,49 @@ self.test_tcp_client = 1 self._testOption(socket.TCP_NODELAY, [0, 1]) -class AsYetUnsupportedOptions: +class TestUnsupportedOptions(TestSocketOptions): - def testSO_ACCEPTCONN(self): pass - def testSO_DEBUG(self): pass - def testSO_DONTROUTE(self): pass - def testSO_ERROR(self): pass + def testSO_ACCEPTCONN(self): + self.failUnless(hasattr(socket, 'SO_ACCEPTCONN')) + + def testSO_DEBUG(self): + self.failUnless(hasattr(socket, 'SO_DEBUG')) + + def testSO_DONTROUTE(self): + self.failUnless(hasattr(socket, 'SO_DONTROUTE')) + + def testSO_ERROR(self): + self.failUnless(hasattr(socket, 'SO_ERROR')) + def testSO_EXCLUSIVEADDRUSE(self): # this is an MS specific option that will not be appearing on java # http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6421091 # http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6402335 - pass - def testSO_RCVLOWAT(self): pass - def testSO_RCVTIMEO(self): pass + self.failUnless(hasattr(socket, 'SO_EXCLUSIVEADDRUSE')) + + def testSO_RCVLOWAT(self): + self.failUnless(hasattr(socket, 'SO_RCVLOWAT')) + + def testSO_RCVTIMEO(self): + self.failUnless(hasattr(socket, 'SO_RCVTIMEO')) + def testSO_REUSEPORT(self): # not yet supported on java # http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6432031 - pass - def testSO_SNDLOWAT(self): pass - def testSO_SNDTIMEO(self): pass - def testSO_TYPE(self): pass - def testSO_USELOOPBACK(self): pass + self.failUnless(hasattr(socket, 'SO_REUSEPORT')) + def testSO_SNDLOWAT(self): + self.failUnless(hasattr(socket, 'SO_SNDLOWAT')) + + def testSO_SNDTIMEO(self): + self.failUnless(hasattr(socket, 'SO_SNDTIMEO')) + + def testSO_TYPE(self): + self.failUnless(hasattr(socket, 'SO_TYPE')) + + def testSO_USELOOPBACK(self): + self.failUnless(hasattr(socket, 'SO_USELOOPBACK')) + class BasicTCPTest(SocketConnectedTest): def __init__(self, methodName='runTest'): @@ -1441,15 +1464,43 @@ def _testUnicodeHostname(self): self.cli.connect((unicode(HOST), PORT)) - + +class TestInvalidUsage(unittest.TestCase): + + def setUp(self): + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + def testShutdownIOOnListener(self): + self.socket.listen() # socket is now a server socket + try: + self.socket.shutdown(socket.SHUT_RDWR) + except socket.error, se: + self.failUnlessEqual(se[0], errno.ENOTCONN, "Shutdown on listening socket should have raised errno.ENOTCONN, not %s" % str(se[0])) + except Exception, x: + self.fail("Shutdown on listening socket should have raised socket exception, not %s" % str(x)) + else: + self.fail("Shutdown on listening socket should have raised socket exception") + + def testShutdownOnUnconnectedSocket(self): + try: + self.socket.shutdown(socket.SHUT_RDWR) + except socket.error, se: + self.failUnlessEqual(se[0], errno.ENOTCONN, "Shutdown on unconnected socket should have raised errno.ENOTCONN, not %s" % str(se[0])) + except Exception, x: + self.fail("Shutdown on unconnected socket should have raised socket exception, not %s" % str(x)) + else: + self.fail("Shutdown on unconnected socket should have raised socket exception") + def test_main(): tests = [ GeneralModuleTests, - TestSocketOptions, + TestSupportedOptions, + TestUnsupportedOptions, BasicTCPTest, TCPTimeoutTest, TCPClientTimeoutTest, TestExceptions, + TestInvalidUsage, TestTCPAddressParameters, TestUDPAddressParameters, BasicUDPTest, @@ -1464,7 +1515,7 @@ UnbufferedFileObjectClassTestCase, LineBufferedFileObjectClassTestCase, SmallBufferedFileObjectClassTestCase, - UnicodeTest + UnicodeTest, ] if hasattr(socket, "socketpair"): tests.append(BasicSocketPairTest) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |