1#![warn(
2 clippy::all,
3 clippy::todo,
4 clippy::empty_enum,
5 clippy::mem_forget,
6 clippy::unused_self,
7 clippy::filter_map_next,
8 clippy::needless_continue,
9 clippy::needless_borrow,
10 clippy::match_wildcard_for_single_variants,
11 clippy::if_let_mutex,
12 clippy::await_holding_lock,
13 clippy::match_on_vec_items,
14 clippy::imprecise_flops,
15 clippy::suboptimal_flops,
16 clippy::lossy_float_literal,
17 clippy::rest_pat_in_fully_bound_structs,
18 clippy::fn_params_excessive_bools,
19 clippy::exit,
20 clippy::inefficient_to_string,
21 clippy::linkedlist,
22 clippy::macro_use_imports,
23 clippy::option_option,
24 clippy::verbose_file_reads,
25 clippy::unnested_or_patterns,
26 rust_2018_idioms,
27 future_incompatible,
28 nonstandard_style,
29 missing_docs
30)]
31
32use bytes::Bytes;
49use de::deserialize_packet;
50use ser::serialize_packet;
51use serde::Deserialize;
52use socketioxide_core::{
53 packet::Packet,
54 parser::{Parse, ParseError, ParserState},
55 Str, Value,
56};
57
58mod de;
59mod ser;
60mod value;
61
62#[derive(Default, Debug, Clone, Copy)]
64pub struct MsgPackParser;
65
66impl Parse for MsgPackParser {
67 type EncodeError = rmp_serde::encode::Error;
68 type DecodeError = rmp_serde::decode::Error;
69
70 fn encode(self, packet: Packet) -> socketioxide_core::Value {
71 let data = serialize_packet(packet);
72 Value::Bytes(data.into())
73 }
74
75 fn decode_str(
76 self,
77 _: &ParserState,
78 _data: Str,
79 ) -> Result<Packet, ParseError<Self::DecodeError>> {
80 Err(ParseError::UnexpectedStringPacket)
81 }
82
83 fn decode_bin(
84 self,
85 _: &ParserState,
86 bin: Bytes,
87 ) -> Result<Packet, ParseError<Self::DecodeError>> {
88 deserialize_packet(bin)
89 }
90
91 fn encode_value<T: ?Sized + serde::Serialize>(
92 self,
93 data: &T,
94 event: Option<&str>,
95 ) -> Result<Value, Self::EncodeError> {
96 value::to_value(data, event)
97 }
98
99 fn decode_value<'de, T: Deserialize<'de>>(
100 self,
101 value: &'de mut Value,
102 with_event: bool,
103 ) -> Result<T, Self::DecodeError> {
104 value::from_value(value, with_event)
105 }
106
107 fn decode_default<'de, T: Deserialize<'de>>(
108 self,
109 value: Option<&'de Value>,
110 ) -> Result<T, Self::DecodeError> {
111 if let Some(value) = value {
112 let value = value.as_bytes().expect("value should be bytes");
113 rmp_serde::from_slice(value)
114 } else {
115 rmp_serde::from_slice(&[0xc0]) }
117 }
118
119 fn encode_default<T: ?Sized + serde::Serialize>(
120 self,
121 data: &T,
122 ) -> Result<Value, Self::EncodeError> {
123 rmp_serde::to_vec_named(data).map(|b| Value::Bytes(b.into()))
124 }
125
126 fn read_event(self, value: &Value) -> Result<&str, Self::DecodeError> {
127 value::read_event(value)
128 }
129}
130
131#[cfg(test)]
134mod tests {
135 use std::str::FromStr;
136
137 use serde_json::json;
138 use socketioxide_core::{packet::ConnectPacket, Sid};
139
140 use super::*;
141 const BIN: Bytes = Bytes::from_static(&[1, 2, 3, 4]);
142
143 fn decode(value: &'static [u8]) -> Packet {
144 MsgPackParser
145 .decode_bin(&Default::default(), Bytes::from_static(value))
146 .unwrap()
147 }
148 fn encode(packet: Packet) -> Bytes {
149 match MsgPackParser.encode(packet) {
150 Value::Bytes(b) => b,
151 Value::Str(_, _) => panic!("implementation should only return bytes"),
152 }
153 }
154 fn to_event_value(data: &impl serde::Serialize, event: &str) -> Value {
155 MsgPackParser.encode_value(data, Some(event)).unwrap()
156 }
157 fn to_value(data: &impl serde::Serialize) -> Value {
158 MsgPackParser.encode_value(data, None).unwrap()
159 }
160 fn to_connect_value(data: &impl serde::Serialize) -> Value {
161 Value::Bytes(rmp_serde::to_vec_named(data).unwrap().into())
162 }
163
164 #[test]
165 fn packet_encode_connect_root_ns() {
166 const DATA: &[u8] = &[
167 131, 164, 116, 121, 112, 101, 0, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
168 129, 163, 115, 105, 100, 176, 110, 119, 122, 51, 67, 56, 117, 55, 113, 121, 115, 118,
169 103, 86, 113, 106,
170 ];
171
172 let sid = Sid::from_str("nwz3C8u7qysvgVqj").unwrap();
173 let sid = to_connect_value(&ConnectPacket { sid });
174 let packet = encode(Packet::connect("/", Some(sid)));
175 assert_eq!(DATA, packet.as_ref());
176 }
177
178 #[test]
179 fn packet_decode_connect_root_ns() {
180 const DATA: &[u8] = &[
181 131, 164, 116, 121, 112, 101, 0, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
182 129, 163, 115, 105, 100, 176, 110, 119, 122, 51, 67, 56, 117, 55, 113, 121, 115, 118,
183 103, 86, 113, 106,
184 ];
185 let sid = Sid::from_str("nwz3C8u7qysvgVqj").unwrap();
186 let sid = to_connect_value(&ConnectPacket { sid });
187 let packet = decode(DATA);
188 assert_eq!(packet, Packet::connect("/", Some(sid)));
189 }
190
191 #[test]
192 fn packet_encode_connect_custom_ns() {
193 const DATA: &[u8] = &[
194 131, 164, 116, 121, 112, 101, 0, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
195 226, 132, 162, 164, 100, 97, 116, 97, 129, 163, 115, 105, 100, 176, 110, 119, 122, 51,
196 67, 56, 117, 55, 113, 121, 115, 118, 103, 86, 113, 106,
197 ];
198
199 let sid = Sid::from_str("nwz3C8u7qysvgVqj").unwrap();
200 let sid = to_connect_value(&ConnectPacket { sid });
201 let packet = encode(Packet::connect("/admin™", Some(sid)));
202 assert_eq!(DATA, packet.as_ref());
203 }
204
205 #[test]
206 fn packet_decode_connect_custom_ns() {
207 const DATA: &[u8] = &[
208 131, 164, 116, 121, 112, 101, 0, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
209 226, 132, 162, 164, 100, 97, 116, 97, 129, 163, 115, 105, 100, 176, 110, 119, 122, 51,
210 67, 56, 117, 55, 113, 121, 115, 118, 103, 86, 113, 106,
211 ];
212
213 let sid = Sid::from_str("nwz3C8u7qysvgVqj").unwrap();
214 let sid = to_connect_value(&ConnectPacket { sid });
215 let packet = decode(DATA);
216 assert_eq!(packet, Packet::connect("/admin™", Some(sid)));
217 }
218
219 #[test]
220 fn packet_encode_disconnect_root_ns() {
221 const DATA: &[u8] = &[130, 164, 116, 121, 112, 101, 1, 163, 110, 115, 112, 161, 47];
222 let packet = encode(Packet::disconnect("/"));
223 assert_eq!(DATA, packet.as_ref());
224 }
225
226 #[test]
227 fn packet_decode_disconnect_root_ns() {
228 const DATA: &[u8] = &[130, 164, 116, 121, 112, 101, 1, 163, 110, 115, 112, 161, 47];
229 let packet = decode(DATA);
230 assert_eq!(packet, Packet::disconnect("/"));
231 }
232
233 #[test]
234 fn packet_encode_disconnect_custom_ns() {
235 const DATA: &[u8] = &[
236 130, 164, 116, 121, 112, 101, 1, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
237 226, 132, 162,
238 ];
239 let packet = encode(Packet::disconnect("/admin™"));
240 assert_eq!(DATA, packet.as_ref());
241 }
242
243 #[test]
244 fn packet_decode_disconnect_custom_ns() {
245 const DATA: &[u8] = &[
246 130, 164, 116, 121, 112, 101, 1, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
247 226, 132, 162,
248 ];
249 let packet = decode(DATA);
250 assert_eq!(packet, Packet::disconnect("/admin™"));
251 }
252
253 #[test]
254 fn packet_encode_event_root_ns() {
255 const DATA: &[u8] = &[
256 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
257 146, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
258 101, 226, 132, 162,
259 ];
260 let packet = encode(Packet::event(
261 "/",
262 to_event_value(&json!({ "data": "value™" }), "event"),
263 ));
264 assert_eq!(DATA, packet.as_ref());
265 }
266
267 #[test]
268 fn packet_decode_event_root_ns() {
269 const DATA: &[u8] = &[
270 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
271 146, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
272 101, 226, 132, 162,
273 ];
274 let data = to_event_value(&json!({ "data": "value™" }), "event");
275 let packet = decode(DATA);
276 assert_eq!(packet, Packet::event("/", data));
277 }
278 #[test]
279 fn packet_decode_event_root_ns_empty_data() {
280 const DATA: &[u8] = &[
281 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
282 145, 165, 101, 118, 101, 110, 116,
283 ];
284 let data = to_event_value(&[0; 0], "event");
285 let packet = decode(DATA);
286 assert_eq!(packet, Packet::event("/", data));
287 }
288
289 #[test]
290 fn packet_encode_event_root_ns_with_ack_id() {
291 const DATA: &[u8] = &[
292 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
293 146, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
294 101, 226, 132, 162, 162, 105, 100, 1,
295 ];
296 let data = to_event_value(&json!({ "data": "value™" }), "event");
297 let mut packet = Packet::event("/", data);
298 packet.inner.set_ack_id(1);
299 let packet = encode(packet);
300 assert_eq!(DATA, packet.as_ref());
301 }
302
303 #[test]
304 fn packet_decode_event_root_ns_with_ack_id() {
305 const DATA: &[u8] = &[
306 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
307 146, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
308 101, 226, 132, 162, 162, 105, 100, 1,
309 ];
310 let data = to_event_value(&json!({ "data": "value™" }), "event");
311 let mut packet_comp = Packet::event("/", data);
312 packet_comp.inner.set_ack_id(1);
313 let packet = decode(DATA);
314 assert_eq!(packet, packet_comp);
315 }
316 #[test]
317 fn packet_encode_event_custom_ns() {
318 const DATA: &[u8] = &[
319 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
320 226, 132, 162, 164, 100, 97, 116, 97, 146, 165, 101, 118, 101, 110, 116, 129, 164, 100,
321 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162,
322 ];
323 let data = to_event_value(&json!({"data": "value™"}), "event");
324 let packet = encode(Packet::event("/admin™", data));
325
326 assert_eq!(DATA, packet.as_ref());
327 }
328
329 #[test]
330 fn packet_decode_event_custom_ns() {
331 const DATA: &[u8] = &[
332 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
333 226, 132, 162, 164, 100, 97, 116, 97, 146, 165, 101, 118, 101, 110, 116, 129, 164, 100,
334 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162,
335 ];
336 let data = to_event_value(&json!({"data": "value™"}), "event");
337 let packet = decode(DATA);
338
339 assert_eq!(packet, Packet::event("/admin™", data));
340 }
341 #[test]
342 fn packet_encode_event_custom_ns_with_ack_id() {
343 const DATA: &[u8] = &[
344 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
345 226, 132, 162, 164, 100, 97, 116, 97, 146, 165, 101, 118, 101, 110, 116, 129, 164, 100,
346 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 162, 105, 100, 1,
347 ];
348 let data = to_event_value(&json!({"data": "value™"}), "event");
349 let mut packet = Packet::event("/admin™", data);
350 packet.inner.set_ack_id(1);
351 let packet = encode(packet);
352 assert_eq!(DATA, packet.as_ref());
353 }
354
355 #[test]
356 fn packet_decode_event_custom_ns_with_ack_id() {
357 const DATA: &[u8] = &[
358 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
359 226, 132, 162, 164, 100, 97, 116, 97, 146, 165, 101, 118, 101, 110, 116, 129, 164, 100,
360 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 162, 105, 100, 1,
361 ];
362 let data = to_event_value(&json!({"data": "value™"}), "event");
363 let mut packet_ref = Packet::event("/admin™", data);
364 packet_ref.inner.set_ack_id(1);
365 let packet = decode(DATA);
366 assert_eq!(packet, packet_ref);
367 }
368
369 #[test]
370 fn packet_encode_event_ack_root_ns() {
371 const DATA: &[u8] = &[
372 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
373 145, 164, 100, 97, 116, 97, 162, 105, 100, 54,
374 ];
375 let data = to_value(&"data");
376 let packet = encode(Packet::ack("/", data, 54));
377 assert_eq!(DATA, packet.as_ref());
378 }
379
380 #[test]
381 fn packet_decode_event_ack_root_ns() {
382 const DATA: &[u8] = &[
383 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
384 145, 164, 100, 97, 116, 97, 162, 105, 100, 54,
385 ];
386 let data = to_value(&"data");
387 let packet = decode(DATA);
388 assert_eq!(packet, Packet::ack("/", data, 54));
389 }
390
391 #[test]
392 fn packet_encode_event_ack_custom_ns() {
393 const DATA: &[u8] = &[
394 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
395 226, 132, 162, 164, 100, 97, 116, 97, 145, 164, 100, 97, 116, 97, 162, 105, 100, 54,
396 ];
397
398 let data = to_value(&"data");
399 let packet = encode(Packet::ack("/admin™", data, 54));
400 assert_eq!(DATA, packet.as_ref());
401 }
402
403 #[test]
404 fn packet_decode_event_ack_custom_ns() {
405 const DATA: &[u8] = &[
406 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
407 226, 132, 162, 164, 100, 97, 116, 97, 145, 164, 100, 97, 116, 97, 162, 105, 100, 54,
408 ];
409
410 let data = to_value(&["data"]);
411 let packet = decode(DATA);
412 assert_eq!(packet, Packet::ack("/admin™", data, 54));
413 }
414
415 #[test]
416 fn packet_encode_binary_event_root_ns() {
417 const DATA: &[u8] = &[
418 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
419 147, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
420 101, 226, 132, 162, 196, 4, 1, 2, 3, 4,
421 ];
422 let data = to_event_value(&(json!({ "data": "value™" }), BIN), "event");
423 let packet = encode(Packet::event("/", data));
424 assert_eq!(DATA, packet.as_ref());
425 }
426
427 #[test]
428 fn packet_decode_binary_event_root_ns() {
429 const DATA: &[u8] = &[
430 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
431 147, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
432 101, 226, 132, 162, 196, 4, 1, 2, 3, 4,
433 ];
434 let data = to_event_value(&(json!({ "data": "value™" }), BIN), "event");
435 let packet = decode(DATA);
436 assert_eq!(packet, Packet::event("/", data));
437 }
438
439 #[test]
440 fn packet_encode_binary_event_root_ns_with_ack_id() {
441 const DATA: &[u8] = &[
442 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
443 147, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
444 101, 226, 132, 162, 196, 4, 1, 2, 3, 4, 162, 105, 100, 204, 254,
445 ];
446 let data = to_event_value(&(json!({ "data": "value™" }), BIN), "event");
447 let mut packet = Packet::event("/", data);
448 packet.inner.set_ack_id(254);
449 let packet = encode(packet);
450
451 assert_eq!(DATA, packet.as_ref());
452 }
453
454 #[test]
455 fn packet_decode_binary_event_root_ns_with_ack_id() {
456 const DATA: &[u8] = &[
457 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
458 147, 165, 101, 118, 101, 110, 116, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117,
459 101, 226, 132, 162, 196, 4, 1, 2, 3, 4, 162, 105, 100, 204, 254,
460 ];
461 let data = to_event_value(&(json!({ "data": "value™" }), BIN), "event");
462 let mut packet_ref = Packet::event("/", data);
463 packet_ref.inner.set_ack_id(254);
464 let packet = decode(DATA);
465
466 assert_eq!(packet, packet_ref);
467 }
468
469 #[test]
470 fn packet_encode_binary_event_custom_ns() {
471 const DATA: &[u8] = &[
472 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
473 226, 132, 162, 164, 100, 97, 116, 97, 147, 165, 101, 118, 101, 110, 116, 129, 164, 100,
474 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 196, 4, 1, 2, 3, 4,
475 ];
476 let data = to_event_value(&(json!({"data": "value™"}), BIN), "event");
477 let packet = encode(Packet::event("/admin™", data));
478
479 assert_eq!(DATA, packet.as_ref());
480 }
481
482 #[test]
483 fn packet_decode_binary_event_custom_ns() {
484 const DATA: &[u8] = &[
485 131, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
486 226, 132, 162, 164, 100, 97, 116, 97, 147, 165, 101, 118, 101, 110, 116, 129, 164, 100,
487 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 196, 4, 1, 2, 3, 4,
488 ];
489 let data = to_event_value(&(json!({"data": "value™"}), BIN), "event");
490 let packet = decode(DATA);
491
492 assert_eq!(packet, Packet::event("/admin™", data));
493 }
494
495 #[test]
496 fn packet_encode_binary_event_custom_ns_with_ack_id() {
497 const DATA: &[u8] = &[
498 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
499 226, 132, 162, 164, 100, 97, 116, 97, 147, 165, 101, 118, 101, 110, 116, 129, 164, 100,
500 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 196, 4, 1, 2, 3, 4, 162, 105,
501 100, 204, 254,
502 ];
503 let data = to_event_value(&(json!({"data": "value™"}), BIN), "event");
504 let mut packet = Packet::event("/admin™", data);
505 packet.inner.set_ack_id(254);
506 let packet = encode(packet);
507 assert_eq!(DATA, packet.as_ref());
508 }
509
510 #[test]
511 fn packet_decode_binary_event_custom_ns_with_ack_id() {
512 const DATA: &[u8] = &[
513 132, 164, 116, 121, 112, 101, 2, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
514 226, 132, 162, 164, 100, 97, 116, 97, 147, 165, 101, 118, 101, 110, 116, 129, 164, 100,
515 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 196, 4, 1, 2, 3, 4, 162, 105,
516 100, 204, 254,
517 ];
518 let data = to_event_value(&(json!({"data": "value™"}), BIN), "event");
519 let mut packet_ref = Packet::event("/admin™", data);
520 packet_ref.inner.set_ack_id(254);
521 let packet = decode(DATA);
522 assert_eq!(packet, packet_ref);
523 }
524
525 #[test]
526 fn packet_encode_binary_ack_root_ns() {
527 const DATA: &[u8] = &[
528 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
529 146, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 196, 4, 1,
530 2, 3, 4, 162, 105, 100, 54,
531 ];
532 let data = to_value(&(json!({ "data": "value™" }), BIN));
533 let packet = encode(Packet::ack("/", data, 54));
534 assert_eq!(DATA, packet.as_ref());
535 }
536
537 #[test]
538 fn packet_decode_binary_ack_root_ns() {
539 const DATA: &[u8] = &[
540 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 161, 47, 164, 100, 97, 116, 97,
541 146, 129, 164, 100, 97, 116, 97, 168, 118, 97, 108, 117, 101, 226, 132, 162, 196, 4, 1,
542 2, 3, 4, 162, 105, 100, 54,
543 ];
544 let data = to_value(&(json!({ "data": "value™" }), BIN));
545 let packet = decode(DATA);
546 assert_eq!(packet, Packet::ack("/", data, 54));
547 }
548
549 #[test]
550 fn packet_encode_binary_ack_custom_ns() {
551 const DATA: &[u8] = &[
552 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
553 226, 132, 162, 164, 100, 97, 116, 97, 146, 129, 164, 100, 97, 116, 97, 168, 118, 97,
554 108, 117, 101, 226, 132, 162, 196, 4, 1, 2, 3, 4, 162, 105, 100, 54,
555 ];
556 let data = to_value(&(json!({ "data": "value™" }), BIN));
557 let packet = encode(Packet::ack("/admin™", data, 54));
558
559 assert_eq!(DATA, packet.as_ref());
560 }
561
562 #[test]
563 fn packet_decode_binary_ack_custom_ns() {
564 const DATA: &[u8] = &[
565 132, 164, 116, 121, 112, 101, 3, 163, 110, 115, 112, 169, 47, 97, 100, 109, 105, 110,
566 226, 132, 162, 164, 100, 97, 116, 97, 146, 129, 164, 100, 97, 116, 97, 168, 118, 97,
567 108, 117, 101, 226, 132, 162, 196, 4, 1, 2, 3, 4, 162, 105, 100, 54,
568 ];
569 let data = to_value(&(json!({ "data": "value™" }), BIN));
570 let packet = decode(DATA);
571
572 assert_eq!(packet, Packet::ack("/admin™", data, 54));
573 }
574}