Skip to content

Commit

Permalink
Merge pull request #27 from Auterion/truncation-fail-test
Browse files Browse the repository at this point in the history
Fix corner case in decoding when truncation is active
  • Loading branch information
ThomasDebrunner authored Nov 21, 2023
2 parents 7b1e517 + e6e79c2 commit 1ede5ca
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
8 changes: 6 additions & 2 deletions include/mav/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,16 @@ namespace mav {


template <typename T>
inline T deserialize(const uint8_t* source, uint32_t deserialize_size) {
inline T deserialize(const uint8_t* source, int deserialize_size) {
// in case we do not have any bytes to read, we return 0
if (deserialize_size <= 0) {
return T{0};
}
if (deserialize_size == sizeof(T)) {
return *static_cast<const T*>(static_cast<const void*>(source));
} else {
uint8_t deserialize_buff[sizeof(T)]{};
std::copy(source, source + std::min(deserialize_size, static_cast<uint32_t>(sizeof(T))), deserialize_buff);
std::copy(source, source + std::min(static_cast<uint32_t>(deserialize_size), static_cast<uint32_t>(sizeof(T))), deserialize_buff);
return *static_cast<const T*>(static_cast<const void*>(deserialize_buff));
}
}
Expand Down
30 changes: 27 additions & 3 deletions tests/Message.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,18 @@ TEST_CASE("Message set creation") {
<field type="float[3]" name="float_arr_field">description</field>
<field type="int32_t[3]" name="int32_arr_field">description</field>
</message>
<message id="9916" name="UINT8_ONLY_MESSAGE">
<field type="uint8_t" name="field1">description</field>
<field type="uint8_t" name="field2">description</field>
<field type="uint8_t" name="field3">description</field>
<field type="uint8_t" name="field4">description</field>
</message>
</messages>
</mavlink>
)"""");

REQUIRE(message_set.contains("BIG_MESSAGE"));
REQUIRE_EQ(message_set.size(), 1);
REQUIRE_EQ(message_set.size(), 2);

auto message = message_set.create("BIG_MESSAGE");
CHECK_EQ(message.id(), message_set.idForMessage("BIG_MESSAGE"));
Expand Down Expand Up @@ -212,8 +218,7 @@ TEST_CASE("Message set creation") {
}

SUBCASE("String at the end of message") {
message.set("uint32_field", 0x0);
message.set("int8_field", 0x0);
message.set("int8_field", 0x00);
message.set("uint16_field", 0x0);
message.set("int16_field", 0x0);
message.set("uint32_field", 0x0);
Expand All @@ -236,4 +241,23 @@ TEST_CASE("Message set creation") {
message.set("char_arr_field", "Hello Worldo!");
CHECK_EQ(message.get<std::string>("char_arr_field"), "Hello Worldo!");
}

SUBCASE("Zero elision works on single byte at end of array") {

auto this_test_message = message_set.create("UINT8_ONLY_MESSAGE");
this_test_message.set("field1", 111);
this_test_message.set("field2", 0);
this_test_message.set("field3", 0);
this_test_message.set("field4", 0);

uint32_t wire_size = this_test_message.finalize(5, {6, 7});
CHECK_EQ(wire_size, 13);
CHECK_EQ(this_test_message.get<uint8_t>("field1"), 111);
CHECK_EQ(this_test_message.get<uint8_t>("field2"), 0);
CHECK_EQ(this_test_message.get<uint8_t>("field3"), 0);
CHECK_EQ(this_test_message.get<uint8_t>("field4"), 0);
}



}

0 comments on commit 1ede5ca

Please sign in to comment.