@@ -399,6 +399,31 @@ TEST(RNTuple, SerializeLocator)
399399 EXPECT_EQ (locator.GetReserved (), 1 );
400400 EXPECT_EQ (1337U , locator.GetPosition <RNTupleLocatorObject64>().GetLocation ());
401401
402+ // S3 locator round-trip with 32-bit nBytesOnStorage
403+ locator = RNTupleLocator{};
404+ locator.SetType (RNTupleLocator::kTypeS3 );
405+ locator.SetPosition (RNTupleLocatorObject64{42U });
406+ locator.SetNBytesOnStorage (1024U );
407+ locator.SetReserved (0 );
408+ EXPECT_EQ (16u , RNTupleSerializer::SerializeLocator (locator, buffer).Unwrap ());
409+ locator = RNTupleLocator{};
410+ EXPECT_EQ (16u , RNTupleSerializer::DeserializeLocator (buffer, 16 , locator).Unwrap ());
411+ EXPECT_EQ (locator.GetType (), RNTupleLocator::kTypeS3 );
412+ EXPECT_EQ (locator.GetNBytesOnStorage (), 1024U );
413+ EXPECT_EQ (locator.GetReserved (), 0 );
414+ EXPECT_EQ (42U , locator.GetPosition <RNTupleLocatorObject64>().GetLocation ());
415+
416+ // S3 locator round-trip with 64-bit nBytesOnStorage and reserved bit
417+ locator.SetNBytesOnStorage (static_cast <std::uint64_t >(std::numeric_limits<std::uint32_t >::max ()) + 1 );
418+ locator.SetReserved (1 );
419+ EXPECT_EQ (20u , RNTupleSerializer::SerializeLocator (locator, buffer).Unwrap ());
420+ locator = RNTupleLocator{};
421+ EXPECT_EQ (20u , RNTupleSerializer::DeserializeLocator (buffer, 20 , locator).Unwrap ());
422+ EXPECT_EQ (locator.GetType (), RNTupleLocator::kTypeS3 );
423+ EXPECT_EQ (locator.GetNBytesOnStorage (), static_cast <std::uint64_t >(std::numeric_limits<std::uint32_t >::max ()) + 1 );
424+ EXPECT_EQ (locator.GetReserved (), 1 );
425+ EXPECT_EQ (42U , locator.GetPosition <RNTupleLocatorObject64>().GetLocation ());
426+
402427 std::int32_t *head = reinterpret_cast <std::int32_t *>(buffer);
403428#ifndef R__BYTESWAP
404429 // on big endian system
0 commit comments