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}