ibb.rs

  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 helpers::Base64;
  8use iq::IqSetPayload;
  9
 10generate_attribute!(Stanza, "stanza", {
 11    Iq => "iq",
 12    Message => "message",
 13}, Default = Iq);
 14
 15generate_element_with_only_attributes!(Open, "open", IBB, [
 16    block_size: u16 = "block-size" => required,
 17    sid: String = "sid" => required,
 18    stanza: Stanza = "stanza" => default,
 19]);
 20
 21impl IqSetPayload for Open {}
 22
 23generate_element_with_text!(Data, "data", IBB,
 24    [
 25        seq: u16 = "seq" => required,
 26        sid: String = "sid" => required
 27    ],
 28    data: Base64<Vec<u8>>
 29);
 30
 31impl IqSetPayload for Data {}
 32
 33generate_element_with_only_attributes!(Close, "close", IBB, [
 34    sid: String = "sid" => required,
 35]);
 36
 37impl IqSetPayload for Close {}
 38
 39#[cfg(test)]
 40mod tests {
 41    use super::*;
 42    use try_from::TryFrom;
 43    use minidom::Element;
 44    use error::Error;
 45    use std::error::Error as StdError;
 46
 47    #[test]
 48    fn test_simple() {
 49        let elem: Element = "<open xmlns='http://jabber.org/protocol/ibb' block-size='3' sid='coucou'/>".parse().unwrap();
 50        let open = Open::try_from(elem).unwrap();
 51        assert_eq!(open.block_size, 3);
 52        assert_eq!(open.sid, "coucou");
 53        assert_eq!(open.stanza, Stanza::Iq);
 54
 55        let elem: Element = "<data xmlns='http://jabber.org/protocol/ibb' seq='0' sid='coucou'>AAAA</data>".parse().unwrap();
 56        let data = Data::try_from(elem).unwrap();
 57        assert_eq!(data.seq, 0);
 58        assert_eq!(data.sid, "coucou");
 59        assert_eq!(data.data, vec!(0, 0, 0));
 60
 61        let elem: Element = "<close xmlns='http://jabber.org/protocol/ibb' sid='coucou'/>".parse().unwrap();
 62        let close = Close::try_from(elem).unwrap();
 63        assert_eq!(close.sid, "coucou");
 64    }
 65
 66    #[test]
 67    fn test_invalid() {
 68        let elem: Element = "<open xmlns='http://jabber.org/protocol/ibb'/>".parse().unwrap();
 69        let error = Open::try_from(elem).unwrap_err();
 70        let message = match error {
 71            Error::ParseError(string) => string,
 72            _ => panic!(),
 73        };
 74        assert_eq!(message, "Required attribute 'block-size' missing.");
 75
 76        let elem: Element = "<open xmlns='http://jabber.org/protocol/ibb' block-size='-5'/>".parse().unwrap();
 77        let error = Open::try_from(elem).unwrap_err();
 78        let message = match error {
 79            Error::ParseIntError(error) => error,
 80            _ => panic!(),
 81        };
 82        assert_eq!(message.description(), "invalid digit found in string");
 83
 84        let elem: Element = "<open xmlns='http://jabber.org/protocol/ibb' block-size='128'/>".parse().unwrap();
 85        let error = Open::try_from(elem).unwrap_err();
 86        let message = match error {
 87            Error::ParseError(error) => error,
 88            _ => panic!(),
 89        };
 90        assert_eq!(message, "Required attribute 'sid' missing.");
 91    }
 92
 93    #[test]
 94    fn test_invalid_stanza() {
 95        let elem: Element = "<open xmlns='http://jabber.org/protocol/ibb' block-size='128' sid='coucou' stanza='fdsq'/>".parse().unwrap();
 96        let error = Open::try_from(elem).unwrap_err();
 97        let message = match error {
 98            Error::ParseError(string) => string,
 99            _ => panic!(),
100        };
101        assert_eq!(message, "Unknown value for 'stanza' attribute.");
102    }
103}