engine_io_parser 0.2.0

A parser for the engine.io protocol for Socket.IO
Documentation
use engine_io_parser::packet::*;
use engine_io_parser::string::decoder;
use engine_io_parser::string::encoder;
use std::borrow::Cow;

#[test]
fn decodes_string_packet() {
    let res = decoder::decode_packet("5asdf").unwrap();
    assert_eq!(
        res,
        Packet {
            packet_type: PacketType::Upgrade,
            data: "asdf".into()
        }
    );
}

#[test]
fn decodes_unicode_string_packet() {
    let res = decoder::decode_packet("2hello world 🦀  안녕 잘 지내?").unwrap();
    assert_eq!(
        res,
        Packet {
            packet_type: PacketType::Ping,
            data: "hello world 🦀  안녕 잘 지내?".into()
        }
    );
}

#[test]
fn decodes_plaintext_string_payload() {
    let res = decoder::decode_payload("6:4hello2:4€").unwrap();
    assert_eq!(res.len(), 2);
    assert_eq!(
        res,
        vec![
            Packet {
                packet_type: PacketType::Message,
                data: "hello".into(),
            },
            Packet {
                packet_type: PacketType::Message,
                data: "€".into()
            }
        ],
    );
}

#[test]
fn decodes_binary_string_payload() {
    let res = decoder::decode_payload("10:b4aGVsbG8=10:b4AQIDBA==").unwrap();
    assert_eq!(res.len(), 2);
    assert_eq!(
        res,
        vec![
            Packet {
                packet_type: PacketType::Message,
                data: PacketData::Binary(Cow::Owned(vec![b'h', b'e', b'l', b'l', b'o'])),
            },
            Packet {
                packet_type: PacketType::Message,
                data: PacketData::Binary(Cow::Owned(vec![1, 2, 3, 4]))
            }
        ],
    );
}

#[test]
fn decodes_mixed_string_payload() {
    let res = decoder::decode_payload("2:4€10:b4AQIDBA==").unwrap();
    assert_eq!(res.len(), 2);
    assert_eq!(
        res,
        vec![
            Packet {
                packet_type: PacketType::Message,
                data: "€".into(),
            },
            Packet {
                packet_type: PacketType::Message,
                data: PacketData::Binary(Cow::Owned(vec![1, 2, 3, 4]))
            }
        ],
    );
}

#[test]
fn encodes_string_packet() {
    let packet = Packet {
        packet_type: PacketType::Message,
        data: "Hello world!".into(),
    };
    assert_eq!(encoder::encode_packet(&packet), "4Hello world!");
}

#[test]
fn encodes_plaintext_string_payload() {
    assert_eq!(
        encoder::encode_payload(&[
            Packet {
                packet_type: PacketType::Message,
                data: "hello".into(),
            },
            Packet {
                packet_type: PacketType::Message,
                data: "€".into()
            }
        ]),
        "6:4hello2:4€"
    );
}

#[test]
fn encodes_mixed_string_payload() {
    assert_eq!(
        encoder::encode_payload(&[
            Packet {
                packet_type: PacketType::Message,
                data: "€".into(),
            },
            Packet {
                packet_type: PacketType::Message,
                data: PacketData::Binary(Cow::Owned(vec![1, 2, 3, 4]))
            }
        ]),
        "2:4€10:b4AQIDBA=="
    );
}

#[test]
fn end_to_end_string_packet_decode() {
    let encoded = "2hello world 🦀  안녕 잘 지내?";
    assert_eq!(
        encoder::encode_packet(&decoder::decode_packet(encoded).unwrap()),
        encoded
    );
}

#[test]
fn end_to_end_string_packet_encode() {
    let packet = Packet {
        packet_type: PacketType::Ping,
        data: "hello world 🦀  안녕 잘 지내?".into(),
    };
    assert_eq!(
        decoder::decode_packet(&encoder::encode_packet(&packet)).unwrap(),
        packet
    );
}