sipmsg 0.2.3

SIP message parser
Documentation
use sipmsg::*;

#[test]
fn status_code_from_bytes_str() {
    assert_eq!(
        SipResponseStatusCode::from_bytes_str("100".as_bytes()),
        SipResponseStatusCode::Trying
    );

    assert_eq!(
        SipResponseStatusCode::from_bytes_str("181".as_bytes()),
        SipResponseStatusCode::CallIsBeingForwarded
    );
}

#[test]
fn status_code_from_str() {
    assert_eq!(
        SipResponseStatusCode::from_str("500"),
        SipResponseStatusCode::ServerInternalError
    );
}

#[test]
fn status_line() {
    match SipResponseStatusLine::parse(b"SIP/2.0 401 Unauthorized\r\n") {
        Ok((left, status_line)) => {
            assert_eq!(left.len(), 0);
            assert_eq!(status_line.sip_version, sipmsg::SipVersion(2, 0));
            assert_eq!(status_line.status_code, SipResponseStatusCode::Unauthorized);
            assert_eq!(status_line.reason_phrase, "Unauthorized");
        }
        Err(_e) => panic!(),
    }
}

#[test]
fn parse_response() {
    let response_msg = "SIP/2.0 401 Unauthorized\r\n\
    Via: SIP/2.0/UDP 192.168.178.69:60686;branch=z9hG4bKPj7IVefnk0j6Wn9oUM78ubmcURGDehvKEc;received=192.168.178.69;rport=60686\r\n\
    From: <sip:12@192.168.178.26>;tag=XOO-LeGIwZmwa2UROKMXEhZGA5mKcY0b\r\n\
    To: <sip:12@192.168.178.26>;tag=as68275e50\r\n\
    Call-ID: p8gpcmxSdWwcM5xV89nm2LkEbcTPUdT1\r\n\
    CSeq: 62833 REGISTER\r\n\
    Server: FPBX-2.11.0(11.6.0)\r\n\
    Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH\r\n\
    Supported: replaces, timer\r\n\
    Content-Length: 0\r\n\r\n";
    match SipResponse::parse(response_msg.as_bytes()) {
        Ok((_, response)) => {
            assert_eq!(response.sl.sip_version, SipVersion(2, 0));
            assert_eq!(response.sl.status_code, SipResponseStatusCode::Unauthorized);
            assert_eq!(response.sl.reason_phrase, "Unauthorized");
            assert_eq!(response.headers.len(), 9);

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::Via)
                    .unwrap()
                    .value
                    .vstr,
                "SIP/2.0/UDP 192.168.178.69:60686"
            );
            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::Via)
                    .unwrap()
                    .params()
                    .unwrap()
                    .get(&"branch"),
                Some(&Some("z9hG4bKPj7IVefnk0j6Wn9oUM78ubmcURGDehvKEc"))
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::Via)
                    .unwrap()
                    .params()
                    .unwrap()
                    .get(&"received"),
                Some(&Some("192.168.178.69"))
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::Via)
                    .unwrap()
                    .params()
                    .unwrap()
                    .get(&"rport"),
                Some(&Some("60686"))
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::From)
                    .unwrap()
                    .value
                    .vstr,
                "<sip:12@192.168.178.26>"
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::From)
                    .unwrap()
                    .params()
                    .unwrap()
                    .get(&"tag"),
                Some(&Some("XOO-LeGIwZmwa2UROKMXEhZGA5mKcY0b"))
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::To)
                    .unwrap()
                    .value
                    .vstr,
                "<sip:12@192.168.178.26>"
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::To)
                    .unwrap()
                    .params()
                    .unwrap()
                    .get(&"tag"),
                Some(&Some("as68275e50"))
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::CallID)
                    .unwrap()
                    .value
                    .vstr,
                "p8gpcmxSdWwcM5xV89nm2LkEbcTPUdT1"
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::CSeq)
                    .unwrap()
                    .value
                    .vstr,
                "62833 REGISTER"
            );

            assert_eq!(
                response
                    .headers
                    .get_rfc_s(SipRFCHeader::Server)
                    .unwrap()
                    .value
                    .vstr,
                "FPBX-2.11.0(11.6.0)"
            );
            let allow_headers = response.headers.get_rfc(SipRFCHeader::Allow).unwrap();
            assert_eq!(allow_headers.len(), 10);
            assert_eq!(allow_headers[0].name, "Allow");
            assert_eq!(allow_headers[0].value.vstr, "INVITE");
            assert_eq!(allow_headers[1].value.vstr, "ACK");
            assert_eq!(allow_headers[2].value.vstr, "CANCEL");
            assert_eq!(allow_headers[3].value.vstr, "OPTIONS");
            assert_eq!(allow_headers[4].value.vstr, "BYE");
            assert_eq!(allow_headers[5].value.vstr, "REFER");
            assert_eq!(allow_headers[6].value.vstr, "SUBSCRIBE");
            assert_eq!(allow_headers[7].value.vstr, "NOTIFY");
            assert_eq!(allow_headers[8].value.vstr, "INFO");
            assert_eq!(allow_headers[9].value.vstr, "PUBLISH");

            let supported_headers = response.headers.get_rfc(SipRFCHeader::Supported).unwrap();
            assert_eq!(supported_headers[0].value.vstr, "replaces");
            assert_eq!(supported_headers[1].value.vstr, "timer");
        }
        Err(_e) => panic!(),
    }
}