mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-30 14:52:56 +03:00
88 lines
2.8 KiB
Rust
88 lines
2.8 KiB
Rust
#![cfg(windows)]
|
|
#![cfg(not(miri))] // no socket support in Miri
|
|
#![feature(windows_unix_domain_sockets)]
|
|
// Now only test windows_unix_domain_sockets feature
|
|
// in the future, will test both unix and windows uds
|
|
use std::io::{Read, Write};
|
|
use std::os::windows::net::{UnixListener, UnixStream};
|
|
use std::thread;
|
|
|
|
#[test]
|
|
fn win_uds_smoke_bind_connect() {
|
|
let tmp = std::env::temp_dir();
|
|
let sock_path = tmp.join("rust-test-uds-smoke.sock");
|
|
let _ = std::fs::remove_file(&sock_path);
|
|
let listener = UnixListener::bind(&sock_path).expect("bind failed");
|
|
let sock_path_clone = sock_path.clone();
|
|
let tx = thread::spawn(move || {
|
|
let mut stream = UnixStream::connect(&sock_path_clone).expect("connect failed");
|
|
stream.write_all(b"hello").expect("write failed");
|
|
});
|
|
|
|
let (mut stream, _) = listener.accept().expect("accept failed");
|
|
let mut buf = [0; 5];
|
|
stream.read_exact(&mut buf).expect("read failed");
|
|
assert_eq!(&buf, b"hello");
|
|
|
|
tx.join().unwrap();
|
|
|
|
drop(listener);
|
|
let _ = std::fs::remove_file(&sock_path);
|
|
}
|
|
|
|
#[test]
|
|
fn win_uds_echo() {
|
|
let tmp = std::env::temp_dir();
|
|
let sock_path = tmp.join("rust-test-uds-echo.sock");
|
|
let _ = std::fs::remove_file(&sock_path);
|
|
|
|
let listener = UnixListener::bind(&sock_path).expect("bind failed");
|
|
let srv = thread::spawn(move || {
|
|
let (mut stream, _) = listener.accept().expect("accept failed");
|
|
let mut buf = [0u8; 128];
|
|
loop {
|
|
let n = match stream.read(&mut buf) {
|
|
Ok(0) => break,
|
|
Ok(n) => n,
|
|
Err(e) => panic!("read error: {}", e),
|
|
};
|
|
stream.write_all(&buf[..n]).expect("write_all failed");
|
|
}
|
|
});
|
|
|
|
let sock_path_clone = sock_path.clone();
|
|
let cli = thread::spawn(move || {
|
|
let mut stream = UnixStream::connect(&sock_path_clone).expect("connect failed");
|
|
let req = b"hello windows uds";
|
|
stream.write_all(req).expect("write failed");
|
|
let mut resp = vec![0u8; req.len()];
|
|
stream.read_exact(&mut resp).expect("read failed");
|
|
assert_eq!(resp, req);
|
|
});
|
|
|
|
cli.join().unwrap();
|
|
srv.join().unwrap();
|
|
|
|
let _ = std::fs::remove_file(&sock_path);
|
|
}
|
|
|
|
#[test]
|
|
fn win_uds_path_too_long() {
|
|
let tmp = std::env::temp_dir();
|
|
let long_path = tmp.join("a".repeat(200));
|
|
let result = UnixListener::bind(&long_path);
|
|
assert!(result.is_err());
|
|
let _ = std::fs::remove_file(&long_path);
|
|
}
|
|
#[test]
|
|
fn win_uds_existing_bind() {
|
|
let tmp = std::env::temp_dir();
|
|
let sock_path = tmp.join("rust-test-uds-existing.sock");
|
|
let _ = std::fs::remove_file(&sock_path);
|
|
let listener = UnixListener::bind(&sock_path).expect("bind failed");
|
|
let result = UnixListener::bind(&sock_path);
|
|
assert!(result.is_err());
|
|
drop(listener);
|
|
let _ = std::fs::remove_file(&sock_path);
|
|
}
|