summaryrefslogtreecommitdiff
path: root/odcsim-engine-tests/src/main/kotlin
diff options
context:
space:
mode:
authorFabian Mastenbroek <mail.fabianm@gmail.com>2019-05-06 18:21:13 +0200
committerFabian Mastenbroek <mail.fabianm@gmail.com>2019-05-14 12:55:56 +0200
commit8a4972730965506cee3cbbdeb2b735454d4b6500 (patch)
tree86c5373c07faef732a41401e7cea09d267b3c6d6 /odcsim-engine-tests/src/main/kotlin
parent5b48cdbad2493c7af9e79bb9996f195ace3123e5 (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.kt36
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 {