@@ -67,6 +67,14 @@ using ::chip::System::pbuf;
67
67
#define TO_LWIP_PBUF (x ) (reinterpret_cast <struct pbuf *>(reinterpret_cast <void *>(x)))
68
68
#define OF_LWIP_PBUF (x ) (reinterpret_cast <PacketBuffer *>(reinterpret_cast <void *>(x)))
69
69
70
+ namespace {
71
+ void ScrambleData (uint8_t * start, uint16_t length)
72
+ {
73
+ for (uint16_t i = 0 ; i < length; ++i)
74
+ ++start[i];
75
+ }
76
+ } // namespace
77
+
70
78
/*
71
79
* An instance of this class created for the test suite.
72
80
* It is a friend class of `PacketBuffer` and `PacketBufferHandle` because some tests
@@ -120,6 +128,7 @@ class PacketBufferTest
120
128
static void CheckHandleHold (nlTestSuite * inSuite, void * inContext);
121
129
static void CheckHandleAdvance (nlTestSuite * inSuite, void * inContext);
122
130
static void CheckHandleRightSize (nlTestSuite * inSuite, void * inContext);
131
+ static void CheckHandleCloneData (nlTestSuite * inSuite, void * inContext);
123
132
static void CheckPacketBufferWriter (nlTestSuite * inSuite, void * inContext);
124
133
static void CheckBuildFreeList (nlTestSuite * inSuite, void * inContext);
125
134
@@ -1707,6 +1716,82 @@ void PacketBufferTest::CheckHandleRightSize(nlTestSuite * inSuite, void * inCont
1707
1716
#endif // CHIP_SYSTEM_PACKETBUFFER_HAS_RIGHT_SIZE
1708
1717
}
1709
1718
1719
+ void PacketBufferTest::CheckHandleCloneData (nlTestSuite * inSuite, void * inContext)
1720
+ {
1721
+ struct TestContext * const theContext = static_cast <struct TestContext *>(inContext);
1722
+ PacketBufferTest * const test = theContext->test ;
1723
+ NL_TEST_ASSERT (inSuite, test->mContext == theContext);
1724
+
1725
+ uint8_t lPayload[2 * PacketBuffer::kMaxSizeWithoutReserve ];
1726
+ for (size_t i = 0 ; i < sizeof (lPayload); ++i)
1727
+ {
1728
+ lPayload[i] = static_cast <uint8_t >(random ());
1729
+ }
1730
+
1731
+ for (auto & config_1 : test->configurations )
1732
+ {
1733
+ for (auto & config_2 : test->configurations )
1734
+ {
1735
+ if (&config_1 == &config_2)
1736
+ {
1737
+ continue ;
1738
+ }
1739
+
1740
+ test->PrepareTestBuffer (&config_1);
1741
+ test->PrepareTestBuffer (&config_2);
1742
+
1743
+ const uint8_t * payload_1 = lPayload;
1744
+ memcpy (config_1.handle ->Start (), payload_1, config_1.handle ->MaxDataLength ());
1745
+ config_1.handle ->SetDataLength (config_1.handle ->MaxDataLength ());
1746
+
1747
+ const uint8_t * payload_2 = lPayload + config_1.handle ->MaxDataLength ();
1748
+ memcpy (config_2.handle ->Start (), payload_2, config_2.handle ->MaxDataLength ());
1749
+ config_2.handle ->SetDataLength (config_2.handle ->MaxDataLength ());
1750
+
1751
+ // Clone single buffer.
1752
+ PacketBufferHandle clone_1 = config_1.handle .CloneData ();
1753
+ NL_TEST_ASSERT (inSuite, !clone_1.IsNull ());
1754
+ NL_TEST_ASSERT (inSuite, clone_1->DataLength () == config_1.handle ->DataLength ());
1755
+ NL_TEST_ASSERT (inSuite, memcmp (clone_1->Start (), payload_1, clone_1->DataLength ()) == 0 );
1756
+ if (clone_1->DataLength ())
1757
+ {
1758
+ // Verify that modifying the clone does not affect the original.
1759
+ ScrambleData (clone_1->Start (), clone_1->DataLength ());
1760
+ NL_TEST_ASSERT (inSuite, memcmp (clone_1->Start (), payload_1, clone_1->DataLength ()) != 0 );
1761
+ NL_TEST_ASSERT (inSuite, memcmp (config_1.handle ->Start (), payload_1, config_1.handle ->DataLength ()) == 0 );
1762
+ }
1763
+
1764
+ // Clone buffer chain.
1765
+ config_1.handle ->AddToEnd (config_2.handle .Retain ());
1766
+ NL_TEST_ASSERT (inSuite, config_1.handle ->HasChainedBuffer ());
1767
+ clone_1 = config_1.handle .CloneData ();
1768
+ PacketBufferHandle clone_1_next = clone_1->Next ();
1769
+ NL_TEST_ASSERT (inSuite, !clone_1.IsNull ());
1770
+ NL_TEST_ASSERT (inSuite, clone_1->HasChainedBuffer ());
1771
+ NL_TEST_ASSERT (inSuite, clone_1->DataLength () == config_1.handle ->DataLength ());
1772
+ NL_TEST_ASSERT (inSuite, clone_1->TotalLength () == config_1.handle ->TotalLength ());
1773
+ NL_TEST_ASSERT (inSuite, clone_1_next->DataLength () == config_2.handle ->DataLength ());
1774
+ NL_TEST_ASSERT (inSuite, memcmp (clone_1->Start (), payload_1, clone_1->DataLength ()) == 0 );
1775
+ NL_TEST_ASSERT (inSuite, memcmp (clone_1_next->Start (), payload_2, clone_1_next->DataLength ()) == 0 );
1776
+ if (clone_1->DataLength ())
1777
+ {
1778
+ ScrambleData (clone_1->Start (), clone_1->DataLength ());
1779
+ NL_TEST_ASSERT (inSuite, memcmp (clone_1->Start (), payload_1, clone_1->DataLength ()) != 0 );
1780
+ NL_TEST_ASSERT (inSuite, memcmp (config_1.handle ->Start (), payload_1, config_1.handle ->DataLength ()) == 0 );
1781
+ }
1782
+ if (clone_1_next->DataLength ())
1783
+ {
1784
+ ScrambleData (clone_1_next->Start (), clone_1_next->DataLength ());
1785
+ NL_TEST_ASSERT (inSuite, memcmp (clone_1_next->Start (), payload_2, clone_1_next->DataLength ()) != 0 );
1786
+ NL_TEST_ASSERT (inSuite, memcmp (config_2.handle ->Start (), payload_2, config_2.handle ->DataLength ()) == 0 );
1787
+ }
1788
+
1789
+ config_1.handle = nullptr ;
1790
+ config_2.handle = nullptr ;
1791
+ }
1792
+ }
1793
+ }
1794
+
1710
1795
void PacketBufferTest::CheckPacketBufferWriter (nlTestSuite * inSuite, void * inContext)
1711
1796
{
1712
1797
struct TestContext * const theContext = static_cast <struct TestContext *>(inContext);
@@ -1773,6 +1858,7 @@ const nlTest sTests[] =
1773
1858
NL_TEST_DEF (" PacketBuffer::HandleHold" , PacketBufferTest::CheckHandleHold),
1774
1859
NL_TEST_DEF (" PacketBuffer::HandleAdvance" , PacketBufferTest::CheckHandleAdvance),
1775
1860
NL_TEST_DEF (" PacketBuffer::HandleRightSize" , PacketBufferTest::CheckHandleRightSize),
1861
+ NL_TEST_DEF (" PacketBuffer::HandleCloneData" , PacketBufferTest::CheckHandleCloneData),
1776
1862
NL_TEST_DEF (" PacketBuffer::PacketBufferWriter" , PacketBufferTest::CheckPacketBufferWriter),
1777
1863
1778
1864
NL_TEST_SENTINEL ()
0 commit comments