diff options
14 files changed, 38 insertions, 77 deletions
diff --git a/crates/shirabe/tests/common/async_runtime.rs b/crates/shirabe/tests/common/async_runtime.rs new file mode 100644 index 00000000..e047315a --- /dev/null +++ b/crates/shirabe/tests/common/async_runtime.rs @@ -0,0 +1,23 @@ +//! Shared tokio runtime bridge for integration tests. +//! +//! `cargo test` runs `#[test]` fns concurrently on separate OS threads, so a per-call +//! `current_thread` Runtime would need one instance per caller. Instead this holds a single +//! process-wide `multi_thread` Runtime that tolerates concurrent `block_on()` callers, and every +//! test bridges into async code through it. +//! +//! Included into each integration-test binary via +//! `#[path = "../common/async_runtime.rs"] mod async_runtime;`. +#![allow(dead_code)] + +use std::sync::LazyLock; + +static RUNTIME: LazyLock<tokio::runtime::Runtime> = LazyLock::new(|| { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() +}); + +pub fn run<F: std::future::Future>(future: F) -> F::Output { + RUNTIME.block_on(future) +} diff --git a/crates/shirabe/tests/downloader/download_manager_test.rs b/crates/shirabe/tests/downloader/download_manager_test.rs index f596beed..6f6ed352 100644 --- a/crates/shirabe/tests/downloader/download_manager_test.rs +++ b/crates/shirabe/tests/downloader/download_manager_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/DownloadManagerTest.php +use crate::async_runtime::run; use crate::io_stub::IOStub; use indexmap::IndexMap; use shirabe::downloader::DownloaderInterface; @@ -58,13 +59,6 @@ mockall::mock! { } } -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - /// ref: DownloadManagerTest::createPackageMock /// /// PHPUnit returns a `PackageInterface` mock; a real CompletePackage with the diff --git a/crates/shirabe/tests/downloader/file_downloader_test.rs b/crates/shirabe/tests/downloader/file_downloader_test.rs index e2b19958..a9af69ed 100644 --- a/crates/shirabe/tests/downloader/file_downloader_test.rs +++ b/crates/shirabe/tests/downloader/file_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/FileDownloaderTest.php +use crate::async_runtime::run; use crate::http_downloader_mock::get_http_downloader_mock; use crate::io_mock::{Expectation, get_io_mock}; use indexmap::IndexMap; @@ -28,13 +29,6 @@ fn get_package(name: &str, version: &str) -> PackageInterfaceHandle { CompletePackageHandle::new(name.to_string(), norm_version, version.to_string()).into() } -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - /// ref: TestCase::getConfig fn get_config( config_options: IndexMap<String, PhpMixed>, diff --git a/crates/shirabe/tests/downloader/fossil_downloader_test.rs b/crates/shirabe/tests/downloader/fossil_downloader_test.rs index eed3d7fb..e473b2dd 100644 --- a/crates/shirabe/tests/downloader/fossil_downloader_test.rs +++ b/crates/shirabe/tests/downloader/fossil_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/FossilDownloaderTest.php +use crate::async_runtime::run; use crate::config_stub::ConfigStubBuilder; use crate::io_stub::IOStub; use crate::process_executor_mock::get_process_executor_mock; @@ -14,13 +15,6 @@ use shirabe_php_shim::PhpMixed; use shirabe_semver::VersionParser; use tempfile::TempDir; -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - fn set_up() -> TempDir { TempDir::new().unwrap() } diff --git a/crates/shirabe/tests/downloader/git_downloader_test.rs b/crates/shirabe/tests/downloader/git_downloader_test.rs index a73958b4..d4f40b77 100644 --- a/crates/shirabe/tests/downloader/git_downloader_test.rs +++ b/crates/shirabe/tests/downloader/git_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/GitDownloaderTest.php +use crate::async_runtime::run; use crate::config_stub::ConfigStubBuilder; use crate::io_mock::{Expectation, get_io_mock}; use crate::io_stub::IOStub; @@ -20,13 +21,6 @@ use shirabe_php_shim::PhpMixed; use shirabe_semver::VersionParser; use tempfile::TempDir; -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - fn set_up() -> TempDir { // skipIfNotExecutable('git') is irrelevant because every git invocation is mocked. diff --git a/crates/shirabe/tests/downloader/hg_downloader_test.rs b/crates/shirabe/tests/downloader/hg_downloader_test.rs index d68812d8..ac3d50b6 100644 --- a/crates/shirabe/tests/downloader/hg_downloader_test.rs +++ b/crates/shirabe/tests/downloader/hg_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/HgDownloaderTest.php +use crate::async_runtime::run; use crate::io_stub::IOStub; use crate::process_executor_mock::{cmd, get_process_executor_mock}; use shirabe::config::Config; @@ -12,13 +13,6 @@ use shirabe::util::filesystem::{Filesystem, FilesystemMock}; use shirabe_semver::VersionParser; use tempfile::TempDir; -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - fn set_up() -> TempDir { TempDir::new().unwrap() } diff --git a/crates/shirabe/tests/downloader/main.rs b/crates/shirabe/tests/downloader/main.rs index 82440108..88f16266 100644 --- a/crates/shirabe/tests/downloader/main.rs +++ b/crates/shirabe/tests/downloader/main.rs @@ -1,3 +1,5 @@ +#[path = "../common/async_runtime.rs"] +mod async_runtime; #[path = "../common/config_stub.rs"] mod config_stub; #[path = "../common/http_downloader_mock.rs"] diff --git a/crates/shirabe/tests/downloader/perforce_downloader_test.rs b/crates/shirabe/tests/downloader/perforce_downloader_test.rs index 13a818a6..bdf24a2e 100644 --- a/crates/shirabe/tests/downloader/perforce_downloader_test.rs +++ b/crates/shirabe/tests/downloader/perforce_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/PerforceDownloaderTest.php +use crate::async_runtime::run; use crate::io_mock::{Expectation, get_io_mock}; use crate::io_stub::IOStub; use crate::process_executor_mock::get_process_executor_mock; @@ -42,13 +43,6 @@ mockall::mock! { } } -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - /// ref: PerforceDownloaderTest::getConfig (seeds `home` with the temp dir) fn get_config(test_path: &std::path::Path) -> Config { let mut config = Config::new(true, None); diff --git a/crates/shirabe/tests/downloader/xz_downloader_test.rs b/crates/shirabe/tests/downloader/xz_downloader_test.rs index 6d504313..0002f0e6 100644 --- a/crates/shirabe/tests/downloader/xz_downloader_test.rs +++ b/crates/shirabe/tests/downloader/xz_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/XzDownloaderTest.php +use crate::async_runtime::run; use indexmap::IndexMap; use shirabe::config::Config; use shirabe::downloader::DownloaderInterface; @@ -22,13 +23,6 @@ fn get_package(name: &str, version: &str) -> PackageInterfaceHandle { CompletePackageHandle::new(name.to_string(), norm_version, version.to_string()).into() } -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - /// ref: setUp markTestSkipped on Windows / 32bit, expressed as a compile-time /// cfg gate on the test function below. fn set_up() -> TempDir { diff --git a/crates/shirabe/tests/downloader/zip_downloader_test.rs b/crates/shirabe/tests/downloader/zip_downloader_test.rs index b8fddf68..878c8054 100644 --- a/crates/shirabe/tests/downloader/zip_downloader_test.rs +++ b/crates/shirabe/tests/downloader/zip_downloader_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Downloader/ZipDownloaderTest.php +use crate::async_runtime::run; use crate::io_stub::IOStub; use indexmap::IndexMap; use serial_test::serial; @@ -17,13 +18,6 @@ use shirabe_php_shim::{PhpMixed, ZipArchive, ZipArchiveMock}; use shirabe_semver::VersionParser; use tempfile::TempDir; -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - struct SetUp { test_dir: TempDir, io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>>, diff --git a/crates/shirabe/tests/installer/installation_manager_test.rs b/crates/shirabe/tests/installer/installation_manager_test.rs index f60d1250..e24f440c 100644 --- a/crates/shirabe/tests/installer/installation_manager_test.rs +++ b/crates/shirabe/tests/installer/installation_manager_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Installer/InstallationManagerTest.php +use crate::async_runtime::run; use crate::test_case::get_package; use shirabe::dependency_resolver::operation::{ InstallOperation, UninstallOperation, UpdateOperation, @@ -15,13 +16,6 @@ use shirabe::util::r#loop::Loop; use shirabe_php_shim::PhpMixed; use shirabe_semver::VersionParser; -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - /// ref: setUp(): the PHP loop/io mocks are never exercised by these tests (the loop has its /// constructor disabled), so a real Loop over a real HttpDownloader and a NullIO stand in. struct SetUp { diff --git a/crates/shirabe/tests/installer/library_installer_test.rs b/crates/shirabe/tests/installer/library_installer_test.rs index 72272a07..f2a94cbf 100644 --- a/crates/shirabe/tests/installer/library_installer_test.rs +++ b/crates/shirabe/tests/installer/library_installer_test.rs @@ -1,5 +1,6 @@ //! ref: composer/tests/Composer/Test/Installer/LibraryInstallerTest.php +use crate::async_runtime::run; use crate::test_case::get_package; use indexmap::IndexMap; use shirabe::composer::{ @@ -87,13 +88,6 @@ mockall::mock! { } } -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - /// Mirror of setUp(): builds the Composer/Config over temp root/vendor/bin dirs plus a NullIO and a /// DownloadManager mock. `composer_full` keeps the inner Rc alive for the duration of the test since /// LibraryInstaller only holds a weak handle, and lets tests swap in a configured DownloadManager diff --git a/crates/shirabe/tests/installer/main.rs b/crates/shirabe/tests/installer/main.rs index 4b422780..b3641108 100644 --- a/crates/shirabe/tests/installer/main.rs +++ b/crates/shirabe/tests/installer/main.rs @@ -1,3 +1,5 @@ +#[path = "../common/async_runtime.rs"] +mod async_runtime; #[path = "../common/io_mock.rs"] mod io_mock; #[path = "../common/test_case.rs"] diff --git a/crates/shirabe/tests/installer/metapackage_installer_test.rs b/crates/shirabe/tests/installer/metapackage_installer_test.rs index bc740e74..3380befb 100644 --- a/crates/shirabe/tests/installer/metapackage_installer_test.rs +++ b/crates/shirabe/tests/installer/metapackage_installer_test.rs @@ -3,19 +3,13 @@ //! PHP verifies the mocked repository's add/remove/hasPackage calls; here the same //! behaviour is checked against a real InstalledArrayRepository by observing its state. +use crate::async_runtime::run; use crate::test_case::get_package; use shirabe::installer::{InstallerInterface, MetapackageInstaller}; use shirabe::io::IOInterface; use shirabe::io::null_io::NullIO; use shirabe::repository::{InstalledArrayRepository, RepositoryInterface}; -fn run<F: std::future::Future>(future: F) -> F::Output { - tokio::runtime::Builder::new_current_thread() - .build() - .unwrap() - .block_on(future) -} - fn installer() -> MetapackageInstaller { let io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>> = std::rc::Rc::new(std::cell::RefCell::new(NullIO::new())); |
