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 try_from::TryFrom;
8use std::str::FromStr;
9
10use minidom::{Element, IntoAttributeValue};
11
12use error::Error;
13
14use ns;
15
16use ibb::Stanza;
17
18generate_id!(StreamId);
19
20generate_element_with_only_attributes!(Transport, "transport", ns::JINGLE_IBB, [
21 block_size: u16 = "block-size" => required,
22 sid: StreamId = "sid" => required,
23 stanza: Stanza = "stanza" => default,
24]);
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29 use std::error::Error as StdError;
30
31 #[test]
32 fn test_simple() {
33 let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='3' sid='coucou'/>".parse().unwrap();
34 let transport = Transport::try_from(elem).unwrap();
35 assert_eq!(transport.block_size, 3);
36 assert_eq!(transport.sid, StreamId(String::from("coucou")));
37 assert_eq!(transport.stanza, Stanza::Iq);
38 }
39
40 #[test]
41 fn test_invalid() {
42 let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1'/>".parse().unwrap();
43 let error = Transport::try_from(elem).unwrap_err();
44 let message = match error {
45 Error::ParseError(string) => string,
46 _ => panic!(),
47 };
48 assert_eq!(message, "Required attribute 'block-size' missing.");
49
50 let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='65536'/>".parse().unwrap();
51 let error = Transport::try_from(elem).unwrap_err();
52 let message = match error {
53 Error::ParseIntError(error) => error,
54 _ => panic!(),
55 };
56 assert_eq!(message.description(), "number too large to fit in target type");
57
58 let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='-5'/>".parse().unwrap();
59 let error = Transport::try_from(elem).unwrap_err();
60 let message = match error {
61 Error::ParseIntError(error) => error,
62 _ => panic!(),
63 };
64 assert_eq!(message.description(), "invalid digit found in string");
65
66 let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128'/>".parse().unwrap();
67 let error = Transport::try_from(elem).unwrap_err();
68 let message = match error {
69 Error::ParseError(string) => string,
70 _ => panic!(),
71 };
72 assert_eq!(message, "Required attribute 'sid' missing.");
73 }
74
75 #[test]
76 fn test_invalid_stanza() {
77 let elem: Element = "<transport xmlns='urn:xmpp:jingle:transports:ibb:1' block-size='128' sid='coucou' stanza='fdsq'/>".parse().unwrap();
78 let error = Transport::try_from(elem).unwrap_err();
79 let message = match error {
80 Error::ParseError(string) => string,
81 _ => panic!(),
82 };
83 assert_eq!(message, "Unknown value for 'stanza' attribute.");
84 }
85}