// 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 "recombiner.h"

#include <gtest/gtest.h>

#include "pdu.h"
#include "src/connectivity/bluetooth/core/bt-host/hci/hci.h"
#include "src/connectivity/bluetooth/core/bt-host/hci/packet.h"

namespace bt {
namespace l2cap {
namespace {

template <typename... T>
hci::ACLDataPacketPtr PacketFromBytes(T... data) {
  auto bytes = CreateStaticByteBuffer(std::forward<T>(data)...);
  ZX_DEBUG_ASSERT(bytes.size() >= sizeof(hci::ACLDataHeader));

  auto packet = hci::ACLDataPacket::New(bytes.size() - sizeof(hci::ACLDataHeader));
  packet->mutable_view()->mutable_data().Write(bytes);
  packet->InitializeFromBuffer();

  return packet;
}

TEST(L2CAP_RecombinerTest, BadFirstFragment) {
  Recombiner recombiner;
  PDU pdu;
  EXPECT_FALSE(pdu.is_valid());

  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));

  // clang-format off

  // Too small (no basic L2CAP header)
  auto packet0 = PacketFromBytes(
    // ACL data header
    0x01, 0x00, 0x03, 0x00,

    // Incomplete basic L2CAP header (one byte short)
    0x00, 0x00, 0x03
  );

  // Too large
  auto packet1 = PacketFromBytes(
    // ACL data header
    0x01, 0x00, 0x06, 0x00,

    // PDU length (2 bytes) is larger than reported length (1 byte)
    0x01, 0x00, 0xFF, 0xFF, 0x00, 0x00
  );

  // Continuation fragment
  auto packet2 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x05, 0x00,

    // L2CAP header + PDU
    0x01, 0x00, 0xFF, 0xFF, 0x00
  );

  // clang-format on

  EXPECT_FALSE(recombiner.AddFragment(std::move(packet0)));
  EXPECT_FALSE(recombiner.AddFragment(std::move(packet1)));
  EXPECT_FALSE(recombiner.AddFragment(std::move(packet2)));

  // None of the packets should have been moved.
  EXPECT_TRUE(packet0);
  EXPECT_TRUE(packet1);
  EXPECT_TRUE(packet2);

  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));
}

TEST(L2CAP_RecombinerTest, CompleteFirstFragmentEmptyPDU) {
  Recombiner recombiner;

  // clang-format off

  // Zero-length PDU
  auto packet0 = PacketFromBytes(
    // ACL data header
    0x01, 0x00, 0x04, 0x00,

    // Basic L2CAP header
    0x00, 0x00, 0xFF, 0xFF
  );

  // Continuation fragment
  auto packet1 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x05, 0x00,

    // L2CAP header + PDU
    0x01, 0x00, 0xFF, 0xFF, 0x00
  );

  // clang-format on

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));

  // |packet0| should have moved.
  EXPECT_FALSE(packet0);

  EXPECT_FALSE(recombiner.empty());
  EXPECT_TRUE(recombiner.ready());

  // Adding a continuation fragment should fail as the PDU is complete.
  EXPECT_FALSE(recombiner.AddFragment(std::move(packet1)));
  EXPECT_TRUE(packet1);

  PDU pdu;
  EXPECT_TRUE(recombiner.Release(&pdu));
  EXPECT_TRUE(pdu.is_valid());
  EXPECT_EQ(0u, pdu.length());
  EXPECT_EQ(0xFFFF, pdu.channel_id());

  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));

  // PDU should remain unmodified.
  EXPECT_TRUE(pdu.is_valid());
  EXPECT_EQ(0u, pdu.length());
  EXPECT_EQ(0xFFFF, pdu.channel_id());
}

