From f19dc9892bb30fcc5ea546643339bb596c26d2b4 Mon Sep 17 00:00:00 2001 From: Chris McCarthy Date: Mon, 11 Sep 2023 11:31:03 +0100 Subject: [PATCH] #1816 - Fixed tests. Used node and link added number (id) in observation space. --- src/primaite/simulator/network/container.py | 16 ++++++- .../system/applications/database_client.py | 1 + .../system/test_database_on_node.py | 28 ++++++++++++ .../test_data_manipulator_service.py | 4 +- .../_system/_services/test_database.py | 45 +------------------ 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/primaite/simulator/network/container.py b/src/primaite/simulator/network/container.py index 4d1afe72..79c7d77b 100644 --- a/src/primaite/simulator/network/container.py +++ b/src/primaite/simulator/network/container.py @@ -29,6 +29,8 @@ class Network(SimComponent): nodes: Dict[str, Node] = {} links: Dict[str, Link] = {} + _node_id_map: Dict[int, Node] = {} + _link_id_map: Dict[int, Node] = {} def __init__(self, **kwargs): """ @@ -161,8 +163,8 @@ class Network(SimComponent): state = super().describe_state() state.update( { - "nodes": {uuid: node.describe_state() for uuid, node in self.nodes.items()}, - "links": {uuid: link.describe_state() for uuid, link in self.links.items()}, + "nodes": {i for i, node in self._node_id_map.items()}, + "links": {i: link.describe_state() for i, link in self._link_id_map.items()}, } ) return state @@ -179,6 +181,7 @@ class Network(SimComponent): _LOGGER.warning(f"Can't add node {node.uuid}. It is already in the network.") return self.nodes[node.uuid] = node + self._node_id_map[len(self.nodes)] = node node.parent = self self._nx_graph.add_node(node.hostname) _LOGGER.info(f"Added node {node.uuid} to Network {self.uuid}") @@ -209,6 +212,10 @@ class Network(SimComponent): _LOGGER.warning(f"Can't remove node {node.uuid}. It's not in the network.") return self.nodes.pop(node.uuid) + for i, _node in self._node_id_map.items(): + if node == _node: + self._node_id_map.pop(i) + break node.parent = None _LOGGER.info(f"Removed node {node.uuid} from network {self.uuid}") @@ -235,6 +242,7 @@ class Network(SimComponent): return link = Link(endpoint_a=endpoint_a, endpoint_b=endpoint_b, **kwargs) self.links[link.uuid] = link + self._link_id_map[len(self.links)] = link self._nx_graph.add_edge(endpoint_a.parent.hostname, endpoint_b.parent.hostname) link.parent = self _LOGGER.info(f"Added link {link.uuid} to connect {endpoint_a} and {endpoint_b}") @@ -248,6 +256,10 @@ class Network(SimComponent): link.endpoint_a.disconnect_link() link.endpoint_b.disconnect_link() self.links.pop(link.uuid) + for i, _link in self._link_id_map.items(): + if link == _link: + self._link_id_map.pop(i) + break link.parent = None _LOGGER.info(f"Removed link {link.uuid} from network {self.uuid}.") diff --git a/src/primaite/simulator/system/applications/database_client.py b/src/primaite/simulator/system/applications/database_client.py index bbcde00f..a866b290 100644 --- a/src/primaite/simulator/system/applications/database_client.py +++ b/src/primaite/simulator/system/applications/database_client.py @@ -57,6 +57,7 @@ class DatabaseClient(Application): return self.connected else: self.sys_log.info(f"DatabaseClient connected to {server_ip_address} declined") + return False payload = {"type": "connect_request", "password": password} software_manager: SoftwareManager = self.software_manager software_manager.send_payload_to_session_manager( diff --git a/tests/integration_tests/system/test_database_on_node.py b/tests/integration_tests/system/test_database_on_node.py index b360907e..31e04666 100644 --- a/tests/integration_tests/system/test_database_on_node.py +++ b/tests/integration_tests/system/test_database_on_node.py @@ -21,6 +21,34 @@ def test_database_client_server_connection(uc2_network): assert len(db_service.connections) == 0 +def test_database_client_server_correct_password(uc2_network): + web_server: Server = uc2_network.get_node_by_hostname("web_server") + db_client: DatabaseClient = web_server.software_manager.software["DatabaseClient"] + + db_server: Server = uc2_network.get_node_by_hostname("database_server") + db_service: DatabaseService = db_server.software_manager.software["DatabaseService"] + db_service.password = "12345" + + assert len(db_service.connections) == 0 + + assert db_client.connect(server_ip_address=IPv4Address("192.168.1.14"), password="12345") + assert len(db_service.connections) == 1 + + +def test_database_client_server_incorrect_password(uc2_network): + web_server: Server = uc2_network.get_node_by_hostname("web_server") + db_client: DatabaseClient = web_server.software_manager.software["DatabaseClient"] + + db_server: Server = uc2_network.get_node_by_hostname("database_server") + db_service: DatabaseService = db_server.software_manager.software["DatabaseService"] + db_service.password = "12345" + + assert len(db_service.connections) == 0 + + assert not db_client.connect(server_ip_address=IPv4Address("192.168.1.14"), password="54321") + assert len(db_service.connections) == 0 + + def test_database_client_query(uc2_network): """Tests DB query across the network returns HTTP status 200 and date.""" web_server: Server = uc2_network.get_node_by_hostname("web_server") diff --git a/tests/unit_tests/_primaite/_simulator/_system/_services/_red_services/test_data_manipulator_service.py b/tests/unit_tests/_primaite/_simulator/_system/_services/_red_services/test_data_manipulator_service.py index f5b37175..f95081a6 100644 --- a/tests/unit_tests/_primaite/_simulator/_system/_services/_red_services/test_data_manipulator_service.py +++ b/tests/unit_tests/_primaite/_simulator/_system/_services/_red_services/test_data_manipulator_service.py @@ -12,9 +12,9 @@ def test_creation(): client_1: Node = network.get_node_by_hostname("client_1") - client_1.software_manager.add_service(service_class=DataManipulatorService) + client_1.software_manager.install(service_class=DataManipulatorService) - data_manipulator_service: DataManipulatorService = client_1.software_manager.services["DataManipulatorBot"] + data_manipulator_service: DataManipulatorService = client_1.software_manager.software["DataManipulatorBot"] assert data_manipulator_service.name == "DataManipulatorBot" assert data_manipulator_service.port == Port.POSTGRES_SERVER diff --git a/tests/unit_tests/_primaite/_simulator/_system/_services/test_database.py b/tests/unit_tests/_primaite/_simulator/_system/_services/test_database.py index db33908d..d41c63c7 100644 --- a/tests/unit_tests/_primaite/_simulator/_system/_services/test_database.py +++ b/tests/unit_tests/_primaite/_simulator/_system/_services/test_database.py @@ -5,55 +5,14 @@ import pytest from primaite.simulator.network.hardware.base import Node from primaite.simulator.system.services.database_service import DatabaseService -DDL = """ -CREATE TABLE IF NOT EXISTS user ( -id INTEGER PRIMARY KEY AUTOINCREMENT, -name VARCHAR(50) NOT NULL, -email VARCHAR(50) NOT NULL, -age INT, -city VARCHAR(50), -occupation VARCHAR(50) -);""" - -USER_INSERT_STATEMENTS = [ - "INSERT INTO user (name, email, age, city, occupation) VALUES ('John Doe', 'johndoe@example.com', 32, 'New York', 'Engineer');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Jane Smith', 'janesmith@example.com', 27, 'Los Angeles', 'Designer');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Bob Johnson', 'bobjohnson@example.com', 45, 'Chicago', 'Manager');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Alice Lee', 'alicelee@example.com', 22, 'San Francisco', 'Student');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('David Kim', 'davidkim@example.com', 38, 'Houston', 'Consultant');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Emily Chen', 'emilychen@example.com', 29, 'Seattle', 'Software Developer');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Frank Wang', 'frankwang@example.com', 55, 'New York', 'Entrepreneur');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Grace Park', 'gracepark@example.com', 31, 'Los Angeles', 'Marketing Specialist');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Henry Wu', 'henrywu@example.com', 40, 'Chicago', 'Accountant');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Isabella Kim', 'isabellakim@example.com', 26, 'San Francisco', 'Graphic Designer');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Jake Lee', 'jakelee@example.com', 33, 'Houston', 'Sales Manager');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Kelly Chen', 'kellychen@example.com', 28, 'Seattle', 'Web Developer');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Lucas Liu', 'lucasliu@example.com', 42, 'New York', 'Lawyer');", - "INSERT INTO user (name, email, age, city, occupation) VALUES ('Maggie Wang', 'maggiewang@example.com', 30, 'Los Angeles', 'Data Analyst');", -] - @pytest.fixture(scope="function") def database_server() -> Node: node = Node(hostname="db_node") - node.software_manager.add_service(DatabaseService) - node.software_manager.services["Database"].start() + node.software_manager.install(DatabaseService) + node.software_manager.software["DatabaseService"].start() return node -@pytest.fixture(scope="function") -def database(database_server) -> DatabaseService: - database: DatabaseService = database_server.software_manager.services["Database"] # noqa - database.receive(DDL, None) - for script in USER_INSERT_STATEMENTS: - database.receive(script, None) - return database - - def test_creation(database_server): database_server.software_manager.show() - - -def test_db_population(database): - database.show() - assert database.tables() == ["user"]