diff options
-rw-r--r-- | tests/fixtures/mod.rs | 35 | ||||
-rw-r--r-- | tests/navigation.rs | 14 | ||||
-rw-r--r-- | tests/qrcode.rs | 3 | ||||
-rw-r--r-- | tests/serve_request.rs | 12 |
4 files changed, 41 insertions, 23 deletions
diff --git a/tests/fixtures/mod.rs b/tests/fixtures/mod.rs index f143413..a227f84 100644 --- a/tests/fixtures/mod.rs +++ b/tests/fixtures/mod.rs @@ -6,7 +6,7 @@ use reqwest::Url; use rstest::fixture; use std::process::{Child, Command, Stdio}; use std::thread::sleep; -use std::time::Duration; +use std::time::{Duration, Instant}; /// Error type used by tests pub type Error = Box<dyn std::error::Error>; @@ -84,11 +84,12 @@ pub fn port() -> u16 { /// Run miniserve as a server; Start with a temporary directory, a free port and some /// optional arguments then wait for a while for the server setup to complete. -#[fixture(args=&[] as &[&str])] +#[fixture] #[allow(dead_code)] -pub fn server<S>(args: impl IntoIterator<Item = S>) -> TestServer +pub fn server<I>(#[default(&[] as &[&str])] args: I) -> TestServer where - S: AsRef<std::ffi::OsStr>, + I: IntoIterator, + I::Item: AsRef<std::ffi::OsStr>, { let port = port(); let tmpdir = tmpdir(); @@ -102,16 +103,17 @@ where .spawn() .expect("Couldn't run test binary"); - sleep(Duration::from_secs(1)); + wait_for_port(port); TestServer::new(port, tmpdir, child) } /// Same as `server()` but ignore stderr -#[fixture(args=&[] as &[&str])] +#[fixture] #[allow(dead_code)] -pub fn server_no_stderr<S>(args: impl IntoIterator<Item = S>) -> TestServer +pub fn server_no_stderr<I>(#[default(&[] as &[&str])] args: I) -> TestServer where - S: AsRef<std::ffi::OsStr>, + I: IntoIterator, + I::Item: AsRef<std::ffi::OsStr>, { let port = port(); let tmpdir = tmpdir(); @@ -126,10 +128,23 @@ where .spawn() .expect("Couldn't run test binary"); - sleep(Duration::from_secs(1)); + wait_for_port(port); TestServer::new(port, tmpdir, child) } +/// Wait a max of 1s for the port to become available. +fn wait_for_port(port: u16) { + let start_wait = Instant::now(); + + while !port_check::is_port_reachable(format!("localhost:{}", port)) { + sleep(Duration::from_millis(100)); + + if start_wait.elapsed().as_secs() > 1 { + panic!("timeout waiting for port {}", port); + } + } +} + #[allow(dead_code)] pub struct TestServer { port: u16, @@ -160,6 +175,6 @@ impl TestServer { impl Drop for TestServer { fn drop(&mut self) { self.child.kill().expect("Couldn't kill test server"); - /* TODO may need .wait() ? */ + self.child.wait().unwrap(); } } diff --git a/tests/navigation.rs b/tests/navigation.rs index 08c1c29..3ef3d33 100644 --- a/tests/navigation.rs +++ b/tests/navigation.rs @@ -107,14 +107,14 @@ fn can_navigate_deep_into_dirs_and_back(server: TestServer) -> Result<(), Error> Ok(()) } -#[rstest(use_custom_title, case(true), case(false))] +#[rstest] +#[case(server(&["--title", "some title"]), true)] +#[case(server(None::<&str>), false)] /// We can use breadcrumbs to navigate. -fn can_navigate_using_breadcrumbs(use_custom_title: bool) -> Result<(), Error> { - let server = server(if use_custom_title { - &["--title", "some title"] - } else { - &[] as &[&str] - }); +fn can_navigate_using_breadcrumbs( + #[case] server: TestServer, + #[case] use_custom_title: bool, +) -> Result<(), Error> { // Create a vector of directory names. We don't need to fetch the file and so we'll // remove that part. let dir: String = { diff --git a/tests/qrcode.rs b/tests/qrcode.rs index 69d4edc..e8a4153 100644 --- a/tests/qrcode.rs +++ b/tests/qrcode.rs @@ -26,8 +26,7 @@ fn show_qrcode_element(server: TestServer) -> Result<(), Error> { } #[rstest] -fn get_svg_qrcode(server_no_stderr: TestServer) -> Result<(), Error> { - let server = server_no_stderr; +fn get_svg_qrcode(#[from(server_no_stderr)] server: TestServer) -> Result<(), Error> { // Ok let resp = reqwest::blocking::get(server.url().join("/?qrcode=test")?)?; diff --git a/tests/serve_request.rs b/tests/serve_request.rs index 323b7b4..211e9fb 100644 --- a/tests/serve_request.rs +++ b/tests/serve_request.rs @@ -121,9 +121,13 @@ fn serves_requests_no_hidden_files_without_flag(server: TestServer) -> Result<() Ok(()) } -#[rstest(no_symlinks, case(true), case(false))] -fn serves_requests_symlinks(no_symlinks: bool) -> Result<(), Error> { - let server = server(["--no-symlinks"].iter().filter(|_| no_symlinks)); +#[rstest] +#[case(true, server(&["--no-symlinks"]))] +#[case(false, server(None::<&str>))] +fn serves_requests_symlinks( + #[case] no_symlinks: bool, + #[case] server: TestServer, +) -> Result<(), Error> { let files = &["symlink-file.html"]; let dirs = &["symlink-dir/"]; let broken = &["symlink broken"]; @@ -137,7 +141,7 @@ fn serves_requests_symlinks(no_symlinks: bool) -> Result<(), Error> { symlink_file(FILES[0], server.path().join(file)).expect("Couldn't create symlink"); } for &file in broken { - symlink_file("souldnt-exist.xxx", server.path().join(file)) + symlink_file("should-not-exist.xxx", server.path().join(file)) .expect("Couldn't create symlink"); } |