Skip to content

Commit

Permalink
[C++] use m_actingBlockLength in decodeLength() (#1045)
Browse files Browse the repository at this point in the history
  • Loading branch information
nbradac authored Jan 8, 2025
1 parent 4caa7f4 commit a209a2f
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -3027,7 +3027,7 @@ private CharSequence generateMessageFlyweightCode(

" SBE_NODISCARD std::uint64_t decodeLength() const\n" +
" {\n" +
" %10$s skipper(m_buffer, m_offset, m_bufferLength, sbeBlockLength(), m_actingVersion);\n" +
" %10$s skipper(m_buffer, m_offset, m_bufferLength, m_actingBlockLength, m_actingVersion);\n" +
" skipper.skip();\n" +
" return skipper.encodedLength();\n" +
" }\n\n" +
Expand Down
7 changes: 7 additions & 0 deletions sbe-tool/src/test/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ set(DTO_SCHEMA ${CODEC_SCHEMA_DIR}/dto-test-schema.xml)
set(ISSUE835_SCHEMA ${CODEC_SCHEMA_DIR}/issue835.xml)
set(ISSUE889_SCHEMA ${CODEC_SCHEMA_DIR}/issue889.xml)
set(ACCESS_ORDER_SCHEMA ${CODEC_SCHEMA_DIR}/field-order-check-schema.xml)
set(VERSIONED_MESSAGE_V1_SCHEMA ${CODEC_SCHEMA_DIR}/versioned-message-v1.xml)
set(VERSIONED_MESSAGE_V2_SCHEMA ${CODEC_SCHEMA_DIR}/versioned-message-v2.xml)

set(GENERATED_CODECS
${CXX_CODEC_TARGET_DIR}
Expand All @@ -59,6 +61,8 @@ add_custom_command(
${ISSUE835_SCHEMA}
${ISSUE889_SCHEMA}
${ACCESS_ORDER_SCHEMA}
${VERSIONED_MESSAGE_V1_SCHEMA}
${VERSIONED_MESSAGE_V2_SCHEMA}
sbe-jar ${SBE_JAR}
COMMAND
${Java_JAVA_EXECUTABLE} --add-opens java.base/jdk.internal.misc=ALL-UNNAMED
Expand All @@ -79,6 +83,8 @@ add_custom_command(
${ISSUE835_SCHEMA}
${ISSUE889_SCHEMA}
${ACCESS_ORDER_SCHEMA}
${VERSIONED_MESSAGE_V1_SCHEMA}
${VERSIONED_MESSAGE_V2_SCHEMA}
)

add_custom_target(codecs DEPENDS ${GENERATED_CODECS})
Expand All @@ -96,6 +102,7 @@ sbe_test(Issue835Test codecs)
sbe_test(Issue889Test codecs)
sbe_test(FieldAccessOrderCheckTest codecs)
target_compile_definitions(FieldAccessOrderCheckTest PRIVATE SBE_ENABLE_PRECEDENCE_CHECKS_IN_TESTS)
sbe_test(VersionedMessageTest codecs)

if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# Check if the GCC version supports C++17
Expand Down
57 changes: 57 additions & 0 deletions sbe-tool/src/test/cpp/VersionedMessageTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*
* Copyright 2013-2025 Real Logic Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include <gtest/gtest.h>

#include "versmsg/VersionedMessageV1.h"
#include "versmsg/VersionedMessageV2.h"

using namespace versmsg;

static const std::size_t BUFFER_LEN = 2048;

class VersionedMessageTest : public testing::Test
{
public:
VersionedMessageV2 m_versionedMessageV2 = {};
VersionedMessageV1 m_versionedMessageV1Decoder = {};
};

TEST_F(VersionedMessageTest, shouldV1DecodeV2Message)
{
char buffer[BUFFER_LEN] = {};

m_versionedMessageV2.wrapForEncode(buffer, 0, sizeof(buffer));
m_versionedMessageV2.fieldA1(1);
m_versionedMessageV2.fieldB1(2);
m_versionedMessageV2.fieldC2(3);
m_versionedMessageV2.fieldD2(4);
m_versionedMessageV2.fieldE2(5);
m_versionedMessageV2.putString1("asdf", 4);

m_versionedMessageV1Decoder.wrapForDecode(
buffer,
0,
VersionedMessageV2::sbeBlockLength(),
VersionedMessageV2::sbeSchemaVersion(),
m_versionedMessageV2.encodedLength());

EXPECT_EQ(m_versionedMessageV1Decoder.fieldA1(), (uint32_t)1);
EXPECT_EQ(m_versionedMessageV1Decoder.fieldB1(), (uint32_t)2);
EXPECT_STREQ(m_versionedMessageV1Decoder.string1(), "asdf");

EXPECT_EQ(m_versionedMessageV1Decoder.decodeLength(), (uint64_t)26);
}
25 changes: 25 additions & 0 deletions sbe-tool/src/test/resources/versioned-message-v1.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messageSchema package="versmsg"
id="1"
version="1"
semanticVersion="1"
description="Unit Test"
byteOrder="littleEndian">
<types>
<composite name="messageHeader" description="Message identifiers and length of message root">
<type name="blockLength" primitiveType="uint16"/>
<type name="templateId" primitiveType="uint16"/>
<type name="schemaId" primitiveType="uint16"/>
<type name="version" primitiveType="uint16"/>
</composite>
<composite name="varStringEncoding">
<type name="length" primitiveType="uint16"/>
<type name="varData" primitiveType="uint8" length="0" characterEncoding="UTF-8"/>
</composite>
</types>
<message name="VersionedMessageV1" id="50001" description="A versioned message" blockLength="8">
<field name="FieldA1" id="1" type="uint32" semanticType="int"/>
<field name="FieldB1" id="2" type="uint32" semanticType="int"/>
<data name="String1" id="10" type="varStringEncoding"/>
</message>
</messageSchema>
28 changes: 28 additions & 0 deletions sbe-tool/src/test/resources/versioned-message-v2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messageSchema package="versmsg"
id="1"
version="2"
semanticVersion="2"
description="Unit Test"
byteOrder="littleEndian">
<types>
<composite name="messageHeader" description="Message identifiers and length of message root">
<type name="blockLength" primitiveType="uint16"/>
<type name="templateId" primitiveType="uint16"/>
<type name="schemaId" primitiveType="uint16"/>
<type name="version" primitiveType="uint16"/>
</composite>
<composite name="varStringEncoding">
<type name="length" primitiveType="uint16"/>
<type name="varData" primitiveType="uint8" length="0" characterEncoding="UTF-8"/>
</composite>
</types>
<message name="VersionedMessageV2" id="50001" description="A versioned message" blockLength="20">
<field name="FieldA1" id="1" type="uint32" semanticType="int"/>
<field name="FieldB1" id="2" type="uint32" semanticType="int"/>
<field name="FieldC2" id="3" type="uint32" semanticType="int"/>
<field name="FieldD2" id="4" type="uint32" semanticType="int"/>
<field name="FieldE2" id="5" type="uint32" semanticType="int"/>
<data name="String1" id="10" type="varStringEncoding"/>
</message>
</messageSchema>

0 comments on commit a209a2f

Please sign in to comment.