diff --git a/src/main/java/io/lettuce/core/output/ObjectOutput.java b/src/main/java/io/lettuce/core/output/ObjectOutput.java index 27710910a0..0f39842763 100644 --- a/src/main/java/io/lettuce/core/output/ObjectOutput.java +++ b/src/main/java/io/lettuce/core/output/ObjectOutput.java @@ -1,7 +1,6 @@ package io.lettuce.core.output; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Deque; @@ -42,11 +41,6 @@ public ObjectOutput(RedisCodec codec) { @Override public void set(long integer) { - - if (!initialized) { - output = new ArrayList<>(); - } - setValue(integer); } @@ -78,6 +72,12 @@ public void setSingle(ByteBuffer bytes) { @SuppressWarnings("unchecked") private void setValue(Object value) { + if (!initialized) { + output = value; + initialized = true; + return; + } + if (output != null) { if (output instanceof Collection) { diff --git a/src/test/java/io/lettuce/core/output/ObjectOutputUnitTests.java b/src/test/java/io/lettuce/core/output/ObjectOutputUnitTests.java index 8fd36f1a2a..8fbb31924c 100644 --- a/src/test/java/io/lettuce/core/output/ObjectOutputUnitTests.java +++ b/src/test/java/io/lettuce/core/output/ObjectOutputUnitTests.java @@ -3,6 +3,7 @@ import static io.lettuce.TestTags.UNIT_TEST; import static org.assertj.core.api.Assertions.*; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -22,6 +23,53 @@ @Tag(UNIT_TEST) class ObjectOutputUnitTests { + @Test + void shouldParseTopLevelBulkString() { + + String in = "$4\r\ntrue\r\n"; + RedisStateMachine rsm = new RedisStateMachine(ByteBufAllocator.DEFAULT); + ObjectOutput output = new ObjectOutput<>(StringCodec.UTF8); + rsm.decode(Unpooled.wrappedBuffer(in.getBytes(StandardCharsets.UTF_8)), output, exception -> { + throw (RuntimeException) exception; + }); + assertThat(output.get()).isEqualTo("true"); + } + + @Test + void shouldParseTopLevelBoolean() { + + RedisStateMachine rsm = new RedisStateMachine(ByteBufAllocator.DEFAULT); + ObjectOutput output = new ObjectOutput<>(StringCodec.UTF8); + rsm.decode(Unpooled.wrappedBuffer("#t\r\n".getBytes(StandardCharsets.UTF_8)), output, exception -> { + throw (RuntimeException) exception; + }); + assertThat(output.get()).isEqualTo(true); + } + + @Test + void shouldParseTopLevelDouble() { + + String in = ",1.5\r\n"; + RedisStateMachine rsm = new RedisStateMachine(ByteBufAllocator.DEFAULT); + ObjectOutput output = new ObjectOutput<>(StringCodec.UTF8); + rsm.decode(Unpooled.wrappedBuffer(in.getBytes(StandardCharsets.UTF_8)), output, exception -> { + throw (RuntimeException) exception; + }); + assertThat(output.get()).isEqualTo(1.5d); + } + + @Test + void shouldParseTopLevelIntegerAsScalar() { + + String in = ":3\r\n"; + RedisStateMachine rsm = new RedisStateMachine(ByteBufAllocator.DEFAULT); + ObjectOutput output = new ObjectOutput<>(StringCodec.UTF8); + rsm.decode(Unpooled.wrappedBuffer(in.getBytes(StandardCharsets.UTF_8)), output, exception -> { + throw (RuntimeException) exception; + }); + assertThat(output.get()).isEqualTo(3L); + } + @Test void shouldParseHelloWithModules() {