@@ -304,6 +304,73 @@ TEST_P(WithAllPools, PageAlligned) {
304304 }
305305}
306306
307+ TEST_P (WithAllPools, RcBufDetach) {
308+ auto memPool = GetParam ();
309+ TRcBuf data = memPool->AllocRcBuf (4 , 0 ).value ();
310+ {
311+ ::memcpy (data.UnsafeGetDataMut(), "test", 4);
312+ }
313+ TRcBuf data2 = data;
314+ UNIT_ASSERT_EQUAL (data.GetData (), data2.GetData ());
315+ char * res = data2.Detach ();
316+ UNIT_ASSERT_UNEQUAL (data.GetData (), data2.GetData ());
317+ UNIT_ASSERT_EQUAL (res, data2.GetData ());
318+ UNIT_ASSERT_EQUAL (::memcmp (res, " test" , 4 ), 0 );
319+ UNIT_ASSERT_EQUAL (::memcmp (data.GetData (), " test" , 4 ), 0 );
320+ }
321+
322+ TEST_P (WithAllPools, RcBufDetachAfterMut) {
323+ auto memPool = GetParam ();
324+ TRcBuf data = memPool->AllocRcBuf (4 , 0 ).value ();
325+ {
326+ ::memcpy (data.UnsafeGetDataMut(), "test", 4);
327+ }
328+ // Check GetDataMut doesn't change backend in case of single ref
329+ UNIT_ASSERT_EQUAL (data.GetData (), data.GetDataMut ());
330+ TRcBuf data2 = data;
331+ UNIT_ASSERT_EQUAL (data.GetData (), data2.GetData ());
332+ char * res = data2.Detach ();
333+ UNIT_ASSERT_UNEQUAL (data.GetData (), data2.GetData ());
334+ UNIT_ASSERT_EQUAL (res, data2.GetData ());
335+ UNIT_ASSERT_EQUAL (::memcmp (res, " test" , 4 ), 0 );
336+ UNIT_ASSERT_EQUAL (::memcmp (data.GetData (), " test" , 4 ), 0 );
337+ }
338+
339+ TEST_P (WithAllPools, RcBufDetachPageAlign) {
340+ using namespace NInterconnect ::NRdma;
341+ static const ui64 pageAlign = NSystemInfo::GetPageSize () - 1 ;
342+ auto memPool = GetParam ();
343+ TRcBuf data = memPool->AllocRcBuf (4 , IMemPool::PAGE_ALIGNED).value ();
344+ {
345+ ::memcpy (data.UnsafeGetDataMut(), "test", 4);
346+ }
347+ TRcBuf data2 = data;
348+ UNIT_ASSERT_EQUAL (data.GetData (), data2.GetData ());
349+ UNIT_ASSERT_EQUAL ((ui64)data.GetData () & pageAlign, 0ull );
350+ char * res = data2.Detach ();
351+ UNIT_ASSERT_UNEQUAL (data.GetData (), data2.GetData ());
352+ UNIT_ASSERT_EQUAL ((ui64)data.GetData () & pageAlign, 0ull );
353+ UNIT_ASSERT_EQUAL ((ui64)data2.GetData () & pageAlign, 0ull );
354+ UNIT_ASSERT_EQUAL (res, data2.GetData ());
355+ UNIT_ASSERT_EQUAL (::memcmp (res, " test" , 4 ), 0 );
356+ UNIT_ASSERT_EQUAL (::memcmp (data.GetData (), " test" , 4 ), 0 );
357+ }
358+
359+ TEST_P (WithAllPools, DetachAndDestroySrc) {
360+ auto memPool = GetParam ();
361+ TRcBuf data = memPool->AllocRcBuf (4 , 0 ).value ();
362+ {
363+ ::memcpy (data.UnsafeGetDataMut(), "test", 4);
364+ }
365+ TRcBuf data2 = data;
366+ data = {};
367+ UNIT_ASSERT_EQUAL (data2.GetSize (), 4u );
368+ char * res = data2.Detach ();
369+ UNIT_ASSERT_EQUAL (data2.GetSize (), 4u );
370+ UNIT_ASSERT_EQUAL (res, data2.GetData ());
371+ UNIT_ASSERT_EQUAL (::memcmp (res, " test" , 4 ), 0 );
372+ }
373+
307374INSTANTIATE_TEST_SUITE_P (
308375 TAllocatorSuite,
309376 WithAllPools,
0 commit comments