use mqtt_protocol_core::mqtt::connection::{GenericStore, Store};
use mqtt_protocol_core::mqtt::packet::v3_1_1;
use mqtt_protocol_core::mqtt::packet::Qos;
use mqtt_protocol_core::mqtt::packet::{GenericStorePacket, ResponsePacket};
mod common;
fn make_packet_u32(id: u32, qos: Qos) -> GenericStorePacket<u32> {
let publish = v3_1_1::GenericPublish::<u32>::builder()
.topic_name("test/topic")
.unwrap()
.payload("test payload")
.qos(qos)
.packet_id(id)
.build()
.unwrap();
GenericStorePacket::V3_1_1Publish(publish)
}
fn make_packet_u16(id: u16, qos: Qos) -> GenericStorePacket<u16> {
let publish = v3_1_1::GenericPublish::<u16>::builder()
.topic_name("test/topic")
.unwrap()
.payload("test payload")
.qos(qos)
.packet_id(id)
.build()
.unwrap();
GenericStorePacket::V3_1_1Publish(publish)
}
#[test]
fn test_add_and_get_stored_order() {
common::init_tracing();
let mut store = GenericStore::<u32>::new();
assert!(store.add(make_packet_u32(1, Qos::AtLeastOnce)).is_ok());
assert!(store.add(make_packet_u32(2, Qos::ExactlyOnce)).is_ok());
assert!(store.add(make_packet_u32(1, Qos::AtLeastOnce)).is_err());
let stored = store.get_stored();
let ids: Vec<u32> = stored.iter().map(|p| p.packet_id()).collect();
assert_eq!(ids, vec![1, 2]);
}
#[test]
fn test_erase_by_response_and_id() {
common::init_tracing();
let mut store = GenericStore::<u32>::new();
let p1 = make_packet_u32(10, Qos::ExactlyOnce); let p2 = make_packet_u32(20, Qos::AtLeastOnce); store.add(p1).unwrap();
store.add(p2).unwrap();
assert!(store.erase(ResponsePacket::V3_1_1Pubrec, 10));
let stored = store.get_stored();
assert_eq!(stored.len(), 1);
assert_eq!(stored[0].packet_id(), 20);
assert!(!store.erase(ResponsePacket::V3_1_1Pubrec, 20));
assert!(!store.erase(ResponsePacket::V5_0Pubrec, 30));
}
#[test]
fn test_erase_publish() {
common::init_tracing();
let mut store = GenericStore::<u32>::new();
store.add(make_packet_u32(42, Qos::ExactlyOnce)).unwrap();
assert!(store.erase_publish(42));
assert!(store.get_stored().is_empty());
assert!(!store.erase_publish(99));
}
#[test]
fn test_clear_and_for_each() {
common::init_tracing();
let mut store = GenericStore::<u32>::new();
for i in 1..6 {
let qos = if i % 2 == 0 {
Qos::AtLeastOnce
} else {
Qos::ExactlyOnce
};
store.add(make_packet_u32(i, qos)).unwrap();
}
store.for_each(|packet| packet.packet_id() % 2 == 0);
let remaining: Vec<u32> = store.get_stored().iter().map(|p| p.packet_id()).collect();
assert_eq!(remaining, vec![2, 4]);
store.clear();
assert!(store.get_stored().is_empty());
}
#[test]
fn test_store_type_alias() {
common::init_tracing();
let mut store = Store::new();
let packet = make_packet_u16(100, Qos::AtLeastOnce);
assert!(store.add(packet).is_ok());
let stored = store.get_stored();
assert_eq!(stored.len(), 1);
assert_eq!(stored[0].packet_id(), 100);
}