| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "slab_allocators.h" |
| |
| #include <forward_list> |
| |
| #include "acl_data_packet.h" |
| #include "control_packets.h" |
| #include "gtest/gtest.h" |
| |
| namespace bt { |
| namespace hci { |
| namespace slab_allocators { |
| namespace { |
| |
| constexpr OpCode kTestOpCode = 0xFFFF; |
| |
| TEST(HCI_SlabAllocatorsTest, CommandPacket) { |
| auto packet = CommandPacket::New(kTestOpCode, 5); |
| EXPECT_TRUE(packet); |
| EXPECT_EQ(5u + sizeof(CommandHeader), packet->view().size()); |
| |
| packet = CommandPacket::New(kTestOpCode, kSmallControlPayloadSize); |
| EXPECT_TRUE(packet); |
| EXPECT_GE(packet->view().size(), kSmallControlPacketSize); |
| |
| packet = CommandPacket::New(kTestOpCode, kSmallControlPayloadSize + 1); |
| EXPECT_TRUE(packet); |
| EXPECT_EQ(kSmallControlPacketSize + 1, packet->view().size()); |
| } |
| |
| TEST(HCI_SlabAllocatorsTest, CommandPacketFallBack) { |
| size_t num_packets = 0; |
| LinkedList<Packet<CommandHeader>> packets; |
| |
| // Allocate a lot of small packets. We should be able to allocate two |
| // allocators' worth of packets until we fail. |
| while (auto packet = CommandPacket::New(kTestOpCode, 5)) { |
| packets.push_front(std::move(packet)); |
| num_packets++; |
| } |
| |
| EXPECT_EQ(kMaxNumSlabs * kNumSmallControlPackets + |
| kMaxNumSlabs * kNumLargeControlPackets, |
| num_packets); |
| } |
| |
| TEST(HCI_SlabAllocatorsTest, ACLDataPacket) { |
| auto packet = ACLDataPacket::New(5); |
| EXPECT_TRUE(packet); |
| EXPECT_EQ(packet->view().size(), 5u + sizeof(ACLDataHeader)); |
| |
| packet = ACLDataPacket::New(kSmallACLDataPayloadSize); |
| EXPECT_TRUE(packet); |
| EXPECT_EQ(kSmallACLDataPacketSize, packet->view().size()); |
| |
| packet = ACLDataPacket::New(kSmallACLDataPayloadSize + 1); |
| EXPECT_TRUE(packet); |
| EXPECT_EQ(kSmallACLDataPacketSize + 1, packet->view().size()); |
| |
| packet = ACLDataPacket::New(kMediumACLDataPayloadSize + 1); |
| EXPECT_EQ(kMediumACLDataPacketSize + 1, packet->view().size()); |
| } |
| |
| TEST(HCI_SlabAllocatorsTest, ACLDataPacketFallBack) { |
| size_t num_packets = 0; |
| LinkedList<Packet<ACLDataHeader>> packets; |
| |
| // Allocate a lot of small packets. We should be able to allocate three |
| // allocators' worth of packets until we fail. |
| while (auto packet = ACLDataPacket::New(5)) { |
| packets.push_front(std::move(packet)); |
| num_packets++; |
| } |
| |
| EXPECT_EQ(kMaxNumSlabs * kNumSmallACLDataPackets + |
| kMaxNumSlabs * kNumMediumACLDataPackets + |
| kMaxNumSlabs * kNumLargeACLDataPackets, |
| num_packets); |
| } |
| |
| } // namespace |
| } // namespace slab_allocators |
| } // namespace hci |
| } // namespace bt |