2023-07-21 14:54:09 +01:00
|
|
|
# © Crown-owned copyright 2023, Defence Science and Technology Laboratory UK
|
2023-06-30 09:08:13 +01:00
|
|
|
import datetime
|
|
|
|
|
import shutil
|
2023-06-07 22:57:37 +01:00
|
|
|
import tempfile
|
|
|
|
|
from datetime import datetime
|
2023-05-25 14:05:53 +01:00
|
|
|
from pathlib import Path
|
2023-10-27 17:50:41 +01:00
|
|
|
from typing import Any, Dict, Union
|
2023-05-25 14:05:53 +01:00
|
|
|
|
2023-10-27 17:50:41 +01:00
|
|
|
import nodeenv
|
2023-06-30 09:08:13 +01:00
|
|
|
import pytest
|
2023-11-15 16:04:16 +00:00
|
|
|
import yaml
|
2023-06-30 09:08:13 +01:00
|
|
|
|
|
|
|
|
from primaite import getLogger
|
2023-11-15 16:04:16 +00:00
|
|
|
from primaite.game.session import PrimaiteSession
|
2023-10-25 13:56:02 +01:00
|
|
|
|
|
|
|
|
# from primaite.environment.primaite_env import Primaite
|
|
|
|
|
# from primaite.primaite_session import PrimaiteSession
|
2023-09-08 16:50:49 +01:00
|
|
|
from primaite.simulator.network.container import Network
|
|
|
|
|
from primaite.simulator.network.networks import arcd_uc2_network
|
2023-11-23 19:49:03 +00:00
|
|
|
from primaite.simulator.network.transmission.network_layer import IPProtocol
|
2023-10-20 12:58:58 +01:00
|
|
|
from primaite.simulator.network.transmission.transport_layer import Port
|
2023-10-27 17:50:41 +01:00
|
|
|
from primaite.simulator.system.applications.application import Application
|
2023-10-10 15:14:47 +01:00
|
|
|
from primaite.simulator.system.core.sys_log import SysLog
|
2023-10-20 12:58:58 +01:00
|
|
|
from primaite.simulator.system.services.service import Service
|
2023-11-16 15:11:03 +00:00
|
|
|
from tests.mock_and_patch.get_session_path_mock import temp_user_sessions_path
|
2023-05-25 14:05:53 +01:00
|
|
|
|
|
|
|
|
ACTION_SPACE_NODE_VALUES = 1
|
|
|
|
|
ACTION_SPACE_NODE_ACTION_VALUES = 1
|
|
|
|
|
|
2023-06-30 09:08:13 +01:00
|
|
|
_LOGGER = getLogger(__name__)
|
|
|
|
|
|
2023-11-16 15:11:03 +00:00
|
|
|
from primaite import PRIMAITE_PATHS
|
|
|
|
|
|
2023-09-06 22:01:51 +01:00
|
|
|
# PrimAITE v3 stuff
|
|
|
|
|
from primaite.simulator.file_system.file_system import FileSystem
|
|
|
|
|
from primaite.simulator.network.hardware.base import Node
|
2023-06-30 09:08:13 +01:00
|
|
|
|
2023-09-06 22:01:51 +01:00
|
|
|
|
2023-10-20 12:58:58 +01:00
|
|
|
class TestService(Service):
|
|
|
|
|
"""Test Service class"""
|
|
|
|
|
|
2023-11-23 19:49:03 +00:00
|
|
|
def __init__(self, **kwargs):
|
|
|
|
|
kwargs["name"] = "TestService"
|
|
|
|
|
kwargs["port"] = Port.HTTP
|
|
|
|
|
kwargs["protocol"] = IPProtocol.TCP
|
|
|
|
|
super().__init__(**kwargs)
|
|
|
|
|
|
2023-10-20 12:58:58 +01:00
|
|
|
def receive(self, payload: Any, session_id: str, **kwargs) -> bool:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
2023-10-27 17:50:41 +01:00
|
|
|
class TestApplication(Application):
|
|
|
|
|
"""Test Application class"""
|
|
|
|
|
|
2023-11-23 22:10:53 +00:00
|
|
|
def __init__(self, **kwargs):
|
|
|
|
|
kwargs["name"] = "TestApplication"
|
|
|
|
|
kwargs["port"] = Port.HTTP
|
|
|
|
|
kwargs["protocol"] = IPProtocol.TCP
|
|
|
|
|
super().__init__(**kwargs)
|
|
|
|
|
|
2023-10-27 17:50:41 +01:00
|
|
|
def describe_state(self) -> Dict:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
2023-09-08 16:50:49 +01:00
|
|
|
@pytest.fixture(scope="function")
|
|
|
|
|
def uc2_network() -> Network:
|
|
|
|
|
return arcd_uc2_network()
|
|
|
|
|
|
|
|
|
|
|
2023-10-20 12:58:58 +01:00
|
|
|
@pytest.fixture(scope="function")
|
|
|
|
|
def service(file_system) -> TestService:
|
|
|
|
|
return TestService(
|
|
|
|
|
name="TestService", port=Port.ARP, file_system=file_system, sys_log=SysLog(hostname="test_service")
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2023-10-27 17:50:41 +01:00
|
|
|
@pytest.fixture(scope="function")
|
|
|
|
|
def application(file_system) -> TestApplication:
|
|
|
|
|
return TestApplication(
|
|
|
|
|
name="TestApplication", port=Port.ARP, file_system=file_system, sys_log=SysLog(hostname="test_application")
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2023-09-06 22:01:51 +01:00
|
|
|
@pytest.fixture(scope="function")
|
|
|
|
|
def file_system() -> FileSystem:
|
|
|
|
|
return Node(hostname="fs_node").file_system
|
|
|
|
|
|
|
|
|
|
|
2023-09-06 22:26:23 +01:00
|
|
|
# PrimAITE v2 stuff
|
2023-11-15 16:04:16 +00:00
|
|
|
class TempPrimaiteSession(PrimaiteSession):
|
2023-06-30 09:08:13 +01:00
|
|
|
"""
|
|
|
|
|
A temporary PrimaiteSession class.
|
|
|
|
|
|
|
|
|
|
Uses context manager for deletion of files upon exit.
|
|
|
|
|
"""
|
|
|
|
|
|
2023-11-15 16:04:16 +00:00
|
|
|
@classmethod
|
|
|
|
|
def from_config(cls, config_path: Union[str, Path]) -> "TempPrimaiteSession":
|
|
|
|
|
"""Create a temporary PrimaiteSession object from a config file."""
|
|
|
|
|
config_path = Path(config_path)
|
|
|
|
|
with open(config_path, "r") as f:
|
|
|
|
|
config = yaml.safe_load(f)
|
2023-06-30 09:08:13 +01:00
|
|
|
|
2023-11-15 16:04:16 +00:00
|
|
|
return super().from_config(cfg=config)
|
2023-06-30 09:08:13 +01:00
|
|
|
|
2023-11-15 16:04:16 +00:00
|
|
|
def __enter__(self):
|
|
|
|
|
return self
|
2023-06-30 09:08:13 +01:00
|
|
|
|
2023-11-15 16:04:16 +00:00
|
|
|
def __exit__(self, type, value, tb):
|
|
|
|
|
pass
|
2023-06-30 09:08:13 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2023-11-16 15:11:03 +00:00
|
|
|
def temp_primaite_session(request, monkeypatch) -> TempPrimaiteSession:
|
2023-11-15 16:04:16 +00:00
|
|
|
"""Create a temporary PrimaiteSession object."""
|
2023-11-16 15:19:14 +00:00
|
|
|
monkeypatch.setattr(PRIMAITE_PATHS, "user_sessions_path", temp_user_sessions_path())
|
|
|
|
|
config_path = request.param[0]
|
|
|
|
|
return TempPrimaiteSession.from_config(config_path=config_path)
|