/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview 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. * * Jalview 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 Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.ws.jabaws; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import jalview.bin.Cache; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.gui.AlignFrame; import jalview.gui.JvOptionPane; import jalview.ws.api.ServiceWithParameters; import jalview.ws.jws2.Jws2Discoverer; import jalview.ws.jws2.SeqAnnotationServiceCalcWorker; import jalview.ws.slivkaws.SlivkaWSDiscoverer; import java.util.ArrayList; import java.util.List; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /* * All methods in this class are set to the Network group because setUpBeforeClass will fail * if there is no network. */ @Test(singleThreaded = true) public class AAConAnnotAndSettingsIO { @BeforeClass(alwaysRun = true) public void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); } public static String testseqs = "examples/uniref50.fa"; public static Jws2Discoverer disc; public static List aacon; jalview.ws.jws2.SeqAnnotationServiceCalcWorker aaconClient; public static jalview.gui.AlignFrame af = null; @BeforeClass(alwaysRun = true) public static void setUpBeforeClass() throws Exception { Cache.loadProperties("test/jalview/io/testProps.jvprops"); Cache.initLogger(); disc = JalviewJabawsTestUtils.getJabawsDiscoverer(); while (disc.isRunning()) { // don't get services until discoverer has finished Thread.sleep(100); } aacon = new ArrayList<>(); for (ServiceWithParameters svc : disc.getServices()) { if (svc.getNameURI().toLowerCase().contains("aacon")) { aacon.add(new ServiceWithParameters[] { svc }); } } for (ServiceWithParameters svc : SlivkaWSDiscoverer.getServices()) { if (svc.getNameURI().toLowerCase().contains("aacon")) { aacon.add(new ServiceWithParameters[] { svc }); } } assertTrue("Couldn't discover any AACon services to use to test.", aacon.size() > 0); } @AfterClass(alwaysRun = true) public static void tearDownAfterClass() throws Exception { if (af != null) { af.setVisible(false); af.dispose(); af = null; } } @DataProvider(name = "aacons") public Object[][] getAaconArray() { Object[][] rtn = new Object[aacon.size()][1]; int i = 0; for (ServiceWithParameters[] aa : aacon) { rtn[i++] = aa; } return rtn; } /** * Run AACon on an alignment with defaults and verify Just Shenkin annotation * appears */ @Test(groups = { "External", "Network" }, dataProvider = "aacons") public void testAAConAnnotAndRecovery(ServiceWithParameters service) { jalview.io.FileLoader fl = new jalview.io.FileLoader(false); AlignFrame _af = fl.LoadFileWaitTillLoaded(testseqs, jalview.io.DataSourceType.FILE); assertNotNull("Couldn't load test data ('" + testseqs + "')", _af); af = _af; try { testAAConClient(_af, service); } finally { af = null; _af.setVisible(false); _af.dispose(); _af = null; } } /** * triggers the given aacon worker on the alignment, waits for 5s and gives up * or verifies SHENKIN annotation is produced. * * @param af * - test data in an alignment frame * @param aacon * - the service to test */ static void testAAConClient(AlignFrame af, ServiceWithParameters aacon) { SeqAnnotationServiceCalcWorker aaconClient = new SeqAnnotationServiceCalcWorker( aacon, af, null, null); long current = System.currentTimeMillis(), limit = 15; af.getViewport().getCalcManager().startWorker(aaconClient); do { try { Thread.sleep(50); } catch (InterruptedException x) { } ; assertTrue( "Waited " + limit + "s for " + aacon.getHostURL() + " - giving up.", (System.currentTimeMillis() - current) < limit * 1000); } while (af.getViewport().getCalcManager().isWorking()); AlignmentI orig_alig = af.getViewport().getAlignment(); boolean foundShenkin = false; Iterable _aa=orig_alig .findAnnotation(aacon.getAlignAnalysisUI().getCalcId()); assertTrue("No annotation from service", _aa != null && _aa.iterator().hasNext()); for (AlignmentAnnotation aa : _aa) { assertTrue("AACon annotation not marked as autocalculated!", aa.autoCalculated); if ("shenkin".equals(aa.label.toLowerCase())) { foundShenkin = true; break; } } assertTrue("Failed to locate 'SHENKIN' annotation row.", foundShenkin); } }