TEST(L2CAP_RecombinerTest, CompleteFirstFragment) {
  Recombiner recombiner;

  // clang-format off

  // Non-empty PDU
  auto packet0 = PacketFromBytes(
    // ACL data header
    0x01, 0x00, 0x08, 0x00,

    // Basic L2CAP header
    0x04, 0x00, 0xFF, 0xFF, 'T', 'e', 's', 't'
  );

  // Continuation fragment
  auto packet1 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x05, 0x00,

    // L2CAP header + PDU
    0x01, 0x00, 0xFF, 0xFF, 0x00
  );

  // clang-format on

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));

  // |packet0| should have moved.
  EXPECT_FALSE(packet0);

  EXPECT_FALSE(recombiner.empty());
  EXPECT_TRUE(recombiner.ready());

  // Adding a continuation fragment should fail as the PDU is complete.
  EXPECT_FALSE(recombiner.AddFragment(std::move(packet1)));
  EXPECT_TRUE(packet1);

  PDU pdu;
  EXPECT_TRUE(recombiner.Release(&pdu));
  EXPECT_TRUE(pdu.is_valid());
  EXPECT_EQ(0xFFFF, pdu.channel_id());

  ASSERT_EQ(4u, pdu.length());

  StaticByteBuffer<4> pdu_data;
  pdu.Copy(&pdu_data);
  EXPECT_EQ("Test", pdu_data.AsString());

  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));
}

TEST(L2CAP_RecombinerTest, BadContinuationFragment) {
  Recombiner recombiner;

  // clang-format off

  // Partial initial fragment
  auto packet0 = PacketFromBytes(
    // ACL data header (total size is 4, packet contains 1)
    0x01, 0x00, 0x05, 0x00,

    // Basic L2CAP header
    0x04, 0x00, 0xFF, 0xFF, 'T'
  );

  // Beginning fragment (instead of continuation).
  auto packet1 = PacketFromBytes(
    // ACL data header (PBF: first non-flushable)
    0x01, 0x00, 0x03, 0x00,

    // L2CAP PDU fragment
    'e', 's', 't'
  );

  // Continuation fragment too long
  auto packet2 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x04, 0x00,

    // L2CAP PDU fragment
    'e', 's', 't', '!'
  );

  // clang-format on

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));
  EXPECT_FALSE(packet0);

  // recombiner is no longer empty but also not ready yet.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_FALSE(recombiner.ready());

  EXPECT_FALSE(recombiner.AddFragment(std::move(packet1)));
  EXPECT_FALSE(recombiner.AddFragment(std::move(packet2)));
  EXPECT_TRUE(packet1);
  EXPECT_TRUE(packet2);

  // recombiner state should not have changed.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_FALSE(recombiner.ready());
}

TEST(L2CAP_RecombinerTest, CompleteContinuationFragment) {
  Recombiner recombiner;

  // clang-format off

  // Partial initial fragment
  auto packet0 = PacketFromBytes(
    // ACL data header (total size is 4, packet contains 1)
    0x01, 0x00, 0x05, 0x00,

    // Basic L2CAP header
    0x04, 0x00, 0xFF, 0xFF, 'T'
  );

  // Continuation fragment
  auto packet1 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x03, 0x00,

    // L2CAP PDU fragment
    'e', 's', 't'
  );

  // clang-format on

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));
  EXPECT_FALSE(packet0);

  // recombiner is no longer empty but also not ready yet.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_FALSE(recombiner.ready());

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet1)));
  EXPECT_FALSE(packet1);

  // recombiner should be ready.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_TRUE(recombiner.ready());

  PDU pdu;
  EXPECT_TRUE(recombiner.Release(&pdu));
  EXPECT_TRUE(pdu.is_valid());
  EXPECT_EQ(0xFFFF, pdu.channel_id());

  ASSERT_EQ(4u, pdu.length());

  StaticByteBuffer<4> pdu_data;
  pdu.Copy(&pdu_data);
  EXPECT_EQ("Test", pdu_data.AsString());

  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));
}

