Skip to content

Commit 14f854f

Browse files
committed
[ntuple] add test for unzip header handling in TKey
1 parent 778fd68 commit 14f854f

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

io/io/test/ZipHeader.cxx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@
55
#include <ROOT/RNTupleZip.hxx>
66

77
#include <RZip.h>
8+
#include <TKey.h>
9+
#include <TMemFile.h>
10+
#include <TNamed.h>
811

912
#include <cstring>
13+
#include <memory>
14+
#include <string>
1015

1116
using ROOT::Internal::RNTupleCompressor;
1217
using ROOT::Internal::RNTupleDecompressor;
@@ -102,3 +107,58 @@ TEST(RZip, CorruptHeaderRNTuple)
102107
EXPECT_THAT(e.what(), ::testing::HasSubstr("failed to unzip buffer header"));
103108
}
104109
}
110+
111+
TEST(RZip, CorruptHeaderTKey)
112+
{
113+
TMemFile writableFile("memfile.root", "RECREATE");
114+
writableFile.SetCompressionSettings(101);
115+
116+
std::string stdstring(1000, 'x');
117+
TNamed tnamed;
118+
tnamed.SetName(stdstring.c_str());
119+
writableFile.WriteObject(&stdstring, "stdstring");
120+
writableFile.WriteObject(&tnamed, "tnamed");
121+
122+
auto keysInfo = writableFile.WalkTKeys();
123+
std::size_t posZipStdString = 0;
124+
std::size_t posZipTNamed = 0;
125+
for (const auto &ki : keysInfo) {
126+
if (ki.fKeyName == "stdstring") {
127+
EXPECT_LT(ki.fLen, ki.fObjLen); // ensure it's compressed
128+
posZipStdString = ki.fSeekKey + ki.fKeyLen;
129+
} else if (ki.fKeyName == "tnamed") {
130+
EXPECT_LT(ki.fLen, ki.fObjLen); // ensure it's compressed
131+
posZipTNamed = ki.fSeekKey + ki.fKeyLen;
132+
}
133+
}
134+
EXPECT_GT(posZipStdString, 0);
135+
EXPECT_GT(posZipTNamed, 0);
136+
137+
writableFile.Close();
138+
139+
auto buffer = std::make_unique<char []>(writableFile.GetSize());
140+
writableFile.CopyTo(buffer.get(), writableFile.GetSize());
141+
142+
TMemFile verifyFile("memfile.root", TMemFile::ZeroCopyView_t(buffer.get(), writableFile.GetSize()));
143+
144+
buffer[posZipStdString + 3]++;
145+
EXPECT_FALSE(verifyFile.Get<std::string>("stdstring"));
146+
buffer[posZipStdString + 3]--;
147+
buffer[posZipStdString + 6]++;
148+
EXPECT_FALSE(verifyFile.Get<std::string>("stdstring"));
149+
buffer[posZipStdString + 6]--;
150+
151+
auto k = verifyFile.GetKey("tnamed");
152+
EXPECT_TRUE(k);
153+
EXPECT_TRUE(dynamic_cast<TNamed *>(k->ReadObj()));
154+
155+
buffer[posZipTNamed + 3]++;
156+
EXPECT_FALSE(dynamic_cast<TNamed *>(k->ReadObj()));
157+
buffer[posZipTNamed + 3]--;
158+
buffer[posZipTNamed + 6]++;
159+
EXPECT_FALSE(dynamic_cast<TNamed *>(k->ReadObj()));
160+
buffer[posZipTNamed + 6]--;
161+
162+
EXPECT_TRUE(verifyFile.Get<std::string>("stdstring"));
163+
EXPECT_TRUE(verifyFile.Get<TNamed>("tnamed"));
164+
}

0 commit comments

Comments
 (0)