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

Commit 8bb8a67f authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "PDL: Add CreateOptional for validated packets" into main am: 251612bc

parents 0f35efb2 251612bc
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ bool generate_cpp_headers_one_file(

#include <cstdint>
#include <functional>
#include <optional>
#include <sstream>
#include <string>
#include <type_traits>
+14 −1
Original line number Diff line number Diff line
@@ -44,9 +44,22 @@ void PacketDef::GenParserDefinition(std::ostream& s, bool generate_fuzzing, bool
  if (parent_ != nullptr) {
    s << "static " << name_ << "View Create(" << parent_->name_ << "View parent)";
    s << "{ return " << name_ << "View(std::move(parent)); }";
    // CreateOptional
    s << "static std::optional<" << name_ << "View> CreateOptional(";
    s << parent_->name_ << "View parent)";
    s << "{ auto to_validate = " << name_ << "View::Create(std::move(parent));";
    s << "if (to_validate.IsValid()) { return to_validate; }";
    s << "else {return {};}}";
  } else {
    s << "static " << name_ << "View Create(PacketView<" << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet) ";
    s << "static " << name_ << "View Create(PacketView<";
    s << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet)";
    s << "{ return " << name_ << "View(std::move(packet)); }";
    // CreateOptional
    s << "static std::optional<" << name_ << "View> CreateOptional(PacketView<";
    s << (is_little_endian_ ? "" : "!") << "kLittleEndian> packet)";
    s << "{ auto to_validate = " << name_ << "View::Create(std::move(packet));";
    s << "if (to_validate.IsValid()) { return to_validate; }";
    s << "else {return {};}}";
  }

  if (generate_fuzzing || generate_tests) {
+23 −0
Original line number Diff line number Diff line
@@ -1965,6 +1965,29 @@ TEST(GeneratedPacketTest, testToStringOneFixedTypesStruct) {
      view.ToString());
}

TEST(GeneratedPacketTest, testCreateOptional) {
  auto packet = ChildTwoTwoThreeBuilder::Create();

  ASSERT_EQ(child_two_two_three.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);

  PacketView<kLittleEndian> packet_bytes_view(packet_bytes);
  auto wrong_view = ParentView::CreateOptional(packet_bytes_view);
  ASSERT_FALSE(wrong_view.has_value());

  auto parent_view = ParentTwoView::CreateOptional(packet_bytes_view);
  ASSERT_EQ(FourBits::TWO, parent_view->GetFourBits());

  auto child_view = ChildTwoTwoView::CreateOptional(*parent_view);
  ASSERT_EQ(FourBits::THREE, child_view->GetMoreBits());

  auto grandchild_view = ChildTwoTwoThreeView::CreateOptional(*child_view);
  ASSERT_TRUE(grandchild_view.has_value());
}

}  // namespace parser
}  // namespace packet
}  // namespace bluetooth