package freenet.client.filter;
import junit.framework.TestCase;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.util.Arrays;
import freenet.support.api.Bucket;
import freenet.support.io.ArrayBucket;
import freenet.support.io.BucketTools;
public class BMPFilterTest extends TestCase {
/** File of size less than 54 bytes */
public void testTooShortImage() throws IOException {
Bucket input = resourceToBucket("./bmp/small.bmp");
filterImage(input, DataFilterException.class);
}
/** Illegal start word (AB instead of BM) */
public void testIllegalStartWord() throws IOException {
Bucket input = resourceToBucket("./bmp/one.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid offset i.e. starting address */
public void testInvalidOffset() throws IOException {
Bucket input = resourceToBucket("./bmp/two.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid size of bitmap info header */
public void testInvalidBitmapInfoHeaderSize() throws IOException {
Bucket input = resourceToBucket("./bmp/three.bmp");
filterImage(input, DataFilterException.class);
}
/** Negative image width */
public void testNegativeImageWidth() throws IOException {
Bucket input = resourceToBucket("./bmp/four.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid number of planes */
public void testInvalidNumberOfPlanes() throws IOException {
Bucket input = resourceToBucket("./bmp/five.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid bit depth */
public void testInvalidBitDepth() throws IOException {
Bucket input = resourceToBucket("./bmp/six.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid compression type */
public void testInvalidCompressionType() throws IOException {
Bucket input = resourceToBucket("./bmp/seven.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid image data size (i.e. not satisfying fileSize = headerSize + imagedatasize) */
public void testInvalidImageDataSize() throws IOException {
Bucket input = resourceToBucket("./bmp/eight.bmp");
filterImage(input, DataFilterException.class);
}
/** Invalid image resolution */
public void testInvalidImageResolution() throws IOException {
Bucket input = resourceToBucket("./bmp/nine.bmp");
filterImage(input, DataFilterException.class);
}
/** File is shorter than expected */
public void testNotEnoughImageData() throws IOException {
Bucket input = resourceToBucket("./bmp/ten.bmp");
filterImage(input, DataFilterException.class);
}
/** Tests valid image */
public void testValidImage() throws IOException {
Bucket input = resourceToBucket("./bmp/ok.bmp");
Bucket output = filterImage(input, null);
//Filter should return the original
assertEquals("Input and output should be the same length", input.size(), output.size());
assertTrue("Input and output are not identical", Arrays.equals(BucketTools.toByteArray(input), BucketTools.toByteArray(output)));
}
/** Checks that the image size calculation works for images with padding */
public void testImageSizeCalculationWithPadding() throws IOException {
Bucket input = resourceToBucket("./bmp/sizeCalculationWithPadding.bmp");
Bucket output = filterImage(input, null);
//Filter should return the original
assertEquals("Input and output should be the same length", input.size(), output.size());
assertTrue("Input and output are not identical", Arrays.equals(BucketTools.toByteArray(input), BucketTools.toByteArray(output)));
}
/** Checks that the image size calculation works for images without padding */
public void testImageSizeCalculationWithoutPadding() throws IOException {
Bucket input = resourceToBucket("./bmp/sizeCalculationWithoutPadding.bmp");
Bucket output = filterImage(input, null);
//Filter should return the original
assertEquals("Input and output should be the same length", input.size(), output.size());
assertTrue("Input and output are not identical", Arrays.equals(BucketTools.toByteArray(input), BucketTools.toByteArray(output)));
}
private Bucket filterImage(Bucket input, Class<? extends Exception> expected) {
BMPFilter objBMPFilter = new BMPFilter();
Bucket output = new ArrayBucket();
InputStream inStream;
OutputStream outStream;
try {
inStream = input.getInputStream();
outStream = output.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
fail("Caugth unexpected IOException: " + e);
return null; //Convince the compiler that we won't continue
}
try {
objBMPFilter.readFilter(inStream, outStream, "", null, null);
if(expected != null) {
fail("Filter didn't throw expected exception");
}
} catch (Exception e) {
if((expected == null) || (!expected.equals(e.getClass()))) {
//Exception is not the one we expected
e.printStackTrace();
fail("Caugth unexpected exception: " + e.getClass() + ": " + e.getMessage());
}
}
try {
inStream.close();
outStream.close();
} catch(IOException e) {
e.printStackTrace();
fail("Caugth unexpected IOException: " + e);
return null; //Convince the compiler that we won't continue
}
return output;
}
private Bucket resourceToBucket(String filename) throws IOException {
InputStream is = getClass().getResourceAsStream(filename);
if (is == null) throw new FileNotFoundException();
Bucket ab = new ArrayBucket();
BucketTools.copyFrom(ab, is, Long.MAX_VALUE);
return ab;
}
}