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();
}
}
|