From 3b69dd7ddb72c2708cf4ae804a8fa9afcc4a2ebc Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Tue, 26 Aug 2008 11:08:55 +0000 Subject: [PATCH] Fixed issue: NETTY-32 (ChannelBuffer.duplicate() sometimes doesn't copy all properties) --- .../netty/buffer/CompositeChannelBuffer.java | 4 ++- .../netty/buffer/SlicedChannelBuffer.java | 4 ++- .../netty/buffer/TruncatedChannelBuffer.java | 4 ++- .../buffer/AbstractChannelBufferTest.java | 35 +++++++++++++++++-- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java b/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java index 007ca4a96d..627ae75f37 100644 --- a/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java +++ b/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java @@ -412,7 +412,9 @@ public class CompositeChannelBuffer extends AbstractChannelBuffer { } public ChannelBuffer duplicate() { - return new CompositeChannelBuffer(this); + ChannelBuffer duplicate = new CompositeChannelBuffer(this); + duplicate.setIndex(readerIndex(), writerIndex()); + return duplicate; } public ChannelBuffer copy(int index, int length) { diff --git a/src/main/java/org/jboss/netty/buffer/SlicedChannelBuffer.java b/src/main/java/org/jboss/netty/buffer/SlicedChannelBuffer.java index 329b9087b6..e3ae6d7516 100644 --- a/src/main/java/org/jboss/netty/buffer/SlicedChannelBuffer.java +++ b/src/main/java/org/jboss/netty/buffer/SlicedChannelBuffer.java @@ -99,7 +99,9 @@ public class SlicedChannelBuffer extends AbstractChannelBuffer implements Wrappe } public ChannelBuffer duplicate() { - return new SlicedChannelBuffer(buffer, adjustment, length); + ChannelBuffer duplicate = new SlicedChannelBuffer(buffer, adjustment, length); + duplicate.setIndex(readerIndex(), writerIndex()); + return duplicate; } public ChannelBuffer copy(int index, int length) { diff --git a/src/main/java/org/jboss/netty/buffer/TruncatedChannelBuffer.java b/src/main/java/org/jboss/netty/buffer/TruncatedChannelBuffer.java index c703ee1816..efdf1ff1b0 100644 --- a/src/main/java/org/jboss/netty/buffer/TruncatedChannelBuffer.java +++ b/src/main/java/org/jboss/netty/buffer/TruncatedChannelBuffer.java @@ -93,7 +93,9 @@ public class TruncatedChannelBuffer extends AbstractChannelBuffer implements Wra } public ChannelBuffer duplicate() { - return new TruncatedChannelBuffer(buffer, length); + ChannelBuffer duplicate = new TruncatedChannelBuffer(buffer, length); + duplicate.setIndex(readerIndex(), writerIndex()); + return duplicate; } public ChannelBuffer copy(int index, int length) { diff --git a/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java b/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java index 153f8b4019..fc074ade24 100644 --- a/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java +++ b/src/test/java/org/jboss/netty/buffer/AbstractChannelBufferTest.java @@ -1238,22 +1238,51 @@ public abstract class AbstractChannelBufferTest { final int writerIndex = CAPACITY * 2 / 3; buffer.setIndex(readerIndex, writerIndex); - // Make sure all properties are cpoied. + // Make sure all properties are copied. ChannelBuffer copy = buffer.copy(); assertEquals(0, copy.readerIndex()); assertEquals(buffer.readableBytes(), copy.writerIndex()); - assertEquals(copy.capacity(), buffer.readableBytes()); + assertEquals(buffer.readableBytes(), copy.capacity()); + assertSame(buffer.order(), copy.order()); for (int i = 0; i < copy.capacity(); i ++) { assertEquals(buffer.getByte(i + readerIndex), copy.getByte(i)); } - // Make sure the buffer contents are independent from each other. + // Make sure the buffer content is independent from each other. buffer.setByte(readerIndex, (byte) (buffer.getByte(readerIndex) + 1)); assertTrue(buffer.getByte(readerIndex) != copy.getByte(0)); copy.setByte(1, (byte) (copy.getByte(1) + 1)); assertTrue(buffer.getByte(readerIndex + 1) != copy.getByte(1)); } + @Test + public void testDuplicate() { + for (int i = 0; i < buffer.capacity(); i ++) { + byte value = (byte) random.nextInt(); + buffer.setByte(i, value); + } + + final int readerIndex = CAPACITY / 3; + final int writerIndex = CAPACITY * 2 / 3; + buffer.setIndex(readerIndex, writerIndex); + + // Make sure all properties are copied. + ChannelBuffer duplicate = buffer.duplicate(); + assertEquals(buffer.readerIndex(), duplicate.readerIndex()); + assertEquals(buffer.writerIndex(), duplicate.writerIndex()); + assertEquals(buffer.capacity(), duplicate.capacity()); + assertSame(buffer.order(), duplicate.order()); + for (int i = 0; i < duplicate.capacity(); i ++) { + assertEquals(buffer.getByte(i), duplicate.getByte(i)); + } + + // Make sure the buffer content is shared. + buffer.setByte(readerIndex, (byte) (buffer.getByte(readerIndex) + 1)); + assertTrue(buffer.getByte(readerIndex) == duplicate.getByte(readerIndex)); + duplicate.setByte(1, (byte) (duplicate.getByte(1) + 1)); + assertTrue(buffer.getByte(1) == duplicate.getByte(1)); + } + @Test public void testEquals() { assertFalse(buffer.equals(null));