use bytes::BytesMut;
use ldap_client_ber::{BerWriter, LdapCodec};
use tokio_util::codec::{Decoder, Encoder};
#[test]
fn empty_buffer_returns_none() {
let mut codec = LdapCodec::new();
let mut buf = BytesMut::new();
let result = codec.decode(&mut buf).unwrap();
assert!(result.is_none());
}
#[test]
fn partial_read_then_complete() {
use ldap_client_ber::tag::Tag;
let mut w = BerWriter::new();
w.write_sequence(Tag::sequence(), |msg| {
msg.write_integer(1);
msg.write_bytes(b"hello");
});
let full = w.into_bytes();
assert!(full.len() > 4, "message must be long enough to split");
let split = full.len() / 2;
let mut codec = LdapCodec::new();
let mut buf = BytesMut::from(&full[..split]);
let result = codec.decode(&mut buf).unwrap();
assert!(result.is_none(), "partial frame must return None");
buf.extend_from_slice(&full[split..]);
let frame = codec
.decode(&mut buf)
.unwrap()
.expect("frame should be available");
assert_eq!(&frame[..], &full[..]);
assert!(buf.is_empty(), "buffer should be drained");
}
#[test]
fn max_message_size_rejection() {
use ldap_client_ber::tag::Tag;
let mut w = BerWriter::new();
w.write_sequence(Tag::sequence(), |msg| {
msg.write_bytes(&[0xAA; 256]);
});
let full = w.into_bytes();
let mut codec = LdapCodec::new().with_max_message_size(64);
let mut buf = BytesMut::from(&full[..]);
let err = codec.decode(&mut buf).unwrap_err();
let msg = format!("{err}");
assert!(
msg.contains("exceeds maximum"),
"expected ElementTooLarge error, got: {msg}"
);
}
#[test]
fn invalid_first_byte_rejection() {
let mut codec = LdapCodec::new();
let mut buf = BytesMut::from(&[0x02, 0x01, 0x05][..]);
let err = codec.decode(&mut buf).unwrap_err();
let msg = format!("{err}");
assert!(
msg.contains("0x02"),
"expected InvalidTag mentioning 0x02, got: {msg}"
);
}
#[test]
fn multiple_messages_in_one_buffer() {
use ldap_client_ber::tag::Tag;
let mut w1 = BerWriter::new();
w1.write_sequence(Tag::sequence(), |msg| {
msg.write_integer(1);
});
let msg1 = w1.into_bytes();
let mut w2 = BerWriter::new();
w2.write_sequence(Tag::sequence(), |msg| {
msg.write_integer(2);
});
let msg2 = w2.into_bytes();
let mut codec = LdapCodec::new();
let mut buf = BytesMut::new();
buf.extend_from_slice(&msg1);
buf.extend_from_slice(&msg2);
let frame1 = codec.decode(&mut buf).unwrap().expect("first frame");
assert_eq!(&frame1[..], &msg1[..]);
let frame2 = codec.decode(&mut buf).unwrap().expect("second frame");
assert_eq!(&frame2[..], &msg2[..]);
assert!(buf.is_empty());
assert!(codec.decode(&mut buf).unwrap().is_none());
}
#[test]
fn encoder_vec_u8() {
use ldap_client_ber::tag::Tag;
let mut w = BerWriter::new();
w.write_sequence(Tag::sequence(), |msg| {
msg.write_integer(1);
});
let data = w.into_bytes();
let mut codec = LdapCodec::new();
let mut buf = BytesMut::new();
codec.encode(data.clone(), &mut buf).unwrap();
assert_eq!(&buf[..], &data[..]);
}
#[test]
fn encoder_slice() {
use ldap_client_ber::tag::Tag;
let mut w = BerWriter::new();
w.write_sequence(Tag::sequence(), |msg| {
msg.write_integer(42);
});
let data = w.into_bytes();
let mut codec = LdapCodec::new();
let mut buf = BytesMut::new();
codec.encode(data.as_slice(), &mut buf).unwrap();
assert_eq!(&buf[..], &data[..]);
}
#[test]
fn encode_then_decode() {
use ldap_client_ber::tag::Tag;
let mut w = BerWriter::new();
w.write_sequence(Tag::sequence(), |msg| {
msg.write_integer(99);
msg.write_bytes(b"test data");
});
let data = w.into_bytes();
let mut codec = LdapCodec::new();
let mut buf = BytesMut::new();
codec.encode(data.clone(), &mut buf).unwrap();
let frame = codec.decode(&mut buf).unwrap().expect("should get frame");
assert_eq!(&frame[..], &data[..]);
}