|
| 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 | +} |
0 commit comments