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 minidom::Element;
 29    use std::error::Error as StdError;
 30    use std::convert::TryFrom;
 31
 32    #[cfg(target_pointer_width = "32")]
 33    #[test]
 34    fn test_size() {
 35        assert_size!(Transport, 16);
 36    }
 37
 38    #[cfg(target_pointer_width = "64")]
 39    #[test]
 40    fn test_size() {
 41        assert_size!(Transport, 32);
 42    }
 43
 44    #[test]
 45    fn test_simple() {
 46        let elem: Element =
 47            "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='3' sid='coucou'/>"
 48                .parse()
 49                .unwrap();
 50        let transport = Transport::try_from(elem).unwrap();
 51        assert_eq!(transport.block_size, 3);
 52        assert_eq!(transport.sid, StreamId(String::from("coucou")));
 53        assert_eq!(transport.stanza, Stanza::Iq);
 54    }
 55
 56    #[test]
 57    fn test_invalid() {
 58        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1'/>"
 59            .parse()
 60            .unwrap();
 61        let error = Transport::try_from(elem).unwrap_err();
 62        let message = match error {
 63            Error::ParseError(string) => string,
 64            _ => panic!(),
 65        };
 66        assert_eq!(message, "Required attribute 'block-size' missing.");
 67
 68        let elem: Element =
 69            "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='65536'/>"
 70                .parse()
 71                .unwrap();
 72        let error = Transport::try_from(elem).unwrap_err();
 73        let message = match error {
 74            Error::ParseIntError(error) => error,
 75            _ => panic!(),
 76        };
 77        assert_eq!(
 78            message.description(),
 79            "number too large to fit in target type"
 80        );
 81
 82        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='-5'/>"
 83            .parse()
 84            .unwrap();
 85        let error = Transport::try_from(elem).unwrap_err();
 86        let message = match error {
 87            Error::ParseIntError(error) => error,
 88            _ => panic!(),
 89        };
 90        assert_eq!(message.description(), "invalid digit found in string");
 91
 92        let elem: Element =
 93            "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128'/>"
 94                .parse()
 95                .unwrap();
 96        let error = Transport::try_from(elem).unwrap_err();
 97        let message = match error {
 98            Error::ParseError(string) => string,
 99            _ => panic!(),
100        };
101        assert_eq!(message, "Required attribute 'sid' missing.");
102    }
103
104    #[test]
105    fn test_invalid_stanza() {
106        let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128' sid='coucou' stanza='fdsq'/>".parse().unwrap();
107        let error = Transport::try_from(elem).unwrap_err();
108        let message = match error {
109            Error::ParseError(string) => string,
110            _ => panic!(),
111        };
112        assert_eq!(message, "Unknown value for 'stanza' attribute.");
113    }
114}