apeirogond 0.18.0

Daemon for Apeirogon, a cross-platform software KVM
// SPDX-License-Identifier: GPL-3.0-or-later

use super::*;

#[test]
fn verify_transfer_corrupt_or_out_of_order_frames_are_rejected() {
    // Arrange
    let item = ClipboardItem {
        size: 3,
        sha256: Sha256::digest(b"abc").to_vec(),
        ..ClipboardItem::default()
    };
    let cases = [
        vec![Frame::Chunk(FileChunk {
            file_index: 0,
            offset: 0,
            data: b"abcd".to_vec(),
        })],
        vec![Frame::Chunk(FileChunk {
            file_index: 0,
            offset: 1,
            data: b"abc".to_vec(),
        })],
        vec![Frame::Chunk(FileChunk {
            file_index: 1,
            offset: 0,
            data: b"abc".to_vec(),
        })],
        vec![Frame::Done(TransferDone {})],
        vec![Frame::FileEnd(FileEnd {
            file_index: 0,
            sha256: item.sha256.clone(),
        })],
        vec![
            Frame::Chunk(FileChunk {
                file_index: 0,
                offset: 0,
                data: b"bad".to_vec(),
            }),
            Frame::FileEnd(FileEnd {
                file_index: 0,
                sha256: item.sha256.clone(),
            }),
        ],
        vec![
            Frame::Chunk(FileChunk {
                file_index: 0,
                offset: 0,
                data: b"abc".to_vec(),
            }),
            Frame::FileEnd(FileEnd {
                file_index: 0,
                sha256: vec![0; 32],
            }),
        ],
    ];
    for frames in cases {
        let mut verifier = Verifier::new(&item).unwrap();

        // Act
        let result: Result<Vec<_>, _> = frames
            .into_iter()
            .map(|frame| verifier.apply(frame))
            .collect();

        // Assert
        assert!(result.is_err());
    }
}

#[tokio::test(start_paused = true)]
async fn receive_stalled_frame_returns_frame_timeout() {
    // Arrange
    let item = ClipboardItem {
        size: 3,
        ..ClipboardItem::default()
    };
    let mut stream = crate::frame::tests::StalledStream {
        prefix: Some(vec![1]),
        reads: 0,
    };
    let mut buf = Vec::new();
    let start = tokio::time::Instant::now();

    // Act
    let result = receive(&mut stream, &mut buf, &item).await;

    // Assert
    assert_eq!(result, Err(TransferError::Timeout));
    assert_eq!(start.elapsed(), limits::FRAME_READ_TIMEOUT);
}