diff options
| author | Dante Niewenhuis <d.niewenhuis@hotmail.com> | 2024-10-25 13:32:41 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-25 13:32:41 +0200 |
| commit | 5a365dbc068f2a8cdfa9813c39cc84bb30e15637 (patch) | |
| tree | 72716d562787b85e03cdc7fe1d30c827054d25a0 /opendc-simulator/opendc-simulator-network/src | |
| parent | 27f5b7dcb05aefdab9b762175d538931face0aba (diff) | |
Rewrote the FlowEngine (#256)
* Removed unused components. Updated tests.
Improved checkpointing model
Improved model, started with SimPowerSource
implemented FailureModels and Checkpointing
First working version
midway commit
first update
All simulation are now run with a single CPU and single MemoryUnit. multi CPUs are combined into one. This is for performance and explainability.
* fixed merge conflicts
* Updated M3SA paths.
* Fixed small typo
Diffstat (limited to 'opendc-simulator/opendc-simulator-network/src')
9 files changed, 0 insertions, 776 deletions
diff --git a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkLink.java b/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkLink.java deleted file mode 100644 index 1ea9cb0e..00000000 --- a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkLink.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2022 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 org.opendc.simulator.network; - -/** - * A physical bidirectional communication link between two [SimNetworkPort]s. - */ -public final class SimNetworkLink { - private final SimNetworkPort left; - private final SimNetworkPort right; - - SimNetworkLink(SimNetworkPort left, SimNetworkPort right) { - this.left = left; - this.right = right; - } - - /** - * Determine whether the specified <code>port</code> participates in this network link. - * - * @return <code>true</code> if the port participates in this link, <code>false</code> otherwise. - */ - public boolean contains(SimNetworkPort port) { - return port == left || port == right; - } - - /** - * Obtain the opposite port to which the specified <code>port</code> is connected through this link. - */ - public SimNetworkPort opposite(SimNetworkPort port) { - if (port == left) { - return right; - } else if (port == right) { - return left; - } - - throw new IllegalArgumentException("Invalid port given"); - } - - /** - * Return the first port of the link. - */ - public SimNetworkPort getLeft() { - return left; - } - - /** - * Return the second port of the link. - */ - public SimNetworkPort getRight() { - return right; - } - - @Override - public String toString() { - return "SimNetworkLink[left=" + left + ",right=" + right + "]"; - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkPort.java b/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkPort.java deleted file mode 100644 index b5e09b9b..00000000 --- a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkPort.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2022 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 org.opendc.simulator.network; - -import org.opendc.simulator.flow2.Inlet; -import org.opendc.simulator.flow2.Outlet; - -/** - * A network port allows network devices to be connected to network through links. - */ -public abstract class SimNetworkPort { - SimNetworkLink link; - - /** - * Determine whether the network port is connected to another port. - * - * @return <code>true</code> if the network port is connected, <code>false</code> otherwise. - */ - public boolean isConnected() { - return link != null; - } - - /** - * Return network link which connects this port to another port. - */ - public SimNetworkLink getLink() { - return link; - } - - /** - * Connect this port to the specified <code>port</code>. - */ - public void connect(SimNetworkPort port) { - if (port == this) { - throw new IllegalArgumentException("Circular reference"); - } - if (isConnected()) { - throw new IllegalStateException("Port already connected"); - } - if (port.isConnected()) { - throw new IllegalStateException("Target port already connected"); - } - - final SimNetworkLink link = new SimNetworkLink(this, port); - this.link = link; - port.link = link; - - // Start bidirectional flow channel between the two ports - final Outlet outlet = getOutlet(); - final Inlet inlet = getInlet(); - - outlet.getGraph().connect(outlet, port.getInlet()); - inlet.getGraph().connect(port.getOutlet(), inlet); - } - - /** - * Disconnect the current network link if it exists. - */ - public void disconnect() { - final SimNetworkLink link = this.link; - if (link == null) { - return; - } - - final SimNetworkPort opposite = link.opposite(this); - this.link = null; - opposite.link = null; - - final Outlet outlet = getOutlet(); - final Inlet inlet = getInlet(); - - outlet.getGraph().disconnect(outlet); - inlet.getGraph().disconnect(inlet); - } - - /** - * Return the {@link Outlet} representing the outgoing traffic of this port. - */ - protected abstract Outlet getOutlet(); - - /** - * An [Inlet] representing the ingoing traffic of this port. - */ - protected abstract Inlet getInlet(); - - @Override - public String toString() { - return "SimNetworkPort[isConnected=" + isConnected() + "]"; - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSink.java b/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSink.java deleted file mode 100644 index f8918328..00000000 --- a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSink.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2022 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 org.opendc.simulator.network; - -import org.opendc.simulator.flow2.FlowGraph; -import org.opendc.simulator.flow2.Inlet; -import org.opendc.simulator.flow2.Outlet; -import org.opendc.simulator.flow2.sink.SimpleFlowSink; -import org.opendc.simulator.flow2.source.EmptyFlowSource; - -/** - * A network sink which discards all received traffic and does not generate any traffic itself. - */ -public final class SimNetworkSink extends SimNetworkPort { - private final EmptyFlowSource source; - private final SimpleFlowSink sink; - - /** - * Construct a {@link SimNetworkSink} instance. - * - * @param graph The {@link FlowGraph} to which the sink belongs. - * @param capacity The capacity of the sink in terms of processed data. - */ - public SimNetworkSink(FlowGraph graph, float capacity) { - this.source = new EmptyFlowSource(graph); - this.sink = new SimpleFlowSink(graph, capacity); - } - - /** - * Return the capacity of the sink. - */ - public float getCapacity() { - return sink.getCapacity(); - } - - @Override - protected Outlet getOutlet() { - return source.getOutput(); - } - - @Override - protected Inlet getInlet() { - return sink.getInput(); - } - - @Override - public String toString() { - return "SimNetworkSink[capacity=" + getCapacity() + "]"; - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSwitch.java b/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSwitch.java deleted file mode 100644 index b05dc53d..00000000 --- a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSwitch.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2022 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 org.opendc.simulator.network; - -import java.util.List; - -/** - * A network device connects devices on a network by switching the traffic over its ports. - */ -public interface SimNetworkSwitch { - /** - * Return the ports of the switch. - */ - List<SimNetworkPort> getPorts(); -} diff --git a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSwitchVirtual.java b/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSwitchVirtual.java deleted file mode 100644 index a94bf799..00000000 --- a/opendc-simulator/opendc-simulator-network/src/main/java/org/opendc/simulator/network/SimNetworkSwitchVirtual.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2022 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 org.opendc.simulator.network; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.opendc.simulator.flow2.FlowGraph; -import org.opendc.simulator.flow2.Inlet; -import org.opendc.simulator.flow2.Outlet; -import org.opendc.simulator.flow2.mux.FlowMultiplexer; -import org.opendc.simulator.flow2.mux.MaxMinFlowMultiplexer; - -/** - * A {@link SimNetworkSwitch} that can support new networking ports on demand. - */ -public final class SimNetworkSwitchVirtual implements SimNetworkSwitch { - private final List<Port> ports = new ArrayList<>(); - - /** - * The {@link MaxMinFlowMultiplexer} to actually perform the switching. - */ - private final MaxMinFlowMultiplexer mux; - - /** - * Construct a {@link SimNetworkSwitchVirtual} instance. - * - * @param graph The {@link FlowGraph} to drive the simulation. - */ - public SimNetworkSwitchVirtual(FlowGraph graph) { - this.mux = new MaxMinFlowMultiplexer(graph); - } - - /** - * Open a new port on the switch. - */ - public Port newPort() { - final Port port = new Port(mux); - ports.add(port); - return port; - } - - @Override - public List<SimNetworkPort> getPorts() { - return Collections.unmodifiableList(ports); - } - - /** - * A port on the network switch. - */ - public class Port extends SimNetworkPort implements AutoCloseable { - private final FlowMultiplexer mux; - private final Inlet inlet; - private final Outlet outlet; - private boolean isClosed; - - private Port(FlowMultiplexer mux) { - this.mux = mux; - this.inlet = mux.newInput(); - this.outlet = mux.newOutput(); - } - - @Override - protected Outlet getOutlet() { - if (isClosed) { - throw new IllegalStateException("Port is closed"); - } - return outlet; - } - - @Override - protected Inlet getInlet() { - if (isClosed) { - throw new IllegalStateException("Port is closed"); - } - return inlet; - } - - @Override - public void close() { - isClosed = true; - mux.releaseInput(inlet); - mux.releaseOutput(outlet); - ports.remove(this); - } - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkLinkTest.kt b/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkLinkTest.kt deleted file mode 100644 index 9863507d..00000000 --- a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkLinkTest.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2021 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 org.opendc.simulator.network - -import io.mockk.mockk -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows - -/** - * Test suite for [SimNetworkLink] class. - */ -class SimNetworkLinkTest { - @Test - fun testContainsLeft() { - val left = mockk<SimNetworkPort>() - val right = mockk<SimNetworkPort>() - - val link = SimNetworkLink(left, right) - assertTrue(left in link) - } - - @Test - fun testContainsRight() { - val left = mockk<SimNetworkPort>() - val right = mockk<SimNetworkPort>() - - val link = SimNetworkLink(left, right) - assertTrue(right in link) - } - - @Test - fun testContainsNone() { - val left = mockk<SimNetworkPort>() - val right = mockk<SimNetworkPort>() - val none = mockk<SimNetworkPort>() - - val link = SimNetworkLink(left, right) - assertFalse(none in link) - } - - @Test - fun testOppositeLeft() { - val left = mockk<SimNetworkPort>() - val right = mockk<SimNetworkPort>() - - val link = SimNetworkLink(left, right) - assertEquals(right, link.opposite(left)) - } - - @Test - fun testOppositeRight() { - val left = mockk<SimNetworkPort>() - val right = mockk<SimNetworkPort>() - - val link = SimNetworkLink(left, right) - assertEquals(left, link.opposite(right)) - } - - @Test - fun testOppositeNone() { - val left = mockk<SimNetworkPort>() - val right = mockk<SimNetworkPort>() - val none = mockk<SimNetworkPort>() - - val link = SimNetworkLink(left, right) - assertThrows<IllegalArgumentException> { link.opposite(none) } - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkSinkTest.kt b/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkSinkTest.kt deleted file mode 100644 index 4655bfea..00000000 --- a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkSinkTest.kt +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2021 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 org.opendc.simulator.network - -import io.mockk.every -import io.mockk.mockk -import io.mockk.verify -import kotlinx.coroutines.yield -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertNull -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertDoesNotThrow -import org.junit.jupiter.api.assertThrows -import org.opendc.simulator.flow2.FlowEngine -import org.opendc.simulator.kotlin.runSimulation - -/** - * Test suite for the [SimNetworkSink] class. - */ -class SimNetworkSinkTest { - @Test - fun testInitialState() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - - assertAll( - { assertFalse(sink.isConnected) }, - { assertNull(sink.link) }, - { assertEquals(100.0f, sink.capacity) }, - ) - } - - @Test - fun testDisconnectIdempotent() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - - assertDoesNotThrow { sink.disconnect() } - assertFalse(sink.isConnected) - } - - @Test - fun testConnectCircular() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - - assertThrows<IllegalArgumentException> { - sink.connect(sink) - } - } - - @Test - fun testConnectAlreadyConnectedTarget() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - val source = mockk<SimNetworkPort>(relaxUnitFun = true) - every { source.isConnected } returns true - - assertThrows<IllegalStateException> { - sink.connect(source) - } - } - - @Test - fun testConnectAlreadyConnected() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - val source1 = TestSource(graph) - - val source2 = mockk<SimNetworkPort>(relaxUnitFun = true) - - every { source2.isConnected } returns false - - sink.connect(source1) - assertThrows<IllegalStateException> { - sink.connect(source2) - } - } - - @Test - fun testConnect() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - val source = TestSource(graph) - - sink.connect(source) - - yield() - - assertAll( - { assertTrue(sink.isConnected) }, - { assertTrue(source.isConnected) }, - { assertEquals(100.0f, source.outlet.capacity) }, - ) - - verify { source.logic.onUpdate(any(), any()) } - } - - @Test - fun testDisconnect() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - val source = TestSource(graph) - - sink.connect(source) - sink.disconnect() - - yield() - - assertAll( - { assertFalse(sink.isConnected) }, - { assertFalse(source.isConnected) }, - { assertEquals(0.0f, source.outlet.capacity) }, - ) - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkSwitchVirtualTest.kt b/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkSwitchVirtualTest.kt deleted file mode 100644 index b5a00ffc..00000000 --- a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/SimNetworkSwitchVirtualTest.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2021 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 org.opendc.simulator.network - -import io.mockk.verify -import kotlinx.coroutines.yield -import org.junit.jupiter.api.Assertions.assertAll -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows -import org.opendc.simulator.flow2.FlowEngine -import org.opendc.simulator.kotlin.runSimulation - -/** - * Test suite for the [SimNetworkSwitchVirtual] class. - */ -class SimNetworkSwitchVirtualTest { - @Test - fun testConnect() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - val source = TestSource(graph) - val switch = SimNetworkSwitchVirtual(graph) - - switch.newPort().connect(sink) - switch.newPort().connect(source) - - yield() - - assertAll( - { assertTrue(sink.isConnected) }, - { assertTrue(source.isConnected) }, - { assertEquals(100.0f, source.outlet.capacity) }, - ) - - verify { source.logic.onUpdate(any(), any()) } - } - - @Test - fun testConnectClosedPort() = - runSimulation { - val engine = FlowEngine.create(dispatcher) - val graph = engine.newGraph() - val sink = SimNetworkSink(graph, 100.0f) - val switch = SimNetworkSwitchVirtual(graph) - - val port = switch.newPort() - port.close() - - assertThrows<IllegalStateException> { - port.connect(sink) - } - } -} diff --git a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/TestSource.kt b/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/TestSource.kt deleted file mode 100644 index 298a5d48..00000000 --- a/opendc-simulator/opendc-simulator-network/src/test/kotlin/org/opendc/simulator/network/TestSource.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2022 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 org.opendc.simulator.network - -import io.mockk.spyk -import org.opendc.simulator.flow2.FlowGraph -import org.opendc.simulator.flow2.FlowStage -import org.opendc.simulator.flow2.FlowStageLogic -import org.opendc.simulator.flow2.InPort -import org.opendc.simulator.flow2.Inlet -import org.opendc.simulator.flow2.OutPort -import org.opendc.simulator.flow2.Outlet - -/** - * A [SimNetworkPort] that acts as a test source. - */ -class TestSource(graph: FlowGraph) : SimNetworkPort(), FlowStageLogic { - val logic = spyk(this) - private val stage = graph.newStage(logic) - - val outlet: OutPort = stage.getOutlet("out") - val inlet: InPort = stage.getInlet("in") - - init { - outlet.push(80.0f) - } - - override fun onUpdate( - ctx: FlowStage, - now: Long, - ): Long = Long.MAX_VALUE - - override fun getOutlet(): Outlet = outlet - - override fun getInlet(): Inlet = inlet -} |
