Package lzma.streams

Source Code of lzma.streams.RoundtripTest

/*
*  Copyright (c) 2010-2011 Julien Ponge. All rights reserved.
*
*  Portions Copyright (c) 2011 Tamas Cservenak.
*
*  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 lzma.streams;

import junit.framework.TestCase;
import lzma.sdk.lzma.Decoder;
import lzma.sdk.lzma.Encoder;
import org.apache.commons.io.IOUtils;

import java.io.*;

import static org.apache.commons.io.FileUtils.contentEquals;

public class RoundtripTest
        extends TestCase

{
    public void testEncoderDecoder()
            throws IOException
    {
        System.out.println("Encoder/Decoder roundtrip (low-level API)");
        final File srcDir = new File("target/test-classes");

        performRoundtrip(new File(srcDir, "plaintext.txt"));
        performRoundtrip(new File(srcDir, "ajar.jar"));
        performRoundtrip(new File(srcDir, "doc.pdf"));
    }

    public void testStreamingEncoderDecoder()
            throws Exception
    {
        System.out.println("Stream roundtrip");
        final File srcDir = new File("target/test-classes");

        performStreamRoundtrip(new File(srcDir, "plaintext.txt"));
        performStreamRoundtrip(new File(srcDir, "ajar.jar"));
        performStreamRoundtrip(new File(srcDir, "doc.pdf"));
    }

    public void testAltStreamingEncoderDecoder()
            throws Exception
    {
        System.out.println("alt-Stream roundtrip");
        final File srcDir = new File("target/test-classes");

        performAltStreamRoundtrip(new File(srcDir, "plaintext.txt"));
        performAltStreamRoundtrip(new File(srcDir, "ajar.jar"));
        performAltStreamRoundtrip(new File(srcDir, "doc.pdf"));
    }

    public void performRoundtrip(final File sourceFile)
            throws IOException
    {
        final File compressedFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".coder.lzma");
        final File decompressedFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".coder.unlzma");

        InputStream in = null;
        OutputStream out = null;

        // compressing
        in = new BufferedInputStream(new FileInputStream(sourceFile));
        out = new BufferedOutputStream(new FileOutputStream(compressedFile));

        final Encoder encoder = new Encoder();

        encoder.setDictionarySize(1 << 23);
        encoder.setEndMarkerMode(true);
        encoder.setMatchFinder(Encoder.EMatchFinderTypeBT4);
        encoder.setNumFastBytes(0x20);

        encoder.writeCoderProperties(out);
        long fileSize = sourceFile.length();
        for (int i = 0; i < 8; i++)
        {
            out.write((int) (fileSize >>> (8 * i)) & 0xFF);
        }
        encoder.code(in, out, -1, -1, null);
        out.flush();
        out.close();
        in.close();

        // decompressing
        in = new BufferedInputStream(new FileInputStream(compressedFile));
        out = new BufferedOutputStream(new FileOutputStream(decompressedFile));

        int propertiesSize = 5;
        byte[] properties = new byte[propertiesSize];
        if (in.read(properties, 0, propertiesSize) != propertiesSize)
        {
            throw new IOException("input .lzma file is too short");
        }
        Decoder decoder = new Decoder();
        if (!decoder.setDecoderProperties(properties))
        {
            throw new IOException("Incorrect stream properties");
        }
        long outSize = 0;
        for (int i = 0; i < 8; i++)
        {
            int v = in.read();
            if (v < 0)
            {
                throw new IOException("Can't read stream size");
            }
            outSize |= ((long) v) << (8 * i);
        }
        if (!decoder.code(in, out, outSize))
        {
            throw new IOException("Error in data stream");
        }
        out.flush();
        out.close();
        in.close();

        assertTrue("Source and uncompressed content does not equals!", contentEquals(sourceFile, decompressedFile));
        assertFalse("Source and compressed content equals!", contentEquals(sourceFile, compressedFile));
    }

    public void performStreamRoundtrip(final File sourceFile)
            throws IOException
    {
        final File compressedFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".stream.lzma");
        final File decompressedFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".stream.unlzma");

        InputStream in = null;
        OutputStream out = null;

        // testing with defaults
        in = new BufferedInputStream(new FileInputStream(sourceFile));
        out = new LzmaOutputStream.Builder(new BufferedOutputStream(new FileOutputStream(compressedFile))).build();

        IOUtils.copy(in, out);
        in.close();
        out.close();

        in = new LzmaInputStream(new BufferedInputStream(new FileInputStream(compressedFile)), new Decoder());
        out = new BufferedOutputStream(new FileOutputStream(decompressedFile));

        IOUtils.copy(in, out);
        in.close();
        out.close();

        assertTrue("Source and uncompressed content does not equals!", contentEquals(sourceFile, decompressedFile));
        assertFalse("Source and compressed content equals!", contentEquals(sourceFile, compressedFile));
    }

    public void performAltStreamRoundtrip(final File sourceFile)
            throws Exception
    {
        final File compressedFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".stream.lzma");
        final File decompressedFile = new File(sourceFile.getParentFile(), sourceFile.getName() + ".stream.unlzma");

        InputStream in = null;
        OutputStream out = null;

        // testing with defaults
        System.out.println(" o Stream compression");
        in = new BufferedInputStream(new FileInputStream(sourceFile));
        out =
                new LzmaOutputStream(new BufferedOutputStream(new FileOutputStream(compressedFile)),
                        new LzmaEncoderWrapper.Builder().build());

        IOUtils.copy(in, out);
        in.close();
        out.flush();
        out.close();

        Thread.sleep(1000);

        System.out.println(" o Stream decompression");
        in =
                new LzmaInputStream(new BufferedInputStream(new FileInputStream(compressedFile)),
                        new Decoder());
        out = new BufferedOutputStream(new FileOutputStream(decompressedFile));

        IOUtils.copy(in, out);
        in.close();
        out.close();

        assertTrue("Source and uncompressed content does not equals!", contentEquals(sourceFile, decompressedFile));
        assertFalse("Source and compressed content equals!", contentEquals(sourceFile, compressedFile));
    }

}
TOP

Related Classes of lzma.streams.RoundtripTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.