blob: 5b097c55e4a9caf0abecbdf3b61941683396aa73 [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.
*
*/
package org.apache.mina.filter.compression;
import static org.junit.Assert.assertTrue;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.filterchain.IoFilterChain;
import org.apache.mina.core.filterchain.IoFilter.NextFilter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.DefaultWriteRequest;
import org.apache.mina.core.write.WriteRequest;
import org.easymock.AbstractMatcher;
import org.easymock.MockControl;
import org.junit.Before;
import org.junit.Test;
/**
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*/
public class CompressionFilterTest {
private MockControl mockSession;
private MockControl mockNextFilter;
private MockControl mockIoFilterChain;
private IoSession session;
private NextFilter nextFilter;
private IoFilterChain ioFilterChain;
private CompressionFilter filter;
private Zlib deflater;
private Zlib inflater;
private Zlib actualDeflater;
private Zlib actualInflater;
// the sample data to be used for testing
String strCompress = "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. "
+ "The quick brown fox jumps over the lazy dog. " + "The quick brown fox jumps over the lazy dog. ";
@Before
public void setUp() {
// create the necessary mock controls.
mockSession = MockControl.createControl(IoSession.class);
mockNextFilter = MockControl.createControl(NextFilter.class);
mockIoFilterChain = MockControl.createControl(IoFilterChain.class);
// set the default matcher
mockNextFilter.setDefaultMatcher(new DataMatcher());
session = (IoSession) mockSession.getMock();
nextFilter = (NextFilter) mockNextFilter.getMock();
ioFilterChain = (IoFilterChain) mockIoFilterChain.getMock();
// create an instance of the filter
filter = new CompressionFilter(CompressionFilter.COMPRESSION_MAX);
// deflater and inflater that will be used by the filter
deflater = new Zlib(Zlib.COMPRESSION_MAX, Zlib.MODE_DEFLATER);
inflater = new Zlib(Zlib.COMPRESSION_MAX, Zlib.MODE_INFLATER);
// create instances of the deflater and inflater to help test the output
actualDeflater = new Zlib(Zlib.COMPRESSION_MAX, Zlib.MODE_DEFLATER);
actualInflater = new Zlib(Zlib.COMPRESSION_MAX, Zlib.MODE_INFLATER);
}
@Test
public void testCompression() throws Exception {
// prepare the input data
IoBuffer buf = IoBuffer.wrap(strCompress.getBytes("UTF8"));
IoBuffer actualOutput = actualDeflater.deflate(buf);
buf.flip();
WriteRequest writeRequest = new DefaultWriteRequest(buf);
// record all the mock calls
ioFilterChain.contains(CompressionFilter.class);
mockIoFilterChain.setReturnValue(false);
ioFilterChain.getSession();
mockIoFilterChain.setReturnValue(session);
session.setAttribute(CompressionFilter.class.getName() + ".Deflater", deflater);
mockSession.setDefaultMatcher(new DataMatcher());
mockSession.setReturnValue(null, MockControl.ONE);
session.setAttribute(CompressionFilter.class.getName() + ".Inflater", inflater);
mockSession.setReturnValue(null, MockControl.ONE);
session.containsAttribute(CompressionFilter.DISABLE_COMPRESSION_ONCE);
mockSession.setReturnValue(false);
session.getAttribute(CompressionFilter.class.getName() + ".Deflater");
mockSession.setReturnValue(deflater);
nextFilter.filterWrite(session, new DefaultWriteRequest(actualOutput));
// switch to playback mode
mockSession.replay();
mockIoFilterChain.replay();
mockNextFilter.replay();
// make the actual calls on the filter
filter.onPreAdd(ioFilterChain, "CompressionFilter", nextFilter);
filter.filterWrite(nextFilter, session, writeRequest);
// verify that all the calls happened as recorded
mockNextFilter.verify();
assertTrue(true);
}
@Test
public void testDecompression() throws Exception {
// prepare the input data
IoBuffer buf = IoBuffer.wrap(strCompress.getBytes("UTF8"));
IoBuffer byteInput = actualDeflater.deflate(buf);
IoBuffer actualOutput = actualInflater.inflate(byteInput);
// record all the mock calls
ioFilterChain.contains(CompressionFilter.class);
mockIoFilterChain.setReturnValue(false);
ioFilterChain.getSession();
mockIoFilterChain.setReturnValue(session);
session.setAttribute(CompressionFilter.class.getName() + ".Deflater", deflater);
mockSession.setDefaultMatcher(new DataMatcher());
mockSession.setReturnValue(null, MockControl.ONE);
session.setAttribute(CompressionFilter.class.getName() + ".Inflater", inflater);
mockSession.setReturnValue(null, MockControl.ONE);
session.getAttribute(CompressionFilter.class.getName() + ".Inflater");
mockSession.setReturnValue(inflater);
nextFilter.messageReceived(session, actualOutput);
// switch to playback mode
mockSession.replay();
mockIoFilterChain.replay();
mockNextFilter.replay();
// make the actual calls on the filter
filter.onPreAdd(ioFilterChain, "CompressionFilter", nextFilter);
filter.messageReceived(nextFilter, session, byteInput);
// verify that all the calls happened as recorded
mockNextFilter.verify();
assertTrue(true);
}
/**
* A matcher used to check if the actual and expected outputs matched
*/
class DataMatcher extends AbstractMatcher {
@Override
protected boolean argumentMatches(Object arg0, Object arg1) {
// we need to only verify the ByteBuffer output
if (arg0 instanceof WriteRequest) {
WriteRequest expected = (WriteRequest) arg0;
WriteRequest actual = (WriteRequest) arg1;
IoBuffer bExpected = (IoBuffer) expected.getMessage();
IoBuffer bActual = (IoBuffer) actual.getMessage();
return bExpected.equals(bActual);
}
return true;
}
}
}