mod common;
use common::*;
use std::{borrow::Cow, io::BufWriter, sync::Arc};
use anyhow::Result;
use mcap_rs as mcap;
use memmap::Mmap;
use tempfile::tempfile;
#[test]
fn smoke() -> Result<()> {
let mapped = map_mcap("tests/references/OneMessage.mcap")?;
let messages = mcap::MessageStream::new(&mapped)?.collect::<mcap::McapResult<Vec<_>>>()?;
assert_eq!(messages.len(), 1);
let expected = mcap::Message {
channel: Arc::new(mcap::Channel {
schema: Some(Arc::new(mcap::Schema {
name: String::from("Example"),
encoding: String::from("c"),
data: Cow::Borrowed(&[4, 5, 6]),
})),
topic: String::from("example"),
message_encoding: String::from("a"),
metadata: [(String::from("foo"), String::from("bar"))].into(),
}),
sequence: 10,
log_time: 2,
publish_time: 1,
data: Cow::Borrowed(&[1, 2, 3]),
};
assert_eq!(messages[0], expected);
Ok(())
}
#[test]
fn round_trip() -> Result<()> {
let mapped = map_mcap("tests/references/OneMessage.mcap")?;
let messages = mcap::MessageStream::new(&mapped)?;
let mut tmp = tempfile()?;
let mut writer = mcap::Writer::new(BufWriter::new(&mut tmp))?;
for m in messages {
writer.write(&m?)?;
}
drop(writer);
let ours = unsafe { Mmap::map(&tmp) }?;
let summary = mcap::Summary::read(&ours)?.unwrap();
let schema = Arc::new(mcap::Schema {
name: String::from("Example"),
encoding: String::from("c"),
data: Cow::Borrowed(&[4, 5, 6]),
});
let channel = Arc::new(mcap::Channel {
schema: Some(schema.clone()),
topic: String::from("example"),
message_encoding: String::from("a"),
metadata: [(String::from("foo"), String::from("bar"))].into(),
});
let expected_summary = mcap::Summary {
stats: Some(mcap::records::Statistics {
message_count: 1,
schema_count: 1,
channel_count: 1,
chunk_count: 1,
message_start_time: 2,
message_end_time: 2,
channel_message_counts: [(0, 1)].into(),
..Default::default()
}),
channels: [(0, channel.clone())].into(),
schemas: [(1, schema.clone())].into(),
..Default::default()
};
assert_eq!(summary.stats, expected_summary.stats);
assert_eq!(summary.channels, expected_summary.channels);
assert_eq!(summary.schemas, expected_summary.schemas);
assert_eq!(
summary.attachment_indexes,
expected_summary.attachment_indexes
);
assert_eq!(summary.metadata_indexes, expected_summary.metadata_indexes);
let expected = mcap::Message {
channel,
sequence: 10,
log_time: 2,
publish_time: 1,
data: Cow::Borrowed(&[1, 2, 3]),
};
assert_eq!(
mcap::MessageStream::new(&ours)?.collect::<mcap::McapResult<Vec<_>>>()?,
&[expected]
);
Ok(())
}