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