diff options
Diffstat (limited to 'odcsim-engine-omega/src')
| -rw-r--r-- | odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt | 22 | ||||
| -rw-r--r-- | odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt (renamed from odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/SmokeTest.kt) | 30 | ||||
| -rw-r--r-- | odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt | 36 |
3 files changed, 53 insertions, 35 deletions
diff --git a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt b/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt index ffc68d0b..3eaddf51 100644 --- a/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt +++ b/odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt @@ -34,7 +34,6 @@ import com.atlarge.odcsim.Instant import com.atlarge.odcsim.PostStop import com.atlarge.odcsim.PreStart import com.atlarge.odcsim.Signal -import mu.KotlinLogging import java.util.PriorityQueue import kotlin.math.max @@ -56,7 +55,7 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String) /** * The path to the root actor. */ - override val path: ActorPath = ActorPath.Root() + override val path: ActorPath = ActorPath.Root(name = "/user") /** * The event queue to process @@ -70,19 +69,16 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String) */ private val registry: MutableMap<ActorPath, Actor<*>> = HashMap() - private val logger = KotlinLogging.logger {} - override fun run(until: Duration) { - require(until >= .0) { "The given instant must be a positive number" } + require(until >= .0) { "The given instant must be a non-negative number" } while (true) { val envelope = queue.peek() ?: break val delivery = envelope.time.takeUnless { it > until } ?: break - if (delivery < time) { - // Message out of order - logger.warn { "Message delivered out of order [expected=$delivery, actual=$time]" } - } + // A message should never be delivered out of order in this single-threaded implementation. Assert for + // sanity + assert(delivery >= time) { "Message delivered out of order [expected=$delivery, actual=$time]" } time = delivery queue.poll() @@ -114,7 +110,7 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String) override val time: Instant get() = this@OmegaActorSystem.time - override fun <U : Any> spawn(name: String, behavior: Behavior<U>): ActorRef<U> { + override fun <U : Any> spawn(behavior: Behavior<U>, name: String): ActorRef<U> { val ref = ActorRefImpl<U>(self.path.child(name)) if (ref.path !in registry) { val actor = Actor(ref, behavior) @@ -125,9 +121,9 @@ class OmegaActorSystem<in T : Any>(root: Behavior<T>, override val name: String) return ref } - override fun <U : Any> stop(child: ActorRef<U>): Boolean { - if (child.path.root != this@OmegaActorSystem.path) { - // This child is not part of the hierarchy. + override fun stop(child: ActorRef<*>): Boolean { + if (child.path.parent != self.path) { + // This is not a child of this actor return false } val ref = registry[child.path] ?: return false diff --git a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/SmokeTest.kt b/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt index a543d9d1..01574b7f 100644 --- a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/SmokeTest.kt +++ b/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemFactoryTest.kt @@ -22,30 +22,16 @@ * SOFTWARE. */ -package com.atlarge.odcsim +package com.atlarge.odcsim.engine.omega -import com.atlarge.odcsim.engine.omega.OmegaActorSystem -import org.junit.jupiter.api.Test +import com.atlarge.odcsim.ActorSystemFactory +import com.atlarge.odcsim.ActorSystemFactoryTest +import org.junit.jupiter.api.DisplayName /** - * A test to verify the system runs without smoking. + * The [ActorSystemFactoryTest] suite for the Omega engine implementation. */ -class SmokeTest { - @Test - fun `hello-world`() { - val system = OmegaActorSystem(object : Behavior<String> { - override fun receive(ctx: ActorContext<String>, msg: String): Behavior<String> { - println("${ctx.time} $msg") - return this - } - - override fun receiveSignal(ctx: ActorContext<String>, signal: Signal): Behavior<String> { - println("${ctx.time} $signal") - return this - } - }, name = "test") - - system.send("Hello World", after = 1.2) - system.run() - } +@DisplayName("OmegaActorSystemFactory") +class OmegaActorSystemFactoryTest : ActorSystemFactoryTest() { + override fun createFactory(): ActorSystemFactory = OmegaActorSystemFactory() } diff --git a/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt b/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt new file mode 100644 index 00000000..ef7a5258 --- /dev/null +++ b/odcsim-engine-omega/src/test/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystemTest.kt @@ -0,0 +1,36 @@ +/* + * MIT License + * + * Copyright (c) 2018 atlarge-research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.atlarge.odcsim.engine.omega + +import com.atlarge.odcsim.ActorSystemTest +import org.junit.jupiter.api.DisplayName + +/** + * The [ActorSystemTest] suite for the Omega engine implementation. + */ +@DisplayName("OmegaActorSystem") +class OmegaActorSystemTest : ActorSystemTest() { + override val factory = OmegaActorSystemFactory() +} |
