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
 7#![deny(missing_docs)]
 8
 9use ibb::{Stanza, StreamId};
10
11generate_element!(
12/// Describes an [In-Band Bytestream](https://xmpp.org/extensions/xep-0047.html)
13/// Jingle transport, see also the [IBB module](../ibb.rs).
14Transport, "transport", JINGLE_IBB,
15attributes: [
16    /// Maximum size in bytes for each chunk.
17    block_size: u16 = "block-size" => required,
18
19    /// The identifier to be used to create a stream.
20    sid: StreamId = "sid" => required,
21
22    /// Which stanza type to use to exchange data.
23    stanza: Stanza = "stanza" => default,
24]);
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use try_from::TryFrom;
30    use minidom::Element;
31    use error::Error;
32    use std::error::Error as StdError;
33
34    #[test]
35    fn test_simple() {
36        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='3' sid='coucou'/>".parse().unwrap();
37        let transport = Transport::try_from(elem).unwrap();
38        assert_eq!(transport.block_size, 3);
39        assert_eq!(transport.sid, StreamId(String::from("coucou")));
40        assert_eq!(transport.stanza, Stanza::Iq);
41    }
42
43    #[test]
44    fn test_invalid() {
45        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1'/>".parse().unwrap();
46        let error = Transport::try_from(elem).unwrap_err();
47        let message = match error {
48            Error::ParseError(string) => string,
49            _ => panic!(),
50        };
51        assert_eq!(message, "Required attribute 'block-size' missing.");
52
53        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='65536'/>".parse().unwrap();
54        let error = Transport::try_from(elem).unwrap_err();
55        let message = match error {
56            Error::ParseIntError(error) => error,
57            _ => panic!(),
58        };
59        assert_eq!(message.description(), "number too large to fit in target type");
60
61        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='-5'/>".parse().unwrap();
62        let error = Transport::try_from(elem).unwrap_err();
63        let message = match error {
64            Error::ParseIntError(error) => error,
65            _ => panic!(),
66        };
67        assert_eq!(message.description(), "invalid digit found in string");
68
69        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128'/>".parse().unwrap();
70        let error = Transport::try_from(elem).unwrap_err();
71        let message = match error {
72            Error::ParseError(string) => string,
73            _ => panic!(),
74        };
75        assert_eq!(message, "Required attribute 'sid' missing.");
76    }
77
78    #[test]
79    fn test_invalid_stanza() {
80        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128' sid='coucou' stanza='fdsq'/>".parse().unwrap();
81        let error = Transport::try_from(elem).unwrap_err();
82        let message = match error {
83            Error::ParseError(string) => string,
84            _ => panic!(),
85        };
86        assert_eq!(message, "Unknown value for 'stanza' attribute.");
87    }
88}