diff --git a/src/primaite/simulator/file_system/file_system.py b/src/primaite/simulator/file_system/file_system.py index cf4a4721..8240cba3 100644 --- a/src/primaite/simulator/file_system/file_system.py +++ b/src/primaite/simulator/file_system/file_system.py @@ -63,6 +63,37 @@ class FileSystem(SimComponent): request_type=RequestType(func=self._delete_manager), ) + self._create_manager = RequestManager() + self._create_manager.add_request( + name="file", + request_type=RequestType( + func=lambda request, context: RequestResponse.from_bool( + bool(self.create_file(folder_name=request[0], file_name=request[1])) + ) + ), + ) + self._create_manager.add_request( + name="folder", + request_type=RequestType( + func=lambda request, context: RequestResponse.from_bool( + bool(self.create_folder(folder_name=request[0])) + ) + ), + ) + rm.add_request( + name="create", + request_type=RequestType(func=self._create_manager), + ) + + rm.add_request( + name="access", + request_type=RequestType( + func=lambda request, context: RequestResponse.from_bool( + self.access_file(folder_name=request[0], file_name=request[1]) + ) + ), + ) + self._restore_manager = RequestManager() self._restore_manager.add_request( name="file", @@ -494,3 +525,28 @@ class FileSystem(SimComponent): return False return folder.restore_file(file_name=file_name) + + def access_file(self, folder_name: str, file_name: str) -> bool: + """ + Access a file. + + Used by agents to simulate a file being accessed. + + :param: folder_name: name of the folder where the file is stored + :type: folder_name: str + + :param: file_name: name of the file to access + :type: file_name: str + """ + folder = self.get_folder(folder_name=folder_name) + + if folder: + file = folder.get_file(file_name=file_name) + + if file: + file.num_access += 1 + return True + else: + self.sys_log.error(f"Unable to access file that does not exist. (file name: {file_name})") + + return False diff --git a/src/primaite/simulator/file_system/folder.py b/src/primaite/simulator/file_system/folder.py index 6107c655..90ad4425 100644 --- a/src/primaite/simulator/file_system/folder.py +++ b/src/primaite/simulator/file_system/folder.py @@ -61,12 +61,6 @@ class Folder(FileSystemItemABC): func=lambda request, context: RequestResponse.from_bool(self.remove_file_by_name(file_name=request[0])) ), ) - rm.add_request( - name="create", - request_type=RequestType( - func=lambda request, context: RequestResponse.from_bool(self.create_file(file_name=request[0])) - ), - ) self._file_request_manager = RequestManager() rm.add_request( name="file", diff --git a/tests/integration_tests/test_simulation/test_request_response.py b/tests/integration_tests/test_simulation/test_request_response.py index b74be0c7..a18f0336 100644 --- a/tests/integration_tests/test_simulation/test_request_response.py +++ b/tests/integration_tests/test_simulation/test_request_response.py @@ -15,6 +15,31 @@ from primaite.simulator.network.transmission.transport_layer import Port from tests.conftest import TestApplication, TestService +def test_successful_node_file_system_creation_request(example_network): + """Tests that the file system requests.""" + client_1 = example_network.get_node_by_hostname("client_1") + assert client_1.file_system.get_file(folder_name="root", file_name="test.txt") is None + + response = example_network.apply_request(["node", "client_1", "file_system", "create", "file", "", "test.txt"]) + + assert response + assert client_1.file_system.get_file(folder_name="root", file_name="test.txt") + + assert client_1.file_system.get_folder(folder_name="test_folder") is None + + response = example_network.apply_request(["node", "client_1", "file_system", "create", "folder", "test_folder"]) + + assert response + assert client_1.file_system.get_folder(folder_name="test_folder") + + assert client_1.file_system.get_file(folder_name="root", file_name="test.txt").num_access == 0 + + response = example_network.apply_request(["node", "client_1", "file_system", "access", "root", "test.txt"]) + + assert response + assert client_1.file_system.get_file(folder_name="root", file_name="test.txt").num_access == 1 + + def test_successful_application_requests(example_network): net = example_network