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