aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/fixtures/mod.rs35
-rw-r--r--tests/navigation.rs14
-rw-r--r--tests/qrcode.rs3
-rw-r--r--tests/serve_request.rs12
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");
}