Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64d2893f authored by Myles Watson's avatar Myles Watson
Browse files

packet/parser: Add tests for payload size modifier

Test: bluetooth_packet_parser_test --gtest_filter=*SizeMod*
Change-Id: If7e6e586477e6580adc540127f82500642658aea
parent 026a813b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -48,7 +48,7 @@ Size PayloadField::GetSize() const {

  std::string dynamic_size = "Get" + size_field_->GetName() + "()";
  if (!size_modifier_.empty()) {
    dynamic_size += size_modifier_;
    dynamic_size += "- (" + size_modifier_ + ") / 8";
  }

  return dynamic_size;
+14 −2
Original line number Diff line number Diff line
@@ -277,8 +277,13 @@ void PacketDef::GenSerialize(std::ostream& s) const {
        ERROR(field) << __func__ << "Can't find sized field named " << field_name;
      }
      if (sized_field->GetFieldType() == PacketField::Type::PAYLOAD) {
        s << "size_t payload_bytes = size() - (BitsOfHeader() + BitsOfFooter()) / 8;";
        s << "ASSERT(payload_bytes < (1 << " << field->GetSize().bits() << "));";
        s << "size_t payload_bytes = GetPayloadSize();";
        std::string modifier = ((PayloadField*)sized_field)->size_modifier_;
        if (modifier != "") {
          s << "static_assert((" << modifier << ")%8 == 0, \"Modifiers must be byte-aligned\");";
          s << "payload_bytes = payload_bytes + (" << modifier << ") / 8;";
        }
        s << "ASSERT(payload_bytes < (static_cast<size_t>(1) << " << field->GetSize().bits() << "));";
        s << "insert(static_cast<" << field->GetType() << ">(payload_bytes), i," << field->GetSize().bits() << ");";
      } else {
        ERROR(field) << __func__ << "Unhandled sized field type for " << field_name;
@@ -361,6 +366,13 @@ void PacketDef::GenBuilderSize(std::ostream& s) const {
  s << footer_bits << ";";
  s << "}\n\n";

  if (fields_.HasPayload()) {
    s << "size_t GetPayloadSize() const {";
    s << "if (payload_ != nullptr) {return payload_->size();}";
    s << "else { return size() - (BitsOfHeader() + BitsOfFooter()) / 8;}";
    s << ";}\n\n";
  }

  s << "public:";
  s << "virtual size_t size() const override {";
  s << "return (BitsOfHeader() / 8)";
+78 −10
Original line number Diff line number Diff line
@@ -37,13 +37,7 @@ vector<uint8_t> child_two_two_three = {
    0x03 /* FourBits::THREE, Reserved : 4 */,
};
vector<uint8_t> child = {
    0x12 /* fixed */,
    0x02 /* Size of the payload */,
    0xa1 /* First byte of the payload */,
    0xa2,
    0xb1 /* footer */,
    0xc1 /* First byte of the FCS */,
    0xc2,
    0x12 /* fixed */, 0x02 /* Size of the payload */, 0xa1 /* First byte of the payload */, 0xa2, 0xb1 /* footer */,
};
vector<uint8_t> child_with_address = {
    0x34 /* TwoBytes */,
@@ -100,7 +94,9 @@ TEST(GeneratedPacketTest, testChildTwoTwoThree) {
}

TEST(GeneratedPacketTest, testChild) {
  auto packet = ChildBuilder::Create(0xa2a1 /* field_name */, 0xb1 /* footer */, 0xc2c1 /* fcs */);
  uint16_t field_name = 0xa2a1;
  uint8_t footer = 0xb1;
  auto packet = ChildBuilder::Create(field_name, footer);

  ASSERT_EQ(child.size(), packet->size());

@@ -126,7 +122,7 @@ TEST(GeneratedPacketTest, testChild) {
  ChildView child_view = ChildView::Create(parent_view);
  ASSERT_TRUE(child_view.IsValid());

  ASSERT_EQ(0xa2a1, child_view.GetFieldName());
  ASSERT_EQ(field_name, child_view.GetFieldName());
}

TEST(GeneratedPacketTest, testValidateDeath) {
@@ -149,7 +145,9 @@ TEST(GeneratedPacketTest, testValidateDeath) {
}

TEST(GeneratedPacketTest, testValidatedParentDeath) {
  auto packet = ChildBuilder::Create(0xa2a1 /* field_name */, 0xb1 /* footer */, 0xc2c1 /* fcs */);
  uint16_t field_name = 0xa2a1;
  uint8_t footer = 0xb1;
  auto packet = ChildBuilder::Create(field_name, footer);

  ASSERT_EQ(child.size(), packet->size());

@@ -287,6 +285,76 @@ TEST(GeneratedPacketTest, testChildWithNestedSum) {

  ASSERT_EQ(more_bytes, child_view.GetMoreBytes());
}

namespace {
vector<uint8_t> parent_size_modifier = {
    0x02 /* Size */,
    0x11 /* TwoBytes */,
    0x12,
};

}  // namespace

TEST(GeneratedPacketTest, testParentSizeModifier) {
  uint16_t two_bytes = 0x1211;
  auto packet = ParentSizeModifierBuilder::Create(std::make_unique<RawBuilder>(), two_bytes);

  ASSERT_EQ(parent_size_modifier.size(), packet->size());

  std::shared_ptr<std::vector<uint8_t>> packet_bytes = std::make_shared<std::vector<uint8_t>>();
  BitInserter it(*packet_bytes);
  packet->Serialize(it);

  ASSERT_EQ(parent_size_modifier.size(), packet_bytes->size());
  for (size_t i = 0; i < parent_size_modifier.size(); i++) {
    ASSERT_EQ(parent_size_modifier[i], packet_bytes->at(i));
  }

  PacketView<kLittleEndian> packet_bytes_view(packet_bytes);
  ParentSizeModifierView parent_view = ParentSizeModifierView::Create(packet_bytes_view);
  ASSERT_TRUE(parent_view.IsValid());
  ASSERT_EQ(two_bytes, parent_view.GetTwoBytes());
}

namespace {
vector<uint8_t> child_size_modifier = {
    0x06 /* PayloadSize (TwoBytes + MoreBytes)*/,
    0x31 /* MoreBytes */,
    0x32,
    0x33,
    0x34,
    0x11 /* TwoBytes = 0x1211 */,
    0x12,
};

}  // namespace

TEST(GeneratedPacketTest, testChildSizeModifier) {
  uint16_t two_bytes = 0x1211;
  uint32_t more_bytes = 0x34333231;
  auto packet = ChildSizeModifierBuilder::Create(more_bytes);

  ASSERT_EQ(child_size_modifier.size(), packet->size());

  std::shared_ptr<std::vector<uint8_t>> packet_bytes = std::make_shared<std::vector<uint8_t>>();
  BitInserter it(*packet_bytes);
  packet->Serialize(it);

  ASSERT_EQ(child_size_modifier.size(), packet_bytes->size());
  for (size_t i = 0; i < child_size_modifier.size(); i++) {
    ASSERT_EQ(child_size_modifier[i], packet_bytes->at(i));
  }

  PacketView<kLittleEndian> packet_bytes_view(packet_bytes);
  ParentSizeModifierView parent_view = ParentSizeModifierView::Create(packet_bytes_view);
  ASSERT_TRUE(parent_view.IsValid());
  ASSERT_EQ(two_bytes, parent_view.GetTwoBytes());

  ChildSizeModifierView child_view = ChildSizeModifierView::Create(parent_view);
  ASSERT_TRUE(child_view.IsValid());

  ASSERT_EQ(more_bytes, child_view.GetMoreBytes());
}
}  // namespace parser
}  // namespace packet
}  // namespace bluetooth
+10 −1
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ packet Parent {
  size(payload) : 8,
  payload,
  Footer : 8,
  Fcs : 16,
}

packet Child : Parent {
@@ -71,3 +70,13 @@ packet ChildWithNestedSum : ParentWithSum {
  MoreBytes : 32,
  NestedChecksum : SimpleSum,
}

packet ParentSizeModifier {
  size(payload) : 8,
  payload : [+2*8], // Include TwoBytes in the size
  TwoBytes : 16,
}

packet ChildSizeModifier : ParentSizeModifier (TwoBytes = 0x1211) {
  MoreBytes : 32,
}