diff --git a/Cargo.lock b/Cargo.lock index ee3283c92..9ae8fc721 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2530,6 +2530,12 @@ dependencies = [ "libloading", ] +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + [[package]] name = "dotenvy" version = "0.15.7" @@ -3415,6 +3421,7 @@ dependencies = [ "prost", "prost-types", "serde 1.0.210", + "test-r", "tokio", "tonic", "tonic-build", @@ -3548,6 +3555,7 @@ dependencies = [ "range-set-blaze", "serde 1.0.210", "serde_json", + "test-r", "thiserror", "tokio", "toml 0.8.19", @@ -3578,6 +3586,7 @@ dependencies = [ "lazy_static 1.5.0", "prometheus", "serde 1.0.210", + "test-r", "thiserror", "tokio", "tonic", @@ -3617,6 +3626,7 @@ dependencies = [ "serde_json", "sqlx", "tap", + "test-r", "thiserror", "tokio", "tokio-stream", @@ -3639,7 +3649,6 @@ dependencies = [ "bytes 1.7.2", "chrono", "conditional-trait-gen", - "criterion", "fastrand 2.1.1", "golem-api-grpc", "golem-common", @@ -3651,6 +3660,7 @@ dependencies = [ "serde 1.0.210", "sqlx", "tap", + "test-r", "testcontainers", "testcontainers-modules", "thiserror", @@ -3717,6 +3727,7 @@ dependencies = [ "semver", "serde 1.0.210", "serde_json", + "test-r", "tokio", "wasm-wave", ] @@ -3749,6 +3760,7 @@ dependencies = [ "serde 1.0.210", "serde_json", "sqlx", + "test-r", "thiserror", "tokio", "tonic", @@ -3781,6 +3793,7 @@ dependencies = [ "rustls 0.23.14", "serde 1.0.210", "serde_json", + "test-r", "thiserror", "tokio", "tonic", @@ -3824,6 +3837,7 @@ dependencies = [ "serde 1.0.210", "serde_json", "serde_yaml", + "test-r", "testcontainers", "testcontainers-modules", "tokio", @@ -3946,6 +3960,7 @@ dependencies = [ "serde 1.0.210", "serde_json", "tempfile", + "test-r", "tokio", "tonic", "tonic-health", @@ -4025,6 +4040,7 @@ dependencies = [ "sqlx", "sysinfo", "tempfile", + "test-r", "testcontainers", "testcontainers-modules", "thiserror", @@ -4842,6 +4858,21 @@ dependencies = [ "warp", ] +[[package]] +name = "interprocess" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + [[package]] name = "inventory" version = "0.3.15" @@ -7088,6 +7119,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + [[package]] name = "redis" version = "0.25.4" @@ -8619,6 +8656,52 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "test-r" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce4f9076be412de335c06832a0a72b3261a2a91a2925f9d47363643e7b7a015a" +dependencies = [ + "ctor", + "test-r-core", + "test-r-macro", + "tokio", +] + +[[package]] +name = "test-r-core" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ad71c85134f87fc11617d92fec4320d3154ecd117871a866116813d6a1ece8" +dependencies = [ + "anstream", + "anstyle", + "bincode", + "clap 4.5.20", + "escape8259", + "futures", + "interprocess", + "parking_lot", + "quick-xml", + "rand", + "tokio", + "topological-sort", + "uuid", +] + +[[package]] +name = "test-r-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a638ef4ccf6d0d5b92d06e5c827ef4e941eb59bf4192101a3b8c29b7540a878" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.79", + "test-r-core", +] + [[package]] name = "testcontainers" version = "0.15.0" @@ -9077,6 +9160,12 @@ dependencies = [ "tonic", ] +[[package]] +name = "topological-sort" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea68304e134ecd095ac6c3574494fc62b909f416c4fca77e440530221e549d3d" + [[package]] name = "tower" version = "0.4.13" @@ -10479,6 +10568,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + [[package]] name = "wiggle" version = "21.0.1" diff --git a/Cargo.toml b/Cargo.toml index 9a7cec872..34bfe2796 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -164,6 +164,7 @@ testcontainers-modules = { version = "0.3.2", features = [ "redis", "minio", ] } +test-r = "0.0.6" thiserror = "1.0.56" tokio = { version = "1.0", features = [ "macros", diff --git a/golem-api-grpc/Cargo.toml b/golem-api-grpc/Cargo.toml index e3727f1aa..8d35a6328 100644 --- a/golem-api-grpc/Cargo.toml +++ b/golem-api-grpc/Cargo.toml @@ -8,6 +8,7 @@ repository = "https://github.com/golemcloud/golem" description = "GRPC API for Golem services" [lib] +harness = false [dependencies] async-trait = { workspace = true } @@ -24,6 +25,9 @@ tonic = { workspace = true } tracing = { workspace = true } uuid = { workspace = true } +[dev-dependencies] +test-r = { workspace = true } + [build-dependencies] cargo_metadata = "0.18.1" tonic-build = "0.11.0" diff --git a/golem-api-grpc/src/lib.rs b/golem-api-grpc/src/lib.rs index 56e6280ec..275b349e3 100644 --- a/golem-api-grpc/src/lib.rs +++ b/golem-api-grpc/src/lib.rs @@ -12,6 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(test)] +test_r::enable!(); + #[allow(clippy::large_enum_variant)] pub mod proto { use crate::proto::golem::worker::UpdateMode; @@ -215,6 +218,8 @@ pub mod proto { #[cfg(test)] mod tests { + use test_r::test; + use crate::proto::golem; use prost::Message; use std::str::FromStr; diff --git a/golem-common/Cargo.toml b/golem-common/Cargo.toml index 3488ff31b..fb722ff56 100644 --- a/golem-common/Cargo.toml +++ b/golem-common/Cargo.toml @@ -9,7 +9,7 @@ description = "Shared code between Golem services" [lib] - +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -54,4 +54,5 @@ wasm-wave = { workspace = true } itertools = { workspace = true } [dev-dependencies] +test-r = { workspace = true } tracing-test = { workspace = true } \ No newline at end of file diff --git a/golem-common/src/lib.rs b/golem-common/src/lib.rs index fddd9cbd0..91cc1487a 100644 --- a/golem-common/src/lib.rs +++ b/golem-common/src/lib.rs @@ -31,6 +31,9 @@ pub mod serialization; pub mod tracing; pub mod uri; +#[cfg(test)] +test_r::enable!(); + /// Trait to convert a value to a string which is safe to return through a public API. pub trait SafeDisplay { fn to_safe_string(&self) -> String; diff --git a/golem-common/src/model/mod.rs b/golem-common/src/model/mod.rs index 961d3e062..95e6c6fe0 100644 --- a/golem-common/src/model/mod.rs +++ b/golem-common/src/model/mod.rs @@ -2470,6 +2470,8 @@ impl FromStr for ComponentType { #[cfg(test)] mod tests { + use test_r::test; + use std::collections::HashSet; use std::str::FromStr; use std::time::SystemTime; diff --git a/golem-common/src/model/regions.rs b/golem-common/src/model/regions.rs index 5daa47ca0..9a6c979a7 100644 --- a/golem-common/src/model/regions.rs +++ b/golem-common/src/model/regions.rs @@ -227,6 +227,8 @@ impl Display for DeletedRegions { #[cfg(test)] mod tests { + use test_r::test; + use crate::model::oplog::OplogIndex; use crate::model::regions::{DeletedRegionsBuilder, OplogRegion}; diff --git a/golem-common/src/retries.rs b/golem-common/src/retries.rs index 9da27b597..b0723c896 100644 --- a/golem-common/src/retries.rs +++ b/golem-common/src/retries.rs @@ -219,9 +219,10 @@ where #[cfg(test)] mod tests { - use std::time::Duration; + use test_r::test; use crate::config::RetryConfig; + use std::time::Duration; #[test] pub fn get_delay_example_without_jitter() { diff --git a/golem-common/src/serialization.rs b/golem-common/src/serialization.rs index 723f1faf5..bc861a841 100644 --- a/golem-common/src/serialization.rs +++ b/golem-common/src/serialization.rs @@ -82,6 +82,8 @@ pub fn try_deserialize_with_version( #[cfg(test)] mod tests { + use test_r::test; + use bincode::{Decode, Encode}; use rand::distributions::Alphanumeric; use rand::Rng; diff --git a/golem-common/src/tracing.rs b/golem-common/src/tracing.rs index dd3068874..3a4aab0aa 100644 --- a/golem-common/src/tracing.rs +++ b/golem-common/src/tracing.rs @@ -605,6 +605,8 @@ mod test { } mod json_flatten_span_formatter { + use test_r::test; + use tracing; use tracing::{field, info, span, Level}; use tracing_subscriber::FmtSubscriber; diff --git a/golem-common/src/uri/cloud/uri.rs b/golem-common/src/uri/cloud/uri.rs index 66c1aa53f..e4d757fb3 100644 --- a/golem-common/src/uri/cloud/uri.rs +++ b/golem-common/src/uri/cloud/uri.rs @@ -177,6 +177,8 @@ uri_from_into!(ResourceUri); #[cfg(test)] mod tests { + use test_r::test; + use crate::model::{ComponentId, TargetWorkerId, WorkerId}; use crate::uri::cloud::uri::{ ApiDefinitionUri, ApiDeploymentUri, ComponentOrVersionUri, ComponentUri, diff --git a/golem-common/src/uri/cloud/url.rs b/golem-common/src/uri/cloud/url.rs index 123d3922e..a3ac98123 100644 --- a/golem-common/src/uri/cloud/url.rs +++ b/golem-common/src/uri/cloud/url.rs @@ -667,6 +667,8 @@ impl Display for ResourceUrl { #[cfg(test)] mod tests { + use test_r::test; + use crate::uri::cloud::url::{ AccountUrl, ApiDefinitionUrl, ApiDeploymentUrl, ComponentOrVersionUrl, ComponentUrl, ComponentVersionUrl, ProjectUrl, ResourceUrl, WorkerFunctionUrl, WorkerOrFunctionUrl, diff --git a/golem-common/src/uri/cloud/urn.rs b/golem-common/src/uri/cloud/urn.rs index 58abf0559..df3e63fb9 100644 --- a/golem-common/src/uri/cloud/urn.rs +++ b/golem-common/src/uri/cloud/urn.rs @@ -171,6 +171,8 @@ impl Display for ResourceUrn { #[cfg(test)] mod tests { + use test_r::test; + use crate::model::{AccountId, ProjectId}; use crate::uri::cloud::urn::{AccountUrn, ProjectUrn, ResourceUrn}; use crate::uri::GolemUrn; diff --git a/golem-common/src/uri/mod.rs b/golem-common/src/uri/mod.rs index f30e19da0..8b1da8255 100644 --- a/golem-common/src/uri/mod.rs +++ b/golem-common/src/uri/mod.rs @@ -715,6 +715,8 @@ impl<'de> Deserialize<'de> for GolemUrl { #[cfg(test)] mod tests { + use test_r::test; + use crate::uri::{GolemUri, GolemUrl, GolemUrn}; use std::str::FromStr; use url::Url; diff --git a/golem-common/src/uri/oss/uri.rs b/golem-common/src/uri/oss/uri.rs index 47ac17df2..a57d6a44a 100644 --- a/golem-common/src/uri/oss/uri.rs +++ b/golem-common/src/uri/oss/uri.rs @@ -131,6 +131,8 @@ uri_from_into!(ResourceUri); #[cfg(test)] mod tests { + use test_r::test; + use crate::model::{ComponentId, TargetWorkerId, WorkerId}; use crate::uri::oss::uri::{ ApiDefinitionUri, ApiDeploymentUri, ComponentOrVersionUri, ComponentUri, diff --git a/golem-common/src/uri/oss/url.rs b/golem-common/src/uri/oss/url.rs index 0322145c2..77d1bbe01 100644 --- a/golem-common/src/uri/oss/url.rs +++ b/golem-common/src/uri/oss/url.rs @@ -432,6 +432,8 @@ impl Display for ResourceUrl { #[cfg(test)] mod tests { + use test_r::test; + use crate::uri::oss::url::{ ApiDefinitionUrl, ApiDeploymentUrl, ComponentOrVersionUrl, ComponentUrl, ComponentVersionUrl, ResourceUrl, WorkerFunctionUrl, WorkerOrFunctionUrl, WorkerUrl, diff --git a/golem-common/src/uri/oss/urn.rs b/golem-common/src/uri/oss/urn.rs index e7cd64bf7..28cd7f9d3 100644 --- a/golem-common/src/uri/oss/urn.rs +++ b/golem-common/src/uri/oss/urn.rs @@ -458,6 +458,8 @@ impl Display for ResourceUrn { #[cfg(test)] mod tests { + use test_r::test; + use crate::model::{ComponentId, TargetWorkerId, WorkerId}; use crate::uri::oss::urn::{ ApiDefinitionUrn, ApiDeploymentUrn, ComponentOrVersionUrn, ComponentUrn, diff --git a/golem-component-compilation-service/Cargo.toml b/golem-component-compilation-service/Cargo.toml index 98896b61f..6def2d214 100644 --- a/golem-component-compilation-service/Cargo.toml +++ b/golem-component-compilation-service/Cargo.toml @@ -5,8 +5,10 @@ edition = "2021" [lib] path = "src/lib.rs" +harness = false [[bin]] +harness = false name = "golem-component-compilation-service" path = "src/server.rs" @@ -34,3 +36,6 @@ tracing-subscriber = { workspace = true } prometheus = { workspace = true } futures-util = "0.3.30" lazy_static.workspace = true + +[dev-dependencies] +test-r = { workspace = true } \ No newline at end of file diff --git a/golem-component-compilation-service/src/config.rs b/golem-component-compilation-service/src/config.rs index a6e260bda..dd006917c 100644 --- a/golem-component-compilation-service/src/config.rs +++ b/golem-component-compilation-service/src/config.rs @@ -133,6 +133,8 @@ pub fn make_config_loader() -> ConfigLoader { #[cfg(test)] mod tests { + use test_r::test; + use crate::config::make_config_loader; #[test] diff --git a/golem-component-compilation-service/src/lib.rs b/golem-component-compilation-service/src/lib.rs index f53eb5470..9f1f77eb7 100644 --- a/golem-component-compilation-service/src/lib.rs +++ b/golem-component-compilation-service/src/lib.rs @@ -43,6 +43,9 @@ mod metrics; mod model; mod service; +#[cfg(test)] +test_r::enable!(); + pub fn server_main() -> Result<(), Box> { match make_config_loader().load_or_dump_config() { Some(config) => { diff --git a/golem-component-compilation-service/src/server.rs b/golem-component-compilation-service/src/server.rs index 5e4d9da36..3ed10d202 100644 --- a/golem-component-compilation-service/src/server.rs +++ b/golem-component-compilation-service/src/server.rs @@ -12,6 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(test)] +test_r::enable!(); + +#[cfg(not(test))] fn main() -> Result<(), Box> { golem_component_compilation_service::server_main() } diff --git a/golem-component-service-base/Cargo.toml b/golem-component-service-base/Cargo.toml index ddf8040ce..b6b63bf67 100644 --- a/golem-component-service-base/Cargo.toml +++ b/golem-component-service-base/Cargo.toml @@ -3,7 +3,12 @@ name = "golem-component-service-base" version = "0.0.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +harness = false + +[[test]] +name = "services_tests" +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -39,7 +44,7 @@ tracing = { workspace = true } uuid = { workspace = true } [dev-dependencies] -criterion = { version = "0.3", features = ["html_reports"] } fastrand = "2.0.2" testcontainers = { workspace = true } -testcontainers-modules = { workspace = true } \ No newline at end of file +testcontainers-modules = { workspace = true } +test-r = { workspace = true } diff --git a/golem-component-service-base/src/lib.rs b/golem-component-service-base/src/lib.rs index 22a61af73..8089a4f2d 100644 --- a/golem-component-service-base/src/lib.rs +++ b/golem-component-service-base/src/lib.rs @@ -17,3 +17,6 @@ pub mod config; pub mod model; pub mod repo; pub mod service; + +#[cfg(test)] +test_r::enable!(); \ No newline at end of file diff --git a/golem-component-service-base/src/service/component.rs b/golem-component-service-base/src/service/component.rs index f8f018fc7..ad1571111 100644 --- a/golem-component-service-base/src/service/component.rs +++ b/golem-component-service-base/src/service/component.rs @@ -630,6 +630,8 @@ impl ComponentServiceDefault { #[cfg(test)] mod tests { + use test_r::test; + use crate::service::component::ComponentError; use golem_common::SafeDisplay; use golem_service_base::repo::RepoError; diff --git a/golem-component-service-base/tests/services_tests.rs b/golem-component-service-base/tests/services_tests.rs index 33a8507c0..cf3823afc 100644 --- a/golem-component-service-base/tests/services_tests.rs +++ b/golem-component-service-base/tests/services_tests.rs @@ -1,489 +1,490 @@ -#[cfg(test)] -mod tests { - use golem_common::config::{DbPostgresConfig, DbSqliteConfig}; - use golem_service_base::auth::DefaultNamespace; - use golem_service_base::config::ComponentStoreLocalConfig; - use golem_service_base::db; - - use golem_common::model::{ComponentId, ComponentType}; - use golem_component_service_base::model::Component; - use golem_component_service_base::repo::component::{ComponentRepo, DbComponentRepo}; - use golem_component_service_base::service::component::{ - create_new_component, ComponentService, ComponentServiceDefault, +use test_r::test; + +use golem_common::config::{DbPostgresConfig, DbSqliteConfig}; +use golem_service_base::auth::DefaultNamespace; +use golem_service_base::config::ComponentStoreLocalConfig; +use golem_service_base::db; + +use golem_common::model::{ComponentId, ComponentType}; +use golem_component_service_base::model::Component; +use golem_component_service_base::repo::component::{ComponentRepo, DbComponentRepo}; +use golem_component_service_base::service::component::{ + create_new_component, ComponentService, ComponentServiceDefault, +}; +use golem_component_service_base::service::component_compilation::{ + ComponentCompilationService, ComponentCompilationServiceDisabled, +}; +use golem_service_base::model::ComponentName; +use golem_service_base::service::component_object_store; +use std::sync::Arc; +use testcontainers::clients::Cli; +use testcontainers::{Container, RunnableImage}; +use testcontainers_modules::postgres::Postgres; +use uuid::Uuid; + +test_r::enable!(); + +fn start_docker_postgres<'d>(docker: &'d Cli) -> (DbPostgresConfig, Container<'d, Postgres>) { + let image = RunnableImage::from(Postgres::default()).with_tag("14.7-alpine"); + let container: Container<'d, Postgres> = docker.run(image); + + let config = DbPostgresConfig { + host: "localhost".to_string(), + port: container.get_host_port_ipv4(5432), + database: "postgres".to_string(), + username: "postgres".to_string(), + password: "postgres".to_string(), + schema: Some("test".to_string()), + max_connections: 10, }; - use golem_component_service_base::service::component_compilation::{ - ComponentCompilationService, ComponentCompilationServiceDisabled, - }; - use golem_service_base::model::ComponentName; - use golem_service_base::service::component_object_store; - use std::sync::Arc; - use testcontainers::clients::Cli; - use testcontainers::{Container, RunnableImage}; - use testcontainers_modules::postgres::Postgres; - use uuid::Uuid; - - fn start_docker_postgres<'d>(docker: &'d Cli) -> (DbPostgresConfig, Container<'d, Postgres>) { - let image = RunnableImage::from(Postgres::default()).with_tag("14.7-alpine"); - let container: Container<'d, Postgres> = docker.run(image); - - let config = DbPostgresConfig { - host: "localhost".to_string(), - port: container.get_host_port_ipv4(5432), - database: "postgres".to_string(), - username: "postgres".to_string(), - password: "postgres".to_string(), - schema: Some("test".to_string()), - max_connections: 10, - }; - - (config, container) - } - struct SqliteDb { - db_path: String, - } + (config, container) +} - impl Default for SqliteDb { - fn default() -> Self { - Self { - db_path: format!("/tmp/golem-component-{}.db", Uuid::new_v4()), - } +struct SqliteDb { + db_path: String, +} + +impl Default for SqliteDb { + fn default() -> Self { + Self { + db_path: format!("/tmp/golem-component-{}.db", Uuid::new_v4()), } } +} - impl Drop for SqliteDb { - fn drop(&mut self) { - std::fs::remove_file(&self.db_path).unwrap(); - } +impl Drop for SqliteDb { + fn drop(&mut self) { + std::fs::remove_file(&self.db_path).unwrap(); } +} - #[tokio::test] - pub async fn test_with_postgres_db() { - let cli = Cli::default(); - let (db_config, _container) = start_docker_postgres(&cli); +#[test] +pub async fn test_with_postgres_db() { + let cli = Cli::default(); + let (db_config, _container) = start_docker_postgres(&cli); - db::postgres_migrate( - &db_config, - "../golem-component-service/db/migration/postgres", - ) + db::postgres_migrate( + &db_config, + "../golem-component-service/db/migration/postgres", + ) + .await + .unwrap(); + + let db_pool = db::create_postgres_pool(&db_config).await.unwrap(); + + let component_repo: Arc = + Arc::new(DbComponentRepo::new(db_pool.clone().into())); + + test_repo(component_repo.clone()).await; + test_services(component_repo.clone()).await; +} + +#[test] +pub async fn test_with_sqlite_db() { + let db = SqliteDb::default(); + let db_config = DbSqliteConfig { + database: db.db_path.clone(), + max_connections: 10, + }; + + db::sqlite_migrate(&db_config, "../golem-component-service/db/migration/sqlite") .await .unwrap(); - let db_pool = db::create_postgres_pool(&db_config).await.unwrap(); + let db_pool = db::create_sqlite_pool(&db_config).await.unwrap(); - let component_repo: Arc = - Arc::new(DbComponentRepo::new(db_pool.clone().into())); + let component_repo: Arc = + Arc::new(DbComponentRepo::new(db_pool.clone().into())); - test_repo(component_repo.clone()).await; - test_services(component_repo.clone()).await; - } + test_repo(component_repo.clone()).await; + test_services(component_repo.clone()).await; +} - #[tokio::test] - pub async fn test_with_sqlite_db() { - let db = SqliteDb::default(); - let db_config = DbSqliteConfig { - database: db.db_path.clone(), - max_connections: 10, - }; +fn get_component_data(name: &str) -> Vec { + let path = format!("../test-components/{}.wasm", name); + std::fs::read(path).unwrap() +} - db::sqlite_migrate(&db_config, "../golem-component-service/db/migration/sqlite") - .await - .unwrap(); +async fn test_services(component_repo: Arc) { + let object_store: Arc = + Arc::new( + component_object_store::FsComponentObjectStore::new(&ComponentStoreLocalConfig { + root_path: "/tmp/component".to_string(), + object_prefix: Uuid::new_v4().to_string(), + }) + .unwrap(), + ); - let db_pool = db::create_sqlite_pool(&db_config).await.unwrap(); + let compilation_service: Arc = + Arc::new(ComponentCompilationServiceDisabled); - let component_repo: Arc = - Arc::new(DbComponentRepo::new(db_pool.clone().into())); + let component_service: Arc + Sync + Send> = + Arc::new(ComponentServiceDefault::new( + component_repo.clone(), + object_store.clone(), + compilation_service.clone(), + )); - test_repo(component_repo.clone()).await; - test_services(component_repo.clone()).await; - } + let component_name1 = ComponentName("shopping-cart".to_string()); + let component_name2 = ComponentName("rust-echo".to_string()); - fn get_component_data(name: &str) -> Vec { - let path = format!("../test-components/{}.wasm", name); - std::fs::read(path).unwrap() - } + let component1 = component_service + .create( + &ComponentId::new_v4(), + &component_name1, + ComponentType::Durable, + get_component_data("shopping-cart"), + &DefaultNamespace::default(), + ) + .await + .unwrap(); - async fn test_services(component_repo: Arc) { - let object_store: Arc = - Arc::new( - component_object_store::FsComponentObjectStore::new(&ComponentStoreLocalConfig { - root_path: "/tmp/component".to_string(), - object_prefix: Uuid::new_v4().to_string(), - }) - .unwrap(), - ); - - let compilation_service: Arc = - Arc::new(ComponentCompilationServiceDisabled); - - let component_service: Arc + Sync + Send> = - Arc::new(ComponentServiceDefault::new( - component_repo.clone(), - object_store.clone(), - compilation_service.clone(), - )); - - let component_name1 = ComponentName("shopping-cart".to_string()); - let component_name2 = ComponentName("rust-echo".to_string()); - - let component1 = component_service - .create( - &ComponentId::new_v4(), - &component_name1, - ComponentType::Durable, - get_component_data("shopping-cart"), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - - let component2 = component_service - .create( - &ComponentId::new_v4(), - &component_name2, - ComponentType::Durable, - get_component_data("rust-echo"), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - - let component1_result = component_service - .get_by_version( - &component1.versioned_component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_some()); - - let component2_result = component_service - .get_by_version( - &component2.versioned_component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component2_result.is_some()); - assert_eq!(component2_result.unwrap(), component2); - - let component1_result = component_service - .get_latest_version( - &component1.versioned_component_id.component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_some()); - assert_eq!(component1_result.unwrap(), component1); - - let component1_result = component_service - .get( - &component1.versioned_component_id.component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert_eq!(component1_result.len(), 1); - - let component1v2 = component_service - .update( - &component1.versioned_component_id.component_id, - get_component_data("shopping-cart"), - None, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - - let component1_result = component_service - .get_latest_version( - &component1.versioned_component_id.component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_some()); - assert_eq!(component1_result.unwrap(), component1v2); - - let component1_result = component_service - .get( - &component1.versioned_component_id.component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert_eq!(component1_result.len(), 2); - - let component1_result = component_service - .get_namespace(&component1.versioned_component_id.component_id) - .await - .unwrap(); - assert!(component1_result.is_some()); - assert_eq!(component1_result.unwrap(), DefaultNamespace::default()); - - let component2_result = component_service - .get_namespace(&component2.versioned_component_id.component_id) - .await - .unwrap(); - assert!(component2_result.is_some()); - assert_eq!(component2_result.unwrap(), DefaultNamespace::default()); - - let component1_result = component_service - .download( - &component1v2.versioned_component_id.component_id, - Some(component1v2.versioned_component_id.version), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(!component1_result.is_empty()); - - let component2_result = component_service - .download( - &component2.versioned_component_id.component_id, - None, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(!component2_result.is_empty()); - - let component1_result = component_service - .get_protected_data( - &component1v2.versioned_component_id.component_id, - Some(component1v2.versioned_component_id.version), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_some()); - - let component1_result = component_service - .get_protected_data( - &component1v2.versioned_component_id.component_id, - Some(10000000), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_none()); - - let component2_result = component_service - .get_protected_data( - &component1v2.versioned_component_id.component_id, - None, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component2_result.is_some()); - - let component1_result = component_service - .find_id_by_name(&component1.component_name, &DefaultNamespace::default()) - .await - .unwrap(); - assert_eq!( - component1_result, - Some(component1.versioned_component_id.component_id.clone()) - ); + let component2 = component_service + .create( + &ComponentId::new_v4(), + &component_name2, + ComponentType::Durable, + get_component_data("rust-echo"), + &DefaultNamespace::default(), + ) + .await + .unwrap(); - let component2_result = component_service - .find_id_by_name(&component2.component_name, &DefaultNamespace::default()) - .await - .unwrap(); - assert_eq!( - component2_result, - Some(component2.versioned_component_id.component_id.clone()) - ); + let component1_result = component_service + .get_by_version( + &component1.versioned_component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component1_result.is_some()); - let component1_result = component_service - .find_by_name( - Some(component1.component_name.clone()), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert_eq!( - component1_result, - vec![component1.clone(), component1v2.clone()] - ); + let component2_result = component_service + .get_by_version( + &component2.versioned_component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component2_result.is_some()); + assert_eq!(component2_result.unwrap(), component2); - let component2_result = component_service - .find_by_name( - Some(component2.component_name.clone()), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert_eq!(component2_result, vec![component2.clone()]); - - let component_result = component_service - .find_by_name(None, &DefaultNamespace::default()) - .await - .unwrap(); - assert_eq!(component_result.len(), 3); - - component_service - .delete( - &component1v2.versioned_component_id.component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - - let component1_result = component_service - .get( - &component1.versioned_component_id.component_id, - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_empty()); - - let component1_result = component_service - .get_protected_data( - &component1v2.versioned_component_id.component_id, - Some(component1v2.versioned_component_id.version), - &DefaultNamespace::default(), - ) - .await - .unwrap(); - assert!(component1_result.is_none()); - } + let component1_result = component_service + .get_latest_version( + &component1.versioned_component_id.component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component1_result.is_some()); + assert_eq!(component1_result.unwrap(), component1); - async fn test_repo(component_repo: Arc) { - test_repo_component_id_unique(component_repo.clone()).await; - test_repo_component_name_unique_in_namespace(component_repo.clone()).await; - test_repo_component_delete(component_repo.clone()).await; - } + let component1_result = component_service + .get( + &component1.versioned_component_id.component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert_eq!(component1_result.len(), 1); + + let component1v2 = component_service + .update( + &component1.versioned_component_id.component_id, + get_component_data("shopping-cart"), + None, + &DefaultNamespace::default(), + ) + .await + .unwrap(); - async fn test_repo_component_id_unique(component_repo: Arc) { - let namespace1 = Uuid::new_v4().to_string(); - let namespace2 = Uuid::new_v4().to_string(); + let component1_result = component_service + .get_latest_version( + &component1.versioned_component_id.component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component1_result.is_some()); + assert_eq!(component1_result.unwrap(), component1v2); - let component_name1 = ComponentName("shopping-cart1".to_string()); - let data = get_component_data("shopping-cart"); + let component1_result = component_service + .get( + &component1.versioned_component_id.component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert_eq!(component1_result.len(), 2); - let component1 = create_new_component( - &ComponentId::new_v4(), - &component_name1, - ComponentType::Durable, - &data, - &namespace1, + let component1_result = component_service + .get_namespace(&component1.versioned_component_id.component_id) + .await + .unwrap(); + assert!(component1_result.is_some()); + assert_eq!(component1_result.unwrap(), DefaultNamespace::default()); + + let component2_result = component_service + .get_namespace(&component2.versioned_component_id.component_id) + .await + .unwrap(); + assert!(component2_result.is_some()); + assert_eq!(component2_result.unwrap(), DefaultNamespace::default()); + + let component1_result = component_service + .download( + &component1v2.versioned_component_id.component_id, + Some(component1v2.versioned_component_id.version), + &DefaultNamespace::default(), ) + .await .unwrap(); + assert!(!component1_result.is_empty()); - let result1 = component_repo - .create(&component1.clone().try_into().unwrap()) - .await; - let result2 = component_repo - .create(&component1.clone().next_version().try_into().unwrap()) - .await; - let result3 = component_repo - .create( - &Component { - namespace: namespace2.clone(), - ..component1.clone() - } - .try_into() - .unwrap(), - ) - .await; - - assert!(result1.is_ok()); - assert!(result2.is_ok()); - assert!(result3.is_err()); - } + let component2_result = component_service + .download( + &component2.versioned_component_id.component_id, + None, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(!component2_result.is_empty()); - async fn test_repo_component_name_unique_in_namespace( - component_repo: Arc, - ) { - let namespace1 = Uuid::new_v4().to_string(); - let namespace2 = Uuid::new_v4().to_string(); + let component1_result = component_service + .get_protected_data( + &component1v2.versioned_component_id.component_id, + Some(component1v2.versioned_component_id.version), + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component1_result.is_some()); - let component_name1 = ComponentName("shopping-cart1".to_string()); - let data = get_component_data("shopping-cart"); + let component1_result = component_service + .get_protected_data( + &component1v2.versioned_component_id.component_id, + Some(10000000), + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component1_result.is_none()); - let component1 = create_new_component( - &ComponentId::new_v4(), - &component_name1, - ComponentType::Durable, - &data, - &namespace1, + let component2_result = component_service + .get_protected_data( + &component1v2.versioned_component_id.component_id, + None, + &DefaultNamespace::default(), ) + .await .unwrap(); - let component2 = create_new_component( - &ComponentId::new_v4(), - &component_name1, - ComponentType::Durable, - &data, - &namespace2, + assert!(component2_result.is_some()); + + let component1_result = component_service + .find_id_by_name(&component1.component_name, &DefaultNamespace::default()) + .await + .unwrap(); + assert_eq!( + component1_result, + Some(component1.versioned_component_id.component_id.clone()) + ); + + let component2_result = component_service + .find_id_by_name(&component2.component_name, &DefaultNamespace::default()) + .await + .unwrap(); + assert_eq!( + component2_result, + Some(component2.versioned_component_id.component_id.clone()) + ); + + let component1_result = component_service + .find_by_name( + Some(component1.component_name.clone()), + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert_eq!( + component1_result, + vec![component1.clone(), component1v2.clone()] + ); + + let component2_result = component_service + .find_by_name( + Some(component2.component_name.clone()), + &DefaultNamespace::default(), ) + .await .unwrap(); + assert_eq!(component2_result, vec![component2.clone()]); - let result1 = component_repo - .create(&component1.clone().try_into().unwrap()) - .await; - let result2 = component_repo - .create( - &Component { - namespace: namespace2.clone(), - ..component1.clone() - } - .try_into() - .unwrap(), - ) - .await; - let result3 = component_repo - .create(&component2.clone().try_into().unwrap()) - .await; - - assert!(result1.is_ok()); - assert!(result2.is_err()); - assert!(result3.is_ok()); - } + let component_result = component_service + .find_by_name(None, &DefaultNamespace::default()) + .await + .unwrap(); + assert_eq!(component_result.len(), 3); - async fn test_repo_component_delete(component_repo: Arc) { - let namespace1 = Uuid::new_v4().to_string(); + component_service + .delete( + &component1v2.versioned_component_id.component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); - let component_name1 = ComponentName("shopping-cart1".to_string()); - let data = get_component_data("shopping-cart"); + let component1_result = component_service + .get( + &component1.versioned_component_id.component_id, + &DefaultNamespace::default(), + ) + .await + .unwrap(); + assert!(component1_result.is_empty()); - let component1 = create_new_component( - &ComponentId::new_v4(), - &component_name1, - ComponentType::Durable, - &data, - &namespace1, + let component1_result = component_service + .get_protected_data( + &component1v2.versioned_component_id.component_id, + Some(component1v2.versioned_component_id.version), + &DefaultNamespace::default(), ) + .await .unwrap(); + assert!(component1_result.is_none()); +} - let result1 = component_repo - .create(&component1.clone().try_into().unwrap()) - .await; - - let result2 = component_repo - .get(&component1.versioned_component_id.component_id.0) - .await; - - let result3 = component_repo - .delete( - &namespace1, - &component1.versioned_component_id.component_id.0, - ) - .await; - - let result4 = component_repo - .get(&component1.versioned_component_id.component_id.0) - .await; - - assert!(result1.is_ok()); - assert!(result2.is_ok()); - assert_eq!(result2.unwrap().len(), 1); - assert!(result3.is_ok()); - assert!(result4.is_ok()); - assert!(result4.unwrap().is_empty()); - } +async fn test_repo(component_repo: Arc) { + test_repo_component_id_unique(component_repo.clone()).await; + test_repo_component_name_unique_in_namespace(component_repo.clone()).await; + test_repo_component_delete(component_repo.clone()).await; +} + +async fn test_repo_component_id_unique(component_repo: Arc) { + let namespace1 = Uuid::new_v4().to_string(); + let namespace2 = Uuid::new_v4().to_string(); + + let component_name1 = ComponentName("shopping-cart1".to_string()); + let data = get_component_data("shopping-cart"); + + let component1 = create_new_component( + &ComponentId::new_v4(), + &component_name1, + ComponentType::Durable, + &data, + &namespace1, + ) + .unwrap(); + + let result1 = component_repo + .create(&component1.clone().try_into().unwrap()) + .await; + let result2 = component_repo + .create(&component1.clone().next_version().try_into().unwrap()) + .await; + let result3 = component_repo + .create( + &Component { + namespace: namespace2.clone(), + ..component1.clone() + } + .try_into() + .unwrap(), + ) + .await; + + assert!(result1.is_ok()); + assert!(result2.is_ok()); + assert!(result3.is_err()); +} + +async fn test_repo_component_name_unique_in_namespace( + component_repo: Arc, +) { + let namespace1 = Uuid::new_v4().to_string(); + let namespace2 = Uuid::new_v4().to_string(); + + let component_name1 = ComponentName("shopping-cart1".to_string()); + let data = get_component_data("shopping-cart"); + + let component1 = create_new_component( + &ComponentId::new_v4(), + &component_name1, + ComponentType::Durable, + &data, + &namespace1, + ) + .unwrap(); + let component2 = create_new_component( + &ComponentId::new_v4(), + &component_name1, + ComponentType::Durable, + &data, + &namespace2, + ) + .unwrap(); + + let result1 = component_repo + .create(&component1.clone().try_into().unwrap()) + .await; + let result2 = component_repo + .create( + &Component { + namespace: namespace2.clone(), + ..component1.clone() + } + .try_into() + .unwrap(), + ) + .await; + let result3 = component_repo + .create(&component2.clone().try_into().unwrap()) + .await; + + assert!(result1.is_ok()); + assert!(result2.is_err()); + assert!(result3.is_ok()); +} + +async fn test_repo_component_delete(component_repo: Arc) { + let namespace1 = Uuid::new_v4().to_string(); + + let component_name1 = ComponentName("shopping-cart1".to_string()); + let data = get_component_data("shopping-cart"); + + let component1 = create_new_component( + &ComponentId::new_v4(), + &component_name1, + ComponentType::Durable, + &data, + &namespace1, + ) + .unwrap(); + + let result1 = component_repo + .create(&component1.clone().try_into().unwrap()) + .await; + + let result2 = component_repo + .get(&component1.versioned_component_id.component_id.0) + .await; + + let result3 = component_repo + .delete( + &namespace1, + &component1.versioned_component_id.component_id.0, + ) + .await; + + let result4 = component_repo + .get(&component1.versioned_component_id.component_id.0) + .await; + + assert!(result1.is_ok()); + assert!(result2.is_ok()); + assert_eq!(result2.unwrap().len(), 1); + assert!(result3.is_ok()); + assert!(result4.is_ok()); + assert!(result4.unwrap().is_empty()); } diff --git a/golem-component-service/Cargo.toml b/golem-component-service/Cargo.toml index 5d45aa1ce..b61afead8 100644 --- a/golem-component-service/Cargo.toml +++ b/golem-component-service/Cargo.toml @@ -6,8 +6,10 @@ edition = "2021" [[bin]] name = "golem-component-service" path = "src/server.rs" +harness = false [lib] +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -53,3 +55,6 @@ tonic-reflection = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } uuid = { workspace = true } + +[dev-dependencies] +test-r = { workspace = true } \ No newline at end of file diff --git a/golem-component-service/src/config.rs b/golem-component-service/src/config.rs index 65d3d4f96..3979de12c 100644 --- a/golem-component-service/src/config.rs +++ b/golem-component-service/src/config.rs @@ -77,6 +77,8 @@ pub fn make_config_loader() -> ConfigLoader { #[cfg(test)] mod tests { + use test_r::test; + use crate::config::make_config_loader; #[test] diff --git a/golem-component-service/src/lib.rs b/golem-component-service/src/lib.rs index ff59fc101..f8090ab4b 100644 --- a/golem-component-service/src/lib.rs +++ b/golem-component-service/src/lib.rs @@ -21,3 +21,6 @@ pub mod metrics; pub mod service; const VERSION: &str = golem_version!(); + +#[cfg(test)] +test_r::enable!(); \ No newline at end of file diff --git a/golem-component-service/src/server.rs b/golem-component-service/src/server.rs index 75622df09..da7069d83 100644 --- a/golem-component-service/src/server.rs +++ b/golem-component-service/src/server.rs @@ -29,6 +29,10 @@ use std::sync::Arc; use tokio::select; use tracing::{error, info}; +#[cfg(test)] +test_r::enable!(); + +#[cfg(not(test))] fn main() -> Result<(), std::io::Error> { if std::env::args().any(|arg| arg == "--dump-openapi-yaml") { tokio::runtime::Builder::new_multi_thread() diff --git a/golem-rib/Cargo.toml b/golem-rib/Cargo.toml index d43113d33..46de766d9 100644 --- a/golem-rib/Cargo.toml +++ b/golem-rib/Cargo.toml @@ -22,6 +22,10 @@ serde_json = { workspace = true } tokio = {workspace = true} wasm-wave = { workspace = true } +[dev-dependencies] +test-r = { workspace = true } + [lib] name = "rib" path = "src/lib.rs" +harness = false \ No newline at end of file diff --git a/golem-rib/src/compiler/byte_code.rs b/golem-rib/src/compiler/byte_code.rs index b8ef1ac43..d8e3a74a6 100644 --- a/golem-rib/src/compiler/byte_code.rs +++ b/golem-rib/src/compiler/byte_code.rs @@ -527,6 +527,8 @@ mod internal { #[cfg(test)] mod compiler_tests { + use test_r::test; + use super::*; use crate::{ArmPattern, InferredType, MatchArm, Number, VariableId}; use golem_wasm_ast::analysis::{AnalysedType, NameTypePair, TypeRecord, TypeStr}; @@ -1018,6 +1020,8 @@ mod compiler_tests { #[cfg(test)] mod invalid_function_invoke_tests { + use test_r::test; + use crate::compiler::byte_code::compiler_tests::internal; use crate::{compiler, Expr}; use golem_wasm_ast::analysis::{AnalysedType, TypeStr}; @@ -1220,6 +1224,8 @@ mod compiler_tests { #[cfg(test)] mod global_input_tests { + use test_r::test; + use crate::compiler::byte_code::compiler_tests::internal; use crate::{compiler, Expr}; use golem_wasm_ast::analysis::{ @@ -1227,7 +1233,7 @@ mod compiler_tests { TypeRecord, TypeResult, TypeStr, TypeTuple, TypeU32, TypeU64, TypeVariant, }; - #[tokio::test] + #[test] async fn test_str_global_input() { let request_value_type = AnalysedType::Str(TypeStr); @@ -1256,7 +1262,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_number_global_input() { let request_value_type = AnalysedType::U32(TypeU32); @@ -1285,7 +1291,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_variant_type_info() { let request_value_type = AnalysedType::Variant(TypeVariant { cases: vec![ @@ -1334,7 +1340,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_result_type_info() { let request_value_type = AnalysedType::Result(TypeResult { ok: Some(Box::new(AnalysedType::U64(TypeU64))), @@ -1371,7 +1377,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_option_type_info() { let request_value_type = AnalysedType::Option(TypeOption { inner: Box::new(AnalysedType::Str(TypeStr)), @@ -1407,7 +1413,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_enum_type_info() { let request_value_type = AnalysedType::Enum(TypeEnum { cases: vec!["prod".to_string(), "dev".to_string(), "test".to_string()], @@ -1444,7 +1450,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_record_global_input() { let request_value_type = AnalysedType::Record(TypeRecord { fields: vec![NameTypePair { @@ -1492,7 +1498,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_tuple_global_input() { let request_value_type = AnalysedType::Tuple(TypeTuple { items: vec![ @@ -1536,7 +1542,7 @@ mod compiler_tests { assert_eq!(compiled.global_input_type_info, expected_type_info); } - #[tokio::test] + #[test] async fn test_list_global_input() { let request_value_type = AnalysedType::List(TypeList { inner: Box::new(AnalysedType::Str(TypeStr)), diff --git a/golem-rib/src/compiler/desugar.rs b/golem-rib/src/compiler/desugar.rs index 1af693e66..bda50de0f 100644 --- a/golem-rib/src/compiler/desugar.rs +++ b/golem-rib/src/compiler/desugar.rs @@ -513,6 +513,8 @@ mod internal { #[cfg(test)] mod desugar_tests { + use test_r::test; + use crate::compiler::desugar::desugar_tests::expectations::expected_condition_with_identifiers; use crate::type_registry::FunctionTypeRegistry; use crate::Expr; diff --git a/golem-rib/src/expr.rs b/golem-rib/src/expr.rs index 781a9f685..451fced15 100644 --- a/golem-rib/src/expr.rs +++ b/golem-rib/src/expr.rs @@ -1544,6 +1544,8 @@ impl Serialize for Expr { #[cfg(test)] mod tests { + use test_r::test; + use crate::ParsedFunctionSite::PackagedInterface; use crate::{ ArmPattern, DynamicParsedFunctionName, DynamicParsedFunctionReference, Expr, MatchArm, diff --git a/golem-rib/src/function_name.rs b/golem-rib/src/function_name.rs index 3c65763af..cb6d7990e 100644 --- a/golem-rib/src/function_name.rs +++ b/golem-rib/src/function_name.rs @@ -1084,6 +1084,8 @@ impl From for golem_api_grpc::proto::golem::rib::ParsedFunct #[cfg(test)] mod function_name_tests { + use test_r::test; + use super::{ParsedFunctionName, ParsedFunctionReference, ParsedFunctionSite, SemVer}; #[test] diff --git a/golem-rib/src/inferred_type.rs b/golem-rib/src/inferred_type.rs index bee7f8269..5a949059a 100644 --- a/golem-rib/src/inferred_type.rs +++ b/golem-rib/src/inferred_type.rs @@ -1209,6 +1209,7 @@ mod internal { #[cfg(test)] mod test { + use test_r::test; #[test] fn test_flatten_one_of() { diff --git a/golem-rib/src/interpreter/rib_interpreter.rs b/golem-rib/src/interpreter/rib_interpreter.rs index 4e3ad8864..8f1503e5e 100644 --- a/golem-rib/src/interpreter/rib_interpreter.rs +++ b/golem-rib/src/interpreter/rib_interpreter.rs @@ -1007,13 +1007,15 @@ mod internal { #[cfg(test)] mod interpreter_tests { + use test_r::test; + use super::*; use crate::{InstructionId, VariableId}; use golem_wasm_ast::analysis::analysed_type::{field, list, record, s32}; use golem_wasm_rpc::protobuf::type_annotated_value::TypeAnnotatedValue; use golem_wasm_rpc::protobuf::{NameValuePair, TypedList, TypedRecord}; - #[tokio::test] + #[test] async fn test_interpreter_for_literal() { let mut interpreter = Interpreter::default(); @@ -1025,7 +1027,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), TypeAnnotatedValue::S32(1)); } - #[tokio::test] + #[test] async fn test_interpreter_for_equal_to() { let mut interpreter = Interpreter::default(); @@ -1041,7 +1043,7 @@ mod interpreter_tests { assert!(result.get_bool().unwrap()); } - #[tokio::test] + #[test] async fn test_interpreter_for_greater_than() { let mut interpreter = Interpreter::default(); @@ -1057,7 +1059,7 @@ mod interpreter_tests { assert!(result.get_bool().unwrap()); } - #[tokio::test] + #[test] async fn test_interpreter_for_less_than() { let mut interpreter = Interpreter::default(); @@ -1073,7 +1075,7 @@ mod interpreter_tests { assert!(result.get_bool().unwrap()); } - #[tokio::test] + #[test] async fn test_interpreter_for_greater_than_or_equal_to() { let mut interpreter = Interpreter::default(); @@ -1089,7 +1091,7 @@ mod interpreter_tests { assert!(result.get_bool().unwrap()); } - #[tokio::test] + #[test] async fn test_interpreter_for_less_than_or_equal_to() { let mut interpreter = Interpreter::default(); @@ -1105,7 +1107,7 @@ mod interpreter_tests { assert!(result.get_bool().unwrap()); } - #[tokio::test] + #[test] async fn test_interpreter_for_assign_and_load_var() { let mut interpreter = Interpreter::default(); @@ -1121,7 +1123,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), TypeAnnotatedValue::S32(1)); } - #[tokio::test] + #[test] async fn test_interpreter_for_jump() { let mut interpreter = Interpreter::default(); @@ -1137,7 +1139,7 @@ mod interpreter_tests { assert!(result.is_err()); } - #[tokio::test] + #[test] async fn test_interpreter_for_jump_if_false() { let mut interpreter = Interpreter::default(); @@ -1156,7 +1158,7 @@ mod interpreter_tests { assert!(result.is_err()); } - #[tokio::test] + #[test] async fn test_interpreter_for_record() { let mut interpreter = Interpreter::default(); @@ -1200,7 +1202,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), expected); } - #[tokio::test] + #[test] async fn test_interpreter_for_sequence() { let mut interpreter = Interpreter::default(); @@ -1227,7 +1229,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), expected); } - #[tokio::test] + #[test] async fn test_interpreter_for_select_field() { let mut interpreter = Interpreter::default(); @@ -1245,7 +1247,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), TypeAnnotatedValue::S32(2)); } - #[tokio::test] + #[test] async fn test_interpreter_for_select_index() { let mut interpreter = Interpreter::default(); @@ -1263,12 +1265,14 @@ mod interpreter_tests { } mod pattern_match_tests { + use test_r::test; + use crate::interpreter::rib_interpreter::interpreter_tests::internal; use crate::{compiler, Expr, FunctionTypeRegistry, Interpreter}; use golem_wasm_ast::analysis::analysed_type::{field, record, str, tuple, u16, u64}; use golem_wasm_rpc::protobuf::type_annotated_value::TypeAnnotatedValue; - #[tokio::test] + #[test] async fn test_interpreter_for_pattern_match_on_option_nested() { let mut interpreter = Interpreter::default(); @@ -1289,7 +1293,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), TypeAnnotatedValue::U64(0)); } - #[tokio::test] + #[test] async fn test_interpreter_for_pattern_match_on_tuple() { let mut interpreter = Interpreter::default(); @@ -1312,7 +1316,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_for_pattern_match_on_tuple_with_option_some() { let mut interpreter = Interpreter::default(); @@ -1337,7 +1341,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_for_pattern_match_on_tuple_with_option_none() { let mut interpreter = Interpreter::default(); @@ -1360,7 +1364,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_for_pattern_match_on_tuple_with_all_types() { let mut interpreter = Interpreter::default(); @@ -1391,7 +1395,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_for_pattern_match_on_tuple_with_wild_pattern() { let mut interpreter = Interpreter::default(); @@ -1421,7 +1425,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_record_output_in_pattern_match() { let input_analysed_type = internal::get_analysed_type_record(); let output_analysed_type = internal::get_analysed_type_result(); @@ -1460,7 +1464,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), expected); } - #[tokio::test] + #[test] async fn test_tuple_output_in_pattern_match() { let input_analysed_type = internal::get_analysed_type_record(); let output_analysed_type = internal::get_analysed_type_result(); @@ -1501,6 +1505,8 @@ mod interpreter_tests { } mod dynamic_resource_parameter_tests { + use test_r::test; + use crate::interpreter::rib_interpreter::interpreter_tests::internal; use crate::{compiler, Expr, Interpreter}; use golem_wasm_ast::analysis::analysed_type::{ @@ -1508,7 +1514,7 @@ mod interpreter_tests { }; use golem_wasm_rpc::protobuf::type_annotated_value::TypeAnnotatedValue; - #[tokio::test] + #[test] async fn test_interpreter_with_indexed_resource_drop() { let expr = r#" let user_id = "user"; @@ -1530,7 +1536,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_indexed_resource_checkout() { let expr = r#" let user_id = "foo"; @@ -1562,7 +1568,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), result_value); } - #[tokio::test] + #[test] async fn test_interpreter_with_indexed_resource_get_cart_contents() { let expr = r#" let user_id = "bar"; @@ -1599,7 +1605,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_indexed_resource_update_item_quantity() { let expr = r#" let user_id = "jon"; @@ -1625,7 +1631,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_indexed_resource_add_item() { let expr = r#" let user_id = "foo"; @@ -1652,7 +1658,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_resource_add_item() { let expr = r#" let user_id = "foo"; @@ -1678,7 +1684,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_resource_get_cart_contents() { let expr = r#" let result = golem:it/api.{cart.get-cart-contents}(); @@ -1713,7 +1719,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_resource_update_item() { let expr = r#" let product_id = "mac"; @@ -1737,7 +1743,7 @@ mod interpreter_tests { ); } - #[tokio::test] + #[test] async fn test_interpreter_with_resource_checkout() { let expr = r#" let result = golem:it/api.{cart.checkout}(); @@ -1767,7 +1773,7 @@ mod interpreter_tests { assert_eq!(result.get_val().unwrap(), result_value); } - #[tokio::test] + #[test] async fn test_interpreter_with_resource_drop() { let expr = r#" golem:it/api.{cart.drop}(); diff --git a/golem-rib/src/interpreter/tests/mod.rs b/golem-rib/src/interpreter/tests/mod.rs index 391e48e2f..1ec8147ea 100644 --- a/golem-rib/src/interpreter/tests/mod.rs +++ b/golem-rib/src/interpreter/tests/mod.rs @@ -1,5 +1,7 @@ #[cfg(test)] mod comprehensive_test { + use test_r::test; + use crate::{compiler, Expr}; use golem_wasm_ast::analysis::{ AnalysedType, NameTypePair, TypeBool, TypeF32, TypeF64, TypeRecord, TypeS16, TypeS32, @@ -7,7 +9,7 @@ mod comprehensive_test { }; use golem_wasm_rpc::protobuf::type_annotated_value::TypeAnnotatedValue; - #[tokio::test] + #[test] async fn test_interpreter_complex_rib() { let expr = r#" diff --git a/golem-rib/src/lib.rs b/golem-rib/src/lib.rs index d3ab51b6c..b4818c6ce 100644 --- a/golem-rib/src/lib.rs +++ b/golem-rib/src/lib.rs @@ -35,3 +35,6 @@ mod type_inference; mod type_refinement; mod type_registry; mod variable_id; + +#[cfg(test)] +test_r::enable!(); \ No newline at end of file diff --git a/golem-rib/src/parser/binary_comparison.rs b/golem-rib/src/parser/binary_comparison.rs index 1908ebc38..570017524 100644 --- a/golem-rib/src/parser/binary_comparison.rs +++ b/golem-rib/src/parser/binary_comparison.rs @@ -58,6 +58,8 @@ pub enum BinaryOp { #[cfg(test)] mod test { + use test_r::test; + use crate::parser::rib_expr::rib_expr; use crate::{ DynamicParsedFunctionName, DynamicParsedFunctionReference, Expr, ParsedFunctionSite, diff --git a/golem-rib/src/parser/boolean.rs b/golem-rib/src/parser/boolean.rs index d04596d81..fb18e1164 100644 --- a/golem-rib/src/parser/boolean.rs +++ b/golem-rib/src/parser/boolean.rs @@ -35,6 +35,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use crate::parser::rib_expr::rib_expr; diff --git a/golem-rib/src/parser/call.rs b/golem-rib/src/parser/call.rs index b29012c38..e945d1c34 100644 --- a/golem-rib/src/parser/call.rs +++ b/golem-rib/src/parser/call.rs @@ -215,6 +215,8 @@ where } #[cfg(test)] mod function_call_tests { + use test_r::test; + use crate::{DynamicParsedFunctionName, DynamicParsedFunctionReference}; use combine::EasyParser; diff --git a/golem-rib/src/parser/cond.rs b/golem-rib/src/parser/cond.rs index 75f9e3882..fe04bab84 100644 --- a/golem-rib/src/parser/cond.rs +++ b/golem-rib/src/parser/cond.rs @@ -46,6 +46,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/errors.rs b/golem-rib/src/parser/errors.rs index 53ed19a24..30f5bb233 100644 --- a/golem-rib/src/parser/errors.rs +++ b/golem-rib/src/parser/errors.rs @@ -29,6 +29,8 @@ impl StdError for RibParseError { // to not regress user-facing error messages with changing parsing logic #[cfg(test)] mod invalid_syntax_tests { + use test_r::test; + use crate::Expr; #[test] diff --git a/golem-rib/src/parser/flag.rs b/golem-rib/src/parser/flag.rs index 81042d59c..dc439fcb6 100644 --- a/golem-rib/src/parser/flag.rs +++ b/golem-rib/src/parser/flag.rs @@ -47,6 +47,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use crate::parser::rib_expr::rib_expr; diff --git a/golem-rib/src/parser/identifier.rs b/golem-rib/src/parser/identifier.rs index d1f454cf4..ab7516ddf 100644 --- a/golem-rib/src/parser/identifier.rs +++ b/golem-rib/src/parser/identifier.rs @@ -63,6 +63,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use super::*; #[test] diff --git a/golem-rib/src/parser/let_binding.rs b/golem-rib/src/parser/let_binding.rs index 88cc8c37e..9d026f15a 100644 --- a/golem-rib/src/parser/let_binding.rs +++ b/golem-rib/src/parser/let_binding.rs @@ -70,6 +70,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use crate::parser::type_name::TypeName; diff --git a/golem-rib/src/parser/literal.rs b/golem-rib/src/parser/literal.rs index d54b032d0..fb19648aa 100644 --- a/golem-rib/src/parser/literal.rs +++ b/golem-rib/src/parser/literal.rs @@ -143,6 +143,8 @@ mod internal { #[cfg(test)] mod tests { + use test_r::test; + use combine::stream::position; use combine::EasyParser; diff --git a/golem-rib/src/parser/multi_line_code_block.rs b/golem-rib/src/parser/multi_line_code_block.rs index 4fd4652dd..4b0001908 100644 --- a/golem-rib/src/parser/multi_line_code_block.rs +++ b/golem-rib/src/parser/multi_line_code_block.rs @@ -66,6 +66,8 @@ mod internal { } #[cfg(test)] mod tests { + use test_r::test; + use crate::expr::Expr; use crate::function_name::DynamicParsedFunctionName; use crate::{ArmPattern, MatchArm}; diff --git a/golem-rib/src/parser/not.rs b/golem-rib/src/parser/not.rs index eccfd419f..5bf4e4433 100644 --- a/golem-rib/src/parser/not.rs +++ b/golem-rib/src/parser/not.rs @@ -37,6 +37,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/number.rs b/golem-rib/src/parser/number.rs index f2d802c56..c5b51e872 100644 --- a/golem-rib/src/parser/number.rs +++ b/golem-rib/src/parser/number.rs @@ -55,6 +55,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/optional.rs b/golem-rib/src/parser/optional.rs index b93ca49b1..4f6a3e85b 100644 --- a/golem-rib/src/parser/optional.rs +++ b/golem-rib/src/parser/optional.rs @@ -47,6 +47,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/pattern_match.rs b/golem-rib/src/parser/pattern_match.rs index 2ca00dcac..fac5fa6e8 100644 --- a/golem-rib/src/parser/pattern_match.rs +++ b/golem-rib/src/parser/pattern_match.rs @@ -300,6 +300,8 @@ mod internal { #[cfg(test)] mod tests { + use test_r::test; + use combine::stream::position; use combine::EasyParser; diff --git a/golem-rib/src/parser/record.rs b/golem-rib/src/parser/record.rs index f9c6368d9..ecf4bfc47 100644 --- a/golem-rib/src/parser/record.rs +++ b/golem-rib/src/parser/record.rs @@ -97,6 +97,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/result.rs b/golem-rib/src/parser/result.rs index 9b3c5df78..8450b9fe9 100644 --- a/golem-rib/src/parser/result.rs +++ b/golem-rib/src/parser/result.rs @@ -42,6 +42,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/select_field.rs b/golem-rib/src/parser/select_field.rs index 37452184f..f234a3bc9 100644 --- a/golem-rib/src/parser/select_field.rs +++ b/golem-rib/src/parser/select_field.rs @@ -123,6 +123,8 @@ mod internal { #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use crate::expr::*; diff --git a/golem-rib/src/parser/select_index.rs b/golem-rib/src/parser/select_index.rs index c091259e1..872230290 100644 --- a/golem-rib/src/parser/select_index.rs +++ b/golem-rib/src/parser/select_index.rs @@ -113,6 +113,8 @@ mod internal { #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use crate::expr::*; diff --git a/golem-rib/src/parser/sequence.rs b/golem-rib/src/parser/sequence.rs index aa2e5986a..936d044b3 100644 --- a/golem-rib/src/parser/sequence.rs +++ b/golem-rib/src/parser/sequence.rs @@ -41,6 +41,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/parser/tuple.rs b/golem-rib/src/parser/tuple.rs index 9fb8029ae..a2bc28497 100644 --- a/golem-rib/src/parser/tuple.rs +++ b/golem-rib/src/parser/tuple.rs @@ -44,6 +44,8 @@ where #[cfg(test)] mod tests { + use test_r::test; + use combine::stream::position; use combine::EasyParser; diff --git a/golem-rib/src/parser/type_name.rs b/golem-rib/src/parser/type_name.rs index ca8f1402e..e37d4d738 100644 --- a/golem-rib/src/parser/type_name.rs +++ b/golem-rib/src/parser/type_name.rs @@ -293,6 +293,8 @@ parser! { #[cfg(test)] mod type_name_parser_tests { + use test_r::test; + use combine::EasyParser; use super::*; diff --git a/golem-rib/src/text/mod.rs b/golem-rib/src/text/mod.rs index 97aa262c4..702cbebe9 100644 --- a/golem-rib/src/text/mod.rs +++ b/golem-rib/src/text/mod.rs @@ -39,6 +39,8 @@ pub fn to_string(expr: &Expr) -> Result { #[cfg(test)] mod interpolation_tests { + use test_r::test; + use crate::{text, Expr}; #[test] @@ -65,6 +67,8 @@ mod interpolation_tests { #[cfg(test)] mod record_tests { + use test_r::test; + use crate::expr::*; use crate::text::{from_string, to_string, Expr}; use crate::MatchArm; @@ -436,6 +440,8 @@ mod record_tests { #[cfg(test)] mod sequence_tests { + use test_r::test; + use crate::expr::Expr; use crate::text::{from_string, to_string}; use crate::{ArmPattern, MatchArm}; @@ -705,6 +711,8 @@ mod sequence_tests { #[cfg(test)] mod tuple_tests { + use test_r::test; + use crate::expr::Expr; use crate::text::{from_string, to_string}; @@ -866,6 +874,8 @@ mod tuple_tests { #[cfg(test)] mod simple_values_test { + use test_r::test; + use crate::expr::Expr; use crate::text::{from_string, to_string}; @@ -943,6 +953,8 @@ mod simple_values_test { #[cfg(test)] mod let_tests { + use test_r::test; + use crate::expr::Expr; use crate::parser::type_name::TypeName; use crate::text::{from_string, to_string}; @@ -1138,6 +1150,8 @@ mod let_tests { #[cfg(test)] mod selection_tests { + use test_r::test; + use crate::expr::Expr; use crate::text::{from_string, to_string}; @@ -1189,6 +1203,8 @@ mod selection_tests { #[cfg(test)] mod flag_tests { + use test_r::test; + use crate::expr::Expr; use crate::text::{from_string, to_string}; @@ -1217,6 +1233,8 @@ mod flag_tests { #[cfg(test)] mod match_tests { + use test_r::test; + use crate::expr::ArmPattern; use crate::expr::Expr; use crate::expr::MatchArm; @@ -1640,6 +1658,8 @@ mod match_tests { #[cfg(test)] mod if_cond_tests { + use test_r::test; + use crate::expr::Expr; use crate::text::{from_string, to_string}; diff --git a/golem-rib/src/type_inference/call_arguments_inference.rs b/golem-rib/src/type_inference/call_arguments_inference.rs index 855d4dca4..15a08b655 100644 --- a/golem-rib/src/type_inference/call_arguments_inference.rs +++ b/golem-rib/src/type_inference/call_arguments_inference.rs @@ -426,6 +426,8 @@ mod internal { #[cfg(test)] mod function_parameters_inference_tests { + use test_r::test; + use crate::call_type::CallType; use crate::function_name::{DynamicParsedFunctionName, DynamicParsedFunctionReference}; use crate::type_registry::FunctionTypeRegistry; diff --git a/golem-rib/src/type_inference/inference_fix_point.rs b/golem-rib/src/type_inference/inference_fix_point.rs index 5dce48e40..4ea1bd518 100644 --- a/golem-rib/src/type_inference/inference_fix_point.rs +++ b/golem-rib/src/type_inference/inference_fix_point.rs @@ -195,6 +195,8 @@ mod internal { #[cfg(test)] mod tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::inference_fix_point::internal::{ equivalent_exprs, equivalent_types, non_equivalent_types, diff --git a/golem-rib/src/type_inference/mod.rs b/golem-rib/src/type_inference/mod.rs index 4e64b72d1..321f50735 100644 --- a/golem-rib/src/type_inference/mod.rs +++ b/golem-rib/src/type_inference/mod.rs @@ -52,6 +52,8 @@ mod type_binding; mod type_inference_tests { mod let_binding_tests { + use test_r::test; + use crate::call_type::CallType; use crate::function_name::{DynamicParsedFunctionName, DynamicParsedFunctionReference}; use crate::type_inference::type_inference_tests::internal; @@ -175,6 +177,8 @@ mod type_inference_tests { } } mod literal_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -240,6 +244,8 @@ mod type_inference_tests { } } mod comparison_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -345,6 +351,8 @@ mod type_inference_tests { } } mod enum_tests { + use test_r::test; + use crate::type_inference::type_inference_tests::internal; use crate::type_inference::type_inference_tests::internal::{ get_analysed_exports, get_analysed_type_enum, @@ -353,7 +361,7 @@ mod type_inference_tests { use golem_wasm_ast::analysis::analysed_type::str; - #[tokio::test] + #[test] async fn test_enum_construction_and_pattern_match() { let input_enum_type = get_analysed_type_enum(vec!["foo", "bar", "foo-bar"]); @@ -414,6 +422,8 @@ mod type_inference_tests { } mod variant_tests { + use test_r::test; + use crate::type_inference::type_inference_tests::internal::{ get_analysed_exports, get_analysed_type_variant, }; @@ -421,7 +431,7 @@ mod type_inference_tests { use golem_wasm_ast::analysis::analysed_type::{str, u64}; - #[tokio::test] + #[test] async fn test_variant_construction_and_pattern_match() { let input_variant_type = get_analysed_type_variant(vec![ ("foo", Some(u64())), @@ -486,6 +496,8 @@ mod type_inference_tests { } mod concat_tests { + use test_r::test; + use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, VariableId}; @@ -530,6 +542,8 @@ mod type_inference_tests { } } mod boolean_tests { + use test_r::test; + use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, VariableId}; @@ -562,6 +576,8 @@ mod type_inference_tests { } } mod cond_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -644,6 +660,8 @@ mod type_inference_tests { } } mod identifier_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -739,6 +757,8 @@ mod type_inference_tests { } } mod list_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -782,6 +802,8 @@ mod type_inference_tests { } } mod select_index_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -829,6 +851,8 @@ mod type_inference_tests { } } mod select_field_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -889,6 +913,8 @@ mod type_inference_tests { } } mod tuple_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -931,6 +957,8 @@ mod type_inference_tests { } } mod variable_conflict_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::{ ArmPattern, Expr, FunctionTypeRegistry, InferredType, MatchArm, Number, VariableId, @@ -1016,6 +1044,8 @@ mod type_inference_tests { } } mod pattern_match_tests { + use test_r::test; + use crate::call_type::CallType; use crate::function_name::{DynamicParsedFunctionName, DynamicParsedFunctionReference}; use crate::parser::type_name::TypeName; @@ -1476,6 +1506,8 @@ mod type_inference_tests { } } mod option_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, Number, VariableId}; @@ -1574,6 +1606,8 @@ mod type_inference_tests { } } mod record_tests { + use test_r::test; + use crate::parser::type_name::TypeName; use crate::type_inference::type_inference_tests::internal; use crate::{Expr, FunctionTypeRegistry, InferredType, Number, VariableId}; @@ -1759,6 +1793,8 @@ mod type_inference_tests { } } mod result_type_tests { + use test_r::test; + use crate::type_inference::type_inference_tests::internal; use crate::{Expr, InferredType, VariableId}; @@ -1863,6 +1899,7 @@ mod type_inference_tests { } } mod internal { + use crate::call_type::CallType; use crate::function_name::{DynamicParsedFunctionName, DynamicParsedFunctionReference}; use crate::parser::type_name::TypeName; diff --git a/golem-rib/src/type_inference/name_binding.rs b/golem-rib/src/type_inference/name_binding.rs index e8cc50ef9..e288114d1 100644 --- a/golem-rib/src/type_inference/name_binding.rs +++ b/golem-rib/src/type_inference/name_binding.rs @@ -73,6 +73,8 @@ mod internal { #[cfg(test)] mod name_binding_tests { + use test_r::test; + use crate::call_type::CallType; use crate::function_name::{DynamicParsedFunctionName, DynamicParsedFunctionReference}; use crate::{Expr, InferredType, ParsedFunctionSite, VariableId}; diff --git a/golem-rib/src/type_inference/pattern_match_binding.rs b/golem-rib/src/type_inference/pattern_match_binding.rs index ef249ddde..c126e6784 100644 --- a/golem-rib/src/type_inference/pattern_match_binding.rs +++ b/golem-rib/src/type_inference/pattern_match_binding.rs @@ -169,6 +169,8 @@ mod internal { #[cfg(test)] mod pattern_match_bindings { + use test_r::test; + use crate::{Expr, InferredType}; use expectations::*; diff --git a/golem-rib/src/type_inference/type_binding.rs b/golem-rib/src/type_inference/type_binding.rs index bbaf35fc4..458d0769e 100644 --- a/golem-rib/src/type_inference/type_binding.rs +++ b/golem-rib/src/type_inference/type_binding.rs @@ -81,6 +81,8 @@ mod internal { #[cfg(test)] mod type_binding_tests { + use test_r::test; + use super::*; use crate::parser::type_name::TypeName; use crate::{ArmPattern, InferredType, MatchArm, Number, VariableId}; diff --git a/golem-rib/src/type_inference/type_pull_up.rs b/golem-rib/src/type_inference/type_pull_up.rs index ad1f8b0c4..912549f42 100644 --- a/golem-rib/src/type_inference/type_pull_up.rs +++ b/golem-rib/src/type_inference/type_pull_up.rs @@ -743,6 +743,8 @@ mod internal { #[cfg(test)] mod type_pull_up_tests { + use test_r::test; + use crate::call_type::CallType; use crate::function_name::DynamicParsedFunctionName; use crate::DynamicParsedFunctionReference::IndexedResourceMethod; diff --git a/golem-rib/src/type_inference/type_push_down.rs b/golem-rib/src/type_inference/type_push_down.rs index 5a83bebb0..3e4b6026d 100644 --- a/golem-rib/src/type_inference/type_push_down.rs +++ b/golem-rib/src/type_inference/type_push_down.rs @@ -319,6 +319,8 @@ mod internal { #[cfg(test)] mod type_push_down_tests { + use test_r::test; + use crate::{Expr, InferredType, VariableId}; #[test] diff --git a/golem-rib/src/type_refinement/mod.rs b/golem-rib/src/type_refinement/mod.rs index ba16706f7..96b161c33 100644 --- a/golem-rib/src/type_refinement/mod.rs +++ b/golem-rib/src/type_refinement/mod.rs @@ -193,6 +193,8 @@ mod internal { #[cfg(test)] mod type_refinement_tests { + use test_r::test; + use crate::type_refinement::precise_types::OptionalType; use crate::type_refinement::{RefinedType, TypeRefinement}; use crate::InferredType; diff --git a/golem-service-base/Cargo.toml b/golem-service-base/Cargo.toml index f90c2796c..528bf242e 100644 --- a/golem-service-base/Cargo.toml +++ b/golem-service-base/Cargo.toml @@ -8,6 +8,7 @@ repository = "https://github.com/golemcloud/golem" description = "Shared code between Golem services" [lib] +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -49,3 +50,4 @@ url = { workspace = true } [dev-dependencies] proptest = { workspace = true } +test-r = { workspace = true } diff --git a/golem-service-base/src/lib.rs b/golem-service-base/src/lib.rs index f55e12fa3..5590ddff3 100644 --- a/golem-service-base/src/lib.rs +++ b/golem-service-base/src/lib.rs @@ -21,3 +21,6 @@ pub mod routing_table; pub mod service; pub mod stream; pub mod type_inference; + +#[cfg(test)] +test_r::enable!(); diff --git a/golem-service-base/src/service/component_object_store.rs b/golem-service-base/src/service/component_object_store.rs index 0d38e5b19..13c6171a1 100644 --- a/golem-service-base/src/service/component_object_store.rs +++ b/golem-service-base/src/service/component_object_store.rs @@ -249,11 +249,13 @@ impl ComponentObjectStore for FsComponentObjectStore { #[cfg(test)] mod tests { + use test_r::test; + use crate::config::ComponentStoreLocalConfig; use crate::service::component_object_store::{ComponentObjectStore, FsComponentObjectStore}; use futures::TryStreamExt; - #[tokio::test] + #[test] pub async fn test_fs_object_store() { let config = ComponentStoreLocalConfig { root_path: "/tmp/cloud-service".to_string(), diff --git a/golem-service-base/src/stream.rs b/golem-service-base/src/stream.rs index 3a5479237..e8764dc61 100644 --- a/golem-service-base/src/stream.rs +++ b/golem-service-base/src/stream.rs @@ -60,11 +60,13 @@ impl ByteStream { #[cfg(test)] mod tests { + use test_r::test; + use crate::stream::ByteStream; use anyhow::Error; use futures::{stream, StreamExt, TryStreamExt}; - #[tokio::test] + #[test] pub async fn test_byte_stream() { let stream = ByteStream::new(stream::iter(vec![Ok(vec![1, 2, 3]), Ok(vec![4, 5, 6])])); let stream_data: Vec = stream diff --git a/golem-service-base/src/type_inference.rs b/golem-service-base/src/type_inference.rs index 2d973a011..2261420c9 100644 --- a/golem-service-base/src/type_inference.rs +++ b/golem-service-base/src/type_inference.rs @@ -64,6 +64,8 @@ pub fn infer_analysed_type(value: &Value) -> AnalysedType { #[cfg(test)] mod tests { + use test_r::test; + use super::*; #[test] diff --git a/golem-shard-manager/Cargo.toml b/golem-shard-manager/Cargo.toml index 112f0c8e8..3020a1aae 100644 --- a/golem-shard-manager/Cargo.toml +++ b/golem-shard-manager/Cargo.toml @@ -5,10 +5,12 @@ edition = "2021" [lib] path = "src/lib.rs" +harness = false [[bin]] name = "golem-shard-manager" path = "src/server.rs" +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -45,6 +47,7 @@ warp = { workspace = true } [dev-dependencies] tracing-test = "0.2.4" +test-r = { workspace = true } [features] default = ["kubernetes"] diff --git a/golem-shard-manager/src/lib.rs b/golem-shard-manager/src/lib.rs index ee4d6cd3b..ded7292e6 100644 --- a/golem-shard-manager/src/lib.rs +++ b/golem-shard-manager/src/lib.rs @@ -51,6 +51,9 @@ use tracing::Instrument; use tracing::{debug, info, warn}; use worker_executor::{WorkerExecutorService, WorkerExecutorServiceDefault}; +#[cfg(test)] +test_r::enable!(); + pub struct ShardManagerServiceImpl { shard_management: ShardManagement, shard_manager_config: Arc, diff --git a/golem-shard-manager/src/rebalancing.rs b/golem-shard-manager/src/rebalancing.rs index db5521a3c..4bade8c64 100644 --- a/golem-shard-manager/src/rebalancing.rs +++ b/golem-shard-manager/src/rebalancing.rs @@ -248,6 +248,8 @@ impl Display for Rebalance { #[cfg(test)] mod tests { + use test_r::test; + use tracing_test::traced_test; use golem_common::model::ShardId; diff --git a/golem-shard-manager/src/server.rs b/golem-shard-manager/src/server.rs index d9ec02153..8ffb53fe9 100644 --- a/golem-shard-manager/src/server.rs +++ b/golem-shard-manager/src/server.rs @@ -12,6 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +#[cfg(test)] +test_r::enable!(); + +#[cfg(not(test))] fn main() -> Result<(), Box> { rustls::crypto::ring::default_provider() .install_default() diff --git a/golem-shard-manager/src/shard_manager_config.rs b/golem-shard-manager/src/shard_manager_config.rs index e3f127d16..5ec9d01aa 100644 --- a/golem-shard-manager/src/shard_manager_config.rs +++ b/golem-shard-manager/src/shard_manager_config.rs @@ -130,6 +130,8 @@ pub fn make_config_loader() -> ConfigLoader { #[cfg(test)] mod tests { + use test_r::test; + use crate::shard_manager_config::make_config_loader; #[test] diff --git a/golem-test-framework/Cargo.toml b/golem-test-framework/Cargo.toml index ba62399cb..33e006768 100644 --- a/golem-test-framework/Cargo.toml +++ b/golem-test-framework/Cargo.toml @@ -8,7 +8,7 @@ description = "Test framework for integration tests and benchmarks" repository = "https://github.com/golemcloud/golem" [lib] - +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -49,3 +49,6 @@ tracing-subscriber = { workspace = true } url = { workspace = true } uuid = { workspace = true } log = { version = "0.4.22", features = [] } + +[dev-dependencies] +test-r = { workspace = true } \ No newline at end of file diff --git a/golem-test-framework/src/dsl/benchmark.rs b/golem-test-framework/src/dsl/benchmark.rs index 1aad8d8f8..58ae49f6c 100644 --- a/golem-test-framework/src/dsl/benchmark.rs +++ b/golem-test-framework/src/dsl/benchmark.rs @@ -817,6 +817,8 @@ impl BenchmarkApi for B { #[cfg(test)] mod tests { + use test_r::test; + use crate::dsl::benchmark::{ BenchmarkResult, BenchmarkRunResult, CountResult, DurationResult, ResultKey, RunConfig, }; diff --git a/golem-test-framework/src/lib.rs b/golem-test-framework/src/lib.rs index f62d21097..a24a6e15b 100644 --- a/golem-test-framework/src/lib.rs +++ b/golem-test-framework/src/lib.rs @@ -22,3 +22,6 @@ pub mod config; pub mod dsl; pub type Result = anyhow::Result; + +#[cfg(test)] +test_r::enable!(); \ No newline at end of file diff --git a/golem-worker-executor-base/Cargo.toml b/golem-worker-executor-base/Cargo.toml index 66fc8ba6e..40aa1b2d9 100644 --- a/golem-worker-executor-base/Cargo.toml +++ b/golem-worker-executor-base/Cargo.toml @@ -12,6 +12,7 @@ autotests = false [lib] path = "src/lib.rs" +harness = false [features] @@ -103,6 +104,7 @@ redis = { workspace = true } serde_json = { workspace = true } testcontainers = { workspace = true } testcontainers-modules = { workspace = true } +test-r = { workspace = true } tracing-subscriber = { workspace = true } warp = { workspace = true } @@ -112,3 +114,4 @@ cargo_metadata = "0.18.1" [[test]] name = "integration" path = "tests/lib.rs" +harness = false \ No newline at end of file diff --git a/golem-worker-executor-base/src/durable_host/http/serialized.rs b/golem-worker-executor-base/src/durable_host/http/serialized.rs index 8606b255e..13118d16d 100644 --- a/golem-worker-executor-base/src/durable_host/http/serialized.rs +++ b/golem-worker-executor-base/src/durable_host/http/serialized.rs @@ -430,6 +430,8 @@ pub struct SerializableHttpRequest { #[cfg(test)] mod tests { + use test_r::test; + use crate::durable_host::http::serialized::{SerializableErrorCode, SerializedHttpVersion}; use http::Version; use proptest::option::of; diff --git a/golem-worker-executor-base/src/durable_host/serialized.rs b/golem-worker-executor-base/src/durable_host/serialized.rs index 4a8e2ea9c..54b4c7cfa 100644 --- a/golem-worker-executor-base/src/durable_host/serialized.rs +++ b/golem-worker-executor-base/src/durable_host/serialized.rs @@ -534,6 +534,8 @@ pub struct SerializableFileTimes { #[cfg(test)] mod tests { + use test_r::test; + use crate::durable_host::serialized::{ SerializableDateTime, SerializableError, SerializableIpAddress, SerializableIpAddresses, SerializableStreamError, diff --git a/golem-worker-executor-base/src/lib.rs b/golem-worker-executor-base/src/lib.rs index 1d5088c8c..755afca2f 100644 --- a/golem-worker-executor-base/src/lib.rs +++ b/golem-worker-executor-base/src/lib.rs @@ -28,6 +28,9 @@ pub mod wasi_host; pub mod worker; pub mod workerctx; +#[cfg(test)] +test_r::enable!(); + use crate::grpc::WorkerExecutorImpl; use crate::http_server::HttpServerImpl; use crate::services::active_workers::ActiveWorkers; diff --git a/golem-worker-executor-base/src/model/mod.rs b/golem-worker-executor-base/src/model/mod.rs index e5ad58422..5de31784d 100644 --- a/golem-worker-executor-base/src/model/mod.rs +++ b/golem-worker-executor-base/src/model/mod.rs @@ -344,6 +344,8 @@ pub enum LookupResult { #[cfg(test)] mod tests { + use test_r::test; + use uuid::Uuid; use golem_common::model::ComponentId; diff --git a/golem-worker-executor-base/src/services/blob_store.rs b/golem-worker-executor-base/src/services/blob_store.rs index f008a883f..4688e3129 100644 --- a/golem-worker-executor-base/src/services/blob_store.rs +++ b/golem-worker-executor-base/src/services/blob_store.rs @@ -425,6 +425,8 @@ pub struct ObjectMetadata { #[cfg(test)] mod tests { + use test_r::test; + use std::path::Path; use std::sync::Arc; @@ -612,52 +614,52 @@ mod tests { DefaultBlobStoreService::new(blob_storage) } - #[tokio::test] + #[test] async fn test_container_exists_in_memory() { let blob_store = in_memory_blob_store(); test_container_exists(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_exists_local() { let tempdir = TempDir::new().unwrap(); let blob_store = fs_blob_store(tempdir.path()).await; test_container_exists(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_delete_in_memory() { let blob_store = in_memory_blob_store(); test_container_delete(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_delete_local() { let tempdir = TempDir::new().unwrap(); let blob_store = fs_blob_store(tempdir.path()).await; test_container_delete(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_has_write_read_has_in_memory() { let blob_store = in_memory_blob_store(); test_container_has_write_read_has(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_has_write_read_has_local() { let tempdir = TempDir::new().unwrap(); let blob_store = fs_blob_store(tempdir.path()).await; test_container_has_write_read_has(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_list_copy_move_list_in_memory() { let blob_store = in_memory_blob_store(); test_container_list_copy_move_list(&blob_store).await; } - #[tokio::test] + #[test] async fn test_container_list_copy_move_list_local() { let tempdir = TempDir::new().unwrap(); let blob_store = fs_blob_store(tempdir.path()).await; diff --git a/golem-worker-executor-base/src/services/oplog/tests.rs b/golem-worker-executor-base/src/services/oplog/tests.rs index 8e8f3ffb0..d5e5e7ef3 100644 --- a/golem-worker-executor-base/src/services/oplog/tests.rs +++ b/golem-worker-executor-base/src/services/oplog/tests.rs @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +use test_r::test; + use assert2::check; use ctor::ctor; use nonempty_collections::nev; @@ -236,7 +238,7 @@ fn rounded(entry: OplogEntry) -> OplogEntry { } } -#[tokio::test] +#[test] async fn open_add_and_read_back() { let indexed_storage = Arc::new(InMemoryIndexedStorage::new()); let blob_storage = Arc::new(InMemoryBlobStorage::new()); @@ -284,7 +286,7 @@ async fn open_add_and_read_back() { ); } -#[tokio::test] +#[test] async fn open_add_and_read_back_ephemeral() { let indexed_storage = Arc::new(InMemoryIndexedStorage::new()); let blob_storage = Arc::new(InMemoryBlobStorage::new()); @@ -346,7 +348,7 @@ async fn open_add_and_read_back_ephemeral() { ); } -#[tokio::test] +#[test] async fn entries_with_small_payload() { let indexed_storage = Arc::new(InMemoryIndexedStorage::new()); let blob_storage = Arc::new(InMemoryBlobStorage::new()); @@ -456,7 +458,7 @@ async fn entries_with_small_payload() { assert_eq!(p4, vec![1, 2, 3]); } -#[tokio::test] +#[test] async fn entries_with_large_payload() { let indexed_storage = Arc::new(InMemoryIndexedStorage::new()); let blob_storage = Arc::new(InMemoryBlobStorage::new()); @@ -570,32 +572,32 @@ async fn entries_with_large_payload() { assert_eq!(p4, large_payload4); } -#[tokio::test] +#[test] async fn multilayer_transfers_entries_after_limit_reached_1() { multilayer_transfers_entries_after_limit_reached(false, 315, 5, 1, 3, false).await; } -#[tokio::test] +#[test] async fn multilayer_transfers_entries_after_limit_reached_2() { multilayer_transfers_entries_after_limit_reached(false, 12, 2, 1, 0, false).await; } -#[tokio::test] +#[test] async fn multilayer_transfers_entries_after_limit_reached_3() { multilayer_transfers_entries_after_limit_reached(false, 10000, 0, 0, 100, false).await; } -#[tokio::test] +#[test] async fn blob_multilayer_transfers_entries_after_limit_reached_1() { multilayer_transfers_entries_after_limit_reached(false, 315, 5, 1, 3, true).await; } -#[tokio::test] +#[test] async fn blob_multilayer_transfers_entries_after_limit_reached_2() { multilayer_transfers_entries_after_limit_reached(false, 12, 2, 1, 0, true).await; } -#[tokio::test] +#[test] async fn blob_multilayer_transfers_entries_after_limit_reached_3() { multilayer_transfers_entries_after_limit_reached(false, 10000, 0, 0, 100, true).await; } @@ -706,12 +708,12 @@ async fn multilayer_transfers_entries_after_limit_reached( check!(all_entries.values().cloned().collect::>() == entries); } -#[tokio::test] +#[test] async fn read_from_archive() { read_from_archive_impl(false).await; } -#[tokio::test] +#[test] async fn blob_read_from_archive() { read_from_archive_impl(true).await; } @@ -800,32 +802,32 @@ async fn read_from_archive_impl(use_blob: bool) { assert_eq!(first10.into_values().collect::>(), original_first10); } -#[tokio::test] +#[test] async fn write_after_archive() { write_after_archive_impl(false, Reopen::No).await; } -#[tokio::test] +#[test] async fn blob_write_after_archive() { write_after_archive_impl(true, Reopen::No).await; } -#[tokio::test] +#[test] async fn write_after_archive_reopen() { write_after_archive_impl(false, Reopen::Yes).await; } -#[tokio::test] +#[test] async fn blob_write_after_archive_reopen() { write_after_archive_impl(true, Reopen::Yes).await; } -#[tokio::test] +#[test] async fn write_after_archive_reopen_full() { write_after_archive_impl(false, Reopen::Full).await; } -#[tokio::test] +#[test] async fn blob_write_after_archive_reopen_full() { write_after_archive_impl(true, Reopen::Full).await; } @@ -1058,12 +1060,12 @@ async fn write_after_archive_impl(use_blob: bool, reopen: Reopen) { ); } -#[tokio::test] +#[test] async fn empty_layer_gets_deleted() { empty_layer_gets_deleted_impl(false).await; } -#[tokio::test] +#[test] async fn blob_empty_layer_gets_deleted() { empty_layer_gets_deleted_impl(true).await; } @@ -1163,12 +1165,12 @@ async fn empty_layer_gets_deleted_impl(use_blob: bool) { assert!(tertiary_exists); } -#[tokio::test] +#[test] async fn scheduled_archive() { scheduled_archive_impl(false).await; } -#[tokio::test] +#[test] async fn blob_scheduled_archive() { scheduled_archive_impl(true).await; } diff --git a/golem-worker-executor-base/src/services/scheduler.rs b/golem-worker-executor-base/src/services/scheduler.rs index c0eab5013..bdfbb8fff 100644 --- a/golem-worker-executor-base/src/services/scheduler.rs +++ b/golem-worker-executor-base/src/services/scheduler.rs @@ -290,6 +290,8 @@ impl SchedulerService for SchedulerServiceDefault { #[cfg(test)] mod tests { + use test_r::test; + use std::collections::{HashMap, HashSet}; use std::str::FromStr; use std::sync::Arc; @@ -355,7 +357,7 @@ mod tests { Arc::new(DefaultWorkerService::new(kvs, shard_service, oplog_service)) } - #[tokio::test] + #[test] pub async fn promises_added_to_expected_buckets() { let uuid = Uuid::new_v4(); let c1: ComponentId = ComponentId(uuid); @@ -473,7 +475,7 @@ mod tests { ); } - #[tokio::test] + #[test] pub async fn cancel_removes_entry() { let c1: ComponentId = ComponentId(Uuid::new_v4()); let i1: WorkerId = WorkerId { @@ -575,7 +577,7 @@ mod tests { ); } - #[tokio::test] + #[test] pub async fn process_current_hours_past_schedules() { let c1: ComponentId = ComponentId(Uuid::new_v4()); let i1: WorkerId = WorkerId { @@ -682,7 +684,7 @@ mod tests { assert!(!completed_promises.contains(&p2)); } - #[tokio::test] + #[test] pub async fn process_past_and_current_hours_past_schedules() { let c1: ComponentId = ComponentId(Uuid::new_v4()); let i1: WorkerId = WorkerId { @@ -783,7 +785,7 @@ mod tests { assert!(completed_promises.contains(&p2)); } - #[tokio::test] + #[test] pub async fn process_past_and_current_hours_past_schedules_2() { let c1: ComponentId = ComponentId(Uuid::new_v4()); let i1: WorkerId = WorkerId { @@ -898,7 +900,7 @@ mod tests { assert!(completed_promises.contains(&p4)); } - #[tokio::test] + #[test] pub async fn process_past_and_current_hours_past_schedules_3() { let c1: ComponentId = ComponentId(Uuid::new_v4()); let i1: WorkerId = WorkerId { diff --git a/golem-worker-executor-base/src/services/worker_event.rs b/golem-worker-executor-base/src/services/worker_event.rs index 87c4ec038..f25fa431f 100644 --- a/golem-worker-executor-base/src/services/worker_event.rs +++ b/golem-worker-executor-base/src/services/worker_event.rs @@ -199,6 +199,8 @@ fn label(event: &WorkerEvent) -> &'static str { #[cfg(test)] mod tests { + use test_r::test; + use std::sync::Arc; use tokio::sync::Mutex; @@ -207,7 +209,7 @@ mod tests { WorkerEvent, WorkerEventService, WorkerEventServiceDefault, }; - #[tokio::test] + #[test] pub async fn both_subscriber_gets_events_small() { let svc = Arc::new(WorkerEventServiceDefault::new(4, 16)); let rx1_events = Arc::new(Mutex::new(Vec::::new())); @@ -283,7 +285,7 @@ mod tests { ) } - #[tokio::test] + #[test] pub async fn both_subscriber_gets_events_large() { let svc = Arc::new(WorkerEventServiceDefault::new(4, 4)); let rx1_events = Arc::new(Mutex::new(Vec::::new())); diff --git a/golem-worker-executor-base/src/storage/indexed/memory.rs b/golem-worker-executor-base/src/storage/indexed/memory.rs index 8c2b22771..98fe3627e 100644 --- a/golem-worker-executor-base/src/storage/indexed/memory.rs +++ b/golem-worker-executor-base/src/storage/indexed/memory.rs @@ -257,10 +257,12 @@ impl IndexedStorage for InMemoryIndexedStorage { #[cfg(test)] mod tests { + use test_r::test; + use crate::storage::indexed::{IndexedStorageLabelledApi, IndexedStorageNamespace}; use assert2::check; - #[tokio::test] + #[test] async fn closest_exact_match() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -287,7 +289,7 @@ mod tests { check!(result == Some((3, 300))); } - #[tokio::test] + #[test] async fn closest_no_match() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -314,7 +316,7 @@ mod tests { check!(result == None); } - #[tokio::test] + #[test] async fn closest_match() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -341,7 +343,7 @@ mod tests { check!(result == Some((40, 400))); } - #[tokio::test] + #[test] async fn read() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -368,7 +370,7 @@ mod tests { check!(result == vec![(20, 200), (30, 300), (40, 400)]); } - #[tokio::test] + #[test] async fn read_wider() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -395,7 +397,7 @@ mod tests { check!(result == vec![(10, 100), (20, 200), (30, 300), (40, 400)]); } - #[tokio::test] + #[test] async fn first() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -416,7 +418,7 @@ mod tests { check!(result == Some((10, 100))); } - #[tokio::test] + #[test] async fn last() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); @@ -434,7 +436,7 @@ mod tests { check!(result == Some((20, 200))); } - #[tokio::test] + #[test] async fn drop_prefix() { let storage = super::InMemoryIndexedStorage::new(); let api = storage.with_entity("test", "test", "test"); diff --git a/golem-worker-executor-base/tests/lib.rs b/golem-worker-executor-base/tests/lib.rs index 611b8316b..b69f2a105 100644 --- a/golem-worker-executor-base/tests/lib.rs +++ b/golem-worker-executor-base/tests/lib.rs @@ -59,6 +59,8 @@ pub mod ts_rpc1; pub mod ts_rpc2; pub mod wasi; +test_r::enable!(); + #[derive(Clone)] pub(crate) struct WorkerExecutorPerTestDependencies { redis: Arc, diff --git a/golem-worker-executor/Cargo.toml b/golem-worker-executor/Cargo.toml index 2d350d660..6ccbfb23d 100644 --- a/golem-worker-executor/Cargo.toml +++ b/golem-worker-executor/Cargo.toml @@ -8,11 +8,13 @@ repository = "https://github.com/golemcloud/golem" description = "Golem worker executor service" [lib] +harness = false # Rename to golem-worker-executor ? [[bin]] name = "worker-executor" path = "src/server.rs" +harness = false [dependencies] golem-api-grpc = { path = "../golem-api-grpc", version = "0.0.0" } @@ -40,3 +42,6 @@ uuid = { workspace = true } wasmtime = { workspace = true } wasmtime-wasi = { workspace = true } wasmtime-wasi-http = { workspace = true } + +[dev-dependencies] +test-r = { workspace = true } diff --git a/golem-worker-executor/src/lib.rs b/golem-worker-executor/src/lib.rs index bdb4ba73e..5f8aa3141 100644 --- a/golem-worker-executor/src/lib.rs +++ b/golem-worker-executor/src/lib.rs @@ -49,6 +49,9 @@ use tracing::info; use wasmtime::component::Linker; use wasmtime::Engine; +#[cfg(test)] +test_r::enable!(); + struct ServerBootstrap {} #[async_trait] diff --git a/golem-worker-executor/src/server.rs b/golem-worker-executor/src/server.rs index 6dd936805..f363d05d2 100644 --- a/golem-worker-executor/src/server.rs +++ b/golem-worker-executor/src/server.rs @@ -19,6 +19,10 @@ use golem_worker_executor::run; use golem_worker_executor_base::metrics; use golem_worker_executor_base::services::golem_config::make_config_loader; +#[cfg(test)] +test_r::enable!(); + +#[cfg(not(test))] fn main() -> Result<(), Box> { match make_config_loader().load_or_dump_config() { Some(mut config) => { diff --git a/golem-worker-executor/src/services/config.rs b/golem-worker-executor/src/services/config.rs index aaf8d5b8a..a019deeb9 100644 --- a/golem-worker-executor/src/services/config.rs +++ b/golem-worker-executor/src/services/config.rs @@ -14,6 +14,8 @@ #[cfg(test)] mod tests { + use test_r::test; + use golem_worker_executor_base::services::golem_config::{ make_config_loader, ShardManagerServiceConfig, };