/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.broad.igv.gs.dm;
import org.broad.igv.AbstractHeadlessTest;
import org.broad.igv.prefs.Constants;
import org.broad.igv.gs.GSTestAuthenticator;
import org.broad.igv.gs.GSUtils;
import org.broad.igv.prefs.PreferencesManager;
import org.broad.igv.track.Track;
import org.broad.igv.track.TrackLoader;
import org.broad.igv.util.HttpUtils;
import org.broad.igv.util.ResourceLocator;
import org.broad.igv.util.TestUtils;
import org.junit.*;
import org.junit.rules.TestRule;
import org.junit.rules.Timeout;
import java.io.File;
import java.io.IOException;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static junit.framework.Assert.*;
/**
* @author Jim Robinson
* @date 1/16/12
*/
public class DMUtilsTest extends AbstractHeadlessTest{
@Rule
public TestRule testTimeout = new Timeout((int) 30e4);
private static final String IGV_TEST_DIR = "/Home/igvtest/";
private URL defaultURL;
private URL personaldirectoryURL;
private static URL fileURL;
private static String delDirName = "testdir_deleteme";
private static String fullPath = IGV_TEST_DIR + delDirName;
@Before
public void setUp() throws Exception{
super.setUp();
GSUtils.logout();
//This is pretty dumb. The reason is that initializing HttpUtils sets the authenticator,
//and we need to overwrite it in initAuth. It's not actually important which method we call,
//as long as HttpUtils is initialized so it doesn't get initialized later
HttpUtils.getInstance().resetAuthenticator();
Authenticator.setDefault(new GSTestAuthenticator());
try {
String defaultURLStr = PreferencesManager.getPreferences().get(Constants.GENOME_SPACE_DM_SERVER);
defaultURL = new URL(defaultURLStr);
personaldirectoryURL = new URL(defaultURLStr + DMUtils.PERSONAL_DIRECTORY);
fileURL = new URL(defaultURL + "file");
System.out.println("Genome space URL: " + defaultURL);
} catch (MalformedURLException e) {
e.printStackTrace();
Assume.assumeTrue(false);
}
//We test creating this directory later
// try{
// DMUtils.deleteFileOrDirectory(fileURL + fullPath);
// }catch(FileNotFoundException e){
// //totally fine, in fact expected
// }
}
@After
public void tearDown() {
GSUtils.logout();
HttpUtils.getInstance().resetAuthenticator();
}
@Test
public void noOpTest() {
assertTrue(true);
}
@Ignore
public void testGetDirectoryListing() throws Exception {
final String testFileName = "Broad.080528.subtypes.seg.gz";
boolean found = dirContainsFile(personaldirectoryURL, testFileName);
assertTrue("Test file not found: " + testFileName, found);
}
protected boolean dirContainsFile(URL dirURL, String testFileName) throws Exception{
GSDirectoryListing dirListing = DMUtils.getDirectoryListing(dirURL);
assertNotNull("Directory listing", dirListing);
List<GSFileMetadata> gsFiles = dirListing.getContents();
//Search for known test file
boolean found = false;
for (GSFileMetadata fileMetadata : gsFiles) {
if (fileMetadata.getName().equals(testFileName)) {
found = true;
String path = IGV_TEST_DIR + testFileName;
assertEquals("Test file path not expected", path, fileMetadata.getPath());
}
}
return found;
}
/**
* Upload a file, check it got uploaded, delete it, check it was deleted
* Not really ideal, but since we need to check that the file doesn't exist before
* uploading and delete it afterwards anyway, figured we might as well combine these.
* @throws Exception
*/
@Ignore
public void testUploadDeleteFile() throws Exception {
String locName = "test2.bed";
File localFile = new File(TestUtils.DATA_DIR + "bed", locName);
String remPath = IGV_TEST_DIR + locName;
// Delete, in case the file is there from a previous test run
try {
DMUtils.deleteFileOrDirectory(fileURL + remPath);
} catch (IOException e) {
// Ignore -- expected
}
assertFileStatus(locName, false);
DMUtils.uploadFile(localFile, remPath);
assertFileStatus(locName, true);
DMUtils.deleteFileOrDirectory(fileURL + remPath);
assertFileStatus(locName, false);
}
//@Test
public void testCreateDeleteDirectory() throws Exception {
assertFileStatus(delDirName, false);
DMUtils.createDirectory(fileURL + fullPath);
assertFileStatus(delDirName, true);
DMUtils.deleteFileOrDirectory(fileURL + fullPath);
assertFileStatus(delDirName, false);
}
protected void assertFileStatus(String objName, boolean expExists) throws Exception{
boolean found = dirContainsFile(personaldirectoryURL, objName);
if(expExists){
assertEquals("Object not found: " + objName, expExists, found);
}else{
assertEquals("Object exists, but it shouldn't: " + objName, expExists, found);
}
}
/**
* Test that we can actually load files. More of an functional test than unit test.
* We also make sure to use token authentication
* @throws Exception
*/
@Ignore
public void testLoadFiles() throws Exception{
GSDirectoryListing dirListing = DMUtils.getDirectoryListing(personaldirectoryURL);
TrackLoader loader = new TrackLoader();
Map<String, Exception> exceptions = new HashMap<String, Exception>();
for(GSFileMetadata md: dirListing.getContents()){
String mdurl = md.getUrl();
if(!md.isDirectory() && (mdurl.endsWith(".bed") || mdurl.endsWith(".bam"))){
System.out.println("Loading file " + mdurl);
try{
List<Track> tracks = loader.load(new ResourceLocator(mdurl), genome);
assertNotNull(tracks);
assertNotSame(0, tracks.size());
}catch(Exception e){
exceptions.put(mdurl, e);
}
}
}
for(Map.Entry<String, Exception> entry: exceptions.entrySet()){
System.out.println("Exception loading Path: " + entry.getKey());
System.out.println("StackTrace: ");
for (StackTraceElement el : entry.getValue().getStackTrace()) {
System.out.println(el);
}
}
assertEquals(0, exceptions.size());
}
}