This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch 2.0.X
in repository https://gitbox.apache.org/repos/asf/mina.git
The following commit(s) were added to refs/heads/2.0.X by this push:
new 82053c792 Fixed the compression-filter
82053c792 is described below
commit 82053c792dfe877e7ae97bcc47b684f04eab7865
Author: emmanuel lecharny <[email protected]>
AuthorDate: Sat Jun 13 21:05:06 2026 +0200
Fixed the compression-filter
---
mina-filter-compression/pom.xml | 4 +-
.../mina/filter/compression/CompressionFilter.java | 3 +-
.../filter/compression/CompressionFilterTest.java | 203 +++++----------------
pom.xml | 9 +
4 files changed, 60 insertions(+), 159 deletions(-)
diff --git a/mina-filter-compression/pom.xml b/mina-filter-compression/pom.xml
index 490d92aa3..c0720b8cc 100644
--- a/mina-filter-compression/pom.xml
+++ b/mina-filter-compression/pom.xml
@@ -45,8 +45,8 @@
</dependency>
<dependency>
- <groupId>org.easymock</groupId>
- <artifactId>easymock</artifactId>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
</dependency>
</dependencies>
diff --git
a/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java
b/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java
index d8c499e8b..bbd51c78d 100644
---
a/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java
+++
b/mina-filter-compression/src/main/java/org/apache/mina/filter/compression/CompressionFilter.java
@@ -261,8 +261,7 @@ public class CompressionFilter extends WriteRequestFilter {
throw new IllegalStateException("Only one " +
CompressionFilter.class + " is permitted.");
}
- Zlib deflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER,
maxDecompressedSize,
- maxDecompressRatio, decompressRatioMinSize);
+ Zlib deflater = new Zlib(compressionLevel, Zlib.MODE_DEFLATER);
Zlib inflater = new Zlib(compressionLevel, Zlib.MODE_INFLATER,
maxDecompressedSize,
maxDecompressRatio, decompressRatioMinSize);
diff --git
a/mina-filter-compression/src/test/java/org/apache/mina/filter/compression/CompressionFilterTest.java
b/mina-filter-compression/src/test/java/org/apache/mina/filter/compression/CompressionFilterTest.java
index 3f5ed3dc8..41e283dab 100644
---
a/mina-filter-compression/src/test/java/org/apache/mina/filter/compression/CompressionFilterTest.java
+++
b/mina-filter-compression/src/test/java/org/apache/mina/filter/compression/CompressionFilterTest.java
@@ -19,188 +19,81 @@
*/
package org.apache.mina.filter.compression;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
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.filterchain.IoFilterChain;
+import org.apache.mina.core.session.AttributeKey;
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;
+import org.mockito.ArgumentCaptor;
/**
* @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;
+ // the sample data to be used for testing
+ private static final String STR_COMPRESS = repeat("The quick brown fox
jumps over the lazy dog. ", 25);
private CompressionFilter filter;
- private Zlib deflater;
-
- private Zlib inflater;
+ private IoSession session;
- private Zlib actualDeflater;
+ private IoFilterChain filterChain;
- private Zlib actualInflater;
+ private NextFilter nextFilter;
- // 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. ";
+ private static String repeat(String value, int count) {
+ StringBuilder builder = new StringBuilder(value.length() * count);
+ for (int i = 0; i < count; i++) {
+ builder.append(value);
+ }
+ return builder.toString();
+ }
@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(StandardCharsets.UTF_8));
- IoBuffer actualOutput = actualDeflater.deflate(buf);
- 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);
+
+ // a mock session whose attributes are stored in a real map, so that
the deflater and inflater
+ // created by onPreAdd() are actually retrieved by filterWrite() and
messageReceived().
+ session = mock(IoSession.class);
+ final Map<Object, Object> attributes = new HashMap<>();
+ when(session.setAttribute(any(), any()))
+ .thenAnswer(invocation ->
attributes.put(invocation.getArgument(0), invocation.getArgument(1)));
+ when(session.getAttribute(any())).thenAnswer(invocation ->
attributes.get(invocation.getArgument(0)));
+ when(session.containsAttribute(any())).thenAnswer(invocation ->
attributes.containsKey(invocation.getArgument(0)));
+ when(session.removeAttribute(any())).thenAnswer(invocation ->
attributes.remove(invocation.getArgument(0)));
+
+ filterChain = mock(IoFilterChain.class);
+ when(filterChain.contains(CompressionFilter.class)).thenReturn(false);
+ when(filterChain.getSession()).thenReturn(session);
+
+ nextFilter = mock(NextFilter.class);
}
- @Test
- public void testDecompression() throws Exception {
- // prepare the input data
- IoBuffer buf =
IoBuffer.wrap(strCompress.getBytes(StandardCharsets.UTF_8));
- IoBuffer byteInput = actualDeflater.deflate(buf);
- IoBuffer actualOutput = actualInflater.inflate(byteInput);
-
- // record all the mock calls
- ioFilterChain.contains(CompressionFilter.class);
- mockIoFilterChain.setReturnValue(false);
+ public void testDeflaterAndInflaterNotSwapped() throws Exception {
+ filter.onPreAdd(filterChain, "CompressionFilter", nextFilter);
+ IoBuffer input =
IoBuffer.wrap(STR_COMPRESS.getBytes(StandardCharsets.UTF_8));
+ Zlib deflater = (Zlib) session.getAttribute(new
AttributeKey(CompressionFilter.class, "deflater"));
+ assertNotNull(deflater);
+ assertThrows(IllegalStateException.class, () ->
deflater.inflate(input));
- 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;
- }
+ Zlib inflater = (Zlib) session.getAttribute(new
AttributeKey(CompressionFilter.class, "inflater"));
+ assertNotNull(inflater);
+ assertThrows(IllegalStateException.class, () ->
inflater.deflate(input));
}
}
diff --git a/pom.xml b/pom.xml
index 3828ff1bf..0915f9fc9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -149,6 +149,7 @@
<!-- Jars -->
<!-- This version of easymock can't be upgraded -->
<version.easymock>2.5.2</version.easymock>
+ <version.mockito>4.11.0</version.mockito>
<version.jboss.javassist>3.8.0.GA</version.jboss.javassist>
<version.jdom>1.0</version.jdom>
<version.jmock>1.2.0</version.jmock>
@@ -317,6 +318,14 @@
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>${version.mockito}</version>
+ <optional>true</optional>
+ <scope>test</scope>
+ </dependency>
+
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-core</artifactId>