Shutting down ALServers properly

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Shutting down ALServers properly

Frank Shearar-3
I thought I'd be clever and start up my server in a #setUp and close
it in a #tearDown.

So I have something like this:

RemoteOrganizerTest >> setUp
        port := 9090.
        host := '127.0.0.1'. "Everything supports IPv4."
        serv := self assertLocalServerOnPort: port.
        local := self setUpLocal.
        remote := self setUpRemote.

RemoteOrganizerTest >> assertLocalServerOnPort: anInteger
        | serv |
        ALServer allInstances do: #stop. "This is excessive!" self flag: #todo.
        serv := ALServer on: anInteger application: (ImageReflector new).
        "Must fork so that we can read from the socket. Otherwise we're
trying to read and write on the same Process, which doesn't work."
        serv start.
        ^ serv.

RemoteOrganizerTest >> tearDown
        serv stop.

local contains a SystemOrganizer while remote contains a
WebClient-using thing. It all kind've works, except that in the
#tearDown the sockets are very unhappy with the way they're being torn
down: SocketPrimitiveFailed: primSocketReceiveDataAvailable: failed.
The stack looks like this:

Socket>>primitiveFailed:
Socket(Object)>>primitiveFailed
Socket>>primSocketReceiveDataAvailable:
Socket>>waitForDataIfClosed:
ALConnection>>wait
ALConnection>>loop
[] in [] in ALConnection>>run
BlockClosure>>on:do:
[] in ALConnection>>run
BlockClosure>>ifCurtailed:
ALConnection>>run
[] in ALConnection>>start
[] in BlockClosure>>newProcess

so I'm reasonably sure that I'm terminating the ALServers with too
extreme a prejudice.

How should I tear down the server?

(I could pull the server creation into a TestFixture, but I'm hesitant
to do that without understanding the error above.)

frank