From 8a4972730965506cee3cbbdeb2b735454d4b6500 Mon Sep 17 00:00:00 2001 From: Fabian Mastenbroek Date: Mon, 6 May 2019 18:21:13 +0200 Subject: feat: Add support for watching actor termination This change adds support for tracking termination of actors in the system. --- .../odcsim/engine/tests/ActorSystemContract.kt | 36 +++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'odcsim-engine-tests/src/main/kotlin') diff --git a/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt b/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt index cb75c2ac..867e7c11 100644 --- a/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt +++ b/odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt @@ -28,9 +28,13 @@ import com.atlarge.odcsim.ActorPath import com.atlarge.odcsim.ActorRef import com.atlarge.odcsim.ActorSystemFactory import com.atlarge.odcsim.Behavior +import com.atlarge.odcsim.Terminated +import com.atlarge.odcsim.coroutines.dsl.timeout +import com.atlarge.odcsim.coroutines.suspending import com.atlarge.odcsim.empty import com.atlarge.odcsim.ignore import com.atlarge.odcsim.receiveMessage +import com.atlarge.odcsim.receiveSignal import com.atlarge.odcsim.same import com.atlarge.odcsim.setup import com.atlarge.odcsim.stopped @@ -278,7 +282,7 @@ abstract class ActorSystemContract { val system = factory(setup> { ctx -> val root = ctx.self val child = ctx.spawn(setup { - val child = ctx.spawn(receiveMessage { + val child = it.spawn(receiveMessage { throw IllegalStateException("DELIBERATE") }, "child") ctx.send(root, child) @@ -363,6 +367,36 @@ abstract class ActorSystemContract { assertEquals(1, counter) system.terminate() } + + /** + * Test whether an actor can watch for termination. + */ + @Test + fun `should watch for termination`() { + var received = false + val system = factory(setup { ctx -> + val child = ctx.spawn(suspending { + it.timeout(50.0) + stopped() + }, "child") + ctx.watch(child) + + receiveSignal { _, signal -> + when (signal) { + is Terminated -> { + received = true + stopped() + } + else -> + same() + } + } + }, "test") + + system.run() + system.terminate() + assertTrue(received) + } } companion object { -- cgit v1.2.3