bacnet-client 0.15.0

BACnet async client: TSM, segmentation, discovery, and service APIs
Documentation
use super::*;
use bacnet_services::file::{AtomicReadFileAck, FileAccessMethod, FileReadAckMethod};

fn stream_request(count: u32) -> FileAccessMethod {
    FileAccessMethod::Stream {
        file_start_position: 4,
        requested_octet_count: count,
    }
}

fn record_request(count: u32) -> FileAccessMethod {
    FileAccessMethod::Record {
        file_start_record: 4,
        requested_record_count: count,
    }
}

#[test]
fn decoded_atomic_read_file_rejects_access_arm_mismatch() {
    let ack = AtomicReadFileAck {
        end_of_file: true,
        access: FileReadAckMethod::Record {
            file_start_record: 4,
            returned_record_count: 0,
            file_record_data: vec![],
        },
    };
    assert!(validate_atomic_read_file_ack(&stream_request(1), &ack).is_err());

    let ack = AtomicReadFileAck {
        end_of_file: true,
        access: FileReadAckMethod::Stream {
            file_start_position: 4,
            file_data: vec![],
        },
    };
    assert!(validate_atomic_read_file_ack(&record_request(1), &ack).is_err());
}

#[test]
fn decoded_atomic_read_file_rejects_oversized_window() {
    let stream_ack = AtomicReadFileAck {
        end_of_file: false,
        access: FileReadAckMethod::Stream {
            file_start_position: 4,
            file_data: vec![1, 2, 3],
        },
    };
    assert!(validate_atomic_read_file_ack(&stream_request(2), &stream_ack).is_err());

    let record_ack = AtomicReadFileAck {
        end_of_file: false,
        access: FileReadAckMethod::Record {
            file_start_record: 4,
            returned_record_count: 2,
            file_record_data: vec![vec![1], vec![2]],
        },
    };
    assert!(validate_atomic_read_file_ack(&record_request(1), &record_ack).is_err());
}

#[test]
fn decoded_atomic_read_file_accepts_matching_bounded_window() {
    let stream_ack = AtomicReadFileAck {
        end_of_file: true,
        access: FileReadAckMethod::Stream {
            file_start_position: 9,
            file_data: vec![1, 2],
        },
    };
    assert!(validate_atomic_read_file_ack(&stream_request(2), &stream_ack).is_ok());

    let record_ack = AtomicReadFileAck {
        end_of_file: true,
        access: FileReadAckMethod::Record {
            file_start_record: 9,
            returned_record_count: 2,
            file_record_data: vec![vec![], vec![0xFF]],
        },
    };
    assert!(validate_atomic_read_file_ack(&record_request(2), &record_ack).is_ok());
}