1 package org.broadinstitute.hellbender.tools;
2 
3 import htsjdk.samtools.SAMFileHeader;
4 import htsjdk.samtools.SAMRecord;
5 import htsjdk.samtools.SamReader;
6 import htsjdk.samtools.SamReaderFactory;
7 import org.apache.commons.io.FileUtils;
8 import org.broadinstitute.hellbender.CommandLineProgramTest;
9 import org.broadinstitute.hellbender.GATKBaseTest;
10 import org.broadinstitute.hellbender.cmdline.ReadFilterArgumentDefinitions;
11 import org.broadinstitute.hellbender.cmdline.StandardArgumentDefinitions;
12 import org.broadinstitute.hellbender.engine.ReadsDataSource;
13 import org.broadinstitute.hellbender.engine.ReadsPathDataSource;
14 import org.broadinstitute.hellbender.engine.filters.ReadLengthReadFilter;
15 import org.broadinstitute.hellbender.engine.filters.ReadNameReadFilter;
16 import org.broadinstitute.hellbender.exceptions.UserException;
17 import org.broadinstitute.hellbender.testutils.ArgumentsBuilder;
18 import org.broadinstitute.hellbender.testutils.IntegrationTestSpec;
19 import org.broadinstitute.hellbender.testutils.SamAssertionUtils;
20 import org.broadinstitute.hellbender.utils.Utils;
21 import org.broadinstitute.hellbender.utils.gcs.BucketUtils;
22 import org.broadinstitute.hellbender.utils.read.GATKRead;
23 import org.testng.Assert;
24 import org.testng.annotations.DataProvider;
25 import org.testng.annotations.Test;
26 
27 import java.io.File;
28 import java.io.IOException;
29 import java.nio.charset.StandardCharsets;
30 import java.util.*;
31 
32 public abstract class AbstractPrintReadsIntegrationTest extends CommandLineProgramTest {
33 
34     protected static final File TEST_DATA_DIR = getTestDataDir();
35 
doFileToFile(String fileIn, String extOut, String reference, boolean testMD5)36     public void doFileToFile(String fileIn, String extOut, String reference, boolean testMD5) throws Exception {
37         String samFile = fileIn;
38         final File outFile = GATKBaseTest.createTempFile(samFile + ".", extOut);
39         final File ORIG_BAM = new File(TEST_DATA_DIR, samFile);
40         final File refFile;
41 
42         final ArrayList<String> args = new ArrayList<>();
43         args.add("--input"); args.add(ORIG_BAM.getAbsolutePath());
44         args.add("--output"); args.add(outFile.getAbsolutePath());
45         if (reference != null) {
46             refFile = new File(TEST_DATA_DIR, reference);
47             args.add("-R"); args.add(refFile.getAbsolutePath());
48         }
49         else {
50             refFile = null;
51         }
52         if (testMD5) {
53             args.add("--" + StandardArgumentDefinitions.CREATE_OUTPUT_BAM_MD5_LONG_NAME);
54             args.add("true");
55         }
56         runCommandLine(args);
57 
58         SamAssertionUtils.assertSamsEqual(outFile, ORIG_BAM, refFile);
59 
60         if (testMD5) {
61             checkMD5asExpected(outFile);
62         }
63     }
64 
checkMD5asExpected(final File outFile)65     private void checkMD5asExpected(final File outFile) throws IOException {
66         final File md5File = new File(outFile.getAbsolutePath() + ".md5");
67         if (md5File.exists()) {
68             md5File.deleteOnExit();
69         }
70         Assert.assertTrue(md5File.exists(), md5File + " does not exist");
71         final String expectedMD5 = Utils.calculateFileMD5(outFile);
72         final String actualMD5 = FileUtils.readFileToString(md5File, StandardCharsets.UTF_8);
73         Assert.assertEquals(actualMD5, expectedMD5);
74     }
75 
76     @Test(dataProvider="testingData")
testFileToFile(String fileIn, String extOut, String reference)77     public void testFileToFile(String fileIn, String extOut, String reference) throws Exception {
78         doFileToFile(fileIn, extOut, reference, false);
79     }
80 
81     @DataProvider(name="testingData")
testingData()82     public Object[][] testingData() {
83         return new String[][]{
84                 {"print_reads.sam", ".sam", null},
85                 {"print_reads.sam", ".bam", null},
86                 {"print_reads.sam", ".cram", "print_reads.fasta"},
87                 {"print_reads.bam", ".sam", null},
88                 {"print_reads.bam", ".bam", null},
89                 {"print_reads.bam", ".cram", "print_reads.fasta"},
90                 {"print_reads.cram", ".sam", "print_reads.fasta"},
91                 {"print_reads.cram", ".bam", "print_reads.fasta"},
92                 {"print_reads.cram", ".cram", "print_reads.fasta"},
93 
94                 {"print_reads.sorted.sam", ".sam", null},
95                 {"print_reads.sorted.sam", ".bam", null},
96                 {"print_reads.sorted.sam", ".cram", "print_reads.fasta"},
97                 {"print_reads.sorted.bam", ".sam", null},
98                 {"print_reads.sorted.bam", ".bam", null},
99                 {"print_reads.sorted.bam", ".cram", "print_reads.fasta"},
100                 {"print_reads.sorted.cram", ".sam", "print_reads.fasta"},
101                 {"print_reads.sorted.cram", ".bam", "print_reads.fasta"},
102                 {"print_reads.sorted.cram", ".cram", "print_reads.fasta"},
103 
104                 {"print_reads.sorted.queryname.sam", ".sam", null},
105                 {"print_reads.sorted.queryname.sam", ".bam", null},
106                 {"print_reads.sorted.queryname.sam", ".cram", "print_reads.fasta"},
107                 {"print_reads.sorted.queryname.bam", ".sam", null},
108                 {"print_reads.sorted.queryname.bam", ".bam", null},
109                 {"print_reads.sorted.queryname.bam", ".cram", "print_reads.fasta"},
110                 {"print_reads.sorted.queryname.cram", ".sam", "print_reads.fasta"},
111                 {"print_reads.sorted.queryname.cram", ".bam", "print_reads.fasta"},
112                 {"print_reads.sorted.queryname.cram", ".cram", "print_reads.fasta"},
113 
114                 //test queryname-sorted crams with multiref containers in GATK:
115                 //print_reads.sorted.queryname_htsjdk_2.1.0.cram was generated from print_reads.sam
116                 //using gatk4 PrintReads/htsjdk.2.1.0, which includes changes to support
117                 //multireference containers
118                 {"print_reads.sorted.queryname.htsjdk-2.1.0.cram", ".cram", "print_reads.fasta"},
119                 {"print_reads.sorted.queryname.htsjdk-2.1.0.cram", ".sam", "print_reads.fasta"}
120         };
121     }
122 
123     @Test
testReadThatConsumesNoReferenceBases()124     public void testReadThatConsumesNoReferenceBases() throws IOException {
125         final File zeroRefBasesReadBam = new File(TEST_DATA_DIR, "read_consumes_zero_ref_bases.bam");
126         final File outFile = GATKBaseTest.createTempFile("testReadThatConsumesNoReferenceBases", ".bam");
127         final String[] args = new String[] {
128                 "--input" , zeroRefBasesReadBam.getAbsolutePath(),
129                 "--output", outFile.getAbsolutePath()
130         };
131         // Make sure no exception is thrown given an input containing a read that consumes no reference bases
132         runCommandLine(args);
133 
134         //Make sure we print the read, ie not lose it.
135         SamAssertionUtils.assertSamsEqual(outFile, zeroRefBasesReadBam);
136     }
137 
138     @DataProvider(name = "UnmappedReadInclusionTestData")
unmappedReadInclusionTestData()139     public Object[][] unmappedReadInclusionTestData() {
140         // This bam has mapped reads from various contigs, plus a few unmapped reads with no mapped mate
141         final File unmappedBam = new File(publicTestDir + "org/broadinstitute/hellbender/engine/reads_data_source_test1_with_unmapped.bam");
142 
143         // This is a snippet of the CEUTrio.HiSeq.WGS.b37.NA12878 bam from large, with mapped reads
144         // from chromosome 20 (with one mapped read having an unmapped mate), plus several unmapped
145         // reads with no mapped mate.
146         final File ceuSnippet = new File(publicTestDir + "org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.snippet_with_unmapped.bam");
147         final File ceuSnippetCram = new File(publicTestDir + "org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.snippet_with_unmapped.cram");
148 
149         return new Object[][] {
150                 { unmappedBam, null, Arrays.asList("unmapped"), Arrays.asList("u1", "u2", "u3", "u4", "u5") },
151                 // The same interval as above in an intervals file
152                 { unmappedBam, null, Arrays.asList(publicTestDir + "org/broadinstitute/hellbender/engine/reads_data_source_test1_unmapped.intervals"), Arrays.asList("u1", "u2", "u3", "u4", "u5") },
153                 { unmappedBam, null, Arrays.asList("1:200-300", "unmapped"), Arrays.asList("a", "b", "c", "u1", "u2", "u3", "u4", "u5") },
154                 { unmappedBam, null, Arrays.asList("1:200-300", "4:700-701", "unmapped"), Arrays.asList("a", "b", "c", "k", "u1", "u2", "u3", "u4", "u5") },
155                 // The same intervals as above in an intervals file
156                 { unmappedBam, null, Arrays.asList(publicTestDir + "org/broadinstitute/hellbender/engine/reads_data_source_test1_unmapped2.intervals"), Arrays.asList("a", "b", "c", "k", "u1", "u2", "u3", "u4", "u5") },
157                 { ceuSnippet, null, Arrays.asList("unmapped"), Arrays.asList("g", "h", "h", "i", "i") },
158                 { ceuSnippet, null, Arrays.asList("20:10000009-10000011"), Arrays.asList("a", "b", "c", "d", "e") },
159                 { ceuSnippet, null, Arrays.asList("20:10000009-10000011", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "g", "h", "h", "i", "i") },
160                 { ceuSnippet, null, Arrays.asList("20:10000009-10000013", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "f", "f", "g", "h", "h", "i", "i") },
161                 { ceuSnippetCram, b37_reference_20_21, Arrays.asList("unmapped"), Arrays.asList("g", "h", "h", "i", "i") },
162                 { ceuSnippetCram, b37_reference_20_21, Arrays.asList("20:10000009-10000011", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "g", "h", "h", "i", "i") },
163                 { ceuSnippetCram, b37_reference_20_21, Arrays.asList("20:10000009-10000013", "unmapped"), Arrays.asList("a", "b", "c", "d", "e", "f", "f", "g", "h", "h", "i", "i") }
164         };
165     }
166 
167     @Test(dataProvider = "UnmappedReadInclusionTestData")
testUnmappedReadInclusion( final File input, final String reference, final List<String> intervalStrings, final List<String> expectedReadNames )168     public void testUnmappedReadInclusion( final File input, final String reference, final List<String> intervalStrings, final List<String> expectedReadNames ) {
169         final File outFile = createTempFile("testUnmappedReadInclusion", ".bam");
170 
171         final ArgumentsBuilder args = new ArgumentsBuilder();
172         args.addRaw("-I"); args.addRaw(input.getAbsolutePath());
173         args.addRaw("-O"); args.addRaw(outFile.getAbsolutePath());
174         for ( final String intervalString : intervalStrings ) {
175             args.addRaw("-L"); args.addRaw(intervalString);
176         }
177         if ( reference != null ) {
178             args.addRaw("-R"); args.addRaw(reference);
179         }
180 
181         runCommandLine(args);
182 
183         try ( final ReadsDataSource outputReadsSource = new ReadsPathDataSource(outFile.toPath()) ) {
184             final List<GATKRead> actualReads = new ArrayList<>();
185             for ( final GATKRead read : outputReadsSource ) {
186                 actualReads.add(read);
187             }
188 
189             Assert.assertEquals(actualReads.size(), expectedReadNames.size(), "Wrong number of reads output");
190 
191             for ( int readNumber = 0; readNumber < actualReads.size(); ++readNumber ) {
192                 Assert.assertEquals(actualReads.get(readNumber).getName(), expectedReadNames.get(readNumber), "Unexpected read name");
193             }
194         }
195     }
196 
197     @DataProvider(name="readFilterTestData")
testReadFilterData()198     public static Object[][] testReadFilterData() {
199         return new Object[][]{
200                 {"print_reads_one_malformed_read.sam", null, ".sam", Collections.emptyList(), 7},
201                 {"print_reads_one_malformed_read.sam", null, ".sam", Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_TOOL_DEFAULT_READ_FILTERS), 8},
202                 {"print_reads_one_malformed_read.sam", null, ".sam",
203                         Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_READ_FILTER_LONG_NAME, "WellformedReadFilter"), 8},
204                 {"print_reads.sorted.sam", null, ".sam", Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_TOOL_DEFAULT_READ_FILTERS), 8},
205                 {"print_reads.sorted.sam", null, ".sam",
206                         Arrays.asList(
207                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(),
208                                 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter"),
209                         2},
210                 {"print_reads.sorted.sam", null, ".sam",
211                         Arrays.asList(
212                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(),
213                                 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100",
214                                 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "200"),
215                         8},
216                 {"print_reads.sorted.sam", null, ".sam",
217                         Arrays.asList(
218                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(),
219                                 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "1",
220                                 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "10"),
221                         0},
222                 {"print_reads.sorted.sam", null, ".sam",
223                         Arrays.asList(
224                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(),
225                                 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter",
226                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(),
227                                 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100",
228                                 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"),
229                         2},
230                 {"print_reads.sorted.bam", null, ".sam", Arrays.asList("--" + ReadFilterArgumentDefinitions.DISABLE_TOOL_DEFAULT_READ_FILTERS), 8},
231                 {"print_reads.sorted.bam", null, ".sam",
232                         Arrays.asList(
233                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(),
234                                 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter"),
235                         2},
236                 {"print_reads.sorted.bam", null, ".sam",
237                         Arrays.asList(
238                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(),
239                                 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100",
240                                 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"),
241                         8},
242                 {"print_reads.sorted.bam", null, ".sam",
243                         Arrays.asList(
244                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(),
245                                 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter",
246                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(),
247                                 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100",
248                                 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"),
249                         2},
250                 {"print_reads.sorted.cram", "print_reads.fasta", ".sam",
251                         Arrays.asList(
252                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadNameReadFilter.class.getSimpleName(),
253                                 "--" + ReadFilterArgumentDefinitions.READ_NAME_LONG_NAME, "both_reads_align_clip_adapter",
254                                 "--" + ReadFilterArgumentDefinitions.READ_FILTER_LONG_NAME, ReadLengthReadFilter.class.getSimpleName(),
255                                 "--" + ReadFilterArgumentDefinitions.MIN_READ_LENGTH_ARG_NAME, "100",
256                                 "--" + ReadFilterArgumentDefinitions.MAX_READ_LENGTH_ARG_NAME, "101"),
257                         2},
258         };
259     }
260 
261     @Test(dataProvider = "readFilterTestData")
testReadFilters( final String input, final String reference, final String extOut, final List<String> inputArgs, final int expectedCount)262     public void testReadFilters(
263             final String input,
264             final String reference,
265             final String extOut,
266             final List<String> inputArgs,
267             final int expectedCount) throws IOException
268     {
269         final File outFile = createTempFile("testReadFilter", extOut);
270 
271         final ArgumentsBuilder args = new ArgumentsBuilder();
272         args.addRaw("-I"); args.addRaw(new File(TEST_DATA_DIR, input).getAbsolutePath());
273         args.addRaw("-O"); args.addRaw(outFile.getAbsolutePath());
274         if ( reference != null ) {
275             args.addRaw("-R"); args.addRaw(new File(TEST_DATA_DIR, reference).getAbsolutePath());
276         }
277         for (final String filter : inputArgs) {
278             args.addRaw(filter);
279         }
280 
281         runCommandLine(args);
282 
283 
284         SamReaderFactory factory = SamReaderFactory.makeDefault();
285         if (reference != null) {
286             factory = factory.referenceSequence(new File(TEST_DATA_DIR, reference));
287         }
288         int count = 0;
289         try (final SamReader reader = factory.open(outFile)) {
290             Iterator<SAMRecord> it = reader.iterator();
291             while (it.hasNext()) {
292                 SAMRecord rec = it.next();
293                 count++;
294             }
295         }
296         Assert.assertEquals(count, expectedCount);
297     }
298 
299     @Test(expectedExceptions = UserException.MissingReference.class)
testNonExistentReference()300     public void testNonExistentReference() throws Exception {
301         final File inCram = new File(TEST_DATA_DIR, "print_reads.sorted.cram");
302         final File outCram = GATKBaseTest.createTempFile("print_reads_bad_reference", ".cram");
303 
304         ArgumentsBuilder args = new ArgumentsBuilder();
305         args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME);
306         args.addRaw(inCram.getCanonicalPath());
307         args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME);
308         args.addRaw(outCram.getCanonicalPath());
309         args.addRaw("-R");
310         args.addRaw(GATKBaseTest.getSafeNonExistentFile("Nonexistent.fasta").getCanonicalPath());
311 
312         runCommandLine(args.getArgsArray());
313     }
314 
315     @DataProvider
gcsTestingData()316     public Object[][] gcsTestingData() {
317         return new Object[][]{
318                 {"org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.20.21.10000000-10000020.with.unmapped.bam",
319                         ".bam", false, null},
320                 {"org/broadinstitute/hellbender/engine/CEUTrio.HiSeq.WGS.b37.NA12878.20.21.10000000-10000020.with.unmapped.bam",
321                         ".bam", true, null},
322         };
323     }
324 
325     /**
326      * Test GCS access.
327      *
328      * For this to work, the settings in src/main/resources/core-site.xml must be correct,
329      * and the project name and credential file it points to must be present.
330      */
331     @Test(dataProvider = "gcsTestingData", groups = "bucket")
testGCSInputsAndOutputs(final String gcsInput, final String outputExtension, final boolean outputToGCS, final File expectedOutput)332     public void testGCSInputsAndOutputs(final String gcsInput, final String outputExtension,
333                                         final boolean outputToGCS, final File expectedOutput) {
334         final String gcsInputPath = getGCPTestInputPath() + gcsInput;
335         final String outputPrefix = outputToGCS ? getGCPTestStaging() : "testGCSInputsAndOutputs";
336         final String outputPath = BucketUtils.getTempFilePath(outputPrefix, outputExtension);
337 
338         final ArgumentsBuilder argBuilder = new ArgumentsBuilder();
339         argBuilder.add("input", gcsInputPath)
340                 .add("output", outputPath);
341         runCommandLine(argBuilder);
342     }
343 
344     @Test()
testCoordinateSortedInRegion()345     public void testCoordinateSortedInRegion() throws Exception {
346         final File inBam = new File(getTestDataDir(), "print_reads.sorted.bam");
347         final File expectedBam = new File(getTestDataDir(), "print_reads.sorted.chr1_1.bam");
348         final File outBam = GATKBaseTest.createTempFile("print_reads", ".bam");
349         ArgumentsBuilder args = new ArgumentsBuilder();
350         args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME);
351         args.addRaw(inBam.getCanonicalPath());
352         args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME);
353         args.addRaw(outBam.getCanonicalPath());
354         args.addRaw("-L chr7:1-100 -XL chr7:2-100");
355 
356         this.runCommandLine(args.getArgsArray());
357 
358         SamAssertionUtils.assertSamsEqual(outBam, expectedBam);
359     }
360 
361     @Test(expectedExceptions = UserException.IncompatibleSequenceDictionaries.class)
testSequenceDictionaryValidation()362     public void testSequenceDictionaryValidation() throws Exception {
363         final File inCram = new File(getTestDataDir(), "print_reads.sorted.cram");
364         final File inRef = new File(getTestDataDir(), "print_reads.chr1only.fasta");
365         final File outBam = GATKBaseTest.createTempFile("print_reads", ".bam");
366         ArgumentsBuilder args = new ArgumentsBuilder();
367         args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME);
368         args.addRaw(inCram.getCanonicalPath());
369         args.addRaw("-R");
370         args.addRaw(inRef.getCanonicalPath());
371         args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME);
372         args.addRaw(outBam.getCanonicalPath());
373 
374         this.runCommandLine(args.getArgsArray());
375     }
376 
377     @Test()
testUnSorted()378     public void testUnSorted() throws Exception {
379         final File inBam = new File(getTestDataDir(), "print_reads.unsorted.bam");
380         try (ReadsDataSource ds = new ReadsPathDataSource(inBam.toPath())){
381             Assert.assertEquals(ds.getHeader().getSortOrder(), SAMFileHeader.SortOrder.unsorted);
382         }
383         final File outBam = GATKBaseTest.createTempFile("print_reads", ".bam");
384         ArgumentsBuilder args = new ArgumentsBuilder();
385         args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME);
386         args.addRaw(inBam.getCanonicalPath());
387         args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME);
388         args.addRaw(outBam.getCanonicalPath());
389 
390         this.runCommandLine(args.getArgsArray());
391 
392         SamAssertionUtils.assertSamsEqual(outBam, inBam);
393     }
394 
395     @Test()
testReadFiltering()396     public void testReadFiltering() throws IOException {
397         final File samWithOneMalformedRead = new File(getTestDataDir(), "print_reads_one_malformed_read.sam");
398         final File outBam = GATKBaseTest.createTempFile("print_reads_testReadFiltering", ".bam");
399 
400         ArgumentsBuilder args = new ArgumentsBuilder();
401         args.addRaw("--" + StandardArgumentDefinitions.INPUT_LONG_NAME);
402         args.addRaw(samWithOneMalformedRead.getCanonicalPath());
403         args.addRaw("--" + StandardArgumentDefinitions.OUTPUT_LONG_NAME);
404         args.addRaw(outBam.getCanonicalPath());
405 
406         runCommandLine(args.getArgsArray());
407         SamAssertionUtils.assertSamsEqual(outBam, new File(getTestDataDir(), "expected.print_reads_one_malformed_read.bam"));
408     }
409 
410     @Test()
testReadFiltering_asIntegrationTestSpec()411     public void testReadFiltering_asIntegrationTestSpec() throws IOException {
412         final File samWithOneMalformedRead = new File(getTestDataDir(), "print_reads_one_malformed_read.sam");
413 
414         final IntegrationTestSpec spec = new IntegrationTestSpec(
415                 " --" + StandardArgumentDefinitions.INPUT_LONG_NAME + " " + samWithOneMalformedRead.getCanonicalPath() +
416                         " --" + StandardArgumentDefinitions.OUTPUT_LONG_NAME + " " + "%s",
417                 Arrays.asList(new File(getTestDataDir(), "expected.print_reads_one_malformed_read.bam").getCanonicalPath())
418         );
419         spec.executeTest("testReadFiltering_asIntegrationTestSpec", this);
420     }
421 }