/* * This file is part of Artemis * * Copyright (C) 2014 Genome Research Limited * * 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 2 * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ package uk.ac.sanger.artemis.components.alignment; import static org.junit.Assert.*; import org.junit.Test; import java.io.File; import java.net.ConnectException; import java.net.URL; import htsjdk.samtools.BAMIndex; import htsjdk.samtools.SAMException; import htsjdk.samtools.SAMFileHeader; import htsjdk.samtools.SAMRecord; import htsjdk.samtools.cram.CRAIIndex; import junit.framework.AssertionFailedError; /** * JUnit tests for the BamUtils class. * * @author kp11 * */ public class BamUtilsTest { @Test public void testIsCramFile() { assertTrue(BamUtils.isCramFile("/a/file/path/file.cram")); assertTrue(BamUtils.isCramFile("/a/file/path/file.cram.cram")); assertTrue(BamUtils.isCramFile("file.cram")); assertTrue(BamUtils.isCramFile("http://mywebsite/file.cram")); assertTrue(BamUtils.isCramFile("https://mywebsite/file.cram")); assertTrue(BamUtils.isCramFile("ftp://myftpsite/file.cram")); assertFalse(BamUtils.isCramFile("/a/file/path/file.bam")); assertFalse(BamUtils.isCramFile("/a/file/path/file")); assertFalse(BamUtils.isCramFile("http://mywebsite/file")); assertFalse(BamUtils.isCramFile("ftp://myftpsite/file")); } @Test public void testIsBamFile() { assertTrue(BamUtils.isBamFile("/a/file/path/file.bam")); assertTrue(BamUtils.isBamFile("/a/file/path/file.cram.bam")); assertTrue(BamUtils.isBamFile("file.bam")); assertTrue(BamUtils.isBamFile("http://mywebsite/file.bam")); assertTrue(BamUtils.isBamFile("https://mywebsite/file.bam")); assertTrue(BamUtils.isBamFile("ftp://myftpsite/file.bam")); assertFalse(BamUtils.isBamFile("/a/file/path/file.cram")); assertFalse(BamUtils.isBamFile("/a/file/path/file")); assertFalse(BamUtils.isBamFile("http://mywebsite/file")); assertFalse(BamUtils.isBamFile("ftp://myftpsite/file")); } @Test public void testConstructIndexFilename() { assertEquals("/a/file/path/file.bam.bai", BamUtils.constructIndexFilename("/a/file/path/file.bam")); assertEquals("http://mywebsite/file.bam.bai", BamUtils.constructIndexFilename("http://mywebsite/file.bam")); assertEquals("https://mywebsite/file.bam.bai", BamUtils.constructIndexFilename("https://mywebsite/file.bam")); assertEquals("ftp://myftpsite/file.bam.bai", BamUtils.constructIndexFilename("ftp://myftpsite/file.bam")); assertEquals("/a/file/path/file.cram.crai", BamUtils.constructIndexFilename("/a/file/path/file.cram")); assertEquals("http://mywebsite/file.cram.crai", BamUtils.constructIndexFilename("http://mywebsite/file.cram")); assertEquals("https://mywebsite/file.cram.crai", BamUtils.constructIndexFilename("https://mywebsite/file.cram")); assertEquals("ftp://myftpsite/file.cram.crai", BamUtils.constructIndexFilename("ftp://myftpsite/file.cram")); assertNull(BamUtils.constructIndexFilename("ftp://myftpsite/file.jpeg")); } @Test public void testCreateTempIndexFile() throws Exception { File indexFile = null; indexFile = BamUtils.createTempIndexFile(new URL("file:/a/file/path/file.bam.bai")); assertTrue(indexFile.exists()); indexFile = BamUtils.createTempIndexFile(new URL("http://mywebsite/file.bam.bai")); assertTrue(indexFile.exists()); indexFile = BamUtils.createTempIndexFile(new URL("ftp://myftpsite/file.bam.bai")); assertTrue(indexFile.exists()); indexFile = BamUtils.createTempIndexFile(new URL("file:/a/file/path/file.cram.crai")); assertTrue(indexFile.exists()); indexFile = BamUtils.createTempIndexFile(new URL("http://mywebsite/file.cram.crai")); assertTrue(indexFile.exists()); indexFile = BamUtils.createTempIndexFile(new URL("ftp://myftpsite/file.cram.crai")); assertTrue(indexFile.exists()); } @Test public void testCreateIndexFileFromScratch() throws Exception { File fileBai = File.createTempFile("unit_test_bam_index_file1", ".bai"); fileBai.deleteOnExit(); assertTrue(fileBai.exists()); assertTrue(fileBai.length()==0); BamUtils.createIndexFileFromScratch("data/MAL_8h.bam", fileBai); assertTrue(fileBai.length()>0); File fileCrai = File.createTempFile("unit_test_bam_index_file1", ".crai"); fileCrai.deleteOnExit(); assertTrue(fileCrai.exists()); assertTrue(fileCrai.length()==0); BamUtils.createIndexFileFromScratch("data/NV.cram", fileCrai); assertTrue(fileCrai.length()>0); } @Test public void testSamRecordEqualityCheck() { byte [] bases = new String("ATGACAAGGGTCAGTTTTAGAGA").getBytes(); SAMRecord rec1 = new SAMRecord(new SAMFileHeader()); rec1.setReadName("rec1"); rec1.setAlignmentStart(10); rec1.setReadBases(bases); rec1.setFlags(8); SAMRecord rec2 = new SAMRecord(new SAMFileHeader()); rec2.setReadName("rec1"); rec2.setAlignmentStart(10); rec2.setReadBases(bases); rec2.setFlags(8); assertTrue(BamUtils.samRecordEqualityCheck(rec1, rec1)); assertTrue(BamUtils.samRecordEqualityCheck(rec1, rec2)); // Check different read name rec1.setReadName("another_read"); assertFalse(BamUtils.samRecordEqualityCheck(rec1, rec2)); rec1.setReadName("rec1"); // Check different start alignment rec1.setAlignmentStart(12); assertFalse(BamUtils.samRecordEqualityCheck(rec1, rec2)); rec1.setAlignmentStart(10); // Check different flags rec1.setFlags(256); assertFalse(BamUtils.samRecordEqualityCheck(rec1, rec2)); rec1.setFlags(8); } @Test public void testGetIndexFileForFile() throws Exception { // File ================================================ // Check getting an already existing BAM index file // File alreadyExistingBamIndexFile = BamUtils.getIndexFile("data/MAL_8h.bam"); assertNotNull(alreadyExistingBamIndexFile); assertTrue(alreadyExistingBamIndexFile.exists()); assertEquals("MAL_8h.bam.bai", alreadyExistingBamIndexFile.getName()); // Check getting an index file for a BAM file with no index. // Should create one. // File checkFile = new File("data/MAL_8h_noindex.bam.bai"); if (checkFile.exists()) { // Remove any leftover index from a previous run... checkFile.delete(); } try { File createdBamIndexFile = BamUtils.getIndexFile("data/MAL_8h_noindex.bam"); assertNotNull(createdBamIndexFile); assertTrue(createdBamIndexFile.exists()); assertEquals("MAL_8h_noindex.bam.bai", createdBamIndexFile.getName()); assertTrue(createdBamIndexFile.length()>0); } finally { if (checkFile.exists()) { // Remove the created index file checkFile.delete(); } } // Check getting an index file for a CRAM file with no index. // Should create one. // File createdCramIndexFile = BamUtils.getIndexFile("data/NV.cram"); assertNotNull(createdCramIndexFile); assertTrue(createdCramIndexFile.exists()); assertEquals("NV.cram.crai", createdCramIndexFile.getName()); assertTrue(createdCramIndexFile.length()>0); // Check getting an already existing CRAM index file // File alreadyExistingCramIndexFile = BamUtils.getIndexFile("data/NV.cram"); assertNotNull(alreadyExistingCramIndexFile); assertTrue(alreadyExistingCramIndexFile.exists()); assertEquals("NV.cram.crai", alreadyExistingCramIndexFile.getName()); } @Test public void testGetIndexFileForFtpBam() throws Exception { System.out.println("testGetIndexFileForFtpBam(): This test creates index files and may be slow to complete"); // FTP Seekable streams ================================================ // These will block so commented out for normal test runs. // Check creating an index file for a BAM file with no index for FTP // Should create local copy. // File createdBamIndexFtpFile = null; try { createdBamIndexFtpFile = BamUtils.getIndexFile("ftp://ftp.sanger.ac.uk/pub/project/pathogens/kp11/NV_noindex.bam"); throw new AssertionFailedError("Expected an exception to be thrown"); } catch (SAMException e) { assertTrue(e.getMessage().contains("Failed to find an index file")); } assertNull(createdBamIndexFtpFile); // Check getting the index file for a BAM file with an index for FTP // Should create local copy. // try { File existingBamIndexFtpFile = BamUtils.getIndexFile("ftp://ftp.sanger.ac.uk/pub/project/pathogens/kp11/NV.bam"); assertNotNull(existingBamIndexFtpFile); assertTrue(existingBamIndexFtpFile.exists()); assertTrue(existingBamIndexFtpFile.getName().endsWith(BAMIndex.BAMIndexSuffix)); assertTrue(existingBamIndexFtpFile.length()>0); } catch (ConnectException e) { System.err.println("testGetIndexFileForFtpBam() : WARNING: Unable to run this test as cannot connect to Sanger FTP server"); e.printStackTrace(); } } @Test public void testCreateIndexFileForFtpCram() throws Exception { // Check creating an index file for a CRAM file with no index for FTP // Should not be allowed. // File createdCramIndexFtpFile = null; try { createdCramIndexFtpFile = BamUtils.getIndexFile("ftp://ftp.sanger.ac.uk/pub/project/pathogens/kp11/NV_noindex.cram"); throw new AssertionFailedError("Expected an exception to be thrown"); } catch (SAMException e) { assertTrue(e.getMessage().contains("Failed to find an index file")); } catch (ConnectException e) { System.err.println("testCreateIndexFileForFtpCram() : WARNING: Unable to run this test as cannot connect to Sanger FTP server"); e.printStackTrace(); } assertNull(createdCramIndexFtpFile); } @Test public void testGetExistingIndexFileForFtpCram() throws Exception { System.out.println("testGetExistingIndexFileForFtpCram(): This test creates index files and may be slow to complete"); // Check getting the index file for a CRAM file with an index for FTP // Should create local copy. // try { File existingCramIndexFtpFile = BamUtils.getIndexFile("ftp://ftp.sanger.ac.uk/pub/project/pathogens/kp11/NV.cram"); assertNotNull(existingCramIndexFtpFile); assertTrue(existingCramIndexFtpFile.exists()); assertTrue(existingCramIndexFtpFile.getName().endsWith(CRAIIndex.CRAI_INDEX_SUFFIX)); assertTrue(existingCramIndexFtpFile.length()>0); } catch (ConnectException e) { System.err.println("testGetExistingIndexFileForFtpCram() : WARNING: Unable to run this test as cannot connect to Sanger FTP server"); e.printStackTrace(); } } }