azalea_protocol/
lib.rs

1#![doc = include_str!("../README.md")]
2// this is necessary for thiserror backtraces
3#![feature(error_generic_member_access)]
4
5pub mod address;
6pub mod common;
7#[cfg(feature = "connecting")]
8pub mod connect;
9pub mod packets;
10pub mod read;
11pub mod resolve;
12pub mod write;
13
14// re-export to make it easier for users to have the correct version
15pub use simdnbt;
16
17#[doc(hidden)]
18#[deprecated(note = "renamed to `resolve`.")]
19pub mod resolver {
20    pub use super::resolve::*;
21}
22
23#[doc(hidden)]
24#[deprecated(note = "moved to `address::ServerAddr`.")]
25pub type ServerAddress = address::ServerAddr;
26
27#[cfg(test)]
28mod tests {
29    use std::io::Cursor;
30
31    use uuid::Uuid;
32
33    use crate::{
34        packets::{
35            Packet,
36            game::s_chat::{LastSeenMessagesUpdate, ServerboundChat},
37            login::{ServerboundLoginPacket, s_hello::ServerboundHello},
38        },
39        read::{compression_decoder, read_packet},
40        write::{compression_encoder, serialize_packet, write_packet},
41    };
42
43    #[tokio::test]
44    async fn test_hello_packet() {
45        let packet = ServerboundHello {
46            name: "test".to_owned(),
47            profile_id: Uuid::nil(),
48        };
49        let mut stream = Vec::new();
50        write_packet(&packet.into_variant(), &mut stream, None, &mut None)
51            .await
52            .unwrap();
53
54        assert_eq!(
55            stream,
56            [
57                22, 0, 4, 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
58            ]
59        );
60
61        let mut stream = Cursor::new(stream);
62
63        let _ = read_packet::<ServerboundLoginPacket, _>(
64            &mut stream,
65            &mut Cursor::new(Vec::new()),
66            None,
67            &mut None,
68        )
69        .await
70        .unwrap();
71    }
72
73    #[tokio::test]
74    async fn test_double_hello_packet() {
75        let packet = ServerboundHello {
76            name: "test".to_owned(),
77            profile_id: Uuid::nil(),
78        }
79        .into_variant();
80        let mut stream = Vec::new();
81        write_packet(&packet, &mut stream, None, &mut None)
82            .await
83            .unwrap();
84        write_packet(&packet, &mut stream, None, &mut None)
85            .await
86            .unwrap();
87        let mut stream = Cursor::new(stream);
88
89        let mut buffer = Cursor::new(Vec::new());
90
91        let _ = read_packet::<ServerboundLoginPacket, _>(&mut stream, &mut buffer, None, &mut None)
92            .await
93            .unwrap();
94        let _ = read_packet::<ServerboundLoginPacket, _>(&mut stream, &mut buffer, None, &mut None)
95            .await
96            .unwrap();
97    }
98
99    #[tokio::test]
100    async fn test_read_long_compressed_chat() {
101        let compression_threshold = 256;
102
103        let buf = serialize_packet(
104            &ServerboundChat {
105                message: "a".repeat(256),
106                timestamp: 0,
107                salt: 0,
108                signature: None,
109                last_seen_messages: LastSeenMessagesUpdate::default(),
110            }
111            .into_variant(),
112        )
113        .unwrap();
114
115        let buf = compression_encoder(&buf, compression_threshold).unwrap();
116
117        println!("{buf:?}");
118
119        compression_decoder(&mut Cursor::new(&buf), compression_threshold).unwrap();
120    }
121}