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;
+
+
+
+
+
+
+
+
+
+
+
+
+
+