# Twisted, the Framework of Your Internet
# Copyright (C) 2001 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from twisted.internet import interfaces, reactor, protocol, error, address
from twisted.python import components, lockfile
from twisted.protocols import loopback
from twisted.trial import unittest
import test_smtp
import stat, os
class CancelProtocol(protocol.Protocol):
def connectionMade(self):
reactor.callLater(0.1, self.transport.loseConnection)
class TestClientFactory(protocol.ClientFactory):
def __init__(self, testcase, name):
self.testcase = testcase
self.name = name
def buildProtocol(self, addr):
self.testcase.assertEquals(address.UNIXAddress(self.name), addr)
return protocol.Protocol()
class Factory(protocol.Factory):
def __init__(self, testcase, name):
self.testcase = testcase
self.name = name
def buildProtocol(self, addr):
self.testcase.assertEquals(None, addr)
return CancelProtocol()
class UnixSocketTestCase(test_smtp.LoopbackSMTPTestCase):
"""Test unix sockets."""
def loopback(self, client, server):
loopback.loopbackUNIX(client, server)
def testDumber(self):
filename = self.mktemp()
l = reactor.listenUNIX(filename, Factory(self, filename))
reactor.connectUNIX(filename, TestClientFactory(self, filename))
self.runReactor(0.2, True)
l.stopListening()
def testMode(self):
filename = self.mktemp()
l = reactor.listenUNIX(filename, Factory(self, filename), mode = 0600)
self.assertEquals(stat.S_IMODE(os.stat(filename)[0]), 0600)
reactor.connectUNIX(filename, TestClientFactory(self, filename))
self.runReactor(0.2, True)
l.stopListening()
def testPIDFile(self):
filename = self.mktemp()
l = reactor.listenUNIX(filename, Factory(self, filename), mode = 0600, wantPID=1)
self.assert_(lockfile.checkLock(filename))
reactor.connectUNIX(filename, TestClientFactory(self, filename), checkPID=1)
self.runReactor(0.2, True)
l.stopListening()
reactor.iterate(0.1)
self.assert_(not lockfile.checkLock(filename))
class ClientProto(protocol.ConnectedDatagramProtocol):
def datagramReceived(self, data):
self.gotback = data
class ServerProto(protocol.DatagramProtocol):
def datagramReceived(self, data, addr):
self.gotfrom = addr
self.gotwhat = data
self.transport.write("hi back", addr)
class DatagramUnixSocketTestCase(unittest.TestCase):
"""Test datagram UNIX sockets."""
def testExchange(self):
clientaddr = self.mktemp()
serveraddr = self.mktemp()
sp = ServerProto()
cp = ClientProto()
s = reactor.listenUNIXDatagram(serveraddr, sp)
c = reactor.connectUNIXDatagram(serveraddr, cp, bindAddress = clientaddr)
reactor.iterate()
reactor.iterate()
reactor.iterate()
reactor.iterate()
cp.transport.write("hi")
reactor.iterate()
reactor.iterate()
reactor.iterate()
reactor.iterate()
reactor.iterate()
reactor.iterate()
s.stopListening()
c.stopListening()
os.unlink(clientaddr)
os.unlink(serveraddr)
self.failUnlessEqual("hi", sp.gotwhat)
self.failUnlessEqual(clientaddr, sp.gotfrom)
self.failUnlessEqual("hi back", cp.gotback)
def testCannotListen(self):
addr = self.mktemp()
p = ServerProto()
s = reactor.listenUNIXDatagram(addr, p)
self.failUnlessRaises(error.CannotListenError, reactor.listenUNIXDatagram, addr, p)
s.stopListening()
os.unlink(addr)
# test connecting to bound and connected (somewhere else) address
if not components.implements(reactor, interfaces.IReactorUNIX):
UnixSocketTestCase.skip = "This reactor does not support UNIX domain sockets"
if not components.implements(reactor, interfaces.IReactorUNIXDatagram):
DatagramUnixSocketTestCase.skip = "This reactor does not support UNIX datagram sockets"
syntax highlighted by Code2HTML, v. 0.9.1