diff --git a/lib/galaxy/tools/parameters/validation.py b/lib/galaxy/tools/parameters/validation.py index 6451d3d44ba..080013a94d8 100644 --- a/lib/galaxy/tools/parameters/validation.py +++ b/lib/galaxy/tools/parameters/validation.py @@ -229,6 +229,23 @@ class DatasetOkValidator( Validator ): raise ValueError( self.message ) +class DatasetEmptyValidator( Validator ): + """Validator that checks if a dataset has a positive file size.""" + def __init__( self, message=None ): + self.message = message + + @classmethod + def from_element( cls, param, elem ): + return cls( elem.get( 'message', None ) ) + + def validate( self, value, trans=None ): + if value: + if value.get_size() == 0: + if self.message is None: + self.message = "The selected dataset is empty, this tool expects non-empty files." + raise ValueError( self.message ) + + class MetadataValidator( Validator ): """ Validator that checks for missing metadata @@ -416,9 +433,10 @@ validator_types = dict( expression=ExpressionValidator, unspecified_build=UnspecifiedBuildValidator, no_options=NoOptionsValidator, empty_field=EmptyTextfieldValidator, + empty_dataset=DatasetEmptyValidator, dataset_metadata_in_file=MetadataInFileColumnValidator, dataset_metadata_in_data_table=MetadataInDataTableColumnValidator, - dataset_ok_validator=DatasetOkValidator ) + dataset_ok_validator=DatasetOkValidator, ) def get_suite(): diff --git a/test/api/test_tools.py b/test/api/test_tools.py index 1109a36da3b..ec79d07f971 100644 --- a/test/api/test_tools.py +++ b/test/api/test_tools.py @@ -237,6 +237,20 @@ class ToolsTestCase( api.ApiTestCase ): response = self._run( "validation_default", history_id, inputs ) self._assert_status_code_is( response, 400 ) + @skip_without_tool( "validation_empty_dataset" ) + def test_validation_empty_dataset( self ): + history_id = self.dataset_populator.new_history() + inputs = { + } + outputs = self._run_and_get_outputs( 'empty_output', history_id, inputs ) + empty_dataset = outputs[0] + inputs = { + 'input1': dataset_to_param(empty_dataset), + } + self.dataset_populator.wait_for_history( history_id, assert_ok=True ) + response = self._run( "validation_empty_dataset", history_id, inputs ) + self._assert_status_code_is( response, 400 ) + @skip_without_tool( "validation_repeat" ) def test_validation_in_repeat( self ): history_id = self.dataset_populator.new_history() diff --git a/test/functional/tools/empty_output.xml b/test/functional/tools/empty_output.xml new file mode 100644 index 00000000000..71caf2b14ba --- /dev/null +++ b/test/functional/tools/empty_output.xml @@ -0,0 +1,12 @@ + + + touch $out_file1; + + + + + + + + + diff --git a/test/functional/tools/samples_tool_conf.xml b/test/functional/tools/samples_tool_conf.xml index 8aa278536de..5ef9bfa6e12 100644 --- a/test/functional/tools/samples_tool_conf.xml +++ b/test/functional/tools/samples_tool_conf.xml @@ -55,6 +55,8 @@ + + diff --git a/test/functional/tools/validation_empty_dataset.xml b/test/functional/tools/validation_empty_dataset.xml new file mode 100644 index 00000000000..589121bb1dc --- /dev/null +++ b/test/functional/tools/validation_empty_dataset.xml @@ -0,0 +1,17 @@ + + + echo "Hello World" > out1; + + + + + + + + + + + + + +