Skip to content

Commit 8786729

Browse files
committed
[C++]: codec tests for composites with enum, set, and nested composite
1 parent 04ade1c commit 8786729

File tree

2 files changed

+264
-13
lines changed

2 files changed

+264
-13
lines changed

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@
1515
#
1616

1717
set(GTEST_LIBS
18-
${GTEST_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LIBPREFIX}gtest${LIBSUFFIX}
19-
${GTEST_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LIBPREFIX}gtest_main${LIBSUFFIX}
18+
${GTEST_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LIBPREFIX}gtest${LIBSUFFIX}
19+
${GTEST_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LIBPREFIX}gtest_main${LIBSUFFIX}
2020
)
2121

2222
function(sbe_test name)
23-
add_executable("${name}" "${name}.cpp")
24-
target_link_libraries("${name}" sbe ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT})
25-
add_test(NAME ${name} COMMAND ${name} WORKING_DIRECTORY ${CODEC_TARGET_DIR})
26-
add_dependencies(${name} gtest)
27-
if(${ARGC} GREATER 1)
28-
add_dependencies(${name} ${ARGV1})
29-
endif()
23+
add_executable("${name}" "${name}.cpp")
24+
target_link_libraries("${name}" sbe ${GTEST_LIBS} ${CMAKE_THREAD_LIBS_INIT})
25+
add_test(NAME ${name} COMMAND ${name} WORKING_DIRECTORY ${CODEC_TARGET_DIR})
26+
add_dependencies(${name} gtest)
27+
if(${ARGC} GREATER 1)
28+
add_dependencies(${name} ${ARGV1})
29+
endif()
3030
endfunction()
3131

3232
find_package(Java REQUIRED)
@@ -35,15 +35,22 @@ set(CODE_GENERATION_SCHEMA ${CODEC_SCHEMA_DIR}/code-generation-schema.xml)
3535
set(COMPOSITE_OFFSETS_SCHEMA ${CODEC_SCHEMA_DIR}/composite-offsets-schema.xml)
3636
set(MESSAGE_BLOCK_LENGTH_TEST ${CODEC_SCHEMA_DIR}/message-block-length-test.xml)
3737
set(GROUP_WITH_DATA_SCHEMA ${CODEC_SCHEMA_DIR}/group-with-data-schema.xml)
38+
set(COMPOSITE_ELEMENTS_SCHEMA ${CODEC_SCHEMA_DIR}/composite-elements-schema.xml)
3839

3940
set(GENERATED_CODECS
40-
${CODEC_TARGET_DIR}
41+
${CODEC_TARGET_DIR}
4142
)
4243

4344
add_custom_command(
44-
OUTPUT ${GENERATED_CODECS}
45-
DEPENDS ${CODE_GENERATION_SCHEMA} ${CODE_GENERATION_SCHEMA_CPP} ${COMPOSITE_OFFSETS_SCHEMA} ${MESSAGE_BLOCK_LENGTH_TEST}
46-
COMMAND ${Java_JAVA_EXECUTABLE} -Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.generate.ir="true" -Dsbe.target.language="cpp" -jar ${SBE_JAR} ${CODE_GENERATION_SCHEMA} ${COMPOSITE_OFFSETS_SCHEMA} ${MESSAGE_BLOCK_LENGTH_TEST} ${GROUP_WITH_DATA_SCHEMA}
45+
OUTPUT ${GENERATED_CODECS}
46+
DEPENDS ${CODE_GENERATION_SCHEMA} ${CODE_GENERATION_SCHEMA_CPP} ${COMPOSITE_OFFSETS_SCHEMA} ${MESSAGE_BLOCK_LENGTH_TEST}
47+
COMMAND ${Java_JAVA_EXECUTABLE}
48+
-Dsbe.output.dir=${CODEC_TARGET_DIR} -Dsbe.generate.ir="true" -Dsbe.target.language="cpp" -jar ${SBE_JAR}
49+
${CODE_GENERATION_SCHEMA}
50+
${COMPOSITE_OFFSETS_SCHEMA}
51+
${MESSAGE_BLOCK_LENGTH_TEST}
52+
${GROUP_WITH_DATA_SCHEMA}
53+
${COMPOSITE_ELEMENTS_SCHEMA}
4754
)
4855

