diff --git a/.azure/azure-ci-build-pipeline.yaml b/.azure/azure-ci-build-pipeline.yaml index 49d76937..6951e350 100644 --- a/.azure/azure-ci-build-pipeline.yaml +++ b/.azure/azure-ci-build-pipeline.yaml @@ -86,5 +86,5 @@ stages: displayName: 'Perform PrimAITE Setup' - script: | - pytest -n auto --cov=src --cov-report=html:coverage_report --cov-fail-under=80 + pytest --cov=src --cov-report=html:coverage_report --cov-fail-under=80 displayName: 'Run tests and code coverage' diff --git a/src/primaite/simulator/network/utils.py b/src/primaite/simulator/network/utils.py index 496f5e13..33085bd6 100644 --- a/src/primaite/simulator/network/utils.py +++ b/src/primaite/simulator/network/utils.py @@ -5,6 +5,8 @@ def convert_bytes_to_megabits(B: Union[int, float]) -> float: # noqa - Keep it """ Convert Bytes (file size) to Megabits (data transfer). + Technically Mebibits - but for simplicity sake, we'll call it megabit + :param B: The file size in Bytes. :return: File bits to transfer in Megabits. """ diff --git a/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py b/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py new file mode 100644 index 00000000..d2d0e52c --- /dev/null +++ b/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py @@ -0,0 +1,17 @@ +import pytest + +from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState +from primaite.simulator.network.hardware.nodes.switch import Switch + + +@pytest.fixture(scope="function") +def switch() -> Switch: + switch: Switch = Switch(hostname="switch_1", num_ports=8, operating_state=NodeOperatingState.ON) + switch.show() + return switch + + +def test_describe_state(switch): + state = switch.describe_state() + assert len(state.get("ports")) is 8 + assert state.get("num_ports") is 8 diff --git a/tests/unit_tests/_primaite/_simulator/_network/test_container.py b/tests/unit_tests/_primaite/_simulator/_network/test_container.py index 92b3a91b..021d6777 100644 --- a/tests/unit_tests/_primaite/_simulator/_network/test_container.py +++ b/tests/unit_tests/_primaite/_simulator/_network/test_container.py @@ -3,6 +3,7 @@ import json import pytest from primaite.simulator.network.container import Network +from primaite.simulator.network.hardware.base import Link, Node from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState from primaite.simulator.network.hardware.nodes.computer import Computer from primaite.simulator.system.applications.database_client import DatabaseClient @@ -17,19 +18,20 @@ def network(example_network) -> Network: assert len(example_network.servers) is 2 example_network.set_original_state() + example_network.show() return example_network -def test_describe_state(example_network): +def test_describe_state(network): """Test that describe state works.""" - state = example_network.describe_state() + state = network.describe_state() assert len(state["nodes"]) is 7 assert len(state["links"]) is 6 -def test_reset_network(example_network): +def test_reset_network(network): """ Test that the network is properly reset. @@ -37,10 +39,10 @@ def test_reset_network(example_network): etc are also removed/reinstalled """ - state_before = example_network.describe_state() + state_before = network.describe_state() - client_1: Computer = example_network.get_node_by_hostname("client_1") - server_1: Computer = example_network.get_node_by_hostname("server_1") + client_1: Computer = network.get_node_by_hostname("client_1") + server_1: Computer = network.get_node_by_hostname("server_1") assert client_1.operating_state is NodeOperatingState.ON assert server_1.operating_state is NodeOperatingState.ON @@ -51,14 +53,14 @@ def test_reset_network(example_network): server_1.power_off() assert server_1.operating_state is NodeOperatingState.SHUTTING_DOWN - assert example_network.describe_state() is not state_before + assert network.describe_state() is not state_before - example_network.reset_component_for_episode(episode=1) + network.reset_component_for_episode(episode=1) assert client_1.operating_state is NodeOperatingState.ON assert server_1.operating_state is NodeOperatingState.ON - assert json.dumps(example_network.describe_state(), sort_keys=True, indent=2) == json.dumps( + assert json.dumps(network.describe_state(), sort_keys=True, indent=2) == json.dumps( state_before, sort_keys=True, indent=2 ) @@ -68,3 +70,46 @@ def test_creating_container(): net = Network() assert net.nodes == {} assert net.links == {} + net.show() + + +def test_apply_timestep_to_nodes(network): + """Calling apply_timestep on the network should apply to the nodes within it.""" + client_1: Computer = network.get_node_by_hostname("client_1") + assert client_1.operating_state is NodeOperatingState.ON + + client_1.power_off() + + for i in range(client_1.shut_down_duration + 1): + network.apply_timestep(timestep=i) + + assert client_1.operating_state is NodeOperatingState.OFF + + +def test_removing_node_that_does_not_exist(network): + """Node that does not exist on network should not affect existing nodes.""" + assert len(network.nodes) is 7 + + network.remove_node(Node(hostname="new_node")) + assert len(network.nodes) is 7 + + +def test_remove_node(network): + """Remove node should remove the correct node.""" + assert len(network.nodes) is 7 + + client_1: Computer = network.get_node_by_hostname("client_1") + network.remove_node(client_1) + + assert network.get_node_by_hostname("client_1") is None + assert len(network.nodes) is 6 + + +def test_remove_link(network): + """Remove link should remove the correct link.""" + assert len(network.links) is 6 + link: Link = network.links.get(next(iter(network.links))) + + network.remove_link(link) + assert len(network.links) is 5 + assert network.links.get(link.uuid) is None diff --git a/tests/unit_tests/_primaite/_simulator/_network/test_utils.py b/tests/unit_tests/_primaite/_simulator/_network/test_utils.py new file mode 100644 index 00000000..a0c1da45 --- /dev/null +++ b/tests/unit_tests/_primaite/_simulator/_network/test_utils.py @@ -0,0 +1,11 @@ +from primaite.simulator.network.utils import convert_bytes_to_megabits, convert_megabits_to_bytes + + +def test_convert_bytes_to_megabits(): + assert round(convert_bytes_to_megabits(B=131072), 5) == float(1) + assert round(convert_bytes_to_megabits(B=69420), 5) == float(0.52963) + + +def test_convert_megabits_to_bytes(): + assert round(convert_megabits_to_bytes(Mbits=1), 5) == float(131072) + assert round(convert_megabits_to_bytes(Mbits=float(0.52963)), 5) == float(69419.66336)