/* * Copyright 2015-2016 OpenCB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.opencb.opencga.server.rest; import org.apache.tools.ant.types.Commandline; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.MultiPart; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.opencb.commons.datastore.mongodb.MongoDataStoreManager; import org.opencb.opencga.analysis.AnalysisExecutionException; import org.opencb.opencga.catalog.monitor.exceptions.ExecutionException; import org.opencb.opencga.catalog.monitor.executors.old.ExecutorManager; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.models.*; import org.opencb.opencga.storage.app.StorageMain; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import java.io.IOException; import java.util.Arrays; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class OpenCGAWSServerTest { public static final String TEST_SERVER_USER = "test_server_user"; private static WSServerTestUtils serverTestUtils; private WebTarget webTarget; @BeforeClass static public void initServer() throws Exception { serverTestUtils = new WSServerTestUtils(); serverTestUtils.setUp(); serverTestUtils.initServer(); } @AfterClass static public void shutdownServer() throws Exception { serverTestUtils.shutdownServer(); } @Before public void init() throws Exception { //Drop default user mongoDB database. String databaseName = WSServerTestUtils.DATABASE_PREFIX + TEST_SERVER_USER + "_" + ProjectWSServerTest.PROJECT_ALIAS; MongoDataStoreManager dataStoreManager = new MongoDataStoreManager("localhost", 27017); dataStoreManager.get(databaseName); dataStoreManager.drop(databaseName); // serverTestUtils.setUp(); webTarget = serverTestUtils.getWebTarget(); } /** First echo message to test Server connectivity **/ @Test public void testConnectivity() throws InterruptedException, IOException { String message = "Test"; WebTarget testPath = webTarget.path("test").path("echo").path(message); System.out.println("testPath = " + testPath); String s = testPath.request().get(String.class); assertEquals("Expected [" + message + "], actual [" + s + "]", message, s); testPath = webTarget.path("test").path("echo"); System.out.println("testPath = " + testPath); MultiPart multiPart = new MultiPart(); multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE); FormDataBodyPart bodyPart = new FormDataBodyPart("message", message); multiPart.bodyPart(bodyPart); s = testPath.request().post(Entity.entity(multiPart, multiPart.getMediaType()), String.class); assertEquals("Expected [" + message + "], actual [" + s + "]", message, s); } /** User tests **/ @Test public void userTests() throws IOException { UserWSServerTest userTest = new UserWSServerTest(webTarget); User user = userTest.createUser(TEST_SERVER_USER); String sessionId = userTest.loginUser(user.getId()); userTest.updateUser(user.getId(), sessionId); } @Test public void workflowCreation() throws Exception { // UserWSServerTest userTest = new UserWSServerTest(webTarget); // User user = userTest.createUser(TEST_SERVER_USER); // String sessionId = userTest.loginUser(user.getId()); // user = userTest.info(user.getId(), sessionId); // // ProjectWSServerTest prTest = new ProjectWSServerTest(webTarget); // Project project = prTest.createProject(user.getId(), sessionId); // prTest.modifyProject(project.getId(), sessionId); // project = prTest.info(project.getId(), sessionId); // userTest.getAllProjects(user.getId(), sessionId); // // StudyWSServerTest stTest = new StudyWSServerTest(webTarget); // Study study = stTest.createStudy(project.getId(), sessionId); // stTest.modifyStudy(study.getId(), sessionId); // study = stTest.info(study.getId(), sessionId); // prTest.getAllStudies(project.getId(), sessionId); // // FileWSServerTest fileTest = new FileWSServerTest(); // fileTest.setWebTarget(webTarget); // File fileVcf = fileTest.uploadVcf(study.getId(), sessionId); // assertEquals(File.FileStatus.READY, fileVcf.getStatus().getName()); // assertEquals(File.Bioformat.VARIANT, fileVcf.getBioformat()); // Job indexJobVcf = fileTest.index(fileVcf.getId(), sessionId); // // /* Emulate DAEMON working */ // indexJobVcf = runStorageJob(sessionId, indexJobVcf); // assertEquals(Job.JobStatus.READY, indexJobVcf.getStatus().getName()); // // QueryOptions queryOptions = new QueryOptions("limit", 10); // queryOptions.put("region", "1"); // List<Sample> samples = OpenCGAWSServer.catalogManager.getAllSamples(study.getId(), // new Query(CatalogSampleDBAdaptor.QueryParams.ID.key(), fileVcf.getSampleIds()), new QueryOptions(), sessionId).getResult(); // List<String> sampleNames = samples.stream().map(Sample::getName).collect(Collectors.toList()); // List<Variant> variants = fileTest.fetchVariants(fileVcf.getId(), sessionId, queryOptions); // assertEquals(10, variants.size()); // for (Variant variant : variants) { // for (StudyEntry sourceEntry : variant.getStudies()) { // assertEquals(sampleNames.size(), sourceEntry.getSamplesData().size()); // assertNotNull("Stats must be calculated", sourceEntry.stats(StudyEntry.DEFAULT_COHORT)); // } // assertNotNull("Must be annotated", variant.getAnnotation()); // } // // //Create a new user with permissions just over 2 samples. // String userTest2 = OpenCGAWSServer.catalogManager.createUser("userTest2", "userTest2", "my@email.com", "1234", "ACME", null, new QueryOptions()).first().getId(); // String sessionId2 = OpenCGAWSServer.catalogManager.login(userTest2, "1234", "127.0.0.1").first().getString("sessionId"); // OpenCGAWSServer.catalogManager.addUsersToGroup(study.getId(), AuthorizationManager.MEMBERS_ROLE, userTest2, sessionId); // // QueryResult<Sample> allSamples = OpenCGAWSServer.catalogManager.getAllSamples(study.getId(), // new Query(CatalogSampleDBAdaptor.QueryParams.NAME.key(), "NA19685,NA19661"), new QueryOptions(), sessionId); // OpenCGAWSServer.catalogManager.shareSample(allSamples.getResult().get(0).getId() + "", "@" + AuthorizationManager.MEMBERS_ROLE, // new AclEntry("@" + AuthorizationManager.MEMBERS_ROLE, true, false, false, false), sessionId); // OpenCGAWSServer.catalogManager.shareSample(allSamples.getResult().get(1).getId() + "", userTest2, // new AclEntry(userTest2, true, false, false, false), sessionId); // // variants = stTest.fetchVariants(study.getId(), sessionId2, queryOptions); // assertEquals(10, variants.size()); // for (Variant variant : variants) { // for (StudyEntry sourceEntry : variant.getStudies()) { // assertEquals(2, sourceEntry.getSamplesData().size()); // assertNotNull("Stats must be calculated", sourceEntry.stats(StudyEntry.DEFAULT_COHORT)); // } // assertNotNull("Must be annotated", variant.getAnnotation()); // } // // // Cohort myCohort = OpenCGAWSServer.catalogManager.createCohort(study.getId(), "MyCohort", Study.Type.FAMILY, "", samples.stream().map(Sample::getId).collect(Collectors.toList()), null, sessionId).first(); // assertEquals(Cohort.CohortStatus.NONE, OpenCGAWSServer.catalogManager.getCohort(myCohort.getId(), null, sessionId).first().getStatus().getName()); // // long outputId = OpenCGAWSServer.catalogManager.getFileParent(fileVcf.getId(), null, sessionId).first().getId(); // Job calculateVariantStatsJob = fileTest.calculateVariantStats(myCohort.getId(), outputId, sessionId); // // /* Emulate DAEMON working */ // calculateVariantStatsJob = runStorageJob(sessionId, calculateVariantStatsJob); // assertEquals(Job.JobStatus.READY, calculateVariantStatsJob.getStatus().getName()); // assertEquals(Cohort.CohortStatus.READY, OpenCGAWSServer.catalogManager.getCohort(myCohort.getId(), null, sessionId).first().getStatus().getName()); // // // // File fileBam = fileTest.uploadBam(study.getId(), sessionId); // assertEquals(File.FileStatus.READY, fileBam.getStatus().getName()); // assertEquals(File.Bioformat.ALIGNMENT, fileBam.getBioformat()); // Job indexJobBam = fileTest.index(fileBam.getId(), sessionId); // // /* Emulate DAEMON working */ // indexJobBam = runStorageJob(sessionId, indexJobBam); // assertEquals(Job.JobStatus.READY, indexJobBam.getStatus().getName()); // // queryOptions = new QueryOptions("limit", 10); // queryOptions.put("region", "20:60000-60200"); // queryOptions.put(AlignmentDBAdaptor.QO_INCLUDE_COVERAGE, false); // fileTest.fetchAlignments(fileBam.getId(), sessionId, queryOptions); // assertEquals(10, alignments.size()); } /** * Do not execute Job using its command line, won't find the opencga-storage.sh * Call directly to the OpenCGAStorageMain */ private Job runStorageJob(String sessionId, Job storageJob) throws AnalysisExecutionException, IOException, CatalogException, ExecutionException { String[] args = Commandline.translateCommandline(storageJob.getCommandLine()); storageJob.setCommandLine("Executing Storage CLI " + storageJob.getCommandLine()); StorageMain.privateMain((Arrays.copyOfRange(args, 1, args.length))); storageJob.setCommandLine("echo 'Executing fake job CLI' " + storageJob.getCommandLine()); ExecutorManager.execute(OpenCGAWSServer.catalogManager, storageJob, sessionId); return OpenCGAWSServer.catalogManager.getJob(storageJob.getId(), null, sessionId).first(); } }