bacnet-server 0.15.0

BACnet server: APDU dispatch and service handlers
Documentation
use super::*;

#[tokio::test]
async fn exact_confirmed_multiple_preserves_routed_peer_and_mode() {
    let router = MacAddr::from_slice(&[192, 168, 1, 1, 0xBA, 0xC0]);
    let remote = NpduAddress {
        network: 222,
        mac_address: MacAddr::from_slice(&[9, 8, 7]),
    };
    let mut sub = subscription(
        Some(PropertyIdentifier::SILENCED),
        CovNotificationKind::Multiple,
        14,
    );
    sub.subscriber_mac = router.clone();
    sub.subscriber_network = Some(remote.clone());
    sub.issue_confirmed_notifications = true;
    let fixture = ExactFixture::new([sub]).await;

    fixture.fire(&[PropertyIdentifier::SILENCED]).await;
    for _ in 0..32 {
        if !fixture.sent.is_empty() {
            break;
        }
        tokio::task::yield_now().await;
    }

    let sent = fixture.sent.lock();
    assert_eq!(sent.len(), 1);
    assert_eq!(sent[0].mac, router);
    let npdu = decode_npdu(sent[0].npdu.clone()).unwrap();
    assert_eq!(npdu.destination, Some(remote.clone()));
    let Apdu::ConfirmedRequest(request) = decode_apdu(npdu.payload).unwrap() else {
        panic!("expected confirmed COVNotificationMultiple");
    };
    assert_eq!(
        request.service_choice,
        ConfirmedServiceChoice::CONFIRMED_COV_NOTIFICATION_MULTIPLE
    );
    let invoke_id = request.invoke_id;
    drop(sent);
    assert!(fixture.transactions.admit_terminal(
        &router,
        Some(&remote),
        None,
        &Apdu::SimpleAck(SimpleAck {
            invoke_id,
            service_choice: ConfirmedServiceChoice::CONFIRMED_COV_NOTIFICATION_MULTIPLE,
        }),
    ));
}