views:

48

answers:

1

The socket module in python wraps the _socket module which is the C implementation stuff. As well, socket.socket will take a _sock parameter that must implement the _socket interface. In some regards _sock must be an actual instance of the underlying socket type from _socket since the C code does type checking (unlike pure python).

Given that you can pass in a socket-like object for _sock, it seems like you could write a socket emulator that you could pass in to socket.socket. It would need to emulate the underlying socket behavior but in memory and not over a real network or anything. It should not otherwise be distinguishable from _socket.

What would it take to build out this sort of emulation?

I know, I know, this is not terribly practical. In fact, I learned the hard way that using regular sockets was easier and fake sockets were unnecessary. I had thought that I would have better control of a test environment with fake sockets. Regardless of the time I "wasted", I found that I learned a bunch about sockets and about python in the process.

I was guessing any solution would have to be a stack of interacting objects like this:

something_that_uses_sockets (like XMLRPCTransport for ServerProxy)
    |
    V
socket.socket
    |
    V
FakeSocket
    |
    V
FakeNetwork
    |
    V
FakeSocket ("remote")
    |
    V
socket.socket
    |
    V
something_else_that_uses_sockets (like SimpleXMLRPCServer)

It seems like this is basically what is going on for real sockets, except for a real network instead of a fake one (plus OS-level sockets), and _socket instead of FakeSocket.

Anyway, just for fun, any ideas on how to approach this?

Incidently, with a FakeSocket you could do some socket-like stuff in Google Apps...

+3  A: 

It's already been done. Twisted uses this extensively for unit tests of its protocol implementations. A good starting place would be looking at some of Twisted's unit tests.

In essence, you'd just call makeConnection on your protocol with a transport that isn't connected to a real socket. Super easy!

Aaron Gallagher
Awesome! That is just what I was looking for. Maybe I should finally get around to looking into twisted. :)
Eric Snow