Report start_time and end_time on empty bags
This commit is contained in:
parent
a1afc15dfa
commit
8cb7a13485
@ -436,17 +436,17 @@ class Reader:
|
|||||||
@property
|
@property
|
||||||
def duration(self) -> int:
|
def duration(self) -> int:
|
||||||
"""Duration in nanoseconds between earliest and latest messages."""
|
"""Duration in nanoseconds between earliest and latest messages."""
|
||||||
return self.end_time - self.start_time
|
return self.end_time - self.start_time if self.chunk_infos else 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def start_time(self) -> int:
|
def start_time(self) -> int:
|
||||||
"""Timestamp in nanoseconds of the earliest message."""
|
"""Timestamp in nanoseconds of the earliest message."""
|
||||||
return min(x.start_time for x in self.chunk_infos)
|
return min(x.start_time for x in self.chunk_infos) if self.chunk_infos else 2**63 - 1
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def end_time(self) -> int:
|
def end_time(self) -> int:
|
||||||
"""Timestamp in nanoseconds after the latest message."""
|
"""Timestamp in nanoseconds after the latest message."""
|
||||||
return max(x.end_time for x in self.chunk_infos)
|
return max(x.end_time for x in self.chunk_infos) if self.chunk_infos else 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def message_count(self) -> int:
|
def message_count(self) -> int:
|
||||||
|
|||||||
@ -191,17 +191,18 @@ class Reader:
|
|||||||
def duration(self) -> int:
|
def duration(self) -> int:
|
||||||
"""Duration in nanoseconds between earliest and latest messages."""
|
"""Duration in nanoseconds between earliest and latest messages."""
|
||||||
nsecs: int = self.metadata['duration']['nanoseconds']
|
nsecs: int = self.metadata['duration']['nanoseconds']
|
||||||
return nsecs + 1
|
return nsecs + 1 if self.message_count else 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def start_time(self) -> int:
|
def start_time(self) -> int:
|
||||||
"""Timestamp in nanoseconds of the earliest message."""
|
"""Timestamp in nanoseconds of the earliest message."""
|
||||||
return self.metadata['starting_time']['nanoseconds_since_epoch']
|
nsecs: int = self.metadata['starting_time']['nanoseconds_since_epoch']
|
||||||
|
return nsecs if self.message_count else 2**63 - 1
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def end_time(self) -> int:
|
def end_time(self) -> int:
|
||||||
"""Timestamp in nanoseconds after the latest message."""
|
"""Timestamp in nanoseconds after the latest message."""
|
||||||
return self.start_time + self.duration
|
return self.start_time + self.duration if self.message_count else 0
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def message_count(self) -> int:
|
def message_count(self) -> int:
|
||||||
|
|||||||
@ -55,6 +55,22 @@ rosbag2_bagfile_information:
|
|||||||
compression_mode: {compression_mode}
|
compression_mode: {compression_mode}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
METADATA_EMPTY = """
|
||||||
|
rosbag2_bagfile_information:
|
||||||
|
version: 4
|
||||||
|
storage_identifier: sqlite3
|
||||||
|
relative_file_paths:
|
||||||
|
- db.db3
|
||||||
|
duration:
|
||||||
|
nanoseconds: 0
|
||||||
|
starting_time:
|
||||||
|
nanoseconds_since_epoch: 0
|
||||||
|
message_count: 0
|
||||||
|
topics_with_message_count: []
|
||||||
|
compression_format: ""
|
||||||
|
compression_mode: ""
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(params=['none', 'file', 'message'])
|
@pytest.fixture(params=['none', 'file', 'message'])
|
||||||
def bag(request: SubRequest, tmp_path: Path) -> Path:
|
def bag(request: SubRequest, tmp_path: Path) -> Path:
|
||||||
@ -117,6 +133,21 @@ def bag(request: SubRequest, tmp_path: Path) -> Path:
|
|||||||
return tmp_path
|
return tmp_path
|
||||||
|
|
||||||
|
|
||||||
|
def test_empty_bag(tmp_path: Path) -> None:
|
||||||
|
"""Test bags with broken fs layout."""
|
||||||
|
(tmp_path / 'metadata.yaml').write_text(METADATA_EMPTY)
|
||||||
|
dbpath = tmp_path / 'db.db3'
|
||||||
|
dbh = sqlite3.connect(dbpath)
|
||||||
|
dbh.executescript(Writer.SQLITE_SCHEMA)
|
||||||
|
|
||||||
|
with Reader(tmp_path) as reader:
|
||||||
|
assert reader.message_count == 0
|
||||||
|
assert reader.start_time == 2**63 - 1
|
||||||
|
assert reader.end_time == 0
|
||||||
|
assert reader.duration == 0
|
||||||
|
assert not list(reader.messages())
|
||||||
|
|
||||||
|
|
||||||
def test_reader(bag: Path) -> None:
|
def test_reader(bag: Path) -> None:
|
||||||
"""Test reader and deserializer on simple bag."""
|
"""Test reader and deserializer on simple bag."""
|
||||||
with Reader(bag) as reader:
|
with Reader(bag) as reader:
|
||||||
|
|||||||
@ -202,6 +202,10 @@ def test_reader(tmp_path: Path) -> None: # pylint: disable=too-many-statements
|
|||||||
write_bag(bag, create_default_header())
|
write_bag(bag, create_default_header())
|
||||||
with Reader(bag) as reader:
|
with Reader(bag) as reader:
|
||||||
assert reader.message_count == 0
|
assert reader.message_count == 0
|
||||||
|
assert reader.start_time == 2**63 - 1
|
||||||
|
assert reader.end_time == 0
|
||||||
|
assert reader.duration == 0
|
||||||
|
assert not list(reader.messages())
|
||||||
|
|
||||||
# empty bag, explicit encryptor
|
# empty bag, explicit encryptor
|
||||||
bag = tmp_path / 'test.bag'
|
bag = tmp_path / 'test.bag'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user