carbons.rs

  1// Copyright (c) 2019 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::forwarding::Forwarded;
  8use crate::iq::IqSetPayload;
  9use crate::message::MessagePayload;
 10
 11generate_empty_element!(
 12    /// Enable carbons for this session.
 13    Enable,
 14    "enable",
 15    CARBONS
 16);
 17
 18impl IqSetPayload for Enable {}
 19
 20generate_empty_element!(
 21    /// Disable a previously-enabled carbons.
 22    Disable,
 23    "disable",
 24    CARBONS
 25);
 26
 27impl IqSetPayload for Disable {}
 28
 29generate_empty_element!(
 30    /// Request the enclosing message to not be copied to other carbons-enabled
 31    /// resources of the user.
 32    Private,
 33    "private",
 34    CARBONS
 35);
 36
 37impl MessagePayload for Private {}
 38
 39generate_element!(
 40    /// Wrapper for a message received on another resource.
 41    Received, "received", CARBONS,
 42
 43    children: [
 44        /// Wrapper for the enclosed message.
 45        forwarded: Required<Forwarded> = ("forwarded", FORWARD) => Forwarded
 46    ]
 47);
 48
 49impl MessagePayload for Received {}
 50
 51generate_element!(
 52    /// Wrapper for a message sent from another resource.
 53    Sent, "sent", CARBONS,
 54
 55    children: [
 56        /// Wrapper for the enclosed message.
 57        forwarded: Required<Forwarded> = ("forwarded", FORWARD) => Forwarded
 58    ]
 59);
 60
 61impl MessagePayload for Sent {}
 62
 63#[cfg(test)]
 64mod tests {
 65    use super::*;
 66    use crate::Element;
 67    use std::convert::TryFrom;
 68
 69    #[cfg(target_pointer_width = "32")]
 70    #[test]
 71    fn test_size() {
 72        assert_size!(Enable, 0);
 73        assert_size!(Disable, 0);
 74        assert_size!(Private, 0);
 75        assert_size!(Received, 212);
 76        assert_size!(Sent, 212);
 77    }
 78
 79    #[cfg(target_pointer_width = "64")]
 80    #[test]
 81    fn test_size() {
 82        assert_size!(Enable, 0);
 83        assert_size!(Disable, 0);
 84        assert_size!(Private, 0);
 85        assert_size!(Received, 408);
 86        assert_size!(Sent, 408);
 87    }
 88
 89    #[test]
 90    fn empty_elements() {
 91        let elem: Element = "<enable xmlns='urn:xmpp:carbons:2'/>".parse().unwrap();
 92        Enable::try_from(elem).unwrap();
 93
 94        let elem: Element = "<disable xmlns='urn:xmpp:carbons:2'/>".parse().unwrap();
 95        Disable::try_from(elem).unwrap();
 96
 97        let elem: Element = "<private xmlns='urn:xmpp:carbons:2'/>".parse().unwrap();
 98        Private::try_from(elem).unwrap();
 99    }
100
101    #[test]
102    fn forwarded_elements() {
103        let elem: Element = "<received xmlns='urn:xmpp:carbons:2'>
104  <forwarded xmlns='urn:xmpp:forward:0'>
105    <message xmlns='jabber:client'
106             to='juliet@capulet.example/balcony'
107             from='romeo@montague.example/home'/>
108  </forwarded>
109</received>"
110            .parse()
111            .unwrap();
112        let received = Received::try_from(elem).unwrap();
113        assert!(received.forwarded.stanza.is_some());
114
115        let elem: Element = "<sent xmlns='urn:xmpp:carbons:2'>
116  <forwarded xmlns='urn:xmpp:forward:0'>
117    <message xmlns='jabber:client'
118             to='juliet@capulet.example/balcony'
119             from='romeo@montague.example/home'/>
120  </forwarded>
121</sent>"
122            .parse()
123            .unwrap();
124        let sent = Sent::try_from(elem).unwrap();
125        assert!(sent.forwarded.stanza.is_some());
126    }
127
128    #[test]
129    fn test_serialize_received() {
130        let reference: Element = "<received xmlns='urn:xmpp:carbons:2'><forwarded xmlns='urn:xmpp:forward:0'><message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/></forwarded></received>"
131        .parse()
132        .unwrap();
133
134        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'><message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/></forwarded>"
135          .parse()
136          .unwrap();
137        let forwarded = Forwarded::try_from(elem).unwrap();
138
139        let received = Received {
140            forwarded: forwarded,
141        };
142
143        let serialized: Element = received.into();
144        assert_eq!(serialized, reference);
145    }
146
147    #[test]
148    fn test_serialize_sent() {
149        let reference: Element = "<sent xmlns='urn:xmpp:carbons:2'><forwarded xmlns='urn:xmpp:forward:0'><message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/></forwarded></sent>"
150        .parse()
151        .unwrap();
152
153        let elem: Element = "<forwarded xmlns='urn:xmpp:forward:0'><message xmlns='jabber:client' to='juliet@capulet.example/balcony' from='romeo@montague.example/home'/></forwarded>"
154          .parse()
155          .unwrap();
156        let forwarded = Forwarded::try_from(elem).unwrap();
157
158        let sent = Sent {
159            forwarded: forwarded,
160        };
161
162        let serialized: Element = sent.into();
163        assert_eq!(serialized, reference);
164    }
165}