package org.archive.format.gzip;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.archive.util.ByteOp;
import org.archive.util.IAUtils;
import org.archive.util.TestUtils;
import org.archive.format.gzip.GZIPFormatException;
import org.archive.format.gzip.GZIPMemberSeries;
import org.archive.format.gzip.GZIPSeriesMember;
import org.archive.streamcontext.ByteArrayWrappedStream;
import org.archive.streamcontext.SimpleStream;
import org.archive.streamcontext.Stream;
import com.google.common.io.ByteStreams;
import com.google.common.primitives.Bytes;
import junit.framework.TestCase;
public class GZIPMemberSeriesTest extends TestCase {
public void testSingle() throws IndexOutOfBoundsException, FileNotFoundException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
ByteArrayInputStream bais = new ByteArrayInputStream(abcd);
Stream stream = new SimpleStream(bais);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
TestUtils.assertStreamEquals(m,"abcd".getBytes(IAUtils.UTF8));
assertNull(s.getNextMember());
}
public void testSingleEmpty() throws IndexOutOfBoundsException, FileNotFoundException, IOException {
InputStream is = getClass().getResourceAsStream("empty.gz");
byte empty[] = ByteStreams.toByteArray(is);
ByteArrayInputStream bais = new ByteArrayInputStream(empty);
Stream stream = new SimpleStream(bais);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
int got = m.read();
assertEquals(-1,got);
assertTrue(m.gotEOR());
assertFalse(m.gotGZipError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
assertNull(s.getNextMember());
assertTrue(s.gotEOF());
}
public void testDouble() throws IndexOutOfBoundsException, FileNotFoundException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
byte abcd2[] = ByteOp.append(abcd, abcd);
ByteArrayInputStream bais = new ByteArrayInputStream(abcd2);
Stream stream = new SimpleStream(bais);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
TestUtils.assertStreamEquals(m,"abcd".getBytes(IAUtils.UTF8));
m = s.getNextMember();
assertNotNull(m);
assertEquals(abcd.length,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
TestUtils.assertStreamEquals(m,"abcd".getBytes(IAUtils.UTF8));
assertNull(s.getNextMember());
}
public void testSingleCRCStrict() throws IndexOutOfBoundsException, FileNotFoundException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
byte oldb = abcd[abcd.length-1];
abcd[abcd.length-1] = (byte) (abcd[abcd.length-1] + 1);
assertFalse(oldb == abcd[abcd.length-1]);
ByteArrayInputStream bais = new ByteArrayInputStream(abcd);
Stream stream = new SimpleStream(bais);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
Exception e = null;
try {
ByteStreams.toByteArray(m);
} catch(IOException gotEx) {
e = gotEx;
}
assertNotNull(e);
assertTrue(m.gotEOR());
assertTrue(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertTrue(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNotNull(e);
}
public void testSingleCRCLAX() throws IndexOutOfBoundsException, FileNotFoundException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
byte oldb = abcd[abcd.length-1];
abcd[abcd.length-1] = (byte) (abcd[abcd.length-1] + 1);
assertFalse(oldb == abcd[abcd.length-1]);
ByteArrayInputStream bais = new ByteArrayInputStream(abcd);
Stream stream = new SimpleStream(bais);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0, false);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
Exception e = null;
try {
ByteStreams.toByteArray(m);
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNotNull(e);
assertTrue(m.gotEOR());
assertTrue(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNull(e);
assertNull(s.getNextMember());
}
public void testDoubleCRC1LAX() throws IndexOutOfBoundsException, FileNotFoundException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
byte abcdorig[] = ByteOp.copy(abcd);
byte oldb = abcd[abcd.length-1];
abcd[abcd.length-1] = (byte) (abcd[abcd.length-1] + 1);
assertFalse(oldb == abcd[abcd.length-1]);
byte both[] = Bytes.concat(abcd,abcdorig);
ByteArrayInputStream bais = new ByteArrayInputStream(both);
Stream stream = new SimpleStream(bais);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0, false);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
Exception e = null;
try {
ByteStreams.toByteArray(m);
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNotNull(e);
assertTrue(m.gotEOR());
assertTrue(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNull(e);
assertNotNull(m);
TestUtils.assertStreamEquals(m,"abcd".getBytes(IAUtils.UTF8));
}
public void testSingleDeflateError() throws IndexOutOfBoundsException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
// int permuteIdx = 15;
// byte oldb = abcd[permuteIdx];
// abcd[permuteIdx] = (byte) (abcd[permuteIdx] + 1);
// assertFalse(oldb == abcd[permuteIdx]);
abcd[10] = 0;
abcd[11] = 0;
abcd[12] = 0;
abcd[13] = 0;
abcd[14] = 0;
// ByteArrayInputStream bais = new ByteArrayInputStream(abcd);
// Stream stream = new SimpleStream(bais);
Stream stream = new ByteArrayWrappedStream(abcd);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0, false);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
Exception e = null;
try {
ByteStreams.toByteArray(m);
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNotNull(e);
assertFalse(m.gotEOR());
assertTrue(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNull(e);
assertNull(m);
}
public void testDoubleDeflateError() throws IndexOutOfBoundsException, IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
byte both[] = Bytes.concat(abcd,abcd);
// int permuteIdx = 15;
// byte oldb = abcd[permuteIdx];
// abcd[permuteIdx] = (byte) (abcd[permuteIdx] + 1);
// assertFalse(oldb == abcd[permuteIdx]);
both[10] = 0;
both[11] = 0;
both[12] = 0;
both[13] = 0;
both[14] = 0;
// ByteArrayInputStream bais = new ByteArrayInputStream(abcd);
// Stream stream = new SimpleStream(bais);
Stream stream = new ByteArrayWrappedStream(both);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0, false);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
Exception e = null;
try {
ByteStreams.toByteArray(m);
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNotNull(e);
assertFalse(m.gotEOR());
assertTrue(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNull(e);
assertNotNull(m);
TestUtils.assertStreamEquals(m,"abcd".getBytes(IAUtils.UTF8));
assertNull(s.getNextMember());
assertTrue(s.gotEOF());
assertFalse(s.gotIOError());
}
public void testDoubleBiggerDeflateErrOnFirst() throws IOException {
String resource = "double-single-inflate-error.gz";
InputStream is = getClass().getResourceAsStream(resource);
byte full[] = ByteStreams.toByteArray(is);
Stream stream = new ByteArrayWrappedStream(full);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0, false);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
Exception e = null;
try {
ByteStreams.toByteArray(m);
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNotNull(e);
// assertFalse(m.gotEOR());
assertTrue(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNull(e);
assertNotNull(m);
try {
ByteStreams.toByteArray(m);
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNull(e);
assertTrue(m.gotEOR());
assertFalse(m.gotGZipError());
}
public void testAutoSkip() throws IOException {
InputStream is = getClass().getResourceAsStream("abcd.gz");
byte abcd[] = ByteStreams.toByteArray(is);
byte both[] = Bytes.concat(abcd,abcd);
Stream stream = new ByteArrayWrappedStream(both);
GZIPMemberSeries s = new GZIPMemberSeries(stream, "unk", 0, false);
GZIPSeriesMember m = s.getNextMember();
assertNotNull(m);
assertEquals(0,m.getRecordStartOffset());
assertEquals(10,m.getCompressedBytesRead());
assertFalse(m.gotEOR());
assertTrue(-1 != m.read());
assertFalse(m.gotEOR());
// auto-skip
m = s.getNextMember();
assertNotNull(m);
Exception e = null;
try {
TestUtils.assertStreamEquals(m,"abcd".getBytes(IAUtils.UTF8));
} catch(GZIPFormatException gotEx) {
e = gotEx;
}
assertNull(e);
assertTrue(m.gotEOR());
assertFalse(m.gotGZipError());
assertFalse(m.gotIOError());
assertFalse(s.gotEOF());
assertFalse(s.gotIOError());
e = null;
try {
m = s.getNextMember();
} catch(IOException gotEx) {
e = gotEx;
}
assertNull(e);
assertNull(m);
assertTrue(s.gotEOF());
}
}