diff --git a/onair/src/run_scripts/execution_engine.py b/onair/src/run_scripts/execution_engine.py index bccfca2a..9bffe893 100644 --- a/onair/src/run_scripts/execution_engine.py +++ b/onair/src/run_scripts/execution_engine.py @@ -23,17 +23,17 @@ class ExecutionEngine: def __init__(self, config_file='', run_name='', save_flag=False): - - # Init Housekeeping + + # Init Housekeeping self.run_name = run_name self.config_filepath = config_file - # Init Flags + # Init Flags self.IO_Flag = False self.Dev_Flag = False self.Viz_Flag = False - - # Init Paths + + # Init Paths self.dataFilePath = '' self.telemetryFile = '' self.fullTelemetryFileName = '' @@ -46,7 +46,7 @@ def __init__(self, config_file='', run_name='', save_flag=False): # Init parsing/sim info self.parser_file_name = '' - self.simDataParser = None + self.simDataSource = None self.sim = None # Init plugins @@ -69,7 +69,7 @@ def parse_configs(self, config_filepath): if len(config.read(config_filepath)) == 0: raise FileNotFoundError(f"Config file at '{config_filepath}' could not be read.") - + try: ## Parse Required Data: Telementry Data & Configuration self.dataFilePath = config['DEFAULT']['TelemetryDataFilePath'] @@ -97,7 +97,7 @@ def parse_configs(self, config_filepath): except KeyError as e: new_message = f"Config file: '{config_filepath}', missing key: {e.args[0]}" raise KeyError(new_message) from e - + ## Parse Optional Data: Benchmarks try: self.benchmarkFilePath = config['DEFAULT']['BenchmarkFilePath'] @@ -106,7 +106,7 @@ def parse_configs(self, config_filepath): except: pass - def parse_plugins_dict(self, config_plugin_dict): + def parse_plugins_dict(self, config_plugin_dict): ## Parse Required Data: Plugin name to path dict ast_plugin_dict = self.ast_parse_eval(config_plugin_dict) if isinstance(ast_plugin_dict.body, ast.Dict): @@ -123,11 +123,11 @@ def parse_data(self, parser_file_name, data_file_name, metadata_file_name, subsy data_source_spec = importlib.util.spec_from_file_location('data_source', parser_file_name) data_source_module = importlib.util.module_from_spec(data_source_spec) data_source_spec.loader.exec_module(data_source_module) - self.simDataParser = data_source_module.DataSource(data_file_name, metadata_file_name, subsystems_breakdown) + self.simDataSource = data_source_module.DataSource(data_file_name, metadata_file_name, subsystems_breakdown) def setup_sim(self): - self.sim = Simulator(self.simDataParser, - self.knowledge_rep_plugin_dict, + self.sim = Simulator(self.simDataSource, + self.knowledge_rep_plugin_dict, self.learners_plugin_dict, self.planners_plugin_dict, self.complex_plugin_dict) @@ -154,7 +154,7 @@ def init_save_paths(self): os.mkdir(temp_save_path) os.mkdir(temp_models_path) os.mkdir(temp_diagnosis_path) - + os.environ['ONAIR_SAVE_PATH'] = save_path os.environ['ONAIR_TMP_SAVE_PATH'] = temp_save_path os.environ['ONAIR_MODELS_SAVE_PATH'] = temp_models_path @@ -163,7 +163,7 @@ def init_save_paths(self): def delete_save_paths(self): save_path = os.environ['RESULTS_PATH'] sub_dirs = os.listdir(save_path) - if 'tmp' in sub_dirs: + if 'tmp' in sub_dirs: try: shutil.rmtree(save_path + '/tmp') except OSError as e: diff --git a/onair/src/run_scripts/sim.py b/onair/src/run_scripts/sim.py index 5cb01a43..e7c79058 100644 --- a/onair/src/run_scripts/sim.py +++ b/onair/src/run_scripts/sim.py @@ -23,9 +23,9 @@ DIAGNOSIS_INTERVAL = 100 class Simulator: - def __init__(self, dataParser, knowledge_rep_plugin_dict, learners_plugin_dict, planners_plugin_dict, complex_plugin_dict): - self.simData = dataParser - headers, tests = dataParser.get_vehicle_metadata() + def __init__(self, dataSource, knowledge_rep_plugin_dict, learners_plugin_dict, planners_plugin_dict, complex_plugin_dict): + self.simData = dataSource + headers, tests = dataSource.get_vehicle_metadata() vehicle = VehicleRepresentation(headers, tests, knowledge_rep_plugin_dict) self.agent = Agent(vehicle, learners_plugin_dict, planners_plugin_dict, complex_plugin_dict) @@ -41,8 +41,8 @@ def run_sim(self, IO_Flag=False, dev_flag=False, viz_flag = True): next = self.simData.get_next() self.agent.reason(next) self.IO_check(time_step, IO_Flag) - - ### Stop when a fault is reached + + ### Stop when a fault is reached if self.agent.mission_status == 'RED': if last_fault == time_step - 1: #if they are consecutive if (time_step - last_diagnosis) % DIAGNOSIS_INTERVAL == 0: @@ -53,7 +53,7 @@ def run_sim(self, IO_Flag=False, dev_flag=False, viz_flag = True): last_diagnosis = time_step last_fault = time_step time_step += 1 - + # Final diagnosis processing if len(diagnosis_list) == 0: diagnosis_list.append(self.agent.diagnose(time_step)) diff --git a/test/onair/src/run_scripts/test_execution_engine.py b/test/onair/src/run_scripts/test_execution_engine.py index 1aa2335d..3436149c 100644 --- a/test/onair/src/run_scripts/test_execution_engine.py +++ b/test/onair/src/run_scripts/test_execution_engine.py @@ -46,7 +46,7 @@ def test_ExecutionEngine__init__sets_expected_values_but_does_no_calls_when_conf assert cut.benchmarkFiles == '' assert cut.benchmarkIndices == '' assert cut.parser_file_name == '' - assert cut.simDataParser == None + assert cut.simDataSource == None assert cut.sim == None assert cut.save_flag == arg_save_flag assert cut.save_name == arg_run_name @@ -110,7 +110,7 @@ def test_ExecutionEngine_parse_configs_raises_FileNotFoundError_when_config_cann mocker.patch(execution_engine.__name__ + '.configparser.ConfigParser', return_value=fake_config) mocker.patch.object(fake_config, 'read', return_value=fake_config_read_result) - + # Act with pytest.raises(FileNotFoundError) as e_info: cut.parse_configs(arg_bad_config_filepath) @@ -253,7 +253,7 @@ def test_ExecutionEngine_parse_configs_sets_all_items_without_error(mocker): fake_keys.__len__.return_value = 1 fake_keys.__iter__.return_value = iter([str(fake_plugin)]) - + cut = ExecutionEngine.__new__(ExecutionEngine) mocker.patch(execution_engine.__name__ + '.configparser.ConfigParser', return_value=fake_config) @@ -331,7 +331,7 @@ def test_ExecutionEngine_parse_configs_bypasses_benchmarks_when_access_raises_er fake_keys.__len__.return_value = 1 fake_keys.__iter__.return_value = iter([str(fake_plugin)]) - + cut = ExecutionEngine.__new__(ExecutionEngine) mocker.patch(execution_engine.__name__ + '.configparser.ConfigParser', return_value=fake_config) @@ -400,7 +400,7 @@ def test_ExecutionEngine_parse_plugins_list_raises_FileNotFoundError_when_single mocker.patch(execution_engine.__name__ + '.ast.literal_eval', return_value=fake_temp_plugin_dict) mocker.patch.object(fake_temp_plugin_dict, 'values', return_value=fake_values) mocker.patch(execution_engine.__name__ + '.os.path.exists', return_value=False) - + # Act with pytest.raises(FileNotFoundError) as e_info: cut.parse_plugins_dict(arg_config_plugin_dict) @@ -444,7 +444,7 @@ def test_ExecutionEngine_parse_plugins_list_raises_FileNotFoundError_when_any_co mocker.patch(execution_engine.__name__ + '.ast.literal_eval', return_value=fake_temp_plugin_dict) mocker.patch.object(fake_temp_plugin_dict, 'values', return_value=fake_values) mocker.patch(execution_engine.__name__ + '.os.path.exists', side_effect=exists_side_effects) - + # Act with pytest.raises(FileNotFoundError) as e_info: cut.parse_plugins_dict(arg_config_plugin_dict) @@ -478,7 +478,7 @@ def test_ExecutionEngine_returns_empty_dict_when_config_dict_is_empty(mocker): mocker.patch.object(cut, 'ast_parse_eval', return_value=fake_plugin_dict) mocker.patch(execution_engine.__name__ + '.isinstance', return_value=True) mocker.patch(execution_engine.__name__ + '.ast.literal_eval', return_value=fake_temp_plugin_dict) - + # Act result = cut.parse_plugins_dict(arg_config_plugin_dict) @@ -514,7 +514,7 @@ def test_ExecutionEngine_returns_expected_dict_when_all_mapped_files_exist(mocke mocker.patch(execution_engine.__name__ + '.ast.literal_eval', return_value=fake_temp_plugin_dict) mocker.patch.object(fake_temp_plugin_dict, 'values', return_value=fake_values) mocker.patch(execution_engine.__name__ + '.os.path.exists', side_effect=exists_side_effects) - + # Act result = cut.parse_plugins_dict(arg_config_plugin_dict) @@ -533,7 +533,7 @@ def test_ExecutionEngine_returns_expected_dict_when_all_mapped_files_exist(mocke assert execution_engine.os.path.exists.call_args_list[i].args == (fake_path, ) # parse_data tests -def test_ExecutionEngine_parse_data_sets_the_simDataParser_to_the_data_parser(mocker): +def test_ExecutionEngine_parse_data_sets_the_simDataSource_to_the_data_parser(mocker): # Arrange arg_parser_file_name = MagicMock() arg_dataFile = str(MagicMock()) @@ -562,7 +562,7 @@ def test_ExecutionEngine_parse_data_sets_the_simDataParser_to_the_data_parser(mo assert fake_spec.loader.exec_module.call_count == 1 assert fake_module.DataSource.call_count == 1 assert fake_module.DataSource.call_args_list[0].args == (arg_dataFile, arg_metadataFile, arg_subsystems_breakdown, ) - assert cut.simDataParser == fake_parser_class_instance + assert cut.simDataSource == fake_parser_class_instance def test_ExecutionEngine_parse_data_argument_subsystems_breakdown_optional_default_is_False(mocker): # Arrange @@ -602,7 +602,7 @@ def __init__(self, data_file, meta_file, subsystems_breakdown): def test_ExecutionEngine_setup_sim_sets_self_sim_to_new_Simulator_and_sets_benchmark_data_when_no_exceptions_are_encountered(mocker): # Arrange cut = ExecutionEngine() - cut.simDataParser = MagicMock() + cut.simDataSource = MagicMock() cut.knowledge_rep_plugin_dict = MagicMock() cut.learners_plugin_dict = MagicMock() cut.planners_plugin_dict = MagicMock() @@ -630,9 +630,9 @@ def test_ExecutionEngine_setup_sim_sets_self_sim_to_new_Simulator_and_sets_bench # Assert assert execution_engine.Simulator.call_count == 1 - assert execution_engine.Simulator.call_args_list[0].args == (cut.simDataParser, - cut.knowledge_rep_plugin_dict, - cut.learners_plugin_dict, + assert execution_engine.Simulator.call_args_list[0].args == (cut.simDataSource, + cut.knowledge_rep_plugin_dict, + cut.learners_plugin_dict, cut.planners_plugin_dict, cut.complex_plugin_dict) assert cut.sim == fake_sim @@ -649,7 +649,7 @@ def test_ExecutionEngine_setup_sim_sets_self_sim_to_new_Simulator_and_sets_bench def test_ExecutionEngine_setup_sim_sets_self_sim_to_new_Simulator_but_does_not_set_bencmark_data_because_exception_is_encountered(mocker): # Arrange cut = ExecutionEngine.__new__(ExecutionEngine) - cut.simDataParser = MagicMock() + cut.simDataSource = MagicMock() cut.knowledge_rep_plugin_dict = MagicMock() cut.learners_plugin_dict = MagicMock() cut.planners_plugin_dict = MagicMock() @@ -672,9 +672,9 @@ def test_ExecutionEngine_setup_sim_sets_self_sim_to_new_Simulator_but_does_not_s # Assert assert execution_engine.Simulator.call_count == 1 - assert execution_engine.Simulator.call_args_list[0].args == (cut.simDataParser, - cut.knowledge_rep_plugin_dict, - cut.learners_plugin_dict, + assert execution_engine.Simulator.call_args_list[0].args == (cut.simDataSource, + cut.knowledge_rep_plugin_dict, + cut.learners_plugin_dict, cut.planners_plugin_dict, cut.complex_plugin_dict) assert cut.sim == fake_sim @@ -738,11 +738,11 @@ def test_ExecutionEngine_init_save_paths_makes_tmp_and_models_and_diagnosis_dire cut = ExecutionEngine.__new__(ExecutionEngine) mocker.patch.dict(execution_engine.__name__ + '.os.environ', fake_environ) - mocker.patch(execution_engine.__name__ + '.os.path.join', + mocker.patch(execution_engine.__name__ + '.os.path.join', side_effect=[fake_tmp_save_path, fake_tmp_models_path, fake_tmp_diagnosis_path]) mocker.patch.object(cut, 'delete_save_paths') mocker.patch(execution_engine.__name__ + '.os.mkdir') - + # Act cut.init_save_paths() @@ -794,7 +794,7 @@ def test_ExecutionEngine_delete_save_paths_removes_tmp_tree_when_it_exists(mocke fake_dirs.append('tmp') for i in range(pytest.gen.randint(0, 5)): # 0 to 5 fake_dirs.append(str(MagicMock())) - + cut = ExecutionEngine.__new__(ExecutionEngine) mocker.patch.dict(execution_engine.__name__ + '.os.environ', fake_environ) @@ -824,7 +824,7 @@ def test_ExecutionEngine_delete_save_paths_prints_error_message_when_rmtree_rais fake_dirs.append('tmp') for i in range(pytest.gen.randint(0, 5)): # 0 to 5 fake_dirs.append(str(MagicMock())) - + cut = ExecutionEngine.__new__(ExecutionEngine) mocker.patch.dict(execution_engine.__name__ + '.os.environ', fake_environ) @@ -854,7 +854,7 @@ def test_ExecutionEngine_save_results_creates_expected_save_path_and_copies_prop fake_onair_tmp_save_path = str(MagicMock()) fake_environ = {'ONAIR_SAVE_PATH':fake_onair_save_path, 'ONAIR_TMP_SAVE_PATH':fake_onair_tmp_save_path} fake_save_path = fake_onair_save_path + '/saved/' + arg_save_name + '_' + fake_complete_time - + cut = ExecutionEngine.__new__(ExecutionEngine) mocker.patch(execution_engine.__name__ + '.gmtime', return_value=fake_gmtime) @@ -875,7 +875,7 @@ def test_ExecutionEngine_save_results_creates_expected_save_path_and_copies_prop assert execution_engine.os.mkdir.call_args_list[0].args == (fake_save_path, ) assert execution_engine.copy_tree.call_count == 1 assert execution_engine.copy_tree.call_args_list[0].args == (fake_onair_tmp_save_path, fake_save_path, ) - + # set_run_param tests def test_ExecutionEngine_set_run_param_passes_given_arguments_to_setattr(mocker): # Arrange diff --git a/test/onair/src/run_scripts/test_sim.py b/test/onair/src/run_scripts/test_sim.py index bcd62bf3..21d71a6f 100644 --- a/test/onair/src/run_scripts/test_sim.py +++ b/test/onair/src/run_scripts/test_sim.py @@ -7,7 +7,7 @@ # Licensed under the NASA Open Source Agreement version 1.3 # See "NOSA GSC-19165-1 OnAIR.pdf" -""" Test Simulator Functionality """ +""" Test Simulator Functionality """ import pytest from mock import MagicMock @@ -23,7 +23,7 @@ def test_Simulator_DIAGNOSIS_INTERVAL_is_expected_value(): # __init__ tests def test_Simulator__init__creates_Vehicle_and_Agent(mocker): # Arrange - arg_dataParser = MagicMock() + arg_dataSource = MagicMock() arg_knowledge_rep_plugin_list = MagicMock() arg_learners_plugin_list = MagicMock() arg_planners_plugin_list = MagicMock() @@ -37,19 +37,19 @@ def test_Simulator__init__creates_Vehicle_and_Agent(mocker): cut = Simulator.__new__(Simulator) - mocker.patch.object(arg_dataParser, 'get_vehicle_metadata', return_value=fake_vehicle_metadata) + mocker.patch.object(arg_dataSource, 'get_vehicle_metadata', return_value=fake_vehicle_metadata) mocker.patch(sim.__name__ + '.VehicleRepresentation', return_value=fake_vehicle) mocker.patch(sim.__name__ + '.Agent', return_value=fake_agent) # Act - cut.__init__(arg_dataParser, - arg_knowledge_rep_plugin_list, - arg_learners_plugin_list, - arg_planners_plugin_list, + cut.__init__(arg_dataSource, + arg_knowledge_rep_plugin_list, + arg_learners_plugin_list, + arg_planners_plugin_list, arg_complex_plugin_list) # Assert - assert cut.simData == arg_dataParser + assert cut.simData == arg_dataSource assert sim.VehicleRepresentation.call_count == 1 assert sim.VehicleRepresentation.call_args_list[0].args == (fake_headers, fake_tests, arg_knowledge_rep_plugin_list) assert sim.Agent.call_count == 1 @@ -222,7 +222,7 @@ def test_Simulator_run_sim_diagnose_is_not_performed_again_when_faults_are_conse result = cut.run_sim(fake_IO_Flag) # Assert - assert cut.simData.get_next.call_count == num_fake_steps + assert cut.simData.get_next.call_count == num_fake_steps for i in range(num_fake_steps): assert cut.simData.get_next.call_args_list[i].args == () assert cut.agent.reason.call_count == num_fake_steps