Skip to content

Commit 6d8d16b

Browse files
committed
Add test for feature flags
1 parent 84876ff commit 6d8d16b

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

structure/feature_flag/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Unknown feature flag set
2+
3+
An empty RNTuple with feature flag 137 (>62) set in the header. Reading should fail accordingly.
4+
The error message should indicate the feature flag.
5+
6+
A later version of this test should set the flag in the footer.

structure/feature_flag/read.C

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include "../read_structure.hxx"
2+
3+
void read(std::string_view input = "structure.feature_flag.root",
4+
std::string_view output = "structure.feature_flag.json") {
5+
read_structure(input, output);
6+
}

structure/feature_flag/write.C

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include <ROOT/RField.hxx>
2+
#include <ROOT/RMiniFile.hxx>
3+
#include <ROOT/RNTupleDescriptor.hxx>
4+
#include <ROOT/RNTupleSerialize.hxx>
5+
#include <ROOT/RNTupleWriteOptions.hxx>
6+
7+
#include <memory>
8+
#include <string_view>
9+
#include <utility>
10+
11+
using ROOT::Experimental::RFieldZero;
12+
using ROOT::Experimental::RNTupleDescriptor;
13+
using ROOT::Experimental::RNTupleWriteOptions;
14+
using ROOT::Experimental::Internal::RFieldDescriptorBuilder;
15+
using ROOT::Experimental::Internal::RNTupleDescriptorBuilder;
16+
using ROOT::Experimental::Internal::RNTupleFileWriter;
17+
using ROOT::Experimental::Internal::RNTupleSerializer;
18+
19+
void write(std::string_view filename = "structure.feature_flag.root") {
20+
21+
RNTupleDescriptorBuilder descBuilder;
22+
// The following line will be required as of ROOT v6.36
23+
// descBuilder.SetVersionForWriting();
24+
descBuilder.SetNTuple("ntpl", "");
25+
descBuilder.SetFeature(RNTupleDescriptor::kFeatureFlagTest);
26+
descBuilder.AddField(RFieldDescriptorBuilder::FromField(RFieldZero()).FieldId(0).MakeDescriptor().Unwrap());
27+
28+
RNTupleWriteOptions options;
29+
auto writer =
30+
RNTupleFileWriter::Recreate("ntpl", filename, RNTupleFileWriter::EContainerFormat::kTFile, RNTupleWriteOptions());
31+
32+
RNTupleSerializer serializer;
33+
34+
auto ctx = serializer.SerializeHeader(nullptr, descBuilder.GetDescriptor());
35+
auto buffer = std::make_unique<unsigned char[]>(ctx.GetHeaderSize());
36+
ctx = serializer.SerializeHeader(buffer.get(), descBuilder.GetDescriptor());
37+
writer->WriteNTupleHeader(buffer.get(), ctx.GetHeaderSize(), ctx.GetHeaderSize());
38+
39+
auto szFooter = serializer.SerializeFooter(nullptr, descBuilder.GetDescriptor(), ctx);
40+
buffer = std::make_unique<unsigned char[]>(szFooter);
41+
serializer.SerializeFooter(buffer.get(), descBuilder.GetDescriptor(), ctx);
42+
writer->WriteNTupleFooter(buffer.get(), szFooter, szFooter);
43+
44+
writer->Commit();
45+
// Call destructor to flush data to disk
46+
writer.reset();
47+
}

structure/read_structure.hxx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <ROOT/REntry.hxx>
22
#include <ROOT/RNTupleReader.hxx>
33

4+
using ROOT::Experimental::RException;
45
using ROOT::Experimental::RNTupleReader;
56

67
#include <cstdint>
@@ -13,7 +14,17 @@ void read_structure(std::string_view input, std::string_view output) {
1314
std::ofstream os(std::string{output});
1415
os << "[\n";
1516

16-
auto reader = RNTupleReader::Open("ntpl", input);
17+
std::unique_ptr<RNTupleReader> reader;
18+
try {
19+
reader = RNTupleReader::Open("ntpl", input);
20+
} catch (const RException &e) {
21+
std::string msgWithoutStacktrace;
22+
std::getline(std::istringstream(e.what()), msgWithoutStacktrace);
23+
os << " error: \"" << msgWithoutStacktrace << "\"\n";
24+
os << "]\n";
25+
return;
26+
}
27+
1728
auto Int32 =
1829
reader->GetModel().GetDefaultEntry().GetPtr<std::int32_t>("Int32");
1930
bool first = true;

0 commit comments

Comments
 (0)