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}