Justin Tracey 1 год назад
Родитель
Сommit
ba77863115
1 измененных файлов с 167 добавлено и 2 удалено
  1. 167 2
      src/lib.rs

+ 167 - 2
src/lib.rs

@@ -71,7 +71,7 @@ impl MessageBody {
 ///
 /// This has everything needed to reconstruct a message.
 // FIXME: we should try to replace MessageHeader with MessageHeaderRef
-#[derive(Debug)]
+#[derive(Debug, PartialEq)]
 pub struct MessageHeader {
     /// User who constructed the message.
     pub sender: String,
@@ -297,7 +297,7 @@ impl SerializedMessage {
 }
 
 /// Handshake between client and server (peers do not use).
-#[derive(Eq, Hash, PartialEq)]
+#[derive(Eq, Debug, Hash, PartialEq)]
 pub struct Handshake {
     /// Who is sending this handshake.
     pub sender: String,
@@ -351,3 +351,168 @@ fn serialize_handshake(sender: &str, group: &str) -> Vec<u8> {
     debug_assert!(handshake.len() == handshake_len);
     handshake
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use tokio::fs::{File, OpenOptions};
+
+    /// creates a temporary file for writing
+    async fn generate_tmp_file(name: &str) -> File {
+        let filename = format!("mgen-test-{}", name);
+        let mut path = std::env::temp_dir();
+        path.push(filename);
+        OpenOptions::new()
+            .read(true)
+            .write(true)
+            .create(true)
+            .open(path)
+            .await
+            .unwrap()
+    }
+
+    /// get an existing temp file for reading
+    async fn get_tmp_file(name: &str) -> File {
+        let filename = format!("mgen-test-{}", name);
+        let mut path = std::env::temp_dir();
+        path.push(filename);
+        OpenOptions::new().read(true).open(path).await.unwrap()
+    }
+
+    #[test]
+    fn serialize_deserialize_message() {
+        let m1 = MessageHeader {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+            body: MessageBody::Size(NonZeroU32::new(256).unwrap()),
+        };
+
+        let serialized = m1.serialize();
+
+        let m2 = MessageHeader::deserialize(&serialized.header[4..]).unwrap();
+        assert_eq!(m1, m2);
+    }
+
+    #[test]
+    fn serialize_deserialize_receipt() {
+        let m1 = MessageHeader {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+            body: MessageBody::Receipt,
+        };
+
+        let serialized = m1.serialize();
+
+        let m2 = MessageHeader::deserialize(&serialized.header[4..]).unwrap();
+        assert_eq!(m1, m2);
+    }
+
+    #[test]
+    fn deserialize_message_ref() {
+        let m1 = MessageHeader {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+            body: MessageBody::Size(NonZeroU32::new(256).unwrap()),
+        };
+
+        let serialized = m1.serialize();
+
+        let m2 = MessageHeaderRef::deserialize(&serialized.header[4..]).unwrap();
+
+        assert_eq!(m1.sender, m2.sender);
+        assert_eq!(m1.group, m2.group);
+        assert_eq!(m1.body, m2.body);
+    }
+
+    #[test]
+    fn deserialize_receipt_ref() {
+        let m1 = MessageHeader {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+            body: MessageBody::Receipt,
+        };
+
+        let serialized = m1.serialize();
+
+        let m2 = MessageHeaderRef::deserialize(&serialized.header[4..]).unwrap();
+
+        assert_eq!(m1.sender, m2.sender);
+        assert_eq!(m1.group, m2.group);
+        assert_eq!(m1.body, m2.body);
+    }
+
+    #[tokio::test]
+    async fn serialize_get_message() {
+        let m1 = MessageHeader {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+            body: MessageBody::Size(NonZeroU32::new(256).unwrap()),
+        };
+
+        let serialized = m1.serialize();
+
+        let file_name = "serialize_message_get";
+        let mut f = generate_tmp_file(file_name).await;
+        serialized.write_all_to(&mut f).await.unwrap();
+
+        let mut f = get_tmp_file(file_name).await;
+        let m2 = get_message(&mut f).await.unwrap();
+
+        assert_eq!(m1, m2);
+    }
+
+    #[tokio::test]
+    async fn serialize_get_receipt() {
+        let m1 = MessageHeader {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+            body: MessageBody::Receipt,
+        };
+
+        let serialized = m1.serialize();
+
+        let file_name = "serialize_receipt_get";
+        let mut f = generate_tmp_file(file_name).await;
+        serialized.write_all_to(&mut f).await.unwrap();
+
+        let mut f = get_tmp_file(file_name).await;
+        let m2 = get_message(&mut f).await.unwrap();
+
+        assert_eq!(m1, m2);
+    }
+
+    #[tokio::test]
+    async fn serialize_get_handshake() {
+        let h1 = Handshake {
+            sender: "Alice".to_string(),
+            group: "group".to_string(),
+        };
+
+        let file_name = "handshake";
+        let mut f = generate_tmp_file(file_name).await;
+        f.write_all(&h1.serialize()).await.unwrap();
+
+        let mut f = get_tmp_file(file_name).await;
+        let h2 = get_handshake(&mut f).await.unwrap();
+
+        assert_eq!(h1, h2);
+    }
+
+    #[tokio::test]
+    async fn serialize_get_handshake_ref() {
+        let h1 = HandshakeRef {
+            sender: "Alice",
+            group: "group",
+        };
+
+        let file_name = "handshake-ref";
+        let mut f = generate_tmp_file(file_name).await;
+        f.write_all(&h1.serialize()).await.unwrap();
+
+        let mut f = get_tmp_file(file_name).await;
+        let h2 = get_handshake(&mut f).await.unwrap();
+
+        assert_eq!(h1.sender, h2.sender);
+        assert_eq!(h1.group, h2.group);
+    }
+}