Skip to content

Commit e5159bd

Browse files
committed
Bug fix to MsgSizeLayer.
1 parent 21f219e commit e5159bd

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

comms/include/comms/protocol/MsgSizeLayer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ class MsgSizeLayer : public
172172
std::is_base_of<std::random_access_iterator_tag, IterTag>::value,
173173
"Current implementation of MsgSizeLayer requires iterator used for reading to be random-access one.");
174174

175+
auto begIter = iter;
175176
auto es = field.read(iter, size);
176177
if (es == ErrorStatus::NotEnoughData) {
177178
BaseImpl::updateMissingSize(field, size, missingSize);
@@ -182,7 +183,8 @@ class MsgSizeLayer : public
182183
}
183184

184185
auto fromIter = iter;
185-
std::size_t actualRemainingSize = (size - field.length());
186+
auto readFieldLength = static_cast<std::size_t>(std::distance(begIter, iter));
187+
std::size_t actualRemainingSize = (size - readFieldLength);
186188
std::size_t requiredRemainingSize =
187189
static_cast<ExtendingClass*>(this)->getRemainingSizeFromField(field);
188190

comms/test/MsgSizeLayer.th

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// Copyright 2014 - 2018 (C). Alex Robenko. All rights reserved.
2+
// Copyright 2014 - 2019 (C). Alex Robenko. All rights reserved.
33
//
44

55
// This file is free software: you can redistribute it and/or modify
@@ -45,6 +45,8 @@ public:
4545
void test13();
4646
void test14();
4747
void test15();
48+
void test16();
49+
void test17();
4850

4951
private:
5052

@@ -133,6 +135,15 @@ private:
133135
comms::option::NumValueSerOffset<TOffset>
134136
>;
135137

138+
template <typename TField, std::size_t TMin = 1, std::size_t TMax = 4>
139+
using VarLenSizeField =
140+
comms::field::IntValue<
141+
TField,
142+
unsigned,
143+
comms::option::VarLength<TMin, TMax>
144+
>;
145+
146+
136147
template <typename TField>
137148
using SizeField20 = SizeField<TField, 2, 0>;
138149
using BeSizeField20 = SizeField20<BeField>;
@@ -149,6 +160,11 @@ private:
149160
using BeSizeField22 = SizeField22<BeField>;
150161
using LeSizeField22 = SizeField22<LeField>;
151162

163+
template <typename TField>
164+
using VarLenSizeFieldDef = VarLenSizeField<TField>;
165+
using BeVarLenSizeField = VarLenSizeFieldDef<BeField>;
166+
using LeVarLenSizeField = VarLenSizeFieldDef<LeField>;
167+
152168
template <typename TField, std::size_t TLen>
153169
using IdField =
154170
comms::field::EnumValue<
@@ -609,3 +625,49 @@ void MsgSizeLayerTestSuite::test15()
609625
TS_ASSERT_EQUALS(std::get<0>(fields2).value(), 3U);
610626
TS_ASSERT_EQUALS(std::get<1>(fields2).value(), MessageType1);
611627
}
628+
629+
void MsgSizeLayerTestSuite::test16()
630+
{
631+
static const char Buf[] = {
632+
(char)0x84, 0x0, MessageType1, 0x01, 0x02,
633+
};
634+
635+
static const std::size_t BufSize = std::extent<decltype(Buf)>::value;
636+
637+
ProtocolStack<LeVarLenSizeField, LeIdField1, LeMsgBase> stack;
638+
auto& sizeLayer = stack.layer_size();
639+
using SizeLayerType = typename std::decay<decltype(sizeLayer)>::type;
640+
static_assert(comms::protocol::isMsgSizeLayer<SizeLayerType>(), "Invalid layer");
641+
642+
auto& idLayer = stack.layer_id();
643+
using IdLayerType = typename std::decay<decltype(idLayer)>::type;
644+
static_assert(comms::protocol::isMsgIdLayer<IdLayerType>(), "Invalid layer");
645+
646+
auto& payloadLayer = stack.layer_payload();
647+
using PayloadLayerType = typename std::decay<decltype(payloadLayer)>::type;
648+
static_assert(comms::protocol::isMsgDataLayer<PayloadLayerType>(), "Invalid layer");
649+
650+
auto msgPtr = commonReadWriteMsgTest(stack, &Buf[0], BufSize, comms::ErrorStatus::NotEnoughData);
651+
TS_ASSERT(!msgPtr)
652+
}
653+
654+
void MsgSizeLayerTestSuite::test17()
655+
{
656+
static const char Buf[] = {
657+
(char)0x81, 0x0, MessageType2
658+
};
659+
660+
static const std::size_t BufSize = std::extent<decltype(Buf)>::value;
661+
662+
using Frame = ProtocolStack<LeVarLenSizeField, LeIdField1, LeMsgBase>;
663+
Frame frame;
664+
665+
Frame::MsgPtr msg;
666+
auto readIter = &Buf[0];
667+
auto es = frame.read(msg, readIter, BufSize);
668+
TS_ASSERT_EQUALS(es, comms::ErrorStatus::Success);
669+
TS_ASSERT(msg);
670+
TS_ASSERT_EQUALS(msg->getId(), MessageType2);
671+
TS_ASSERT_EQUALS(frame.length(*msg), BufSize - 1);
672+
}
673+

0 commit comments

Comments
 (0)