jingle_ibb.rs

 1// Copyright (c) 2017 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
 2//
 3// This Source Code Form is subject to the terms of the Mozilla Public
 4// License, v. 2.0. If a copy of the MPL was not distributed with this
 5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 6
 7use try_from::TryFrom;
 8use std::str::FromStr;
 9
10use minidom::{Element, IntoAttributeValue};
11
12use error::Error;
13
14use ns;
15
16use ibb::Stanza;
17
18generate_id!(StreamId);
19
20generate_element_with_only_attributes!(Transport, "transport", ns::JINGLE_IBB, [
21    block_size: u16 = "block-size" => required,
22    sid: StreamId = "sid" => required,
23    stanza: Stanza = "stanza" => default,
24]);
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use std::error::Error as StdError;
30
31    #[test]
32    fn test_simple() {
33        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='3' sid='coucou'/>".parse().unwrap();
34        let transport = Transport::try_from(elem).unwrap();
35        assert_eq!(transport.block_size, 3);
36        assert_eq!(transport.sid, StreamId(String::from("coucou")));
37        assert_eq!(transport.stanza, Stanza::Iq);
38    }
39
40    #[test]
41    fn test_invalid() {
42        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1'/>".parse().unwrap();
43        let error = Transport::try_from(elem).unwrap_err();
44        let message = match error {
45            Error::ParseError(string) => string,
46            _ => panic!(),
47        };
48        assert_eq!(message, "Required attribute 'block-size' missing.");
49
50        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='65536'/>".parse().unwrap();
51        let error = Transport::try_from(elem).unwrap_err();
52        let message = match error {
53            Error::ParseIntError(error) => error,
54            _ => panic!(),
55        };
56        assert_eq!(message.description(), "number too large to fit in target type");
57
58        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='-5'/>".parse().unwrap();
59        let error = Transport::try_from(elem).unwrap_err();
60        let message = match error {
61            Error::ParseIntError(error) => error,
62            _ => panic!(),
63        };
64        assert_eq!(message.description(), "invalid digit found in string");
65
66        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128'/>".parse().unwrap();
67        let error = Transport::try_from(elem).unwrap_err();
68        let message = match error {
69            Error::ParseError(string) => string,
70            _ => panic!(),
71        };
72        assert_eq!(message, "Required attribute 'sid' missing.");
73    }
74
75    #[test]
76    fn test_invalid_stanza() {
77        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128' sid='coucou' stanza='fdsq'/>".parse().unwrap();
78        let error = Transport::try_from(elem).unwrap_err();
79        let message = match error {
80            Error::ParseError(string) => string,
81            _ => panic!(),
82        };
83        assert_eq!(message, "Unknown value for 'stanza' attribute.");
84    }
85}