diff --git a/force_bdss/cli/tests/fixtures/test_csv.json b/force_bdss/cli/tests/fixtures/test_csv.json index 80437d0abf8ad92fd7d5529f3ab36fd5c614094e..b58994dba80eabeecad2fc886de0b5a377de74b4 100644 --- a/force_bdss/cli/tests/fixtures/test_csv.json +++ b/force_bdss/cli/tests/fixtures/test_csv.json @@ -1,4 +1,5 @@ { + "version": "1", "multi_criteria_optimizer": { "id": "force.bdss.bundles.enthought.dakota", "model_data": { @@ -35,4 +36,3 @@ } ] } - 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..2c63c0851048d8f7bff41ecf0f8cee05f52fd120 --- /dev/null +++ b/force_bdss/cli/tests/fixtures/test_csv_corrupted.json @@ -0,0 +1,2 @@ +{ +} diff --git a/force_bdss/cli/tests/fixtures/test_csv_v2.json b/force_bdss/cli/tests/fixtures/test_csv_v2.json new file mode 100644 index 0000000000000000000000000000000000000000..a6963bba7644cf77ece55b383ec72204906d6d8b --- /dev/null +++ b/force_bdss/cli/tests/fixtures/test_csv_v2.json @@ -0,0 +1,3 @@ +{ + "version": "2" +} diff --git a/force_bdss/cli/tests/test_execution.py b/force_bdss/cli/tests/test_execution.py index 3e4d28d928a9847fa8daa58aec65a4576ab2cc2c..d511f79f6f2a4b0a806b12bc50e7c02c216c237d 100644 --- a/force_bdss/cli/tests/test_execution.py +++ b/force_bdss/cli/tests/test_execution.py @@ -6,7 +6,7 @@ from contextlib import contextmanager @contextmanager def cd(dir): - cwd = os.curdir + cwd = os.getcwd() os.chdir(dir) try: yield @@ -26,6 +26,17 @@ class TestExecution(unittest.TestCase): out = subprocess.check_call(["force_bdss", "test_csv.json"]) self.assertEqual(out, 0) + def test_unsupported_file_input(self): + with cd(fixture_dir()): + 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 6a1321e84587e9bc681dff92d529a3340ab728fb..f84c83dda83f6eeee1f7839608060d61551c952f 100644 --- a/force_bdss/core_mco_driver.py +++ b/force_bdss/core_mco_driver.py @@ -1,6 +1,12 @@ +from __future__ import print_function + +import sys + from traits.api import on_trait_change from force_bdss.base_core_driver import BaseCoreDriver +from force_bdss.workspecs.workflow import (InvalidVersionException, + InvalidFileException) class CoreMCODriver(BaseCoreDriver): @@ -10,7 +16,11 @@ class CoreMCODriver(BaseCoreDriver): @on_trait_change("application:started") def application_started(self): - workflow = self.application.workflow + try: + workflow = self.application.workflow + except (InvalidVersionException, InvalidFileException) as e: + print(str(e), file=sys.stderr) + 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 ffac3a42247f89e5e977ca0a9e2b03da3e7cd792..edc85c80f6f1770b08a15ce3dba17aa9080d61e7 100644 --- a/force_bdss/workspecs/workflow.py +++ b/force_bdss/workspecs/workflow.py @@ -4,6 +4,16 @@ from force_bdss.workspecs.data_source import DataSource from force_bdss.workspecs.kpi_calculator import KPICalculator from .multi_criteria_optimizer import MultiCriteriaOptimizer +SUPPORTED_FILE_VERSIONS = ["1"] + + +class InvalidFileException(Exception): + pass + + +class InvalidVersionException(InvalidFileException): + pass + class Workflow(HasStrictTraits): name = String() @@ -13,9 +23,19 @@ class Workflow(HasStrictTraits): @classmethod def from_json(cls, json_data): + try: + version = json_data["version"] + except KeyError: + raise InvalidFileException("Corrupted input file, no version" + " specified") + + if version not in SUPPORTED_FILE_VERSIONS: + raise InvalidVersionException( + "File version {} not supported".format(json_data["version"])) + self = cls( multi_criteria_optimizer=MultiCriteriaOptimizer.from_json( - json_data["multi_criteria_optimizer"] + json_data["multi_criteria_optimizer"] ), data_sources=[ DataSource.from_json(data_source_data)