1#![doc = include_str!("../README.md")]
2#![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
14pub 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}