Files
bak-and-rest/tests/test_usn_journal.py

60 lines
1.9 KiB
Python

from __future__ import annotations
import struct
from bakrest.usn_journal import (
USN_REASON_BASIC_INFO_CHANGE,
USN_REASON_CLOSE,
USN_REASON_DATA_EXTEND,
USN_REASON_DATA_OVERWRITE,
USN_REASON_FILE_CREATE,
USN_REASON_RENAME_NEW_NAME,
is_meaningful_usn_reason,
parse_usn_records,
volume_name_for_path,
)
from pathlib import Path
def test_usn_reason_filter_accepts_real_data_changes() -> None:
assert is_meaningful_usn_reason(USN_REASON_DATA_OVERWRITE)
assert is_meaningful_usn_reason(USN_REASON_DATA_EXTEND | USN_REASON_CLOSE)
assert is_meaningful_usn_reason(USN_REASON_FILE_CREATE)
assert is_meaningful_usn_reason(USN_REASON_RENAME_NEW_NAME)
def test_usn_reason_filter_rejects_metadata_only_changes() -> None:
assert not is_meaningful_usn_reason(USN_REASON_BASIC_INFO_CHANGE)
assert not is_meaningful_usn_reason(USN_REASON_CLOSE)
def test_parse_usn_record_v2_reason_and_file_reference() -> None:
record = bytearray(64)
struct.pack_into("<IHH", record, 0, 64, 2, 0)
struct.pack_into("<Q", record, 8, 12345)
struct.pack_into("<I", record, 40, USN_REASON_DATA_OVERWRITE)
records = parse_usn_records(bytes(record))
assert len(records) == 1
assert records[0].file_reference_number == 12345
assert records[0].reason == USN_REASON_DATA_OVERWRITE
def test_parse_usn_record_v3_reason_and_file_reference() -> None:
record = bytearray(80)
struct.pack_into("<IHH", record, 0, 80, 3, 0)
record[8:24] = (12345).to_bytes(16, "little")
struct.pack_into("<I", record, 56, USN_REASON_FILE_CREATE)
records = parse_usn_records(bytes(record))
assert len(records) == 1
assert records[0].file_reference_number == 12345
assert records[0].reason == USN_REASON_FILE_CREATE
def test_volume_name_is_normalized_to_uppercase_drive() -> None:
assert volume_name_for_path(Path("c:/tmp")) == "\\\\.\\C:"
assert volume_name_for_path(Path("C:/tmp")) == "\\\\.\\C:"