Skip to content

Commit 0d9bcc2

Browse files
committed
io: Add new bytecount test
1 parent 53ce599 commit 0d9bcc2

File tree

3 files changed

+126
-0
lines changed

3 files changed

+126
-0
lines changed

io/io/test/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,7 @@ endif()
2828
# ROOT_EXECUTABLE(TMapFileTest TMapFileTest.cxx LIBRARIES RIO Hist New)
2929
# ROOT_ADD_TEST(io-io-test-TMapFileTest COMMAND TMapFileTest complete)
3030
#endif()
31+
32+
ROOTTEST_ADD_TEST(testLargeByteCounts
33+
MACRO testByteCount.C
34+
OUTREF testByteCount.ref)

io/io/test/testByteCount.C

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
{
2+
int errors = 0;
3+
int expectedByteCounts = 1;
4+
5+
// TBufferFile currently reject size larger than 2GB.
6+
// SetBufferOffset does not check against the size,
7+
// so we can provide and use a larger buffer.
8+
std::vector<char> databuffer{};
9+
databuffer.reserve( 4*1024*1024*1024ll );
10+
TBufferFile b(TBuffer::kWrite, 2*1024*1024*1024ll-100, databuffer.data(), false /* don't adopt */);
11+
{
12+
// Regular object at offset 0
13+
UInt_t R__c = b.WriteVersion(TExMap::Class(), kTRUE);
14+
b.SetBufferOffset(1000);
15+
b.SetByteCount(R__c, kTRUE);
16+
}
17+
{
18+
// Regular object
19+
UInt_t R__c = b.WriteVersion(TExMap::Class(), kTRUE);
20+
b.SetBufferOffset(2000);
21+
b.SetByteCount(R__c, kTRUE);
22+
}
23+
{
24+
// Object larger than 1GB
25+
UInt_t R__c = b.WriteVersion(TExMap::Class(), kTRUE);
26+
b.SetBufferOffset(4000+1*1024*1024*1024ll);
27+
b.SetByteCount(R__c, kTRUE);
28+
}
29+
{
30+
// Regular object located past 1GB
31+
UInt_t R__c = b.WriteVersion(TExMap::Class(), kTRUE);
32+
b.SetBufferOffset(8000+1*1024*1024*1024ll);
33+
b.SetByteCount(R__c, kTRUE);
34+
}
35+
{
36+
++expectedByteCounts;
37+
// Object larger than 1GB start after 1GB
38+
// NOTE: this does not yet fit, we are writing past the end.
39+
// Need to lift the 2GB limit for TBuffer first.
40+
// However the lifting might be temporary, so this might need to be
41+
// moved to a test that stored objects in a TFile.
42+
UInt_t R__c = b.WriteVersion(TExMap::Class(), kTRUE);
43+
b.SetBufferOffset(12000+2*1024*1024*1024ll);
44+
b.SetByteCount(R__c, kTRUE);
45+
}
46+
47+
48+
// To make a copy instead of using the const references:
49+
auto bytecounts{ b.GetByteCounts() };
50+
if (bytecounts.size() != expectedByteCounts) {
51+
++errors;
52+
std::cerr << "The number of bytecount is not as expected (1), it is " << bytecounts.size() << '\n';
53+
std::cerr << "The full list is:\n";
54+
for(auto bc : bytecounts)
55+
std::cerr << "values: " << bc.first << " , " << bc.second << '\n';
56+
}
57+
58+
// Rewind. Other code use Reset instead of SetBufferOffset
59+
b.SetReadMode();
60+
b.Reset();
61+
b.SetByteCounts(std::move(bytecounts));
62+
63+
UInt_t R__s = 0;
64+
UInt_t R__c = 0;
65+
{
66+
// Regular object at offset 0
67+
auto version = b.ReadVersion(&R__s, &R__c, TExMap::Class());
68+
b.SetBufferOffset(1000);
69+
auto res = b.CheckByteCount(R__s, R__c, TExMap::Class());
70+
if (res != 0) {
71+
++errors;
72+
// We can assume there as already an error message in CheckByCount
73+
}
74+
}
75+
{
76+
// Regular object
77+
auto version = b.ReadVersion(&R__s, &R__c, TExMap::Class());
78+
b.SetBufferOffset(2000);
79+
auto res = b.CheckByteCount(R__s, R__c, TExMap::Class());
80+
if (res != 0) {
81+
++errors;
82+
// We can assume there as already an error message in CheckByCount
83+
}
84+
}
85+
{
86+
// Object larger than 1GB
87+
auto version = b.ReadVersion(&R__s, &R__c, TExMap::Class());
88+
b.SetBufferOffset(4000+1*1024*1024*1024ll);
89+
auto res = b.CheckByteCount(R__s, R__c, TExMap::Class());
90+
if (res != 0) {
91+
++errors;
92+
// We can assume there as already an error message in CheckByCount
93+
}
94+
}
95+
{
96+
// Regular object located past 1GB
97+
auto version = b.ReadVersion(&R__s, &R__c, TExMap::Class());
98+
b.SetBufferOffset(8000+1*1024*1024*1024ll);
99+
auto res = b.CheckByteCount(R__s, R__c, TExMap::Class());
100+
if (res != 0) {
101+
++errors;
102+
// We can assume there as already an error message in CheckByCount
103+
}
104+
}
105+
{
106+
// Object larger than 1GB start after 1GB
107+
// NOTE: this does not yet fit.
108+
auto version = b.ReadVersion(&R__s, &R__c, TExMap::Class());
109+
b.SetBufferOffset(12000+2*1024*1024*1024ll);
110+
auto res = b.CheckByteCount(R__s, R__c, TExMap::Class());
111+
if (res != 0) {
112+
++errors;
113+
// We can assume there as already an error message in CheckByCount
114+
}
115+
}
116+
117+
std::cerr << "The end.\n";
118+
return errors;
119+
}

io/io/test/testByteCount.ref

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
2+
Processing testByteCount.C...
3+
The end.

0 commit comments

Comments
 (0)