diff --git a/force_bdss/cli/tests/fixtures/test_csv_corrupted.json b/force_bdss/cli/tests/fixtures/test_csv_corrupted.json new file mode 100644 index 0000000000000000000000000000000000000000..d09b6f7c33fb87bb450c755a9f9a07c3d3530b3d --- /dev/null +++ b/force_bdss/cli/tests/fixtures/test_csv_corrupted.json @@ -0,0 +1,37 @@ +{ + "multi_criteria_optimizer": { + "id": "force.bdss.bundles.enthought.dakota", + "model_data": { + "value_types": ["DUMMY"] + } + }, + "data_sources": [ + { + "id": "force.bdss.bundles.enthought.csv_extractor", + "model_data": { + "filename": "foo.csv", + "row": 3, + "column": 5, + "cuba_type": "PRESSURE" + } + }, + { + "id": "force.bdss.bundles.enthought.csv_extractor", + "model_data": { + "filename": "foo.csv", + "row": 3, + "column": 5, + "cuba_type": "PRESSURE" + } + } + ], + "kpi_calculators": [ + { + "id": "force.bdss.bundles.enthought.kpi_adder", + "model_data": { + "cuba_type_in": "PRESSURE", + "cuba_type_out": "TOTAL_PRESSURE" + } + } + ] +} diff --git a/force_bdss/cli/tests/test_execution.py b/force_bdss/cli/tests/test_execution.py index 9777a04786f4cf490e2662b4237dd63ca46e1cd0..d511f79f6f2a4b0a806b12bc50e7c02c216c237d 100644 --- a/force_bdss/cli/tests/test_execution.py +++ b/force_bdss/cli/tests/test_execution.py @@ -31,6 +31,12 @@ class TestExecution(unittest.TestCase): with self.assertRaises(subprocess.CalledProcessError): subprocess.check_call(["force_bdss", "test_csv_v2.json"]) + def test_corrupted_file_input(self): + with cd(fixture_dir()): + with self.assertRaises(subprocess.CalledProcessError): + subprocess.check_call(["force_bdss", + "test_csv_corrupted.json"]) + if __name__ == '__main__': unittest.main() diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py index 0b7621176c0a6138d3a65e896816a5b8ec3ff50d..3be63d98c928dc1afdfd234e66659976f9c2ea00 100644 --- a/force_bdss/core_mco_driver.py +++ b/force_bdss/core_mco_driver.py @@ -3,7 +3,8 @@ import sys from traits.api import on_trait_change from force_bdss.base_core_driver import BaseCoreDriver -from force_bdss.workspecs.workflow import InvalidVersionException +from force_bdss.workspecs.workflow import (InvalidVersionException, + CorruptedInputFile) class CoreMCODriver(BaseCoreDriver): @@ -18,6 +19,9 @@ class CoreMCODriver(BaseCoreDriver): except InvalidVersionException as e: print e.message sys.exit(1) + except CorruptedInputFile as e: + print e.message + sys.exit(1) mco_data = workflow.multi_criteria_optimizer mco_bundle = self.bundle_registry.mco_bundle_by_id(mco_data.id) diff --git a/force_bdss/workspecs/workflow.py b/force_bdss/workspecs/workflow.py index 66aa30f4ee353bc90d4b3150d0053085317aa87f..e49a81e9b3e6209ffac7d26871ca63b74164fc54 100644 --- a/force_bdss/workspecs/workflow.py +++ b/force_bdss/workspecs/workflow.py @@ -11,6 +11,10 @@ class InvalidVersionException(Exception): pass +class CorruptedInputFile(Exception): + pass + + class Workflow(HasStrictTraits): name = String() multi_criteria_optimizer = Instance(MultiCriteriaOptimizer) @@ -19,7 +23,13 @@ class Workflow(HasStrictTraits): @classmethod def from_json(cls, json_data): - if json_data["version"] not in SUPPORTED_FILE_VERSIONS: + try: + version = json_data["version"] + except KeyError: + raise CorruptedInputFile("Corrupted input file, no version" + " specified") + + if version not in SUPPORTED_FILE_VERSIONS: raise InvalidVersionException( "File version {} not supported".format(json_data["version"]))