Skip to content

Commit a209a2f

Browse files
authored
[C++] use m_actingBlockLength in decodeLength() (#1045)
1 parent 4caa7f4 commit a209a2f

File tree

5 files changed

+118
-1
lines changed

5 files changed

+118
-1
lines changed

sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -3027,7 +3027,7 @@ private CharSequence generateMessageFlyweightCode(
30273027

30283028
" SBE_NODISCARD std::uint64_t decodeLength() const\n" +
30293029
" {\n" +
3030-
" %10$s skipper(m_buffer, m_offset, m_bufferLength, sbeBlockLength(), m_actingVersion);\n" +
3030+
" %10$s skipper(m_buffer, m_offset, m_bufferLength, m_actingBlockLength, m_actingVersion);\n" +
30313031
" skipper.skip();\n" +
30323032
" return skipper.encodedLength();\n" +
30333033
" }\n\n" +

sbe-tool/src/test/cpp/CMakeLists.txt

+7
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ set(DTO_SCHEMA ${CODEC_SCHEMA_DIR}/dto-test-schema.xml)
4343
set(ISSUE835_SCHEMA ${CODEC_SCHEMA_DIR}/issue835.xml)
4444
set(ISSUE889_SCHEMA ${CODEC_SCHEMA_DIR}/issue889.xml)
4545
set(ACCESS_ORDER_SCHEMA ${CODEC_SCHEMA_DIR}/field-order-check-schema.xml)
46+
set(VERSIONED_MESSAGE_V1_SCHEMA ${CODEC_SCHEMA_DIR}/versioned-message-v1.xml)
47+
set(VERSIONED_MESSAGE_V2_SCHEMA ${CODEC_SCHEMA_DIR}/versioned-message-v2.xml)
4648

4749
set(GENERATED_CODECS
4850
${CXX_CODEC_TARGET_DIR}
@@ -59,6 +61,8 @@ add_custom_command(
5961
${ISSUE835_SCHEMA}
6062
${ISSUE889_SCHEMA}
6163
${ACCESS_ORDER_SCHEMA}
64+
${VERSIONED_MESSAGE_V1_SCHEMA}
65+
${VERSIONED_MESSAGE_V2_SCHEMA}
6266
sbe-jar ${SBE_JAR}
6367
COMMAND
6468
${Java_JAVA_EXECUTABLE} --add-opens java.base/jdk.internal.misc=ALL-UNNAMED
@@ -79,6 +83,8 @@ add_custom_command(
7983
${ISSUE835_SCHEMA}
8084
${ISSUE889_SCHEMA}
8185
${ACCESS_ORDER_SCHEMA}
86+
${VERSIONED_MESSAGE_V1_SCHEMA}
87+
${VERSIONED_MESSAGE_V2_SCHEMA}
8288
)
8389

8490
add_custom_target(codecs DEPENDS ${GENERATED_CODECS})
@@ -96,6 +102,7 @@ sbe_test(Issue835Test codecs)
96102
sbe_test(Issue889Test codecs)
97103
sbe_test(FieldAccessOrderCheckTest codecs)
98104
target_compile_definitions(FieldAccessOrderCheckTest PRIVATE SBE_ENABLE_PRECEDENCE_CHECKS_IN_TESTS)
105+
sbe_test(VersionedMessageTest codecs)
99106

100107
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
101108
# Check if the GCC version supports C++17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2013-2025 Real Logic Limited.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include <gtest/gtest.h>
18+
19+
#include "versmsg/VersionedMessageV1.h"
20+
#include "versmsg/VersionedMessageV2.h"
21+
22+
using namespace versmsg;
23+
24+
static const std::size_t BUFFER_LEN = 2048;
25+
26+
class VersionedMessageTest : public testing::Test
27+
{
28+
public:
29+
VersionedMessageV2 m_versionedMessageV2 = {};
30+
VersionedMessageV1 m_versionedMessageV1Decoder = {};
31+
};
32+
33+
TEST_F(VersionedMessageTest, shouldV1DecodeV2Message)
34+
{
35+
char buffer[BUFFER_LEN] = {};
36+
37+
m_versionedMessageV2.wrapForEncode(buffer, 0, sizeof(buffer));
38+
m_versionedMessageV2.fieldA1(1);
39+
m_versionedMessageV2.fieldB1(2);
40+
m_versionedMessageV2.fieldC2(3);
41+
m_versionedMessageV2.fieldD2(4);
42+
m_versionedMessageV2.fieldE2(5);
43+
m_versionedMessageV2.putString1("asdf", 4);
44+
45+
m_versionedMessageV1Decoder.wrapForDecode(
46+
buffer,
47+
0,
48+
VersionedMessageV2::sbeBlockLength(),
49+
VersionedMessageV2::sbeSchemaVersion(),
50+
m_versionedMessageV2.encodedLength());
51+
52+
EXPECT_EQ(m_versionedMessageV1Decoder.fieldA1(), (uint32_t)1);
53+
EXPECT_EQ(m_versionedMessageV1Decoder.fieldB1(), (uint32_t)2);
54+
EXPECT_STREQ(m_versionedMessageV1Decoder.string1(), "asdf");
55+
56+
EXPECT_EQ(m_versionedMessageV1Decoder.decodeLength(), (uint64_t)26);
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<messageSchema package="versmsg"
3+
id="1"
4+
version="1"
5+
semanticVersion="1"
6+
description="Unit Test"
7+
byteOrder="littleEndian">
8+
<types>
9+
<composite name="messageHeader" description="Message identifiers and length of message root">
10+
<type name="blockLength" primitiveType="uint16"/>
11+
<type name="templateId" primitiveType="uint16"/>
12+
<type name="schemaId" primitiveType="uint16"/>
13+
<type name="version" primitiveType="uint16"/>
14+
</composite>
15+
<composite name="varStringEncoding">
16+
<type name="length" primitiveType="uint16"/>
17+
<type name="varData" primitiveType="uint8" length="0" characterEncoding="UTF-8"/>
18+
</composite>
19+
</types>
20+
<message name="VersionedMessageV1" id="50001" description="A versioned message" blockLength="8">
21+
<field name="FieldA1" id="1" type="uint32" semanticType="int"/>
22+
<field name="FieldB1" id="2" type="uint32" semanticType="int"/>
23+
<data name="String1" id="10" type="varStringEncoding"/>
24+
</message>
25+
</messageSchema>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2+
<messageSchema package="versmsg"
3+
id="1"
4+
version="2"
5+
semanticVersion="2"
6+
description="Unit Test"
7+
byteOrder="littleEndian">
8+
<types>
9+
<composite name="messageHeader" description="Message identifiers and length of message root">
10+
<type name="blockLength" primitiveType="uint16"/>
11+
<type name="templateId" primitiveType="uint16"/>
12+
<type name="schemaId" primitiveType="uint16"/>
13+
<type name="version" primitiveType="uint16"/>
14+
</composite>
15+
<composite name="varStringEncoding">
16+
<type name="length" primitiveType="uint16"/>
17+
<type name="varData" primitiveType="uint8" length="0" characterEncoding="UTF-8"/>
18+
</composite>
19+
</types>
20+
<message name="VersionedMessageV2" id="50001" description="A versioned message" blockLength="20">
21+
<field name="FieldA1" id="1" type="uint32" semanticType="int"/>
22+
<field name="FieldB1" id="2" type="uint32" semanticType="int"/>
23+
<field name="FieldC2" id="3" type="uint32" semanticType="int"/>
24+
<field name="FieldD2" id="4" type="uint32" semanticType="int"/>
25+
<field name="FieldE2" id="5" type="uint32" semanticType="int"/>
26+
<data name="String1" id="10" type="varStringEncoding"/>
27+
</message>
28+
</messageSchema>

0 commit comments

Comments
 (0)