summaryrefslogtreecommitdiff
path: root/odcsim-engine-omega
diff options
context:
space:
mode:
Diffstat (limited to 'odcsim-engine-omega')
-rw-r--r--odcsim-engine-omega/build.gradle2
-rw-r--r--odcsim-engine-omega/src/main/kotlin/com/atlarge/odcsim/engine/omega/OmegaActorSystem.kt22
-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.kt36
4 files changed, 53 insertions, 37 deletions
diff --git a/odcsim-engine-omega/build.gradle b/odcsim-engine-omega/build.gradle
index 4f01e4ca..b8399a4e 100644
--- a/odcsim-engine-omega/build.gradle
+++ b/odcsim-engine-omega/build.gradle
@@ -35,11 +35,9 @@ dependencies {
api project(':odcsim-core')
implementation "org.jetbrains.kotlin:kotlin-stdlib"
- implementation "io.github.microutils:kotlin-logging:1.4.6"
testCompile project(path: ':odcsim-core', configuration: 'tests')
testImplementation "org.junit.jupiter:junit-jupiter-api:$junit_jupiter_version"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junit_jupiter_version"
testImplementation "org.junit.platform:junit-platform-launcher:$junit_platform_version"
- testRuntimeOnly "org.slf4j:slf4j-simple:1.7.25"
}
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()
+}