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}