blob: a0dfd216b5d0576a778b566b81812002937d04d6 [file] [log] [blame]
/*
* 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.
*/
#include "DeflaterOutputStreamTest.h"
#include <decaf/util/zip/DeflaterOutputStream.h>
#include <decaf/util/zip/InflaterInputStream.h>
#include <decaf/io/ByteArrayOutputStream.h>
#include <decaf/io/ByteArrayInputStream.h>
#include <decaf/util/zip/Deflater.h>
#include <decaf/util/zip/Inflater.h>
#include <decaf/util/zip/Adler32.h>
#include <decaf/util/zip/CRC32.h>
#include <decaf/lang/Integer.h>
#include <decaf/lang/exceptions/IndexOutOfBoundsException.h>
#include <vector>
using namespace std;
using namespace decaf;
using namespace decaf::io;
using namespace decaf::lang;
using namespace decaf::lang::exceptions;
using namespace decaf::util;
using namespace decaf::util::zip;
////////////////////////////////////////////////////////////////////////////////
namespace {
class MyDeflaterOutputStream : public DeflaterOutputStream {
private:
bool deflateFlag;
public:
MyDeflaterOutputStream(OutputStream* out) : DeflaterOutputStream(out), deflateFlag(false) {}
MyDeflaterOutputStream(OutputStream* out, Deflater* defl) :
DeflaterOutputStream(out, defl), deflateFlag(false) {
}
MyDeflaterOutputStream(OutputStream* out, Deflater* defl, int size) :
DeflaterOutputStream(out, defl, size), deflateFlag(false) {
}
virtual ~MyDeflaterOutputStream() {}
std::vector<unsigned char>& getProtectedBuf() {
return buf;
}
bool getDaflateFlag() const {
return deflateFlag;
}
protected:
void deflate() {
deflateFlag = true;
DeflaterOutputStream::deflate();
}
};
}
////////////////////////////////////////////////////////////////////////////////
DeflaterOutputStreamTest::DeflaterOutputStreamTest() : outputBuffer() {
}
////////////////////////////////////////////////////////////////////////////////
DeflaterOutputStreamTest::~DeflaterOutputStreamTest() {
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::tearDown() {
this->outputBuffer.clear();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::setUp() {
this->outputBuffer.clear();
this->outputBuffer.resize( 500 );
// setting up a deflater to be used
unsigned char byteArray[] = { 1, 3, 4, 7, 8 };
int x = 0;
Deflater deflate( 1 );
deflate.setInput( byteArray, 5, 0, 5 );
while( !( deflate.needsInput() ) ) {
x += deflate.deflate( outputBuffer, x, (int)outputBuffer.size() - x );
}
deflate.finish();
while( !( deflate.finished() ) ) {
x = x + deflate.deflate( outputBuffer, x, (int)outputBuffer.size() - x );
}
deflate.end();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testConstructorOutputStreamDeflater() {
unsigned char byteArray[] = { 1, 3, 4, 7, 8 };
ByteArrayOutputStream baos;
Deflater* nullDeflater = NULL;
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NullPointerException",
DeflaterOutputStream( &baos, nullDeflater ),
NullPointerException );
Deflater defl;
MyDeflaterOutputStream dos( &baos, &defl );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Buffer Size for new DeflaterOutputStream",
(std::size_t)512, dos.getProtectedBuf().size() );
dos.write( byteArray, 5 );
dos.close();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testConstructorOutputStream() {
ByteArrayOutputStream baos;
MyDeflaterOutputStream dos( &baos );
// Test to see if DeflaterOutputStream was created with the correct
// buffer.
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Buffer Size",
(std::size_t)512, dos.getProtectedBuf().size() );
dos.write( &outputBuffer[0], (int)outputBuffer.size() );
dos.close();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testConstructorOutputStreamDeflaterI() {
int buf = 5;
int zeroBuf = 0;
unsigned char byteArray[] = { 1, 3, 4, 7, 8, 3, 6 };
ByteArrayOutputStream baos;
Deflater* nullDeflater = NULL;
// Test for a null Deflater.
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a NullPointerException",
DeflaterOutputStream( &baos, nullDeflater, buf ),
NullPointerException );
Deflater defl;
// Test for a zero buf.
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IllegalArgumentException",
DeflaterOutputStream( &baos, &defl, zeroBuf ),
IllegalArgumentException );
// Test to see if DeflaterOutputStream was created with the correct
// buffer.
MyDeflaterOutputStream dos( &baos, &defl, buf );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Buffer Size for new DeflaterOutputStream",
(std::size_t)5, dos.getProtectedBuf().size() );
dos.write( byteArray, 7, 0, 7 );
dos.close();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testClose() {
ByteArrayOutputStream baos;
DeflaterOutputStream dos( &baos );
unsigned char byteArray[] = { 1, 3, 4, 6 };
dos.write( byteArray, 4 );
dos.close();
std::pair<const unsigned char*, int> array = baos.toByteArray();
ByteArrayInputStream bais( array.first, array.second, true );
InflaterInputStream iis( &bais );
// Test to see if the finish method wrote the bytes to the file.
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 1, iis.read());
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 3, iis.read());
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 4, iis.read());
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 6, iis.read());
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", -1, iis.read());
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", -1, iis.read());
iis.close();
// Test for a zero buf.
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown a IOException",
dos.write( 5 ),
IOException );
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testFinish() {
ByteArrayOutputStream baos;
DeflaterOutputStream dos( &baos );
unsigned char byteArray[] = { 1, 3, 4, 6 };
dos.write( byteArray, 4 );
dos.finish();
// Test to see if the same FileOutputStream can be used with the
// DeflaterOutputStream after finish is called.
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown an IOException",
dos.write( 1 ),
IOException );
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testWriteI() {
ByteArrayOutputStream baos;
DeflaterOutputStream dos( &baos );
for( int i = 0; i < 3; i++ ) {
dos.write( (unsigned char)i );
}
dos.close();
std::pair<const unsigned char*, int> array = baos.toByteArray();
ByteArrayInputStream bais( array.first, array.second, true );
InflaterInputStream iis( &bais );
for( int i = 0; i < 3; i++ ) {
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", i, iis.read() );
}
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned (EOF).", -1, iis.read() );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned (EOF).", -1, iis.read() );
iis.close();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testWriteBIII() {
unsigned char byteArray[] = { 1, 3, 4, 7, 8, 3, 6 };
// Test to see if the correct bytes are saved.
ByteArrayOutputStream baos;
DeflaterOutputStream dos1( &baos );
dos1.write( byteArray, 7, 2, 3 );
dos1.close();
std::pair<const unsigned char*, int> array = baos.toByteArray();
ByteArrayInputStream bais( array.first, array.second, true );
InflaterInputStream iis( &bais );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 4, iis.read() );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 7, iis.read() );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned.", 8, iis.read() );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned (EOF).", -1, iis.read() );
CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect Byte Returned (EOF).", -1, iis.read() );
iis.close();
// Test for trying to write more bytes than available from the array
ByteArrayOutputStream baos2;
DeflaterOutputStream dos2( &baos2 );
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown an IndexOutOfBoundsException",
dos2.write( byteArray, 7, 2, 10 ),
IndexOutOfBoundsException );
// Test for trying to start writing from a unsigned char > than the array
// size.
CPPUNIT_ASSERT_THROW_MESSAGE(
"Should have thrown an IndexOutOfBoundsException",
dos2.write( byteArray, 7, 2, 10 ),
IndexOutOfBoundsException );
dos2.close();
}
////////////////////////////////////////////////////////////////////////////////
void DeflaterOutputStreamTest::testDeflate() {
ByteArrayOutputStream baos;
MyDeflaterOutputStream dos( &baos );
CPPUNIT_ASSERT( !dos.getDaflateFlag() );
for( int i = 0; i < 3; i++ ) {
dos.write( (unsigned char)i );
}
CPPUNIT_ASSERT( dos.getDaflateFlag() );
dos.close();
}