4956
add_custom_target(codecs DEPENDS ${GENERATED_CODECS})
@@ -56,3 +63,4 @@ sbe_test(CompositeOffsetsIrTest codecs)
5663
sbe_test(MessageBlockLengthTest codecs)
5764
sbe_test(GroupWithDataTest codecs)
5865
sbe_test(Rc3OtfFullIrTest codecs)
66+
sbe_test(CompositeElementsTest codecs)
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
/*
2+
* Copyright 2015 Real Logic Ltd.
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+
* http://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+
#include <iostream>
17+
18+
#include "gtest/gtest.h"
19+
#include "composite_elements/MessageHeader.h"
20+
#include "composite_elements/Msg.h"
21+
#include "otf/IrDecoder.h"
22+
#include "otf/OtfHeaderDecoder.h"
23+
#include "otf/OtfMessageDecoder.h"
24+
25+
using namespace std;
26+
using namespace composite_elements;
27+
using namespace sbe::otf;
28+
29+
class CompositeElementsTest : public testing::Test, public OtfMessageDecoder::BasicTokenListener
30+
{
31+
public:
32+
char m_buffer[2048];
33+
IrDecoder m_irDecoder;
34+
int m_eventNumber;
35+
36+
virtual void SetUp()
37+
{
38+
m_eventNumber = 0;
39+
}
40+
41+
virtual std::uint64_t encodeHdrAndMsg()
42+
{
43+
MessageHeader hdr;
44+
Msg msg;
45+
46+
hdr.wrap(m_buffer, 0, 0, sizeof(m_buffer))
47+
.blockLength(Msg::sbeBlockLength())
48+
.templateId(Msg::sbeTemplateId())
49+
.schemaId(Msg::sbeSchemaId())
50+
.version(Msg::sbeSchemaVersion());
51+
52+
msg.wrapForEncode(m_buffer, hdr.encodedLength(), sizeof(m_buffer));
53+
54+
msg.structure()
55+
.enumOne(EnumOne::Value10)
56+
.zeroth(42)
57+
.setOne().clear().bit0(false).bit16(true).bit26(false);
58+
59+
msg.structure()
60+
.inner()
61+
.first(101)
62+
.second(202);
63+
64+
return hdr.encodedLength() + msg.encodedLength();
65+
}
66+
67+
virtual void onEncoding(
68+
Token& fieldToken,
69+
const char *buffer,
70+
Token& typeToken,
71+
std::uint64_t actingVersion)
72+
{
73+
switch (m_eventNumber++)
74+
{
75+
case 0:
76+
{
77+
EXPECT_EQ(typeToken.encoding().primitiveType(), PrimitiveType::UINT64);
78+
EXPECT_EQ(typeToken.encoding().getAsUInt(buffer), 187u);
79+
break;
80+
}
81+
case 3:
82+
{
83+
EXPECT_EQ(typeToken.encoding().primitiveType(), PrimitiveType::UINT64);
84+
EXPECT_EQ(typeToken.encoding().getAsUInt(buffer), 10u);
85+
break;
86+
}
87+
case 4:
88+
{
89+
EXPECT_EQ(typeToken.encoding().primitiveType(), PrimitiveType::INT64);
90+
EXPECT_EQ(typeToken.encoding().getAsInt(buffer), 20);
91+
break;
92+
}
93+
case 5:
94+
{
95+
EXPECT_EQ(typeToken.encoding().primitiveType(), PrimitiveType::UINT64);
96+
EXPECT_EQ(typeToken.encoding().getAsUInt(buffer), 30u);
97+
break;
98+
}
99+
case 6:
100+
{
101+
EXPECT_EQ(typeToken.encoding().primitiveType(), PrimitiveType::INT64);
102+
EXPECT_EQ(typeToken.encoding().getAsInt(buffer), 40);
103+
break;
104+
}
105+
default:
106+
FAIL() << "unknown event number " << m_eventNumber;
107+
}
108+
109+
}
110+
111+
virtual void onBitSet(
112+
Token& fieldToken,
113+
const char *buffer,
114+
std::vector<Token>& tokens,
115+
std::size_t fromIndex,
116+
std::size_t toIndex,
117+
std::uint64_t actingVersion)
118+
{
119+
switch (m_eventNumber++)
120+
{
121+
case 1:
122+
{
123+
const Token& typeToken = tokens.at(fromIndex + 1);
124+
const Encoding& encoding = typeToken.encoding();
125+
126+
EXPECT_EQ(encoding.primitiveType(), PrimitiveType::UINT8);
127+
EXPECT_EQ(encoding.getAsUInt(buffer), 0x2u);
128+
break;
129+
}
130+
default:
131+
FAIL() << "unknown event number " << m_eventNumber;
132+
}
133+
}
134+
135+
virtual void onGroupHeader(
136+
Token& token,
137+
std::uint64_t numInGroup)
138+
{
139+
switch (m_eventNumber++)
140+
{
141+
case 2:
142+
{
143+
EXPECT_EQ(numInGroup, 2u);
144+
break;
145+
}
146+
default:
147+
FAIL() << "unknown event number " << m_eventNumber;
148+
}
149+
}
150+
};
151+
152+
TEST_F(CompositeElementsTest, shouldEncodeMsgCorrectly)
153+
{
154+
std::uint64_t sz = encodeHdrAndMsg();
155+
const char *bufferPtr = m_buffer;
156+
std::uint64_t offset = 0;
157+
158+
ASSERT_EQ(sz, 8u + 22u);
159+
160+
EXPECT_EQ(*((std::uint16_t *)(bufferPtr + offset)), Msg::sbeBlockLength());
161+
offset += sizeof(std::uint16_t);
162+
EXPECT_EQ(*((std::uint16_t *)(bufferPtr + offset)), Msg::sbeTemplateId());
163+
offset += sizeof(std::uint16_t);
164+
EXPECT_EQ(*((std::uint16_t *)(bufferPtr + offset)), Msg::sbeSchemaId());
165+
offset += sizeof(std::uint16_t);
166+
EXPECT_EQ(*((std::uint16_t *)(bufferPtr + offset)), Msg::sbeSchemaVersion());
167+
offset += sizeof(std::uint16_t);
168+
169+
EXPECT_EQ(*((std::uint8_t *)(bufferPtr + offset)), 10u);
170+
offset += sizeof(std::uint8_t);
171+
172+
EXPECT_EQ(*((std::uint8_t *)(bufferPtr + offset)), 42u);
173+
offset += sizeof(std::uint8_t);
174+
175+
EXPECT_EQ(*((std::uint32_t *)(bufferPtr + offset)), 0x00010000u);
176+
offset += sizeof(std::uint32_t);
177+
178+
EXPECT_EQ(*((std::int64_t *)(bufferPtr + offset)), 101l);
179+
offset += sizeof(std::int64_t);
180+
181+
EXPECT_EQ(*((std::int64_t *)(bufferPtr + offset)), 202l);
182+
offset += sizeof(std::int64_t);
183+
184+
EXPECT_EQ(offset, sz);
185+
}
186+
187+
TEST_F(CompositeElementsTest, shouldEncodeAndDecodeMsgCorrectly)
188+
{
189+
std::uint64_t sz = encodeHdrAndMsg();
190+
191+
ASSERT_EQ(sz, MessageHeader::encodedLength() + Msg::sbeBlockLength());
192+
193+
MessageHeader hdr;
194+
Msg msg;
195+
196+
hdr.wrap(m_buffer, 0, Msg::sbeSchemaVersion(), sizeof(m_buffer));
197+
198+
EXPECT_EQ(hdr.blockLength(), Msg::sbeBlockLength());
199+
EXPECT_EQ(hdr.templateId(), Msg::sbeTemplateId());
200+
EXPECT_EQ(hdr.schemaId(), Msg::sbeSchemaId());
201+
EXPECT_EQ(hdr.version(), Msg::sbeSchemaVersion());
202+
203+
msg.wrapForDecode(m_buffer, MessageHeader::encodedLength(), hdr.blockLength(), hdr.version(), sizeof(m_buffer));
204+
205+
EXPECT_EQ(msg.structure().enumOne(), EnumOne::Value::Value10);
206+
EXPECT_EQ(msg.structure().zeroth(), 42u);
207+
EXPECT_EQ(msg.structure().setOne().bit0(), false);
208+
EXPECT_EQ(msg.structure().setOne().bit16(), true);
209+
EXPECT_EQ(msg.structure().setOne().bit26(), false);
210+
EXPECT_EQ(msg.structure().inner().first(), 101l);
211+
EXPECT_EQ(msg.structure().inner().second(), 202l);
212+
213+
EXPECT_EQ(msg.encodedLength(), sz - MessageHeader::encodedLength());
214+
}
215+
216+
TEST_F(CompositeElementsTest, DISABLED_shouldHandleAllEventsCorrectltInOrder)
217+
{
218+
std::uint64_t sz = encodeHdrAndMsg();
219+
220+
ASSERT_EQ(sz, MessageHeader::encodedLength() + Msg::sbeBlockLength());
221+
222+
ASSERT_GE(m_irDecoder.decode("composite-elements-schema.sbeir"), 0);
223+
224+
std::shared_ptr<std::vector<Token>> headerTokens = m_irDecoder.header();
225+
std::shared_ptr<std::vector<Token>> messageTokens = m_irDecoder.message(Msg::sbeTemplateId(), Msg::sbeSchemaVersion());
226+
227+
ASSERT_TRUE(headerTokens != nullptr);
228+
ASSERT_TRUE(messageTokens!= nullptr);
229+
230+
OtfHeaderDecoder headerDecoder(headerTokens);
231+
232+
EXPECT_EQ(headerDecoder.encodedLength(), MessageHeader::encodedLength());
233+
const char *messageBuffer = m_buffer + headerDecoder.encodedLength();
234+
std::size_t length = MessageHeader::encodedLength() - headerDecoder.encodedLength();
235+
std::uint64_t actingVersion = headerDecoder.getSchemaVersion(m_buffer);
236+
std::uint64_t blockLength = headerDecoder.getBlockLength(m_buffer);
237+
238+
const std::size_t result =
239+
OtfMessageDecoder::decode(messageBuffer, length, actingVersion, blockLength, messageTokens, *this);
240+
EXPECT_EQ(result, static_cast<std::size_t>(Msg::sbeBlockLength() - MessageHeader::encodedLength()));
241+
242+
EXPECT_EQ(m_eventNumber, 7);
243+
}

0 commit comments

Comments
 (0)