aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/lib.rs
blob: dc170e060470b149a7ead86d0129ae56b27b8319 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#![doc = include_str!("../README.md")]
// this is necessary for thiserror backtraces
#![feature(error_generic_member_access)]

pub mod address;
pub mod common;
#[cfg(feature = "connecting")]
pub mod connect;
pub mod packets;
pub mod read;
pub mod resolve;
pub mod write;

#[doc(hidden)]
#[deprecated(note = "renamed to `resolve`.")]
pub mod resolver {
    pub use super::resolve::*;
}

#[doc(hidden)]
#[deprecated(note = "moved to `address::ServerAddr`.")]
pub type ServerAddress = address::ServerAddr;

#[cfg(test)]
mod tests {
    use std::io::Cursor;

    use uuid::Uuid;

    use crate::{
        packets::{
            Packet,
            game::s_chat::{LastSeenMessagesUpdate, ServerboundChat},
            login::{ServerboundLoginPacket, s_hello::ServerboundHello},
        },
        read::{compression_decoder, read_packet},
        write::{compression_encoder, serialize_packet, write_packet},
    };

    #[tokio::test]
    async fn test_hello_packet() {
        let packet = ServerboundHello {
            name: "test".to_owned(),
            profile_id: Uuid::nil(),
        };
        let mut stream = Vec::new();
        write_packet(&packet.into_variant(), &mut stream, None, &mut None)
            .await
            .unwrap();

        assert_eq!(
            stream,
            [
                22, 0, 4, 116, 101, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
            ]
        );

        let mut stream = Cursor::new(stream);

        let _ = read_packet::<ServerboundLoginPacket, _>(
            &mut stream,
            &mut Cursor::new(Vec::new()),
            None,
            &mut None,
        )
        .await
        .unwrap();
    }

    #[tokio::test]
    async fn test_double_hello_packet() {
        let packet = ServerboundHello {
            name: "test".to_owned(),
            profile_id: Uuid::nil(),
        }
        .into_variant();
        let mut stream = Vec::new();
        write_packet(&packet, &mut stream, None, &mut None)
            .await
            .unwrap();
        write_packet(&packet, &mut stream, None, &mut None)
            .await
            .unwrap();
        let mut stream = Cursor::new(stream);

        let mut buffer = Cursor::new(Vec::new());

        let _ = read_packet::<ServerboundLoginPacket, _>(&mut stream, &mut buffer, None, &mut None)
            .await
            .unwrap();
        let _ = read_packet::<ServerboundLoginPacket, _>(&mut stream, &mut buffer, None, &mut None)
            .await
            .unwrap();
    }

    #[tokio::test]
    async fn test_read_long_compressed_chat() {
        let compression_threshold = 256;

        let buf = serialize_packet(
            &ServerboundChat {
                message: "a".repeat(256),
                timestamp: 0,
                salt: 0,
                signature: None,
                last_seen_messages: LastSeenMessagesUpdate::default(),
            }
            .into_variant(),
        )
        .unwrap();

        let buf = compression_encoder(&buf, compression_threshold).unwrap();

        println!("{buf:?}");

        compression_decoder(&mut Cursor::new(&buf), compression_threshold).unwrap();
    }
}