Add unit test for serializing an empty ArrayHandle and fix test failure

Fix: Always serialize the size of the Buffer in vtkm/cont/internal/Buffer.cxx
but only serialize its contents, if the size differs from zero.
This commit is contained in:
Gunther H. Weber 2022-06-05 19:37:40 -07:00
parent 3f52549ac0
commit d6a7348172
2 changed files with 32 additions and 5 deletions

@ -1164,9 +1164,14 @@ void Serialization<vtkm::cont::internal::Buffer>::save(BinaryBuffer& bb,
vtkm::BufferSizeType size = obj.GetNumberOfBytes();
vtkmdiy::save(bb, size);
vtkm::cont::Token token;
const vtkm::UInt8* data = reinterpret_cast<const vtkm::UInt8*>(obj.ReadPointerHost(token));
vtkmdiy::save(bb, data, static_cast<std::size_t>(size));
if (size)
{
// NOTE: If size == 0, obj.ReadPointerHost will be a nullptr, and saving that via
// vtkmdiy causes test failure on osheim
vtkm::cont::Token token;
const vtkm::UInt8* data = reinterpret_cast<const vtkm::UInt8*>(obj.ReadPointerHost(token));
vtkmdiy::save(bb, data, static_cast<std::size_t>(size));
}
}
void Serialization<vtkm::cont::internal::Buffer>::load(BinaryBuffer& bb,
@ -1177,8 +1182,11 @@ void Serialization<vtkm::cont::internal::Buffer>::load(BinaryBuffer& bb,
vtkm::cont::Token token;
obj.SetNumberOfBytes(size, vtkm::CopyFlag::Off, token);
vtkm::UInt8* data = reinterpret_cast<vtkm::UInt8*>(obj.WritePointerHost(token));
vtkmdiy::load(bb, data, static_cast<std::size_t>(size));
if (size)
{
vtkm::UInt8* data = reinterpret_cast<vtkm::UInt8*>(obj.WritePointerHost(token));
vtkmdiy::load(bb, data, static_cast<std::size_t>(size));
}
}
} // namespace diy

@ -150,6 +150,19 @@ struct TestArrayHandleBasic
}
};
struct TestArrayHandleBasicEmpty
{
template <typename T>
void operator()(T) const
{
vtkm::cont::ArrayHandle<T> array;
array.Allocate(0);
RunTest(array);
RunTest(MakeTestUnknownArrayHandle(array));
RunTest(MakeTestUncertainArrayHandle(array));
}
};
struct TestArrayHandleSOA
{
template <typename T>
@ -372,6 +385,12 @@ void TestArrayHandleSerialization()
vtkm::testing::Testing::TryTypes(
TestArrayHandleBasic(), vtkm::List<char, long, long long, unsigned long, unsigned long long>());
std::cout << "Testing empty ArrayHandleBasic\n";
vtkm::testing::Testing::TryTypes(TestArrayHandleBasicEmpty(), TestTypesList());
vtkm::testing::Testing::TryTypes(
TestArrayHandleBasicEmpty(),
vtkm::List<char, long, long long, unsigned long, unsigned long long>());
std::cout << "Testing ArrayHandleSOA\n";
vtkm::testing::Testing::TryTypes(TestArrayHandleSOA(), TestTypesListVec());