#1816 - Fixed tests. Used node and link added number (id) in observation space.
This commit is contained in:
@@ -29,6 +29,8 @@ class Network(SimComponent):
|
|||||||
|
|
||||||
nodes: Dict[str, Node] = {}
|
nodes: Dict[str, Node] = {}
|
||||||
links: Dict[str, Link] = {}
|
links: Dict[str, Link] = {}
|
||||||
|
_node_id_map: Dict[int, Node] = {}
|
||||||
|
_link_id_map: Dict[int, Node] = {}
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
"""
|
"""
|
||||||
@@ -161,8 +163,8 @@ class Network(SimComponent):
|
|||||||
state = super().describe_state()
|
state = super().describe_state()
|
||||||
state.update(
|
state.update(
|
||||||
{
|
{
|
||||||
"nodes": {uuid: node.describe_state() for uuid, node in self.nodes.items()},
|
"nodes": {i for i, node in self._node_id_map.items()},
|
||||||
"links": {uuid: link.describe_state() for uuid, link in self.links.items()},
|
"links": {i: link.describe_state() for i, link in self._link_id_map.items()},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
return state
|
return state
|
||||||
@@ -179,6 +181,7 @@ class Network(SimComponent):
|
|||||||
_LOGGER.warning(f"Can't add node {node.uuid}. It is already in the network.")
|
_LOGGER.warning(f"Can't add node {node.uuid}. It is already in the network.")
|
||||||
return
|
return
|
||||||
self.nodes[node.uuid] = node
|
self.nodes[node.uuid] = node
|
||||||
|
self._node_id_map[len(self.nodes)] = node
|
||||||
node.parent = self
|
node.parent = self
|
||||||
self._nx_graph.add_node(node.hostname)
|
self._nx_graph.add_node(node.hostname)
|
||||||
_LOGGER.info(f"Added node {node.uuid} to Network {self.uuid}")
|
_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.")
|
_LOGGER.warning(f"Can't remove node {node.uuid}. It's not in the network.")
|
||||||
return
|
return
|
||||||
self.nodes.pop(node.uuid)
|
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
|
node.parent = None
|
||||||
_LOGGER.info(f"Removed node {node.uuid} from network {self.uuid}")
|
_LOGGER.info(f"Removed node {node.uuid} from network {self.uuid}")
|
||||||
|
|
||||||
@@ -235,6 +242,7 @@ class Network(SimComponent):
|
|||||||
return
|
return
|
||||||
link = Link(endpoint_a=endpoint_a, endpoint_b=endpoint_b, **kwargs)
|
link = Link(endpoint_a=endpoint_a, endpoint_b=endpoint_b, **kwargs)
|
||||||
self.links[link.uuid] = link
|
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)
|
self._nx_graph.add_edge(endpoint_a.parent.hostname, endpoint_b.parent.hostname)
|
||||||
link.parent = self
|
link.parent = self
|
||||||
_LOGGER.info(f"Added link {link.uuid} to connect {endpoint_a} and {endpoint_b}")
|
_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_a.disconnect_link()
|
||||||
link.endpoint_b.disconnect_link()
|
link.endpoint_b.disconnect_link()
|
||||||
self.links.pop(link.uuid)
|
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
|
link.parent = None
|
||||||
_LOGGER.info(f"Removed link {link.uuid} from network {self.uuid}.")
|
_LOGGER.info(f"Removed link {link.uuid} from network {self.uuid}.")
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ class DatabaseClient(Application):
|
|||||||
return self.connected
|
return self.connected
|
||||||
else:
|
else:
|
||||||
self.sys_log.info(f"DatabaseClient connected to {server_ip_address} declined")
|
self.sys_log.info(f"DatabaseClient connected to {server_ip_address} declined")
|
||||||
|
return False
|
||||||
payload = {"type": "connect_request", "password": password}
|
payload = {"type": "connect_request", "password": password}
|
||||||
software_manager: SoftwareManager = self.software_manager
|
software_manager: SoftwareManager = self.software_manager
|
||||||
software_manager.send_payload_to_session_manager(
|
software_manager.send_payload_to_session_manager(
|
||||||
|
|||||||
@@ -21,6 +21,34 @@ def test_database_client_server_connection(uc2_network):
|
|||||||
assert len(db_service.connections) == 0
|
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):
|
def test_database_client_query(uc2_network):
|
||||||
"""Tests DB query across the network returns HTTP status 200 and date."""
|
"""Tests DB query across the network returns HTTP status 200 and date."""
|
||||||
web_server: Server = uc2_network.get_node_by_hostname("web_server")
|
web_server: Server = uc2_network.get_node_by_hostname("web_server")
|
||||||
|
|||||||
@@ -12,9 +12,9 @@ def test_creation():
|
|||||||
|
|
||||||
client_1: Node = network.get_node_by_hostname("client_1")
|
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.name == "DataManipulatorBot"
|
||||||
assert data_manipulator_service.port == Port.POSTGRES_SERVER
|
assert data_manipulator_service.port == Port.POSTGRES_SERVER
|
||||||
|
|||||||
@@ -5,55 +5,14 @@ import pytest
|
|||||||
from primaite.simulator.network.hardware.base import Node
|
from primaite.simulator.network.hardware.base import Node
|
||||||
from primaite.simulator.system.services.database_service import DatabaseService
|
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")
|
@pytest.fixture(scope="function")
|
||||||
def database_server() -> Node:
|
def database_server() -> Node:
|
||||||
node = Node(hostname="db_node")
|
node = Node(hostname="db_node")
|
||||||
node.software_manager.add_service(DatabaseService)
|
node.software_manager.install(DatabaseService)
|
||||||
node.software_manager.services["Database"].start()
|
node.software_manager.software["DatabaseService"].start()
|
||||||
return node
|
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):
|
def test_creation(database_server):
|
||||||
database_server.software_manager.show()
|
database_server.software_manager.show()
|
||||||
|
|
||||||
|
|
||||||
def test_db_population(database):
|
|
||||||
database.show()
|
|
||||||
assert database.tables() == ["user"]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user