text: // Copyright 2019 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 "basic_mode_rx_engine.h"
  
  #include "gtest/gtest.h"
  #include "src/connectivity/bluetooth/core/bt-host/common/byte_buffer.h"
  #include "src/connectivity/bluetooth/core/bt-host/common/test_helpers.h"
  #include "src/connectivity/bluetooth/core/bt-host/hci/hci.h"
  #include "src/connectivity/bluetooth/core/bt-host/l2cap/fragmenter.h"
  #include "src/connectivity/bluetooth/core/bt-host/l2cap/recombiner.h"
  
  namespace bt {
  namespace l2cap {
  namespace internal {
  namespace {
  
  constexpr hci::ConnectionHandle kTestHandle = 0x0001;
  constexpr ChannelId kTestChannelId = 0x0001;
  
  TEST(L2CAP_BasicModeRxEngineTest, ProcessPduReturnsSdu) {
    const auto payload = CreateStaticByteBuffer('h', 'e', 'l', 'l', 'o');
    const auto sdu = BasicModeRxEngine().ProcessPdu(
        Fragmenter(kTestHandle).BuildBasicFrame(kTestChannelId, payload));
    ASSERT_TRUE(sdu);
    EXPECT_TRUE(ContainersEqual(payload, *sdu));
  }
  
  TEST(L2CAP_BasicModeRxEngineTest, ProcessPduCanHandleZeroBytePayload) {
    const auto byte_buf =
        CreateStaticByteBuffer(0x01, 0x00, 0x04, 0x00,  // ACL data header
                               0x00, 0x00, 0xFF, 0xFF   // Basic L2CAP header
        );
    auto hci_packet =
        hci::ACLDataPacket::New(byte_buf.size() - sizeof(hci::ACLDataHeader));
    hci_packet->mutable_view()->mutable_data().Write(byte_buf);
    hci_packet->InitializeFromBuffer();
  
    Recombiner recombiner;
    ASSERT_TRUE(recombiner.AddFragment(std::move(hci_packet)));
  
    PDU pdu;
    ASSERT_TRUE(recombiner.Release(&pdu));
    ASSERT_TRUE(pdu.is_valid());
    ASSERT_EQ(1u, pdu.fragment_count());
    ASSERT_EQ(0u, pdu.length());
  
    const ByteBufferPtr sdu = BasicModeRxEngine().ProcessPdu(std::move(pdu));
    ASSERT_TRUE(sdu);
    EXPECT_EQ(0u, sdu->size());
  }
  
  }  // namespace
  }  // namespace internal
  }  // namespace l2cap
  }  // namespace bt
  