tests and fixes for message serialization

This commit is contained in:
debris 2016-09-20 12:49:04 +02:00
parent 3e373acd23
commit 28f6abb63e
2 changed files with 44 additions and 4 deletions

View File

@ -1,7 +1,7 @@
use bytes::Bytes;
use crypto::checksum;
use ser::{
Serializable, Stream, CompactInteger,
Serializable, Stream,
Deserializable, Reader, Error as ReaderError
};
use Command;
@ -25,7 +25,7 @@ impl Serializable for Message {
stream
.append(&self.magic)
.append(&self.command)
.append(&CompactInteger::from(self.payload.len()))
.append(&(self.payload.len() as u32))
.append_slice(&self.payload_checksum())
.append_slice(&self.payload);
}
@ -35,9 +35,9 @@ impl Deserializable for Message {
fn deserialize(reader: &mut Reader) -> Result<Self, ReaderError> where Self: Sized {
let magic = try!(reader.read());
let command = try!(reader.read());
let len: CompactInteger = try!(reader.read());
let len: u32 = try!(reader.read());
let cs = try!(reader.read_slice(4));
let payload = try!(reader.read_slice(len.into()));
let payload = try!(reader.read_slice(len as usize));
if cs != &checksum(payload) {
return Err(ReaderError::MalformedData);
@ -55,4 +55,35 @@ impl Deserializable for Message {
#[cfg(test)]
mod tests {
use bytes::Bytes;
use ser::{serialize, deserialize};
use super::Message;
#[test]
fn test_message_serialization() {
let expected: Bytes = "f9beb4d976657273696f6e000000000064000000358d493262ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300".into();
let payload: Bytes = "62ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300".into();
let message = Message {
magic: 0xd9b4bef9,
command: "version".into(),
payload: payload,
};
assert_eq!(serialize(&message), expected);
}
#[test]
fn test_message_deserialization() {
let raw: Bytes = "f9beb4d976657273696f6e000000000064000000358d493262ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300".into();
let payload: Bytes = "62ea0000010000000000000011b2d05000000000010000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffff0000000000003b2eb35d8ce617650f2f5361746f7368693a302e372e322fc03e0300".into();
let expected = Message {
magic: 0xd9b4bef9,
command: "version".into(),
payload: payload,
};
assert_eq!(expected, deserialize(&raw).unwrap());
}
}

View File

@ -241,4 +241,13 @@ mod tests {
let expected: String = "".into();
assert_eq!(expected, deserialize::<String>(&raw).unwrap());
}
#[test]
fn test_steam_append_slice() {
let mut slice = [0u8; 4];
slice[0] = 0x64;
let mut stream = Stream::default();
stream.append_slice(&slice);
assert_eq!(stream.out(), "64000000".into());
}
}