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::delay::Delay;
8use crate::message::Message;
9
10generate_element!(
11 /// Contains a forwarded stanza, either standalone or part of another
12 /// extension (such as carbons).
13 Forwarded, "forwarded", FORWARD,
14 children: [
15 /// When the stanza originally got sent.
16 delay: Option<Delay> = ("delay", DELAY) => Delay,
17
18 // XXX: really? Option?
19 /// The stanza being forwarded.
20 stanza: Option<Message> = ("message", DEFAULT_NS) => Message
21
22 // TODO: also handle the two other stanza possibilities.
23 ]
24);
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29 use crate::util::error::Error;
30 use crate::Element;
31 use std::convert::TryFrom;
32
33 #[cfg(target_pointer_width = "32")]
34 #[test]
35 fn test_size() {
36 assert_size!(Forwarded, 212);
37 }
38
39 #[cfg(target_pointer_width = "64")]
40 #[test]
41 fn test_size() {
42 assert_size!(Forwarded, 408);
43 }
44
45 #[test]
46 fn test_simple() {
47 let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'/>".parse().unwrap();
48 Forwarded::try_from(elem).unwrap();
49 }
50
51 #[test]
52 fn test_invalid_child() {
53 let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'><coucou/></forwarded>"
54 .parse()
55 .unwrap();
56 let error = Forwarded::try_from(elem).unwrap_err();
57 let message = match error {
58 Error::ParseError(string) => string,
59 _ => panic!(),
60 };
61 assert_eq!(message, "Unknown child in forwarded element.");
62 }
63
64 #[test]
65 fn test_serialise() {
66 let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'/>".parse().unwrap();
67 let forwarded = Forwarded {
68 delay: None,
69 stanza: None,
70 };
71 let elem2 = forwarded.into();
72 assert_eq!(elem, elem2);
73 }
74
75 #[test]
76 fn test_serialize_with_delay_and_stanza() {
77 let reference: Element = "<forwarded xmlns='urn:xmpp:forward:0'><delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25+00:00'/><message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/></forwarded>"
78 .parse()
79 .unwrap();
80
81 let elem: Element = "<message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/>"
82 .parse()
83 .unwrap();
84 let message = Message::try_from(elem).unwrap();
85
86 let elem: Element =
87 "<delay xmlns='urn:xmpp:delay' from='capulet.com' stamp='2002-09-10T23:08:25Z'/>"
88 .parse()
89 .unwrap();
90 let delay = Delay::try_from(elem).unwrap();
91
92 let forwarded = Forwarded {
93 delay: Some(delay),
94 stanza: Some(message),
95 };
96
97 let serialized: Element = forwarded.into();
98 assert_eq!(serialized, reference);
99 }
100}