/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 com.tom_roush.pdfbox.cos; import com.tom_roush.pdfbox.filter.Filter; import com.tom_roush.pdfbox.filter.FilterFactory; import com.tom_roush.pdfbox.io.IOUtils; import junit.framework.TestCase; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Arrays; public class TestCOSStream extends TestCase { /** * Tests encoding of a stream without any filter applied. * * @throws IOException */ public void testUncompressedStreamEncode() throws IOException { byte[] testString = "This is a test string to be used as input for TestCOSStream".getBytes("ASCII"); COSStream stream = createStream(testString, null); validateEncoded(stream, testString); } /** * Tests decoding of a stream without any filter applied. * * @throws IOException */ public void testUncompressedStreamDecode() throws IOException { byte[] testString = "This is a test string to be used as input for TestCOSStream".getBytes("ASCII"); COSStream stream = createStream(testString, null); validateDecoded(stream, testString); } /** * Tests encoding of a stream with one filter applied. * * @throws IOException */ public void testCompressedStream1Encode() throws IOException { byte[] testString = "This is a test string to be used as input for TestCOSStream".getBytes("ASCII"); byte[] testStringEncoded = encodeData(testString, COSName.FLATE_DECODE); COSStream stream = createStream(testString, COSName.FLATE_DECODE); validateEncoded(stream, testStringEncoded); } /** * Tests decoding of a stream with one filter applied. * * @throws IOException */ public void testCompressedStream1Decode() throws IOException { byte[] testString = "This is a test string to be used as input for TestCOSStream".getBytes("ASCII"); byte[] testStringEncoded = encodeData(testString, COSName.FLATE_DECODE); COSStream stream = new COSStream(); OutputStream output = stream.createRawOutputStream(); output.write(testStringEncoded); output.close(); stream.setItem(COSName.FILTER, COSName.FLATE_DECODE); validateDecoded(stream, testString); } /** * Tests encoding of a stream with 2 filters applied. * * @throws IOException */ public void testCompressedStream2Encode() throws IOException { byte[] testString = "This is a test string to be used as input for TestCOSStream".getBytes("ASCII"); byte[] testStringEncoded = encodeData(testString, COSName.FLATE_DECODE); testStringEncoded = encodeData(testStringEncoded, COSName.ASCII85_DECODE); COSArray filters = new COSArray(); filters.add(COSName.ASCII85_DECODE); filters.add(COSName.FLATE_DECODE); COSStream stream = createStream(testString, filters); validateEncoded(stream, testStringEncoded); } /** * Tests decoding of a stream with 2 filters applied. * * @throws IOException */ public void testCompressedStream2Decode() throws IOException { byte[] testString = "This is a test string to be used as input for TestCOSStream".getBytes("ASCII"); byte[] testStringEncoded = encodeData(testString, COSName.FLATE_DECODE); testStringEncoded = encodeData(testStringEncoded, COSName.ASCII85_DECODE); COSStream stream = new COSStream(); COSArray filters = new COSArray(); filters.add(COSName.ASCII85_DECODE); filters.add(COSName.FLATE_DECODE); stream.setItem(COSName.FILTER, filters); OutputStream output = stream.createRawOutputStream(); output.write(testStringEncoded); output.close(); validateDecoded(stream, testString); } private byte[] encodeData(byte[] original, COSName filter) throws IOException { Filter encodingFilter = FilterFactory.INSTANCE.getFilter(filter); ByteArrayOutputStream encoded = new ByteArrayOutputStream(); encodingFilter.encode(new ByteArrayInputStream(original), encoded, new COSDictionary(), 0); return encoded.toByteArray(); } private COSStream createStream(byte[] testString, COSBase filters) throws IOException { COSStream stream = new COSStream(); OutputStream output = stream.createOutputStream(filters); output.write(testString); output.close(); return stream; } private void validateEncoded(COSStream stream, byte[] expected) throws IOException { byte[] decoded = IOUtils.toByteArray(stream.createRawInputStream()); stream.close(); assertTrue("Encoded data doesn't match input", Arrays.equals(expected, decoded)); } private void validateDecoded(COSStream stream, byte[] expected) throws IOException { byte[] encoded = IOUtils.toByteArray(stream.createInputStream()); stream.close(); assertTrue("Decoded data doesn't match input", Arrays.equals(expected, encoded)); } }