Loading system/packet/avrcp/get_element_attributes_packet.cc +6 −6 Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ GetElementAttributesResponseBuilder::MakeBuilder(size_t mtu) { return builder; } bool GetElementAttributesResponseBuilder::AddAttributeEntry( size_t GetElementAttributesResponseBuilder::AddAttributeEntry( AttributeEntry entry) { CHECK_LT(entries_.size(), size_t(0xFF)) << __func__ << ": attribute entry overflow"; Loading @@ -101,15 +101,15 @@ bool GetElementAttributesResponseBuilder::AddAttributeEntry( } if (entry.empty()) { return false; return 0; } entries_.insert(entry); return true; return entry.size(); } bool GetElementAttributesResponseBuilder::AddAttributeEntry(Attribute attribute, std::string value) { size_t GetElementAttributesResponseBuilder::AddAttributeEntry( Attribute attribute, const std::string& value) { return AddAttributeEntry(AttributeEntry(attribute, value)); } Loading @@ -120,7 +120,7 @@ size_t GetElementAttributesResponseBuilder::size() const { attr_list_size += attribute_entry.size(); } return VendorPacket::kMinSize() + 1 + attr_list_size; return kHeaderSize() + attr_list_size; } bool GetElementAttributesResponseBuilder::Serialize( Loading system/packet/avrcp/get_element_attributes_packet.h +13 −5 Original line number Diff line number Diff line Loading @@ -58,15 +58,21 @@ class GetElementAttributesRequest : public VendorPacket { using VendorPacket::VendorPacket; }; template <class Builder> class AttributesResponseBuilderTestUser; class GetElementAttributesResponseBuilder : public VendorPacketBuilder { public: virtual ~GetElementAttributesResponseBuilder() = default; using Builder = std::unique_ptr<GetElementAttributesResponseBuilder>; static Builder MakeBuilder(size_t mtu); size_t AddAttributeEntry(AttributeEntry entry); size_t AddAttributeEntry(Attribute attribute, const std::string& value); static std::unique_ptr<GetElementAttributesResponseBuilder> MakeBuilder( size_t mtu); virtual void clear() { entries_.clear(); } bool AddAttributeEntry(AttributeEntry entry); bool AddAttributeEntry(Attribute attribute, std::string value); static constexpr size_t kHeaderSize() { return VendorPacket::kMinSize() + 1; } virtual size_t size() const override; virtual bool Serialize( Loading @@ -75,6 +81,8 @@ class GetElementAttributesResponseBuilder : public VendorPacketBuilder { private: std::set<AttributeEntry> entries_; size_t mtu_; friend class AttributesResponseBuilderTestUser< GetElementAttributesResponseBuilder>; GetElementAttributesResponseBuilder(size_t mtu) : VendorPacketBuilder(CType::STABLE, CommandPdu::GET_ELEMENT_ATTRIBUTES, Loading system/packet/avrcp/get_item_attributes.cc +8 −9 Original line number Diff line number Diff line Loading @@ -27,7 +27,8 @@ GetItemAttributesResponseBuilder::MakeBuilder(Status status, size_t mtu) { return builder; } bool GetItemAttributesResponseBuilder::AddAttributeEntry(AttributeEntry entry) { size_t GetItemAttributesResponseBuilder::AddAttributeEntry( AttributeEntry entry) { CHECK(entries_.size() < 0xFF); size_t remaining_space = mtu_ - size(); Loading @@ -36,24 +37,22 @@ bool GetItemAttributesResponseBuilder::AddAttributeEntry(AttributeEntry entry) { } if (entry.empty()) { return false; return 0; } entries_.insert(entry); return true; return entry.size(); } bool GetItemAttributesResponseBuilder::AddAttributeEntry(Attribute attribute, std::string value) { size_t GetItemAttributesResponseBuilder::AddAttributeEntry( Attribute attribute, const std::string& value) { return AddAttributeEntry(AttributeEntry(attribute, value)); } size_t GetItemAttributesResponseBuilder::size() const { size_t len = BrowsePacket::kMinSize(); len += 1; // Status if (status_ != Status::NO_ERROR) return len; size_t len = kHeaderSize(); if (status_ != Status::NO_ERROR) return kErrorHeaderSize(); len += 1; // Number of attributes for (const auto& entry : entries_) { len += entry.size(); } Loading system/packet/avrcp/get_item_attributes.h +24 −5 Original line number Diff line number Diff line Loading @@ -23,15 +23,32 @@ namespace bluetooth { namespace avrcp { template <class Builder> class AttributesResponseBuilderTestUser; class GetItemAttributesResponseBuilder : public BrowsePacketBuilder { public: virtual ~GetItemAttributesResponseBuilder() = default; using Builder = std::unique_ptr<GetItemAttributesResponseBuilder>; static Builder MakeBuilder(Status status, size_t mtu); size_t AddAttributeEntry(AttributeEntry entry); size_t AddAttributeEntry(Attribute, const std::string&); virtual void clear() { entries_.clear(); } static std::unique_ptr<GetItemAttributesResponseBuilder> MakeBuilder( Status status, size_t mtu); static constexpr size_t kHeaderSize() { size_t len = BrowsePacket::kMinSize(); len += 1; // Status len += 1; // Number of attributes return len; } bool AddAttributeEntry(AttributeEntry entry); bool AddAttributeEntry(Attribute, std::string); static constexpr size_t kErrorHeaderSize() { size_t len = BrowsePacket::kMinSize(); len += 1; // Status return len; } virtual size_t size() const override; virtual bool Serialize( Loading @@ -41,6 +58,8 @@ class GetItemAttributesResponseBuilder : public BrowsePacketBuilder { Status status_; size_t mtu_; std::set<AttributeEntry> entries_; friend class AttributesResponseBuilderTestUser< GetItemAttributesResponseBuilder>; GetItemAttributesResponseBuilder(Status status, size_t mtu) : BrowsePacketBuilder(BrowsePdu::GET_ITEM_ATTRIBUTES), Loading system/packet/tests/avrcp/get_element_attributes_packet_test.cc +42 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,47 @@ TEST(GetElementAttributesResponseBuilderTest, builderTest) { ASSERT_EQ(test_packet->GetData(), get_elements_attributes_response_full); } TEST(GetElementAttributesResponseBuilderTest, builderMtuTest) { std::vector<AttributeEntry> test_data = { {Attribute::TITLE, "Test Song 1"}, {Attribute::ARTIST_NAME, "Test Artist"}, {Attribute::ALBUM_NAME, "Test Album"}, {Attribute::TRACK_NUMBER, "1"}, {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"}, {Attribute::GENRE, "Test Genre"}, {Attribute::PLAYING_TIME, "10 200"}, {Attribute::TITLE, "Test Song 2"}, {Attribute::ARTIST_NAME, "Test Artist"}, {Attribute::ALBUM_NAME, "Test Album"}, {Attribute::TRACK_NUMBER, "2"}, {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"}, {Attribute::GENRE, "Test Genre"}, {Attribute::PLAYING_TIME, "1500"}, }; using Builder = GetElementAttributesResponseBuilder; using Helper = FragmentationBuilderHelper<Builder>; size_t mtu = size_t(-1); Helper helper(mtu, [](size_t mtu) { return Builder::MakeBuilder(mtu); }); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false)); mtu = test_data[0].size() + Builder::kHeaderSize(); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu)); mtu = test_data[0].size() + test_data[1].size() + Builder::kHeaderSize(); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu)); mtu = test_data[0].size() + (Builder::kHeaderSize() * 2) + 1; EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, true, false)); mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize() + 1; EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu)); mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize(); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false)); } TEST(GetElementAttributesResponseBuilderTest, truncateBuilderTest) { auto attribute = AttributeEntry(Attribute::TITLE, "1234"); size_t truncated_size = VendorPacket::kMinSize(); Loading Loading
system/packet/avrcp/get_element_attributes_packet.cc +6 −6 Original line number Diff line number Diff line Loading @@ -90,7 +90,7 @@ GetElementAttributesResponseBuilder::MakeBuilder(size_t mtu) { return builder; } bool GetElementAttributesResponseBuilder::AddAttributeEntry( size_t GetElementAttributesResponseBuilder::AddAttributeEntry( AttributeEntry entry) { CHECK_LT(entries_.size(), size_t(0xFF)) << __func__ << ": attribute entry overflow"; Loading @@ -101,15 +101,15 @@ bool GetElementAttributesResponseBuilder::AddAttributeEntry( } if (entry.empty()) { return false; return 0; } entries_.insert(entry); return true; return entry.size(); } bool GetElementAttributesResponseBuilder::AddAttributeEntry(Attribute attribute, std::string value) { size_t GetElementAttributesResponseBuilder::AddAttributeEntry( Attribute attribute, const std::string& value) { return AddAttributeEntry(AttributeEntry(attribute, value)); } Loading @@ -120,7 +120,7 @@ size_t GetElementAttributesResponseBuilder::size() const { attr_list_size += attribute_entry.size(); } return VendorPacket::kMinSize() + 1 + attr_list_size; return kHeaderSize() + attr_list_size; } bool GetElementAttributesResponseBuilder::Serialize( Loading
system/packet/avrcp/get_element_attributes_packet.h +13 −5 Original line number Diff line number Diff line Loading @@ -58,15 +58,21 @@ class GetElementAttributesRequest : public VendorPacket { using VendorPacket::VendorPacket; }; template <class Builder> class AttributesResponseBuilderTestUser; class GetElementAttributesResponseBuilder : public VendorPacketBuilder { public: virtual ~GetElementAttributesResponseBuilder() = default; using Builder = std::unique_ptr<GetElementAttributesResponseBuilder>; static Builder MakeBuilder(size_t mtu); size_t AddAttributeEntry(AttributeEntry entry); size_t AddAttributeEntry(Attribute attribute, const std::string& value); static std::unique_ptr<GetElementAttributesResponseBuilder> MakeBuilder( size_t mtu); virtual void clear() { entries_.clear(); } bool AddAttributeEntry(AttributeEntry entry); bool AddAttributeEntry(Attribute attribute, std::string value); static constexpr size_t kHeaderSize() { return VendorPacket::kMinSize() + 1; } virtual size_t size() const override; virtual bool Serialize( Loading @@ -75,6 +81,8 @@ class GetElementAttributesResponseBuilder : public VendorPacketBuilder { private: std::set<AttributeEntry> entries_; size_t mtu_; friend class AttributesResponseBuilderTestUser< GetElementAttributesResponseBuilder>; GetElementAttributesResponseBuilder(size_t mtu) : VendorPacketBuilder(CType::STABLE, CommandPdu::GET_ELEMENT_ATTRIBUTES, Loading
system/packet/avrcp/get_item_attributes.cc +8 −9 Original line number Diff line number Diff line Loading @@ -27,7 +27,8 @@ GetItemAttributesResponseBuilder::MakeBuilder(Status status, size_t mtu) { return builder; } bool GetItemAttributesResponseBuilder::AddAttributeEntry(AttributeEntry entry) { size_t GetItemAttributesResponseBuilder::AddAttributeEntry( AttributeEntry entry) { CHECK(entries_.size() < 0xFF); size_t remaining_space = mtu_ - size(); Loading @@ -36,24 +37,22 @@ bool GetItemAttributesResponseBuilder::AddAttributeEntry(AttributeEntry entry) { } if (entry.empty()) { return false; return 0; } entries_.insert(entry); return true; return entry.size(); } bool GetItemAttributesResponseBuilder::AddAttributeEntry(Attribute attribute, std::string value) { size_t GetItemAttributesResponseBuilder::AddAttributeEntry( Attribute attribute, const std::string& value) { return AddAttributeEntry(AttributeEntry(attribute, value)); } size_t GetItemAttributesResponseBuilder::size() const { size_t len = BrowsePacket::kMinSize(); len += 1; // Status if (status_ != Status::NO_ERROR) return len; size_t len = kHeaderSize(); if (status_ != Status::NO_ERROR) return kErrorHeaderSize(); len += 1; // Number of attributes for (const auto& entry : entries_) { len += entry.size(); } Loading
system/packet/avrcp/get_item_attributes.h +24 −5 Original line number Diff line number Diff line Loading @@ -23,15 +23,32 @@ namespace bluetooth { namespace avrcp { template <class Builder> class AttributesResponseBuilderTestUser; class GetItemAttributesResponseBuilder : public BrowsePacketBuilder { public: virtual ~GetItemAttributesResponseBuilder() = default; using Builder = std::unique_ptr<GetItemAttributesResponseBuilder>; static Builder MakeBuilder(Status status, size_t mtu); size_t AddAttributeEntry(AttributeEntry entry); size_t AddAttributeEntry(Attribute, const std::string&); virtual void clear() { entries_.clear(); } static std::unique_ptr<GetItemAttributesResponseBuilder> MakeBuilder( Status status, size_t mtu); static constexpr size_t kHeaderSize() { size_t len = BrowsePacket::kMinSize(); len += 1; // Status len += 1; // Number of attributes return len; } bool AddAttributeEntry(AttributeEntry entry); bool AddAttributeEntry(Attribute, std::string); static constexpr size_t kErrorHeaderSize() { size_t len = BrowsePacket::kMinSize(); len += 1; // Status return len; } virtual size_t size() const override; virtual bool Serialize( Loading @@ -41,6 +58,8 @@ class GetItemAttributesResponseBuilder : public BrowsePacketBuilder { Status status_; size_t mtu_; std::set<AttributeEntry> entries_; friend class AttributesResponseBuilderTestUser< GetItemAttributesResponseBuilder>; GetItemAttributesResponseBuilder(Status status, size_t mtu) : BrowsePacketBuilder(BrowsePdu::GET_ITEM_ATTRIBUTES), Loading
system/packet/tests/avrcp/get_element_attributes_packet_test.cc +42 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,47 @@ TEST(GetElementAttributesResponseBuilderTest, builderTest) { ASSERT_EQ(test_packet->GetData(), get_elements_attributes_response_full); } TEST(GetElementAttributesResponseBuilderTest, builderMtuTest) { std::vector<AttributeEntry> test_data = { {Attribute::TITLE, "Test Song 1"}, {Attribute::ARTIST_NAME, "Test Artist"}, {Attribute::ALBUM_NAME, "Test Album"}, {Attribute::TRACK_NUMBER, "1"}, {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"}, {Attribute::GENRE, "Test Genre"}, {Attribute::PLAYING_TIME, "10 200"}, {Attribute::TITLE, "Test Song 2"}, {Attribute::ARTIST_NAME, "Test Artist"}, {Attribute::ALBUM_NAME, "Test Album"}, {Attribute::TRACK_NUMBER, "2"}, {Attribute::TOTAL_NUMBER_OF_TRACKS, "2"}, {Attribute::GENRE, "Test Genre"}, {Attribute::PLAYING_TIME, "1500"}, }; using Builder = GetElementAttributesResponseBuilder; using Helper = FragmentationBuilderHelper<Builder>; size_t mtu = size_t(-1); Helper helper(mtu, [](size_t mtu) { return Builder::MakeBuilder(mtu); }); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false)); mtu = test_data[0].size() + Builder::kHeaderSize(); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu)); mtu = test_data[0].size() + test_data[1].size() + Builder::kHeaderSize(); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu)); mtu = test_data[0].size() + (Builder::kHeaderSize() * 2) + 1; EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, true, false)); mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize() + 1; EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu)); mtu = Builder::kHeaderSize() + AttributeEntry::kHeaderSize(); EXPECT_NO_FATAL_FAILURE(helper.runTest(test_data, mtu, false, false)); } TEST(GetElementAttributesResponseBuilderTest, truncateBuilderTest) { auto attribute = AttributeEntry(Attribute::TITLE, "1234"); size_t truncated_size = VendorPacket::kMinSize(); Loading