rtc-ice 0.9.0

RTC ICE in Rust
Documentation
use super::*;

#[test]
fn test_parse_url_success() -> Result<()> {
    let tests = vec![
        (
            "stun:google.de",
            "stun:google.de:3478",
            SchemeType::Stun,
            false,
            "google.de",
            3478,
            ProtoType::Udp,
        ),
        (
            "stun:google.de:1234",
            "stun:google.de:1234",
            SchemeType::Stun,
            false,
            "google.de",
            1234,
            ProtoType::Udp,
        ),
        (
            "stuns:google.de",
            "stuns:google.de:5349",
            SchemeType::Stuns,
            true,
            "google.de",
            5349,
            ProtoType::Tcp,
        ),
        (
            "stun:[::1]:123",
            "stun:[::1]:123",
            SchemeType::Stun,
            false,
            "::1",
            123,
            ProtoType::Udp,
        ),
        (
            "turn:google.de",
            "turn:google.de:3478?transport=udp",
            SchemeType::Turn,
            false,
            "google.de",
            3478,
            ProtoType::Udp,
        ),
        (
            "turns:google.de",
            "turns:google.de:5349?transport=tcp",
            SchemeType::Turns,
            true,
            "google.de",
            5349,
            ProtoType::Tcp,
        ),
        (
            "turn:google.de?transport=udp",
            "turn:google.de:3478?transport=udp",
            SchemeType::Turn,
            false,
            "google.de",
            3478,
            ProtoType::Udp,
        ),
        (
            "turns:google.de?transport=tcp",
            "turns:google.de:5349?transport=tcp",
            SchemeType::Turns,
            true,
            "google.de",
            5349,
            ProtoType::Tcp,
        ),
    ];

    for (
        raw_url,
        expected_url_string,
        expected_scheme,
        expected_secure,
        expected_host,
        expected_port,
        expected_proto,
    ) in tests
    {
        let url = Url::parse_url(raw_url)?;

        assert_eq!(url.scheme, expected_scheme, "testCase: {raw_url:?}");
        assert_eq!(
            expected_url_string,
            url.to_string(),
            "testCase: {raw_url:?}"
        );
        assert_eq!(url.is_secure(), expected_secure, "testCase: {raw_url:?}");
        assert_eq!(url.host, expected_host, "testCase: {raw_url:?}");
        assert_eq!(url.port, expected_port, "testCase: {raw_url:?}");
        assert_eq!(url.proto, expected_proto, "testCase: {raw_url:?}");
    }

    Ok(())
}

#[test]
fn test_parse_url_failure() -> Result<()> {
    let tests = vec![
        ("", Error::ErrSchemeType),
        (":::", Error::ErrUrlParse),
        ("stun:[::1]:123:", Error::ErrPort),
        ("stun:[::1]:123a", Error::ErrPort),
        ("google.de", Error::ErrSchemeType),
        ("stun:", Error::ErrHost),
        ("stun:google.de:abc", Error::ErrPort),
        ("stun:google.de?transport=udp", Error::ErrStunQuery),
        ("stuns:google.de?transport=udp", Error::ErrStunQuery),
        ("turn:google.de?trans=udp", Error::ErrInvalidQuery),
        ("turns:google.de?trans=udp", Error::ErrInvalidQuery),
        (
            "turns:google.de?transport=udp&another=1",
            Error::ErrInvalidQuery,
        ),
        ("turn:google.de?transport=ip", Error::ErrProtoType),
    ];

    for (raw_url, expected_err) in tests {
        let result = Url::parse_url(raw_url);
        if let Err(err) = result {
            assert_eq!(
                err.to_string(),
                expected_err.to_string(),
                "testCase: '{raw_url}', expected err '{expected_err}', but got err '{err}'"
            );
        } else {
            panic!("expected error, but got ok");
        }
    }

    Ok(())
}