use super::layer::NetworkLayer;
use bacnet_encoding::npdu::{Npdu, encode_npdu};
use bacnet_npdu::NetworkPriority;
use bacnet_transport::loopback::LoopbackTransport;
use bacnet_transport::port::TransportPort;
use bytes::{Bytes, BytesMut};
use tokio::time::{Duration, timeout};
#[tokio::test]
async fn legacy_loopback_traffic_reaches_apdu_as_unverified() {
let (transport, mut peer) = LoopbackTransport::pair(vec![0x01], vec![0x02]);
let mut network = NetworkLayer::new(transport);
let mut rx = network.start().await.unwrap();
let npdu = Npdu {
expecting_reply: false,
priority: NetworkPriority::Normal,
destination: None,
source: None,
hop_count: 255,
payload: Bytes::from_static(&[0x10, 0x08]),
..Npdu::default()
};
let mut buffer = BytesMut::new();
encode_npdu(&mut buffer, &npdu).unwrap();
peer.send_unicast(&buffer.freeze(), &[0x01]).await.unwrap();
let received = timeout(Duration::from_secs(2), rx.recv())
.await
.expect("loopback APDU timed out")
.expect("network closed");
assert_eq!(received.apdu.as_ref(), &[0x10, 0x08]);
assert_eq!(received.source_mac.as_slice(), &[0x02]);
assert!(received.provenance.is_unverified());
assert!(!received.provenance.is_verified());
assert!(!received.provenance.is_direct_peer());
assert!(!received.provenance.is_relayed_origin());
assert!(received.provenance.scope().contains("unverified"));
network.stop().await.unwrap();
peer.stop().await.unwrap();
}