package picard.util;
import htsjdk.samtools.util.Md5CalculatingInputStream;
import htsjdk.samtools.util.Md5CalculatingOutputStream;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Random;
/**
* Tests for the FifoBuffer class. Generates (deterministically!) random files of certain sizes
* and then pipes them through the FifoBuffer class and checks that input and output MD5s match.
*/
public class FifoBufferTest {
/* Simply invokes the real test method many times with different inputs. */
@Test public void testFifoBuffer() throws IOException {
test(1);
test(2);
test(3);
test(4);
test(5);
test(6);
test(7);
test(8);
test(9);
test(10);
test(10.1345);
test(150);
}
/**
* Writes a file of the given size in megabytes fill with random bytes, initialized using (int) megabytes as the
* seed to the random number generator. Then pipes through FifoBuffer and confirms that output == input via md5.
*/
public void test(final double megabytes) throws IOException {
final File inputFile = File.createTempFile("fifo_input.", ".foo");
// Generate a file with a set number of megabytes of random data
final int nBytes = (int) (megabytes * 1024 * 1024);
{
final Random random = new Random(nBytes);
final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(inputFile));
final int bytesPerWrite = 127;
final byte[] bytes = new byte[bytesPerWrite];
for (int i=0; i<nBytes; i+=bytesPerWrite) {
random.nextBytes(bytes);
out.write(bytes);
}
out.close();
}
// Run the input file through the FifoBuffer and back into another file
final Md5CalculatingInputStream in = new Md5CalculatingInputStream(new FileInputStream(inputFile), null);
final Md5CalculatingOutputStream out = new Md5CalculatingOutputStream(new FileOutputStream("/dev/null"), null);
final PrintStream outStream = new PrintStream(out);
final FifoBuffer buffer = new FifoBuffer(in, outStream);
buffer.BUFFER_SIZE = 128 * 1024 * 1024;
buffer.doWork();
in.close();
out.close();
final String inputMd5 = in.md5();
final String outputMd5 = out.md5();
Assert.assertEquals(outputMd5, inputMd5, "MD5s do not match between input and output.");
inputFile.delete();
}
}