@@ -176,14 +176,14 @@ testAgentEventHandling result = do
176176
177177 stash result $ seenAlive && seenDead
178178
179−testMxMonitorEvents :: Process ()
180−testMxMonitorEvents = do
179+testMxRegEvents :: Process ()
180+testMxRegEvents = do
181181
182182 {- This test only deals with the local case, to ensure that we are being
183183 notified in the expected order - the remote cases related to the
184184 behaviour of the node controller are contained in the CH test suite. -}
185185
186− let label = "testMxMonitorEvents"
186+ let label = "testMxRegEvents"
187187 let agentLabel = "listener-agent"
188188 let delay = 1000000
189189 (regChan, regSink) <- newChan
@@ -223,9 +223,65 @@ testMxMonitorEvents = do
223223
224224 mapM_ (flip kill $ "test-complete") [agent, p1, p2]
225225
226+testMxRegMon :: LocalNode -> Process ()
227+testMxRegMon remoteNode = do
228+
229+ -- ensure that when a registered process dies, we get a notification that
230+ -- it has been unregistered as well as seeing the name get removed
231+
232+ let label1 = "aaaaa"
233+ let label2 = "bbbbb"
234+ let isValid l = l ==label1 || l == label2
235+ let agentLabel = "listener-agent"
236+ let delay = 1000000
237+ (regChan, regSink) <- newChan
238+ (unRegChan, unRegSink) <- newChan
239+ agent <- mxAgent (MxAgentId agentLabel) () [
240+ mxSink $ \ev -> do
241+ case ev of
242+ MxRegistered pid label
243+ | isValid label -> liftMX $ sendChan regChan (label, pid)
244+ MxUnRegistered pid label
245+ | isValid label -> liftMX $ sendChan unRegChan (label, pid)
246+ _ -> return ()
247+ mxReady
248+ ]
249+
250+ (sp, rp) <- newChan
251+ liftIO $ forkProcess remoteNode $ do
252+ getSelfPid >>= sendChan sp
253+ expect :: Process ()
254+
255+ p1 <- receiveChan rp
256+
257+ register label1 p1
258+ reg1 <- receiveChanTimeout delay regSink
259+ reg1 `shouldBe` equalTo (Just (label1, p1))
260+
261+ register label2 p1
262+ reg2 <- receiveChanTimeout delay regSink
263+ reg2 `shouldBe` equalTo (Just (label2, p1))
264+
265+ n1 <- whereis label1
266+ n1 `shouldBe` equalTo (Just p1)
267+
268+ n2 <- whereis label2
269+ n2 `shouldBe` equalTo (Just p1)
270+
271+ kill p1 "goodbye"
272+
273+ unreg1 <- receiveChanTimeout delay unRegSink
274+ unreg2 <- receiveChanTimeout delay unRegSink
275+
276+ sort [unreg1, unreg2]
277+ `shouldBe` equalTo [Just (label1, p1), Just (label2, p1)]
278+
279+ kill agent "test-complete"
280+
226281tests :: TestTransport -> IO [Test]
227282tests TestTransport{..} = do
228283 node1 <- newLocalNode testTransport initRemoteTable
284+ node2 <- newLocalNode testTransport initRemoteTable
229285 return [
230286 testGroup "Mx Agents" [
231287 testCase "Event Handling"
@@ -252,7 +308,9 @@ tests TestTransport{..} = do
252308 "fifth"]) testAgentPrioritisation)
253309 ]
254310 , testGroup "Mx Events" [
255− testCase "Monitor Events"
256− (runProcess node1 testMxMonitorEvents)
311+ testCase "Name Registration Events"
312+ (runProcess node1 testMxRegEvents)
313+ , testCase "Post Death Name UnRegistration Events"
314+ (runProcess node1 (testMxRegMon node2))
257315 ]
258316 ]