diff options
| author | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2019-05-06 18:21:13 +0200 |
|---|---|---|
| committer | Fabian Mastenbroek <mail.fabianm@gmail.com> | 2019-05-14 12:55:56 +0200 |
| commit | 8a4972730965506cee3cbbdeb2b735454d4b6500 (patch) | |
| tree | 86c5373c07faef732a41401e7cea09d267b3c6d6 /odcsim-engine-tests/src/main/kotlin | |
| parent | 5b48cdbad2493c7af9e79bb9996f195ace3123e5 (diff) | |
feat: Add support for watching actor termination
This change adds support for tracking termination of actors in the
system.
Diffstat (limited to 'odcsim-engine-tests/src/main/kotlin')
| -rw-r--r-- | odcsim-engine-tests/src/main/kotlin/com/atlarge/odcsim/engine/tests/ActorSystemContract.kt | 36 |
1 files changed, 35 insertions, 1 deletions
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<ActorRef<Unit>> { ctx -> val root = ctx.self val child = ctx.spawn(setup<Unit> { - val child = ctx.spawn(receiveMessage<Unit> { + val child = it.spawn(receiveMessage<Unit> { 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<Nothing> { ctx -> + val child = ctx.spawn(suspending<Nothing> { + 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 { |
