use rsip::{ common::{self, uri}, headers::*, message::{request, response, sip_message::Tokenizer}, Request, Response, SipMessage, }; use std::convert::TryFrom; #[test] fn methods() { let uri = uri::Uri { scheme: Some(uri::scheme::Scheme::Sips), auth: None, host_with_port: uri::HostWithPort { host: uri::Host::Domain("ss2.biloxi.example.com".into()), port: None, }, params: vec![], headers: vec![].into(), }; let headers: rsip::Headers = vec![ Via::new("SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92").into(), MaxForwards::new("70").into(), From::new("Bob ;tag=ja743ks76zlflH").into(), To::new("Bob ").into(), CallId::new("1j9FpLxk3uxtm8tn@biloxi.example.com").into(), CSeq::new("2 REGISTER").into(), Contact::new("").into(), Authorization::new("Digest username=\"bob\", realm=\"atlanta.example.com\" nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\" uri=\"sips:ss2.biloxi.example.com\", response=\"dfe56131d1958046689d83306477ecc\"").into(), ContentLength::new("0").into(), ].into(); let sip_message = SipMessage::Request(Request { method: common::method::Method::Register, uri: uri.clone(), version: common::version::Version::V2, headers: headers.clone(), body: vec![1, 2, 3], }); assert_eq!(sip_message.version(), &common::version::Version::V2); assert_eq!(sip_message.body(), &vec![1, 2, 3]); //TODO: how do I test mut signatures (mut_body & mut_headers) ? assert_eq!(rsip::message::HasHeaders::headers(&sip_message), &headers); } #[test] fn bytes() { assert_eq!( Into::::into(SipMessage::Response(Response { status_code: common::StatusCode::Unauthorized, version: common::Version::V2, headers: vec![].into(), body: vec![] })), bytes::Bytes::from(String::from("SIP/2.0 401 Unauthorized\r\n\r\n")) ); } mod display { use super::*; #[test] fn display() { assert_eq!( SipMessage::Response(Response { status_code: common::StatusCode::Unauthorized, version: common::Version::V2, headers: vec![].into(), body: vec![] }) .to_string(), String::from("SIP/2.0 401 Unauthorized\r\n\r\n") ); } } mod parser { use super::*; #[test] fn parser1() { assert_eq!( SipMessage::try_from("REGISTER sip:server.com SIP/2.0\r\n\r\n".as_bytes()), Ok(SipMessage::Request(Request { method: common::method::Method::Register, uri: uri::Uri { scheme: Some(uri::scheme::Scheme::Sip), auth: None, host_with_port: uri::HostWithPort { host: uri::Host::Domain("server.com".into()), port: None }, params: vec![], headers: vec![].into() }, version: common::version::Version::V2, headers: vec![].into(), body: vec![] })), ); } #[test] fn parser2() { assert_eq!( SipMessage::try_from( concat!( "REGISTER sips:ss2.biloxi.example.com SIP/2.0\r\n", "Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92\r\n", "Max-Forwards: 70\r\n", "From: Bob ;tag=ja743ks76zlflH\r\n", "To: Bob \r\n", "Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com\r\n", "CSeq: 2 REGISTER\r\n", "Contact: \r\n", "Authorization: Digest username=\"bob\", realm=\"atlanta.example.com\" nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\" uri=\"sips:ss2.biloxi.example.com\", response=\"dfe56131d1958046689d83306477ecc\"\r\n", "Content-Length: 0\r\n\r\n", "a simple body\r\n", "and some complex: characters\r\n", "Ok?" ).as_bytes() ), Ok(SipMessage::Request(Request { method: common::method::Method::Register, uri: uri::Uri { scheme: Some(uri::scheme::Scheme::Sips), auth: None, host_with_port: uri::HostWithPort { host: uri::Host::Domain("ss2.biloxi.example.com".into()), port: None }, params: vec![], headers: vec![].into() }, version: common::version::Version::V2, headers: vec![ Via::new("SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92").into(), MaxForwards::new("70").into(), From::new("Bob ;tag=ja743ks76zlflH").into(), To::new("Bob ").into(), CallId::new("1j9FpLxk3uxtm8tn@biloxi.example.com").into(), CSeq::new("2 REGISTER").into(), Contact::new("").into(), Authorization::new("Digest username=\"bob\", realm=\"atlanta.example.com\" nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\" uri=\"sips:ss2.biloxi.example.com\", response=\"dfe56131d1958046689d83306477ecc\"").into(), ContentLength::new("0").into(), ].into(), body: concat!( "a simple body\r\n", "and some complex: characters\r\n", "Ok?" ).as_bytes().to_vec() })), ); } #[test] fn parser3() { assert_eq!( SipMessage::try_from("SIP/2.0 401 Unauthorized\r\n\r\n".as_bytes()), Ok(SipMessage::Response(Response { status_code: common::StatusCode::Unauthorized, version: common::Version::V2, headers: vec![].into(), body: vec![] })), ); } #[test] fn parser4() { assert_eq!( SipMessage::try_from( concat!( "SIP/2.0 401 Unauthorized\r\n", "Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201\r\n", "From: Bob ;tag=a73kszlfl\r\n", "To: Bob ;tag=1410948204\r\n", "Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com\r\n", "CSeq: 1 REGISTER\r\n", "WWW-Authenticate: Digest realm=\"atlanta.example.com\", qop=\"auth\", nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\", stale=FALSE, algorithm=MD5\r\n", "Content-Length: 0\r\n\r\n", "a simple body\r\n", "and some complex: characters\r\n", "Ok?" ).as_bytes() ), Ok(SipMessage::Response(Response { status_code: common::StatusCode::Unauthorized, version: common::Version::V2, headers: vec![ Via::new("SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201").into(), From::new("Bob ;tag=a73kszlfl").into(), To::new("Bob ;tag=1410948204").into(), CallId::new("1j9FpLxk3uxtm8tn@biloxi.example.com").into(), CSeq::new("1 REGISTER").into(), WwwAuthenticate::new("Digest realm=\"atlanta.example.com\", qop=\"auth\", nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\", stale=FALSE, algorithm=MD5").into(), ContentLength::new("0").into(), ].into(), body: concat!( "a simple body\r\n", "and some complex: characters\r\n", "Ok?" ).as_bytes().to_vec() })), ); } } mod tokenizer { use super::*; #[test] fn tokenizer1() { assert_eq!( Tokenizer::tokenize("REGISTER sip:server.com SIP/2.0\r\n\r\n".as_bytes()), Ok(( "".as_bytes(), Tokenizer::Request(request::Tokenizer { method: "REGISTER".as_bytes().into(), uri: uri::Tokenizer { scheme: Some("sip".as_bytes().into()), auth: None, host_with_port: ("server.com".as_bytes(), None).into(), params: vec![], headers: None, ..Default::default() }, version: ("2".as_bytes(), "0".as_bytes()).into(), headers: vec![].into(), body: &[] }) )), ); } #[test] fn tokenizer2() { assert_eq!( Tokenizer::tokenize( concat!( "REGISTER sips:ss2.biloxi.example.com SIP/2.0\r\n", "Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92\r\n", "Max-Forwards: 70\r\n", "From: Bob ;tag=ja743ks76zlflH\r\n", "To: Bob \r\n", "Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com\r\n", "CSeq: 2 REGISTER\r\n", "Contact: \r\n", "Authorization: Digest username=\"bob\", realm=\"atlanta.example.com\" nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\" uri=\"sips:ss2.biloxi.example.com\", response=\"dfe56131d1958046689d83306477ecc\"\r\n", "Content-Length: 0\r\n\r\n" ).as_bytes() ), Ok(( "".as_bytes(), Tokenizer::Request(request::Tokenizer { method: "REGISTER".as_bytes().into(), uri: uri::Tokenizer { scheme: Some("sips".as_bytes().into()), auth: None, host_with_port: ("ss2.biloxi.example.com".as_bytes(), None).into(), params: vec![], headers: None, ..Default::default() }, version: ("2".as_bytes(), "0".as_bytes()).into(), headers: vec![ ("Via".as_bytes(), "SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92".as_bytes()).into(), ("Max-Forwards".as_bytes(), "70".as_bytes()).into(), ("From".as_bytes(), "Bob ;tag=ja743ks76zlflH".as_bytes()).into(), ("To".as_bytes(), "Bob ".as_bytes()).into(), ("Call-ID".as_bytes(), "1j9FpLxk3uxtm8tn@biloxi.example.com".as_bytes()).into(), ("CSeq".as_bytes(), "2 REGISTER".as_bytes()).into(), ("Contact".as_bytes(), "".as_bytes()).into(), ("Authorization".as_bytes(), "Digest username=\"bob\", realm=\"atlanta.example.com\" nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\" uri=\"sips:ss2.biloxi.example.com\", response=\"dfe56131d1958046689d83306477ecc\"".as_bytes()).into(), ("Content-Length".as_bytes(), "0".as_bytes()).into(), ], body: &[] }) )), ); } #[test] fn tokenizer3() { assert_eq!( Tokenizer::tokenize("SIP/2.0 401 Unauthorized\r\n\r\n".as_bytes()), Ok(( "".as_bytes(), Tokenizer::Response(response::Tokenizer { version: ("2".as_bytes(), "0".as_bytes()).into(), status_code: ("401".as_bytes(), "Unauthorized".as_bytes()).into(), headers: vec![].into(), body: &[] }) )), ); } #[test] fn tokenizer4() { assert_eq!( Tokenizer::tokenize( concat!( "SIP/2.0 401 Unauthorized\r\n", "Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201\r\n", "From: Bob ;tag=a73kszlfl\r\n", "To: Bob ;tag=1410948204\r\n", "Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com\r\n", "CSeq: 1 REGISTER\r\n", "WWW-Authenticate: Digest realm=\"atlanta.example.com\", qop=\"auth\", nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\", stale=FALSE, algorithm=MD5\r\n", "Content-Length: 0\r\n\r\n" ).as_bytes() ), Ok(( "".as_bytes(), Tokenizer::Response(response::Tokenizer { version: ("2".as_bytes(), "0".as_bytes()).into(), status_code: ("401".as_bytes(), "Unauthorized".as_bytes()).into(), headers: vec![ ("Via".as_bytes(), "SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201".as_bytes()).into(), ("From".as_bytes(), "Bob ;tag=a73kszlfl".as_bytes()).into(), ("To".as_bytes(), "Bob ;tag=1410948204".as_bytes()).into(), ("Call-ID".as_bytes(), "1j9FpLxk3uxtm8tn@biloxi.example.com".as_bytes()).into(), ("CSeq".as_bytes(), "1 REGISTER".as_bytes()).into(), ("WWW-Authenticate".as_bytes(), "Digest realm=\"atlanta.example.com\", qop=\"auth\", nonce=\"ea9c8e88df84f1cec4341ae6cbe5a359\", opaque=\"\", stale=FALSE, algorithm=MD5".as_bytes()).into(), ("Content-Length".as_bytes(), "0".as_bytes()).into(), ], body: &[] }) )), ); } }