Fixed issue: NETTY-32 (ChannelBuffer.duplicate() sometimes doesn't copy all properties)
This commit is contained in:
parent
a57e21aee7
commit
3b69dd7ddb
@ -412,7 +412,9 @@ public class CompositeChannelBuffer extends AbstractChannelBuffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ChannelBuffer duplicate() {
|
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) {
|
public ChannelBuffer copy(int index, int length) {
|
||||||
|
@ -99,7 +99,9 @@ public class SlicedChannelBuffer extends AbstractChannelBuffer implements Wrappe
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ChannelBuffer duplicate() {
|
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) {
|
public ChannelBuffer copy(int index, int length) {
|
||||||
|
@ -93,7 +93,9 @@ public class TruncatedChannelBuffer extends AbstractChannelBuffer implements Wra
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ChannelBuffer duplicate() {
|
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) {
|
public ChannelBuffer copy(int index, int length) {
|
||||||
|
@ -1238,22 +1238,51 @@ public abstract class AbstractChannelBufferTest {
|
|||||||
final int writerIndex = CAPACITY * 2 / 3;
|
final int writerIndex = CAPACITY * 2 / 3;
|
||||||
buffer.setIndex(readerIndex, writerIndex);
|
buffer.setIndex(readerIndex, writerIndex);
|
||||||
|
|
||||||
// Make sure all properties are cpoied.
|
// Make sure all properties are copied.
|
||||||
ChannelBuffer copy = buffer.copy();
|
ChannelBuffer copy = buffer.copy();
|
||||||
assertEquals(0, copy.readerIndex());
|
assertEquals(0, copy.readerIndex());
|
||||||
assertEquals(buffer.readableBytes(), copy.writerIndex());
|
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 ++) {
|
for (int i = 0; i < copy.capacity(); i ++) {
|
||||||
assertEquals(buffer.getByte(i + readerIndex), copy.getByte(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));
|
buffer.setByte(readerIndex, (byte) (buffer.getByte(readerIndex) + 1));
|
||||||
assertTrue(buffer.getByte(readerIndex) != copy.getByte(0));
|
assertTrue(buffer.getByte(readerIndex) != copy.getByte(0));
|
||||||
copy.setByte(1, (byte) (copy.getByte(1) + 1));
|
copy.setByte(1, (byte) (copy.getByte(1) + 1));
|
||||||
assertTrue(buffer.getByte(readerIndex + 1) != copy.getByte(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
|
@Test
|
||||||
public void testEquals() {
|
public void testEquals() {
|
||||||
assertFalse(buffer.equals(null));
|
assertFalse(buffer.equals(null));
|
||||||
|
Loading…
Reference in New Issue
Block a user