PROTON-1966: ensure the position is always reset on return
diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java b/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
index c614e39..1441dcb 100644
--- a/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
+++ b/proton-j/src/main/java/org/apache/qpid/proton/codec/CompositeReadableBuffer.java
@@ -839,17 +839,18 @@
return false;
}
- final int currentPos = position();
-
- for (int i = buffer.position(); hasRemaining(); i++) {
- if (!equals(this.get(), buffer.get(i))) {
- return false;
+ final int origPos = position();
+ try {
+ for (int i = buffer.position(); hasRemaining(); i++) {
+ if (!equals(this.get(), buffer.get(i))) {
+ return false;
+ }
}
+
+ return true;
+ } finally {
+ position(origPos);
}
-
- position(currentPos);
-
- return true;
}
@Override
diff --git a/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java b/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
index 86ee4ab..1e8e731 100644
--- a/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
+++ b/proton-j/src/test/java/org/apache/qpid/proton/codec/CompositeReadableBufferTest.java
@@ -3464,6 +3464,8 @@
buffer.append(data);
assertEquals(buffer, buffer);
+
+ assertEquals(0, buffer.position());
}
@Test
@@ -3481,6 +3483,10 @@
assertEquals(buffer1, buffer2);
assertEquals(buffer2, buffer3);
assertEquals(buffer3, buffer1);
+
+ assertEquals(0, buffer1.position());
+ assertEquals(0, buffer2.position());
+ assertEquals(0, buffer3.position());
}
@Test
@@ -3495,6 +3501,9 @@
buffer2.append(data2);
assertNotEquals(buffer1, buffer2);
+
+ assertEquals(0, buffer1.position());
+ assertEquals(0, buffer2.position());
}
@Test
@@ -3509,6 +3518,9 @@
buffer2.append(data2).append(data1);
assertNotEquals(buffer1, buffer2);
+
+ assertEquals(0, buffer1.position());
+ assertEquals(0, buffer2.position());
}
@Test
@@ -3523,6 +3535,79 @@
buffer2.append(data1).append(data2);
assertEquals(buffer1, buffer2);
+
+ assertEquals(0, buffer1.position());
+ assertEquals(0, buffer2.position());
+ }
+
+ @Test
+ public void testEqualsWhenContentRemainingWithDifferentStartPositionsSame() throws CharacterCodingException {
+ doEqualsWhenContentRemainingWithDifferentStartPositionsSameTestImpl(false);
+ }
+
+ @Test
+ public void testEqualsWhenContentRemainingWithDifferentStartPositionsSameMultipleArrays() throws CharacterCodingException {
+ doEqualsWhenContentRemainingWithDifferentStartPositionsSameTestImpl(true);
+ }
+
+ private void doEqualsWhenContentRemainingWithDifferentStartPositionsSameTestImpl(boolean multipleArrays) {
+ CompositeReadableBuffer buffer1 = new CompositeReadableBuffer();
+ CompositeReadableBuffer buffer2 = new CompositeReadableBuffer();
+
+ byte[] data1 = new byte[] {-1, -1, 0, 1, 2, 3, 4, 5};
+ byte[] data2 = new byte[] {-1, -1, -1, 0, 1, 2, 3, 4, 5};
+
+ buffer1.append(data1);
+ buffer1.position(2);
+
+ buffer2.append(data2);
+ buffer2.position(3);
+
+ if (multipleArrays) {
+ byte[] data3 = new byte[] { 5, 4, 3, 2, 1 };
+ buffer1.append(data3);
+ buffer2.append(data3);
+ }
+
+ assertEquals(buffer1, buffer2);
+
+ assertEquals(2, buffer1.position());
+ assertEquals(3, buffer2.position());
+ }
+
+ @Test
+ public void testEqualsWhenContentRemainingWithDifferentStartPositionsNotSame() throws CharacterCodingException {
+ doEqualsWhenContentRemainingWithDifferentStartPositionsNotSameTestImpl(false);
+ }
+
+ @Test
+ public void testEqualsWhenContentRemainingWithDifferentStartPositionsNotSameMultipleArrays() throws CharacterCodingException {
+ doEqualsWhenContentRemainingWithDifferentStartPositionsNotSameTestImpl(true);
+ }
+
+ private void doEqualsWhenContentRemainingWithDifferentStartPositionsNotSameTestImpl(boolean multipleArrays) {
+ CompositeReadableBuffer buffer1 = new CompositeReadableBuffer();
+ CompositeReadableBuffer buffer2 = new CompositeReadableBuffer();
+
+ byte[] data1 = new byte[] {-1, -1, 0, 1, 2, 3, 4, 5};
+ byte[] data2 = new byte[] {-1, -1, -1, 0, 1, 2, 3, 4, -1};
+
+ buffer1.append(data1);
+ buffer1.position(2);
+
+ buffer2.append(data2);
+ buffer2.position(3);
+
+ if (multipleArrays) {
+ byte[] data3 = new byte[] { 5, 4, 3, 2, 1 };
+ buffer1.append(data3);
+ buffer2.append(data3);
+ }
+
+ assertNotEquals(buffer1, buffer2);
+
+ assertEquals(2, buffer1.position());
+ assertEquals(3, buffer2.position());
}
//----- Utility Methods --------------------------------------------------//