/* * Copyright (C) 2011 SeqWare * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.sourceforge.seqware.common.metadata; import com.google.common.collect.Lists; import io.seqware.common.model.ProcessingStatus; import io.seqware.common.model.WorkflowRunStatus; import io.seqware.pipeline.SqwKeys; import java.net.URISyntaxException; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.SortedSet; import net.sourceforge.seqware.common.err.NotFoundException; import net.sourceforge.seqware.common.factory.DBAccess; import net.sourceforge.seqware.common.model.Experiment; import net.sourceforge.seqware.common.model.File; import net.sourceforge.seqware.common.model.FileAttribute; import net.sourceforge.seqware.common.model.IUS; import net.sourceforge.seqware.common.model.Lane; import net.sourceforge.seqware.common.model.Sample; import net.sourceforge.seqware.common.model.SequencerRun; import net.sourceforge.seqware.common.model.Workflow; import net.sourceforge.seqware.common.model.WorkflowParam; import net.sourceforge.seqware.common.model.WorkflowRun; import net.sourceforge.seqware.common.module.FileMetadata; import net.sourceforge.seqware.common.module.ReturnValue; import net.sourceforge.seqware.common.util.Log; import net.sourceforge.seqware.common.util.configtools.ConfigTools; import net.sourceforge.seqware.common.util.testtools.BasicTestDatabaseCreator; import net.sourceforge.seqware.webservice.resources.tables.FileChildWorkflowRunsResource; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.log4j.Logger; import org.junit.After; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * * @author mtaschuk */ public class MetadataWSTest { protected static Metadata instance; public static Metadata newTestMetadataInstance() { // if an alternative database is set, then we need to redirect to look at the defined REST URL Map<String, String> settings = ConfigTools.getSettings(); if (useEmbeddedWebService(settings)) { return new MetadataWS("http://localhost:8889/seqware-webservice", "admin@admin.com", "admin"); } else { return MetadataFactory.get(settings); } } public static boolean useEmbeddedWebService(Map<String, String> settings) { return !settings.containsKey(SqwKeys.BASIC_TEST_DB_HOST.getSettingKey()); } private final Logger logger; public MetadataWSTest() { logger = Logger.getLogger(MetadataWSTest.class); } @BeforeClass public static void setUpClass() throws Exception { instance = newTestMetadataInstance(); BasicTestDatabaseCreator.resetDatabaseWithUsers(); } @AfterClass public static void tearDownClass() throws Exception { instance.clean_up(); } @Before public void setUp() { } @After public void tearDown() { } /** * Test of addWorkflow method, of class MetadataWS. dyuen asks: Why was this commented out? */ @Test public void testAddWorkflow() { logger.info("addWorkflow"); String name = "GATKRecalibrationAndVariantCalling"; String version = "1.3.16"; String description = "GATKRecalibrationAndVariantCalling"; String baseCommand = "java -jar /u/seqware/provisioned-bundles/sqwprod/" + "Workflow_Bundle_GATKRecalibrationAndVariantCalling_1.2.29_" + "SeqWare_0.10.0/GATKRecalibrationAndVariantCalling/1.x.x/lib/" + "seqware-pipeline-0.10.0.jar --plugin net.sourceforge.seqware." + "pipeline.plugins.WorkflowLauncher -- --bundle /u/seqware/" + "provisioned-bundles/sqwprod/Workflow_Bundle_GATKRecalibration" + "AndVariantCalling_1.2.29_SeqWare_0.10.0 --workflow GATK" + "RecalibrationAndVariantCalling --version 1.3.16"; java.io.File configFile = null, templateFile = null; try { configFile = new java.io.File(MetadataWSTest.class.getResource("GATKRecalibrationAndVariantCalling_1.3.16.ini").toURI()); templateFile = new java.io.File(MetadataWSTest.class.getResource("GATKRecalibrationAndVariantCalling_1.3.16.ftl").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } java.io.File provisionDir = new java.io.File("/u/seqware/provisioned-bundles" + "/sqwprod/Workflow_Bundle_GATKRecalibrationAndVariantCalling_" + "1.2.29_SeqWare_0.10.0/"); int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.addWorkflow(name, version, description, baseCommand, configFile.getAbsolutePath(), templateFile.getAbsolutePath(), provisionDir.getAbsolutePath(), true, "", false, null, null, null, null); Assert.assertEquals(expResult, result.getExitStatus()); // test certain properties of the workflow parameters in relation to SEQWARE-1444 String workflow_id = result.getAttribute("sw_accession"); Workflow workflow = instance.getWorkflow(Integer.valueOf(workflow_id)); Assert.assertTrue("workflow retrieved is invalid", workflow.getWorkflowId() == result.getReturnValue()); SortedSet<WorkflowParam> workflowParams = instance.getWorkflowParams(workflow_id); Assert.assertTrue("invalid number of workflow params retrieved", workflowParams.size() == 33); // check out the values of some long values for (WorkflowParam param : workflowParams) { switch (param.getKey()) { case "bam_inputs": Assert.assertTrue( "bam_inputs invalid", param.getDefaultValue() .equals("${workflow_bundle_dir}/GATKRecalibrationAndVariantCalling/1.x.x/data/test/PCSI0022P.val.bam,${workflow_bundle_dir}/GATKRecalibrationAndVariantCalling/1.x.x/data/test/PCSI0022R.val.bam,${workflow_bundle_dir}/GATKRecalibrationAndVariantCalling/1.x.x/data/test/PCSI0022X.val.bam,${workflow_bundle_dir}/GATKRecalibrationAndVariantCalling/1.x.x/data/test/PCSI0022C.val.bam")); break; case "chr_sizes": Assert.assertTrue( "chr_sizes invalid", param.getDefaultValue() .equals("chr1:249250621,chr2:243199373,chr3:198022430,chr4:191154276,chr5:180915260,chr6:171115067,chr7:159138663,chr8:146364022,chr9:141213431,chr10:135534747,chr11:135006516,chr12:133851895,chr13:115169878,chr14:107349540,chr15:102531392,chr16:90354753,chr17:81195210,chr18:78077248,chr19:59128983,chr20:63025520,chr21:48129895,chr22:51304566,chrX:155270560,chrY:59373566,chrM:16571")); break; } } } /** * Test of addWorkflow method, of class MetadataWS with a novoalign.ini. */ @Test public void testAddNovoAlignWorkflow() { logger.info("addWorkflow"); String name = "novoalign"; String version = "0.13.6.2"; String description = "Novoalign"; String baseCommand = "java -jar /u/seqware/provisioned-bundles/sqwprod/" + "Workflow_Bundle_GATKRecalibrationAndVariantCalling_1.2.29_" + "SeqWare_0.10.0/GATKRecalibrationAndVariantCalling/1.x.x/lib/" + "seqware-pipeline-0.10.0.jar --plugin net.sourceforge.seqware." + "pipeline.plugins.WorkflowLauncher -- --bundle /u/seqware/" + "provisioned-bundles/sqwprod/Workflow_Bundle_GATKRecalibration" + "AndVariantCalling_1.2.29_SeqWare_0.10.0 --workflow GATK" + "RecalibrationAndVariantCalling --version 1.3.16"; java.io.File configFile = null, templateFile = null; try { configFile = new java.io.File(MetadataWSTest.class.getResource("novoalign.ini").toURI()); templateFile = new java.io.File(MetadataWSTest.class.getResource("GATKRecalibrationAndVariantCalling_1.3.16.ftl").toURI()); } catch (URISyntaxException e) { e.printStackTrace(); } java.io.File provisionDir = new java.io.File("/u/seqware/provisioned-bundles" + "/sqwprod/Workflow_Bundle_GATKRecalibrationAndVariantCalling_" + "1.2.29_SeqWare_0.10.0/"); int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.addWorkflow(name, version, description, baseCommand, configFile.getAbsolutePath(), templateFile.getAbsolutePath(), provisionDir.getAbsolutePath(), true, "", false, null, null, null, null); Assert.assertEquals(expResult, result.getExitStatus()); // test certain properties of the workflow parameters in relation to SEQWARE-1444 String workflow_id = result.getAttribute("sw_accession"); Workflow workflow = instance.getWorkflow(Integer.valueOf(workflow_id)); Assert.assertTrue("workflow retrieved is invalid", workflow.getWorkflowId() == result.getReturnValue()); SortedSet<WorkflowParam> workflowParams = instance.getWorkflowParams(workflow_id); Assert.assertTrue("invalid number of workflow params retrieved", workflowParams.size() == 34); // check out the values of some suspicious values for (WorkflowParam param : workflowParams) { switch (param.getKey()) { case "colorspace": Assert.assertTrue("colorspace invalid", param.getDefaultValue().equals("0")); break; case "novoalign_r1_adapter_trim": Assert.assertTrue("novoalign_r1_adapter_trim invalid", param.getDefaultValue().equals("-a AGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACCG")); break; } } } /** * Test of add_empty_processing_event method, of class MetadataWS. */ @Test public void testAdd_empty_processing_event() { Date beforeDate = new Timestamp(System.currentTimeMillis()); logger.info("add_empty_processing_event"); int[] parentIDs = { 3, 5 }; ReturnValue result = instance.add_empty_processing_event(parentIDs); Assert.assertEquals("Adding empty processing event was unsuccessful: ", 0, result.getExitStatus()); testTimestamp("select max(create_tstmp) from processing " + "where processing_id in " + "(select distinct child_id from processing_relationship " + "where parent_id IN (3,5))", "max", beforeDate); } protected void testTimestamp(String sql, final String colname, Date beforeDate) { logger.debug(sql); try { Date date = DBAccess.get().executeQuery(sql, new ResultSetHandler<Date>() { @Override public Date handle(ResultSet rs) throws SQLException { if (rs.next()) { return rs.getTimestamp(colname); } else { return null; } } }); if (date != null) { if (date.before(beforeDate)) { logger.debug("before " + beforeDate.toString()); logger.debug("update " + date.toString()); Assert.fail("Update failed."); } } else { Assert.fail("No rows in ResultSet"); } } catch (SQLException ex) { ex.printStackTrace(); Assert.fail("SQL Exception"); } finally { DBAccess.close(); } } protected void testCount(String sql, int expectedCount) { logger.debug(sql); try { int count = DBAccess.get().executeQuery(sql, new ResultSetHandler<Integer>() { @Override public Integer handle(ResultSet rs) throws SQLException { if (rs.next()) { return rs.getInt("count"); } else { return 0; } } }); if (count > 0) { Assert.assertEquals("Expected count is not the same:" + expectedCount + "!=<" + count, true, (expectedCount <= count)); } else { Assert.fail("No rows in ResultSet"); } } catch (SQLException ex) { ex.printStackTrace(); Assert.fail("SQL Exception"); } finally { DBAccess.close(); } } /** * Test of add_empty_processing_event_by_parent_accession method, of class MetadataWS. */ @Test public void testAdd_empty_processing_event_by_parent_accession() { logger.info("add_empty_processing_event_by_parent_accession"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int[] parentAccessions = { 4707, 4765 }; int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.add_empty_processing_event_by_parent_accession(parentAccessions); Assert.assertEquals(expResult, result.getExitStatus()); testTimestamp("select max(create_tstmp) from processing " + "where processing_id in " + "(select distinct processing_id from processing_lanes pl, lane l " + "where l.sw_accession = 4707);", "max", beforeDate); testTimestamp("select max(create_tstmp) from processing " + "where processing_id in " + "(select distinct processing_id from processing_ius pl, ius l " + "where l.sw_accession = 4765);", "max", beforeDate); } /** * Test of add_task_group method, of class MetadataWS. */ // @Test public void testAdd_task_group() { logger.info("add_task_group"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int[] parentIDs = { 5, 7 }; int[] childIDs = { 10, 12 }; String algorithm = "metadataWSTest"; String description = "Testing the MetadataWS"; int expResult = 0; ReturnValue result = instance.add_task_group(parentIDs, childIDs, algorithm, description); Assert.assertNotSame(expResult, result.getReturnValue()); testTimestamp("select max(create_tstmp), task_group from processing " + "where processing_id in " + "(select distinct child_id from processing_relationship " + "where parent_id IN (5,7)) " + "AND processing_id in " + "(select distinct parent_id from processing_relationship " + "where child_id IN (10,12)) GROUP BY task_group", "max", beforeDate); } /** * Test of add_workflow_run method, of class MetadataWS. */ // @Test public void testAdd_workflow_run() { logger.info("add_workflow_run"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int workflowAccession = 2860; int expResult = 0; int result = instance.add_workflow_run(workflowAccession); Assert.assertNotSame(expResult, result); testTimestamp("select max(create_tstmp) from workflow_run " + "where workflow_id = 15", "max", beforeDate); } /** * Test of add_workflow_run_ancestor method, of class MetadataWS. */ // @Test public void testAdd_workflow_run_ancestor() { logger.info("add_workflow_run_ancestor"); Date beforeDate = new Timestamp(System.currentTimeMillis()); // int workflowRunAccession = 862;//double-checked now...//but clearly not because it's still not finding it // int workflowRunAccession = 64;// what the hell! int workflowRunAccession = 862; int processingId = 4921; instance.add_workflow_run_ancestor(workflowRunAccession, processingId); testTimestamp("select update_tstmp from processing " + "where ancestor_workflow_run_id = 22 and processing_id=4921", "update_tstmp", beforeDate); } /** * Test of associate_processing_event_with_parents_and_child method, of class MetadataWS. */ // @Test public void testAssociate_processing_event_with_parents_and_child() { logger.info("associate_processing_event_with_parents_and_child"); int processingID = 773; int[] parentIDs = { 16, 18 }; int[] childIDs = { 20, 22 }; int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.associate_processing_event_with_parents_and_child(processingID, parentIDs, childIDs); Assert.assertEquals(expResult, result.getExitStatus()); testCount("select count(*) from processing_relationship " + "where (parent_id=773 AND child_id IN (20,22)) " + "OR (child_id=12 AND parent_id IN (16,18));", 4); } /** * Test of get_workflow_info method, of class MetadataWS. */ // @Test public void testGet_workflow_info() { logger.info("get_workflow_info"); int workflowAccession = 2861; String dbName = "GzippedFastqQualityReportAndFilter"; Map result = instance.get_workflow_info(workflowAccession); Assert.assertEquals(dbName, result.get("name")); } /** * Test of get_workflow_run_accession method, of class MetadataWS. */ // @Test public void testGet_workflow_run_accession() { logger.info("get_workflow_run_accession"); int workflowRunId = 23; int expResult = 863; int result = instance.get_workflow_run_accession(workflowRunId); Assert.assertEquals(expResult, result); } /** * Test of get_workflow_run_id method, of class MetadataWS. */ // @Test public void testGet_workflow_run_id() { logger.info("get_workflow_run_id"); int workflowRunAccession = 863; int expResult = 23; int result = instance.get_workflow_run_id(workflowRunAccession); Assert.assertEquals(expResult, result); } /** * Test of linkWorkflowRunAndParent method, of class MetadataWS. * * @throws java.lang.Exception */ // @Test public void testLinkWorkflowRunAndParent() throws Exception { logger.info("linkWorkflowRunAndParent"); int workflowRunId = 24; int parentAccession = 4789; boolean expResult = true; boolean result = instance.linkWorkflowRunAndParent(workflowRunId, parentAccession); Assert.assertEquals(expResult, result); testCount("select count(*) from ius_workflow_runs where ius_id = 5 and workflow_run_id = 24", 1); } /** * Test of mapProcessingIdToAccession method, of class MetadataWS. */ // @Test public void testMapProcessingIdToAccession() { logger.info("mapProcessingIdToAccession"); int processingId = 26; int expResult = 48; int result = instance.mapProcessingIdToAccession(processingId); Assert.assertEquals(expResult, result); } /** * Test of processing_event_to_task_group method, of class MetadataWS. */ // @Test public void testProcessing_event_to_task_group() { logger.info("processing_event_to_task_group"); int processingID = 4923; int[] parentIDs = { 30, 32 }; int[] childIDs = { 34, 36 }; String algorithm = "MetadataWS testProcessing_event_to_task_group "; String description = "testProcessing_event_to_task_group"; int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.processing_event_to_task_group(processingID, parentIDs, childIDs, algorithm, description); Assert.assertEquals(expResult, result.getExitStatus()); testCount("select count(*) from processing_relationship " + "where (parent_id=4923 AND child_id IN (34,36)) " + "OR (child_id=4923 AND parent_id IN (30,32));", 4); } /** * Test of update_processing_event method, of class MetadataWS. */ // @Test public void testUpdate_processing_event() { logger.info("update_processing_event"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int processingID = 4939; ReturnValue retval = new ReturnValue(); retval.setExitStatus(ReturnValue.FREEMARKEREXCEPTION); retval.setAlgorithm("algo testUpdate_processing_event()"); retval.setParameters("parameters testUpdate_processing_event()"); retval.setProcessExitStatus(ReturnValue.DBCOULDNOTDISCONNECT); // this is awful, but it looks like this is the mechanism that Runner uses to populate files with the ProvisionFiles module FileMetadata data = new FileMetadata(); data.setFilePath("path of righteousness"); FileAttribute attribute = new FileAttribute(); attribute.setTag("funky_tag"); attribute.setValue("funky_value"); data.getAnnotations().add(attribute); retval.setFiles(Lists.newArrayList(data)); int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.update_processing_event(processingID, retval); Assert.assertEquals(expResult, result.getExitStatus()); testTimestamp("select update_tstmp from processing " + "where processing_id=4939 " + "and process_exit_status=81 and algorithm='algo testUpdate_processing_event()' " + "and status = 'success'", "update_tstmp", beforeDate); } /** * Test of update_processing_status method, of class MetadataWS. */ // @Test public void testUpdate_processing_status() { logger.info("update_processing_status"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int processingID = 5247; ProcessingStatus status = ProcessingStatus.success; int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.update_processing_status(processingID, status); Assert.assertEquals(expResult, result.getExitStatus()); testTimestamp("select update_tstmp from processing " + "where processing_id=5247 " + "and status='testUpdate_processing_status()'", "update_tstmp", beforeDate); } /** * Test of update_processing_workflow_run method, of class MetadataWS. */ // @Test public void testUpdate_processing_workflow_run() { logger.info("update_processing_workflow_run"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int processingID = 5395; int workflowRunAccession = 872; int expResult = ReturnValue.SUCCESS; ReturnValue result = instance.update_processing_workflow_run(processingID, workflowRunAccession); Assert.assertEquals(expResult, result.getExitStatus()); testTimestamp("select update_tstmp from processing " + "where processing_id=5395 and workflow_run_id=24;", "update_tstmp", beforeDate); } /** * Test of update_workflow_run method, of class MetadataWS. */ // @Test public void testUpdate_workflow_run() { logger.info("update_workflow_run"); Date beforeDate = new Timestamp(System.currentTimeMillis()); int workflowRunId = 32; String pegasusCmd = "test pegasus cmd"; String workflowTemplate = "test template"; WorkflowRunStatus status = WorkflowRunStatus.completed; String statusCmd = "test command"; String workingDirectory = "test working dir"; String dax = "test dax"; String ini = "test ini"; String host = "localhost"; String testEngine = "test engine"; int expResult = 2862; ReturnValue result = instance.update_workflow_run(workflowRunId, pegasusCmd, workflowTemplate, status, statusCmd, workingDirectory, dax, ini, host, null, null, testEngine, null); Assert.assertEquals(expResult, result.getReturnValue()); testTimestamp("select update_tstmp from workflow_run " + "where workflow_run_id=32;", "update_tstmp", beforeDate); } // @Test public void testListInstalledWorkflow() { logger.info("listInstalledWorkflows"); instance.listInstalledWorkflows(); } // @Test public void testUpdateWorkflow() { Date beforeDate = new Timestamp(System.currentTimeMillis()); logger.info("updateWorkflow"); ReturnValue ret = instance.updateWorkflow(15, "http://testtest"); Assert.assertEquals("Did not return with a success ReturnValue", ReturnValue.SUCCESS, ret.getExitStatus()); testTimestamp("select update_tstmp from workflow " + "where workflow_id=15", "update_tstmp", beforeDate); } // @Test public void testGetWorkflowAccession() { logger.info("getWorkflowAccession"); int accession = instance.getWorkflowAccession("FastqQualityReportAndFilter", "0.10.1"); Assert.assertNotSame("Accession not found", -1, accession); Assert.assertEquals("Incorrect accession found", 2860, accession); } @Test public void testGetFile() { logger.info("testGetFile"); File file = instance.getFile(4761); Assert.assertEquals("The file cannot be found (or the file path is wrong for some reason).", "s3://abcco.analysis/sample_data/Sample_Tumour/simulated_1.fastq.gz", file.getFilePath()); } /** * Find candidates for this test via "select * from File f, Processing_files pf, Processing pp, Processing_relationship pr, Processing * pc , Workflow_Run wr WHERE f.file_id=pf.file_id AND pf.processing_id=pp.processing_id AND pp.processing_id=pr.parent_id AND * pc.processing_id=pr.child_id AND pc.workflow_run_id = wr.workflow_run_id ORDER BY f.sw_accession;" */ @Test public void testGetWorkflowRunsRelatedToFile_basic() { logger.info("testGetWorkflowRunsRelatedToFile_basic"); List<Integer> files = new ArrayList<>(); boolean exceptionThrown = false; List<WorkflowRun> result; try { result = instance.getWorkflowRunsAssociatedWithFiles(files, FileChildWorkflowRunsResource.SEARCH_TYPE.CHILDREN_VIA_PROCESSING_RELATIONSHIP.toString()); } catch (NotFoundException nfe) { exceptionThrown = true; } Assert.assertTrue("exception not thrown on invalid input", exceptionThrown); files.add(-1); exceptionThrown = false; try { result = instance.getWorkflowRunsAssociatedWithFiles(files, FileChildWorkflowRunsResource.SEARCH_TYPE.CHILDREN_VIA_PROCESSING_RELATIONSHIP.toString()); } catch (NotFoundException nfe) { exceptionThrown = true; } Assert.assertTrue("exception not thrown on invalid object", exceptionThrown); files.clear(); files.add(835); result = instance.getWorkflowRunsAssociatedWithFiles(files, FileChildWorkflowRunsResource.SEARCH_TYPE.CHILDREN_VIA_PROCESSING_RELATIONSHIP.toString()); Assert.assertTrue("basic call failed", result.size() == 1 && result.get(0).getSwAccession() == 862); } @Test public void testGetWorkflowRunsRelatedToFile_multipleFiles() { logger.info("testGetWorkflowRunsRelatedToFile_multipleFiles"); List<Integer> files = new ArrayList<>(); files.add(835); files.add(838); List<WorkflowRun> result = instance.getWorkflowRunsAssociatedWithFiles(files, FileChildWorkflowRunsResource.SEARCH_TYPE.CHILDREN_VIA_PROCESSING_RELATIONSHIP.toString()); Assert.assertTrue("multiple file call failed", result.size() == 2); Assert.assertTrue("multiple file call failed", result.get(0).getSwAccession() == 862 || result.get(0).getSwAccession() == 863); Assert.assertTrue("multiple file call failed", result.get(1).getSwAccession() == 862 || result.get(1).getSwAccession() == 863); } /** * Unfortunately, the next two tests do not seem to have appropriate candidates in the test database for now as checked via select * f.sw_accession, wr.workflow_run_id, wr.sw_accession, wr2.workflow_run_id, wr2.sw_accession from File f, Processing_files pf, * Processing pp, Workflow_Run wr, ius_workflow_runs iwr, ius i, ius_workflow_runs iwr2, workflow_run wr2 WHERE f.file_id=pf.file_id AND * pf.processing_id=pp.processing_id AND (pp.ancestor_workflow_run_id=wr.workflow_run_id OR pp.workflow_run_id=wr.workflow_run_id) AND * wr.workflow_run_id=iwr.workflow_run_id AND iwr.ius_id = i.ius_id AND iwr2.ius_id = i.ius_id AND wr2.workflow_run_id = * iwr2.workflow_run_id ORDER BY f.sw_accession; * * select f.sw_accession, wr.workflow_run_id, wr.sw_accession, wr2.workflow_run_id, wr2.sw_accession from File f, Processing_files pf, * Processing pp, Workflow_Run wr, lane_workflow_runs iwr, lane i, lane_workflow_runs iwr2, workflow_run wr2 WHERE f.file_id=pf.file_id * AND pf.processing_id=pp.processing_id AND (pp.ancestor_workflow_run_id=wr.workflow_run_id OR pp.workflow_run_id=wr.workflow_run_id) * AND wr.workflow_run_id=iwr.workflow_run_id AND iwr.lane_id = i.lane_id AND iwr2.lane_id = i.lane_id AND wr2.workflow_run_id = * iwr2.workflow_run_id ORDER BY f.sw_accession; */ @Test public void testGetWorkflowRunsRelatedToFile_viaIUS() { logger.info("testGetWorkflowRunsRelatedToFile_IUS"); List<Integer> files = new ArrayList<>(); files.add(835); files.add(838); List<WorkflowRun> result = instance.getWorkflowRunsAssociatedWithFiles(files, FileChildWorkflowRunsResource.SEARCH_TYPE.CHILDREN_VIA_IUS_WORKFLOW_RUN.toString()); Assert.assertTrue("testGetWorkflowRunsRelatedToFile_IUS failed", result.isEmpty()); } @Test public void testGetWorkflowRunsRelatedToFile_viaLane() { logger.info("testGetWorkflowRunsRelatedToFile_lane"); List<Integer> files = new ArrayList<>(); files.add(835); files.add(838); List<WorkflowRun> result = instance.getWorkflowRunsAssociatedWithFiles(files, FileChildWorkflowRunsResource.SEARCH_TYPE.CHILDREN_VIA_LANE_WORKFLOW_RUN.toString()); Assert.assertTrue("testGetWorkflowRunsRelatedToFile_lane failed", result.isEmpty()); } @Test public void testGetAllSequencerRuns() { Log.info("testGetAllSequencerRuns"); List<SequencerRun> runs = instance.getAllSequencerRuns(); Assert.assertFalse("There are no sequencer runs!", runs.isEmpty()); } @Test public void testGetLanesFrom() { Log.info("testGetLanesFrom"); List<Lane> lanes = instance.getLanesFrom(4715); Assert.assertFalse("There are no lanes for sequencer run!", lanes.isEmpty()); } @Test public void testGetIUSFromLane() { Log.info("testGetIUSFromLane"); List<IUS> iuses = instance.getIUSFrom(4764); Assert.assertFalse(iuses.isEmpty()); } @Test public void testGetIUSFromSample() { Log.info("testGetIUSFromSample"); List<IUS> iuses = instance.getIUSFrom(4783); Assert.assertFalse(iuses.isEmpty()); } @Test public void testGetExperimentsFrom() { Log.info("testGetExperimentsFrom"); List<Experiment> experiments = instance.getExperimentsFrom(120); Assert.assertFalse(experiments.isEmpty()); } @Test public void testGetSamplesFromExperiment() { Log.info("testGetSamplesFromExperiment"); List<Sample> samples = instance.getSamplesFrom(6157); Assert.assertFalse(samples.isEmpty()); } @Test public void testGetChildSamplesFrom() { Log.info("testGetChildSamplesFrom"); List<Sample> samples = instance.getChildSamplesFrom(1940); Assert.assertFalse(samples.isEmpty()); } @Test public void testGetParentSamplesFrom() { Log.info("testGetParentSamplesFrom"); List<Sample> samples = instance.getParentSamplesFrom(1944); Assert.assertFalse(samples.isEmpty()); } @Test public void testGetInputFilesForExistingWorkflowRun() { WorkflowRun workflowRun = instance.getWorkflowRun(4735); Assert.assertTrue("workflow run with no parents should have empty set", workflowRun.getInputFileAccessions().isEmpty()); } @Test public void testUpdateWorkflowRunWithInputFiles() { BasicTestDatabaseCreator.resetDatabaseWithUsers(); final int wr_sw_accession = 6603; WorkflowRun wr = instance.getWorkflowRun(wr_sw_accession); // should already be blank instance.update_workflow_run(wr.getWorkflowRunId(), wr.getCommand(), wr.getTemplate(), wr.getStatus(), wr.getStatusCmd(), wr.getCurrentWorkingDir(), wr.getDax(), wr.getIniFile(), wr.getHost(), wr.getStdOut(), wr.getStdErr(), wr.getWorkflowEngine(), new HashSet<Integer>()); wr = instance.getWorkflowRun(wr_sw_accession); Assert.assertTrue("empty input file set should blank", wr.getInputFileAccessions().isEmpty()); // try a empty set and asking for it back wr.getInputFileAccessions().clear(); instance.update_workflow_run(wr.getWorkflowRunId(), wr.getCommand(), wr.getTemplate(), wr.getStatus(), wr.getStatusCmd(), wr.getCurrentWorkingDir(), wr.getDax(), wr.getIniFile(), wr.getHost(), wr.getStdOut(), wr.getStdErr(), wr.getWorkflowEngine(), wr.getInputFileAccessions()); wr = instance.getWorkflowRun(wr_sw_accession); Assert.assertTrue("nulled input file set should be blank", wr.getInputFileAccessions().isEmpty()); final int f1_sw_accession = 835; wr.getInputFileAccessions().add(f1_sw_accession); final int f2_sw_accession = 838; wr.getInputFileAccessions().add(f2_sw_accession); final int f3_sw_accession = 866; wr.getInputFileAccessions().add(f3_sw_accession); instance.update_workflow_run(wr.getWorkflowRunId(), wr.getCommand(), wr.getTemplate(), wr.getStatus(), wr.getStatusCmd(), wr.getCurrentWorkingDir(), wr.getDax(), wr.getIniFile(), wr.getHost(), wr.getStdOut(), wr.getStdErr(), wr.getWorkflowEngine(), wr.getInputFileAccessions()); wr = instance.getWorkflowRun(wr_sw_accession); Assert.assertTrue("updated input file set should be size 3, was " + wr.getInputFileAccessions().size(), wr .getInputFileAccessions().size() == 3); final int f4_sw_accession = 867; wr.getInputFileAccessions().add(f4_sw_accession); instance.update_workflow_run(wr.getWorkflowRunId(), wr.getCommand(), wr.getTemplate(), wr.getStatus(), wr.getStatusCmd(), wr.getCurrentWorkingDir(), wr.getDax(), wr.getIniFile(), wr.getHost(), wr.getStdOut(), wr.getStdErr(), wr.getWorkflowEngine(), wr.getInputFileAccessions()); wr = instance.getWorkflowRun(wr_sw_accession); Assert.assertTrue("updated input file set should be size 4, was " + wr.getInputFileAccessions().size(), wr .getInputFileAccessions().size() == 4); } @Test public void getDirectFilesAssociatedWithWorkflowRuns() { BasicTestDatabaseCreator.resetDatabaseWithUsers(); List<Integer> files = new ArrayList<>(); // try getting nothing List<WorkflowRun> result = instance.getWorkflowRunsAssociatedWithInputFiles(files); Assert.assertTrue("should have been no files", result.isEmpty()); final int workflow_run1 = 6480; // build required file structures WorkflowRun wr = instance.getWorkflowRun(workflow_run1); Assert.assertTrue("nulled input file set should be blank", wr.getInputFileAccessions().isEmpty()); final int f1_sw_accession = 1963; wr.getInputFileAccessions().add(f1_sw_accession); final int f2_sw_accession = 1978; wr.getInputFileAccessions().add(f2_sw_accession); final int f3_sw_accession = 2139; wr.getInputFileAccessions().add(f3_sw_accession); instance.update_workflow_run(wr.getWorkflowRunId(), wr.getCommand(), wr.getTemplate(), wr.getStatus(), wr.getStatusCmd(), wr.getCurrentWorkingDir(), wr.getDax(), wr.getIniFile(), wr.getHost(), wr.getStdOut(), wr.getStdErr(), wr.getWorkflowEngine(), wr.getInputFileAccessions()); // add a couple more files to a different workflow_run final int f4_sw_accession = 2160; final int workflow_run2 = 6603; wr = instance.getWorkflowRun(workflow_run2); wr.getInputFileAccessions().add(f1_sw_accession); wr.getInputFileAccessions().add(f4_sw_accession); instance.update_workflow_run(wr.getWorkflowRunId(), wr.getCommand(), wr.getTemplate(), wr.getStatus(), wr.getStatusCmd(), wr.getCurrentWorkingDir(), wr.getDax(), wr.getIniFile(), wr.getHost(), wr.getStdOut(), wr.getStdErr(), wr.getWorkflowEngine(), wr.getInputFileAccessions()); // try a file accession that both workflow runs should have files.add(f1_sw_accession); result = instance.getWorkflowRunsAssociatedWithInputFiles(files); Assert.assertTrue("should have been 2 workflow runs, found " + result.size(), result.size() == 2); Assert.assertTrue("incorrect workflow runs found", result.get(0).getSwAccession() == workflow_run1); Assert.assertTrue("incorrect workflow runs found", result.get(1).getSwAccession() == workflow_run2); files.clear(); // try a file accession that only the latter workflow run should have files.add(f4_sw_accession); result = instance.getWorkflowRunsAssociatedWithInputFiles(files); Assert.assertTrue("should have been 1 file, found " + result.size(), result.size() == 1); Assert.assertTrue("incorrect workflow runs found", result.get(0).getSwAccession() == workflow_run2); // try both file accessions, should get both back (allows for partial matching) files.add(f1_sw_accession); result = instance.getWorkflowRunsAssociatedWithInputFiles(files); Assert.assertTrue("should have been 2 workflow runs, found " + result.size(), result.size() == 2); Assert.assertTrue("incorrect workflow runs found", result.get(0).getSwAccession() == workflow_run1); Assert.assertTrue("incorrect workflow runs found", result.get(1).getSwAccession() == workflow_run2); // go back and check that the workflow runs include this input file for (WorkflowRun r : result) { Assert.assertTrue("input files for the returned workflow runs should include f1 or f4", r.getInputFileAccessions().contains(f1_sw_accession) || r.getInputFileAccessions().contains(f4_sw_accession)); } } }