mqute_codec/protocol/v4/
pubcomp.rs

1//! # PubComp Packet V4
2//!
3//! This module defines the `PubComp` packet, which is used in the MQTT protocol to acknowledge
4//! the completion of a QoS 2 message flow. The `PubComp` packet contains a packet ID to match it
5//! with the corresponding `PubRel` packet.
6
7use super::util;
8use crate::protocol::{PacketType, traits};
9
10// Defines the `PubComp` packet for MQTT V4
11util::id_packet!(PubComp);
12
13// Implement the `Decode` trait for `PubComp`.
14util::id_packet_decode_impl!(PubComp, PacketType::PubComp);
15
16// Implement the `Encode` trait for `PubComp`.
17util::id_packet_encode_impl!(PubComp, PacketType::PubComp);
18
19impl traits::PubComp for PubComp {}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24    use crate::codec::PacketCodec;
25    use crate::codec::{Decode, Encode};
26    use bytes::BytesMut;
27    use tokio_util::codec::Decoder;
28
29    #[test]
30    fn pubrel_decode() {
31        let mut codec = PacketCodec::new(None, None);
32
33        let data = &[
34            (PacketType::PubComp as u8) << 4, // Packet type
35            0x02,                             // Remaining len
36            0x12,                             // Packet ID
37            0x34,
38        ];
39
40        let mut stream = BytesMut::new();
41
42        stream.extend_from_slice(&data[..]);
43
44        let raw_packet = codec.decode(&mut stream).unwrap().unwrap();
45        let packet = PubComp::decode(raw_packet).unwrap();
46
47        assert_eq!(packet, PubComp::new(0x1234));
48    }
49
50    #[test]
51    fn pubrel_encode() {
52        let packet = PubComp::new(0x1234);
53
54        let mut stream = BytesMut::new();
55        packet.encode(&mut stream).unwrap();
56        assert_eq!(
57            stream,
58            vec![(PacketType::PubComp as u8) << 4, 0x02, 0x12, 0x34]
59        );
60    }
61}