diff --git a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java index df1140ee22..dd5065dbe2 100755 --- a/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java +++ b/sbe-tool/src/main/java/uk/co/real_logic/sbe/generation/cpp/CppGenerator.java @@ -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" + diff --git a/sbe-tool/src/test/cpp/CMakeLists.txt b/sbe-tool/src/test/cpp/CMakeLists.txt index 675688cc0c..53bb18f2ef 100644 --- a/sbe-tool/src/test/cpp/CMakeLists.txt +++ b/sbe-tool/src/test/cpp/CMakeLists.txt @@ -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} @@ -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 @@ -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}) @@ -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 diff --git a/sbe-tool/src/test/cpp/VersionedMessageTest.cpp b/sbe-tool/src/test/cpp/VersionedMessageTest.cpp new file mode 100644 index 0000000000..af4a90c442 --- /dev/null +++ b/sbe-tool/src/test/cpp/VersionedMessageTest.cpp @@ -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 + +#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); +} diff --git a/sbe-tool/src/test/resources/versioned-message-v1.xml b/sbe-tool/src/test/resources/versioned-message-v1.xml new file mode 100644 index 0000000000..bd942e82c7 --- /dev/null +++ b/sbe-tool/src/test/resources/versioned-message-v1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/sbe-tool/src/test/resources/versioned-message-v2.xml b/sbe-tool/src/test/resources/versioned-message-v2.xml new file mode 100644 index 0000000000..3d0de450e5 --- /dev/null +++ b/sbe-tool/src/test/resources/versioned-message-v2.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + +