blob: b4d05ed5a330527eacb53352ec4e4d63619c28bc [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.java.util.zip;
import junit.framework.TestCase;
import java.io.UnsupportedEncodingException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
public class OldAndroidDeflateTest extends TestCase {
public void testDeflate() throws Exception {
simpleTest();
bigTest(0, 1738149618);
bigTest(1, 934350518);
bigTest(2, -532869390);
}
/*
* Simple inflate/deflate test, taken from the reference docs for the
* Inflater/Deflater classes.
*/
private void simpleTest()
throws UnsupportedEncodingException, DataFormatException {
// Encode a String into bytes
String inputString = "blahblahblah??";
byte[] input = inputString.getBytes("UTF-8");
// Compress the bytes
byte[] output = new byte[100];
Deflater compresser = new Deflater();
compresser.setInput(input);
compresser.finish();
int compressedDataLength = compresser.deflate(output);
// Decompress the bytes
Inflater decompresser = new Inflater();
decompresser.setInput(output, 0, compressedDataLength);
byte[] result = new byte[100];
int resultLength = decompresser.inflate(result);
// Decode the bytes into a String
String outputString = new String(result, 0, resultLength, "UTF-8");
assertEquals(inputString, outputString);
assertEquals(compresser.getAdler(), decompresser.getAdler());
decompresser.end();
}
/*
* "step" determines how compressible the data is.
*
* Note we must set "nowrap" to false, or the Adler-32 doesn't get
* computed.
*/
private void bigTest(int step, int expectedAdler)
throws UnsupportedEncodingException, DataFormatException {
byte[] input = new byte[128 * 1024];
byte[] comp = new byte[128 * 1024 + 512];
byte[] output = new byte[128 * 1024 + 512];
Inflater inflater = new Inflater(false);
Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, false);
createSample(input, step);
compress(deflater, input, comp);
expand(inflater, comp, (int) deflater.getBytesWritten(), output);
assertEquals(inflater.getBytesWritten(), input.length);
assertEquals(deflater.getAdler(), inflater.getAdler());
assertEquals(deflater.getAdler(), expectedAdler);
}
/*
* Create a large data sample.
* stepStep = 0 --> >99% compression
* stepStep = 1 --> ~30% compression
* stepStep = 2 --> no compression
*/
private void createSample(byte[] sample, int stepStep) {
byte val, step;
int i, j, offset;
assertTrue(sample.length >= 128 * 1024);
val = 0;
step = 1;
offset = 0;
for (i = 0; i < (128 * 1024) / 256; i++) {
for (j = 0; j < 256; j++) {
sample[offset++] = val;
val += step;
}
step += stepStep;
}
}
private static final int LOCAL_BUF_SIZE = 256;
/*
* Compress all data in "in" to "out". We use a small window on input
* and output to exercise that part of the code.
*
* It's the caller's responsibility to ensure that "out" has enough
* space.
*/
private void compress(Deflater deflater, byte[] inBuf, byte[] outBuf) {
int inCount = inBuf.length; // use all
int inPosn;
int outPosn;
inPosn = outPosn = 0;
//System.out.println("### starting compress");
while (!deflater.finished()) {
int want = -1, got;
// only read if the input buffer is empty
if (deflater.needsInput() && inCount != 0) {
want = (inCount < LOCAL_BUF_SIZE) ? inCount : LOCAL_BUF_SIZE;
deflater.setInput(inBuf, inPosn, want);
inCount -= want;
inPosn += want;
if (inCount == 0) {
deflater.finish();
}
}
// deflate to current position in output buffer
int compCount;
compCount = deflater.deflate(outBuf, outPosn, LOCAL_BUF_SIZE);
outPosn += compCount;
//System.out.println("Compressed " + want + ", output " + compCount);
}
}
/*
* Expand data from "inBuf" to "outBuf". Uses a small window to better
* exercise the code.
*/
private void expand(Inflater inflater, byte[] inBuf, int inCount,
byte[] outBuf) throws DataFormatException {
int inPosn;
int outPosn;
inPosn = outPosn = 0;
//System.out.println("### starting expand, inCount is " + inCount);
while (!inflater.finished()) {
int want = -1, got;
// only read if the input buffer is empty
if (inflater.needsInput() && inCount != 0) {
want = (inCount < LOCAL_BUF_SIZE) ? inCount : LOCAL_BUF_SIZE;
inflater.setInput(inBuf, inPosn, want);
inCount -= want;
inPosn += want;
}
// inflate to current position in output buffer
int compCount;
compCount = inflater.inflate(outBuf, outPosn, LOCAL_BUF_SIZE);
outPosn += compCount;
//System.out.println("Expanded " + want + ", output " + compCount);
}
}
}