use super::LysSignIn;
use crate::door::config::Lys;
use std::net::TcpListener;
use std::sync::mpsc;
use std::time::Duration;
type TestResult = Result<(), Box<dyn std::error::Error>>;
#[test]
fn signin_discovery_has_a_total_deadline() -> TestResult {
let listener = TcpListener::bind("127.0.0.1:0")?;
let issuer = format!("http://{}/", listener.local_addr()?);
let (release, released) = mpsc::channel();
let server = std::thread::spawn(move || -> std::io::Result<()> {
let (_stream, _) = listener.accept()?;
released.recv().map_err(std::io::Error::other)?;
Ok(())
});
let dir = tempfile::tempdir()?;
let secret_file = dir.path().join("secret");
std::fs::write(&secret_file, "fixture")?;
let lys = Lys {
issuer,
secret_file,
client_id: "fixture".into(),
redirect: "https://studio.example/callback".into(),
};
let (send, receive) = mpsc::channel();
let worker = std::thread::spawn(move || {
send.send(
LysSignIn::connect_with_timeouts(
&lys,
Duration::from_millis(50),
Duration::from_millis(50),
)
.err(),
)
});
let result = receive.recv_timeout(Duration::from_secs(2));
release.send(())?;
server.join().map_err(|_| "issuer panicked")??;
worker.join().map_err(|_| "client panicked")??;
assert!(
result.is_ok(),
"sign-in discovery outlived the configured total timeout"
);
assert!(result?.is_some_and(|message| message.contains("lys_could_not_be_asked")));
Ok(())
}