TEST(L2CAP_RecombinerTest, MultipleContinuationFragments) {
  Recombiner recombiner;

  // clang-format off

  // Partial initial fragment
  auto packet0 = PacketFromBytes(
    // ACL data header (total size is 4, packet contains 1)
    0x01, 0x00, 0x0A, 0x00,

    // Basic L2CAP header
    0x0F, 0x00, 0xFF, 0xFF, 'T', 'h', 'i', 's', ' ', 'i'
  );

  // Continuation fragment
  auto packet1 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x06, 0x00,

    // L2CAP PDU fragment
    's', ' ', 'a', ' ', 't', 'e'
  );

  // Continuation fragment
  auto packet2 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x02, 0x00,

    // L2CAP PDU fragment
    's', 't'
  );

  // Continuation fragment
  auto packet3 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x01, 0x00,

    // L2CAP PDU fragment
    '!'
  );

  // clang-format on

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));
  EXPECT_FALSE(packet0);

  // recombiner is no longer empty but also not ready yet.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_FALSE(recombiner.ready());

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet1)));
  EXPECT_TRUE(recombiner.AddFragment(std::move(packet2)));
  EXPECT_TRUE(recombiner.AddFragment(std::move(packet3)));
  EXPECT_FALSE(packet1);
  EXPECT_FALSE(packet2);
  EXPECT_FALSE(packet3);

  // recombiner should be ready.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_TRUE(recombiner.ready());

  PDU pdu;
  EXPECT_TRUE(recombiner.Release(&pdu));
  EXPECT_TRUE(pdu.is_valid());

  ASSERT_EQ(15u, pdu.length());

  StaticByteBuffer<15u> pdu_data;
  pdu.Copy(&pdu_data);
  EXPECT_EQ("This is a test!", pdu_data.AsString());

  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));
}

TEST(L2CAP_RecombinerTest, Drop) {
  Recombiner recombiner;

  // clang-format off

  // Partial initial fragment
  auto packet0 = PacketFromBytes(
    // ACL data header (total size is 4, packet contains 1)
    0x01, 0x00, 0x05, 0x00,

    // Basic L2CAP header
    0x04, 0x00, 0xFF, 0xFF, 'T'
  );

  // Continuation fragment
  auto packet1 = PacketFromBytes(
    // ACL data header (PBF: continuing fragment)
    0x01, 0x10, 0x03, 0x00,

    // L2CAP PDU fragment
    'e', 's', 't'
  );

  // clang-format on

  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));
  EXPECT_TRUE(recombiner.AddFragment(std::move(packet1)));

  // recombiner should be ready.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_TRUE(recombiner.ready());

  recombiner.Drop();

  PDU pdu;
  EXPECT_FALSE(recombiner.ready());
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.Release(&pdu));
}

TEST(L2CAP_RecombinerTest, DropPartial) {
  Recombiner recombiner;

  // clang-format off

  // Partial initial fragment
  auto packet0 = PacketFromBytes(
    // ACL data header (total size is 4, packet contains 1)
    0x01, 0x00, 0x05, 0x00,

    // Basic L2CAP header
    0x04, 0x00, 0xFF, 0xFF, 'T'
  );

  // Complete packet
  auto packet1 = PacketFromBytes(
    // ACL data header
    0x01, 0x00, 0x08, 0x00,

    // Basic L2CAP header
    0x04, 0x00, 0xFF, 0xFF, 'T', 'e', 's', 't'
  );

  // clang-format on

  // Partially fill packet.
  EXPECT_TRUE(recombiner.AddFragment(std::move(packet0)));
  EXPECT_FALSE(recombiner.empty());
  EXPECT_FALSE(recombiner.ready());

  recombiner.Drop();
  EXPECT_TRUE(recombiner.empty());
  EXPECT_FALSE(recombiner.ready());

  // Build a new PDU. The previous packet should have no effect.
  EXPECT_TRUE(recombiner.AddFragment(std::move(packet1)));

  // recombiner should be ready.
  EXPECT_FALSE(recombiner.empty());
  EXPECT_TRUE(recombiner.ready());

  PDU pdu;
  EXPECT_TRUE(recombiner.Release(&pdu));
  EXPECT_EQ(4u, pdu.length());
}

}  // namespace
}  // namespace l2cap
}  // namespace bt
