Skip to content

Commit 32fa547

Browse files
committed
msgpack#100: Add a test case for pack/unpack large strings
1 parent 2657f07 commit 32fa547

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

msgpack-core/src/main/java/org/msgpack/core/MessagePacker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,9 +334,10 @@ public MessagePacker packString(String s) throws IOException {
334334
// Allocate a larger buffer
335335
int estimatedRemainingSize = Math.max(1, (int) (in.remaining() * encoder.averageBytesPerChar()));
336336
encodeBuffer.flip();
337-
ByteBuffer newBuffer = ByteBuffer.allocate(encodeBuffer.remaining() + estimatedRemainingSize);
337+
ByteBuffer newBuffer = ByteBuffer.allocate(Math.max((int) (encodeBuffer.capacity() * 1.5), encodeBuffer.remaining() + estimatedRemainingSize));
338338
newBuffer.put(encodeBuffer);
339339
encodeBuffer = newBuffer;
340+
encoder.reset();
340341
continue;
341342
}
342343

msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,7 @@ public String unpackString() throws IOException {
827827
if(cr.isOverflow()) {
828828
// The output CharBuffer has insufficient space
829829
readLen = bb.limit() - bb.remaining();
830+
decoder.reset();
830831
}
831832

832833
if(cr.isError()) {

msgpack-core/src/test/scala/org/msgpack/core/MessagePackTest.scala

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ import java.math.BigInteger
1111
*/
1212
class MessagePackTest extends MessagePackSpec with PropertyChecks {
1313

14+
def isValidUTF8(s: String) = {
15+
MessagePack.UTF8.newEncoder().canEncode(s)
16+
}
17+
18+
1419
"MessagePack" should {
1520
"detect fixint values" in {
1621

@@ -125,18 +130,22 @@ class MessagePackTest extends MessagePackSpec with PropertyChecks {
125130

126131
"pack/unpack strings" taggedAs ("string") in {
127132

128-
def isValidUTF8(s: String) = {
129-
MessagePack.UTF8.newEncoder().canEncode(s)
130-
}
131-
132-
133133
forAll { (v: String) =>
134134
whenever(isValidUTF8(v)) {
135135
check(v, _.packString(v), _.unpackString)
136136
}
137137
}
138138
}
139139

140+
"pack/unpack large strings" taggedAs ("large-string") in {
141+
// Large string
142+
val strLen = Seq(1000, 2000, 10000, 50000, 100000, 500000)
143+
for(l <- strLen) {
144+
val v : String = Iterator.continually(Random.nextString(l * 10)).find(isValidUTF8).get
145+
check(v, _.packString(v), _.unpackString)
146+
}
147+
}
148+
140149
"pack/unpack binary" taggedAs ("binary") in {
141150
forAll { (v: Array[Byte]) =>
142151
check(v, { packer => packer.packBinaryHeader(v.length); packer.writePayload(v)}, { unpacker =>

0 commit comments

Comments
 (0)