dope-tls 0.49.0

TCP TLS streams for dope runtime, rustls-backed
pub mod common;

use common::native;

use rustls::StreamOwned;
use std::{
    io::{self, Read as _, Write as _},
    os::unix::net::UnixStream,
    time::Duration,
};

#[test]
fn close_keeps_reads() {
    let (client, server) = native::try_half_closed().expect("native half-close");
    let (left, right) = UnixStream::pair().expect("native socket pair");
    for socket in [&left, &right] {
        socket
            .set_read_timeout(Some(Duration::from_secs(3)))
            .expect("read timeout");
        socket
            .set_write_timeout(Some(Duration::from_secs(3)))
            .expect("write timeout");
    }
    let mut client = StreamOwned::new(client, left);
    let mut server = StreamOwned::new(server, right);
    server.write_all(b"after close").expect("peer response");
    server.flush().expect("response output");
    let mut response = [0; 11];
    client.read_exact(&mut response).expect("response input");
    assert_eq!(&response, b"after close");
    assert!(client.conn.wants_read());
}

#[test]
#[ignore = "Rustls 0.23.46 asserts !sent_fatal_alert after local close_notify; run with --release --include-ignored"]
fn malformed_after_close() {
    let (client, server) = native::try_half_closed().expect("native half-close");
    let (left, right) = UnixStream::pair().expect("native socket pair");
    for socket in [&left, &right] {
        socket
            .set_read_timeout(Some(Duration::from_secs(3)))
            .expect("read timeout");
        socket
            .set_write_timeout(Some(Duration::from_secs(3)))
            .expect("write timeout");
    }
    let mut client = StreamOwned::new(client, left);
    let mut server = StreamOwned::new(server, right);
    server
        .sock
        .write_all(&[0xff, 3, 3, 0, 0])
        .expect("invalid peer record");
    let error = client.read(&mut [0; 1]).expect_err("invalid TLS record");
    assert_eq!(error.kind(), io::ErrorKind::InvalidData);
    assert!(matches!(
        error
            .get_ref()
            .and_then(|cause| cause.downcast_ref::<rustls::Error>()),
        Some(rustls::Error::InvalidMessage(
            rustls::InvalidMessage::InvalidContentType
        ))
    ));
}