This patch defines two new base types called RecordProducer and
RecordConsumer which have default implementations for convenience
(particularly for testing).
A RecordProducer implementation has one member function called
produce() which serves as a factory constructor for Record
instances. This code exercises the RecordInitializer code path in the
implementation for FileBasedRecordProducer.
A RecordConsumer has a single member function called consume(...)
which, as the name implies, consumes instances of
std::unique_ptr<Record>. We have two implementations, one of which is
used in the test to generate a vector of std::unique_ptr<Record>
similar to how the LogBuilder implementation works.
We introduce a test in FDRProducerConsumerTest which ensures that
records we write through the FDRTraceWriter can be loaded by the
FileBasedRecordProducer. The record(s) loaded this way are written
again through the FDRTraceWriter into a separate string, which we then
compare. This ensures that the read-in bytes to create the Record
instances in memory can be replicated when written out through the
FDRTraceWriter.
This change depends on D51210 and is part of the refactoring of D50441
into smaller, more focused changes.
nit: Instead of doing the bitwise ops directly here and in the switch statement argument + elsewhere, why not declare something like bool is_metadata(uint8_t b) and enum MetadataType metadata_type(uint8t_t d). That way you don't need somebody to refer to your comment at the top of this function, and if you use enum values you don't need to annotate each 'case N:' line.