diff --git a/src/agent/Cargo.lock b/src/agent/Cargo.lock index dc1c2eae9..7711c1f3a 100644 --- a/src/agent/Cargo.lock +++ b/src/agent/Cargo.lock @@ -64,6 +64,23 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0ffd3d69bd89910509a5d31d1f1353f38ccffdd116dd0099bbd6627f7bd8ad8" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "async-channel" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-trait" version = "0.1.50" @@ -169,6 +186,12 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" +[[package]] +name = "cache-padded" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" + [[package]] name = "cassowary" version = "0.3.0" @@ -221,6 +244,26 @@ dependencies = [ "vec_map", ] +[[package]] +name = "concurrent-queue" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +dependencies = [ + "cache-padded", +] + +[[package]] +name = "config" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b076e143e1d9538dde65da30f8481c2a6c44040edb8e02b9bf1351edb92ce3" +dependencies = [ + "lazy_static", + "nom", + "serde", +] + [[package]] name = "core-foundation" version = "0.9.1" @@ -338,6 +381,16 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.5", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -404,6 +457,26 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "data-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ee2393c4a91429dffb4bedf19f4d6abf27d8a732c8ce4980305d782e5426d57" + +[[package]] +name = "deadpool" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d126179d86aee4556e54f5f3c6bf6d9884e7cc52cef82f77ee6f90a7747616d" +dependencies = [ + "async-trait", + "config", + "crossbeam-queue", + "num_cpus", + "serde", + "tokio 1.6.1", +] + [[package]] name = "debugger" version = "0.1.0" @@ -513,12 +586,27 @@ dependencies = [ "libc", ] +[[package]] +name = "event-listener" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" + [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fastrand" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb" +dependencies = [ + "instant", +] + [[package]] name = "filetime" version = "0.2.14" @@ -703,6 +791,21 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite 0.2.6", + "waker-fn", +] + [[package]] name = "futures-macro" version = "0.3.15" @@ -728,6 +831,12 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + [[package]] name = "futures-util" version = "0.3.15" @@ -918,6 +1027,27 @@ dependencies = [ "pin-project-lite 0.2.6", ] +[[package]] +name = "http-types" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad077d89137cd3debdce53c66714dc536525ef43fe075d41ddc0a8ac11f85957" +dependencies = [ + "anyhow", + "async-channel", + "base64", + "futures-lite", + "http", + "infer", + "pin-project-lite 0.2.6", + "rand 0.7.3", + "serde", + "serde_json", + "serde_qs", + "serde_urlencoded", + "url", +] + [[package]] name = "httparse" version = "1.4.1" @@ -1047,6 +1177,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "infer" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" + [[package]] name = "inotify" version = "0.7.1" @@ -1146,6 +1282,19 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lexical-core" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" +dependencies = [ + "arrayvec", + "bitflags", + "cfg-if 1.0.0", + "ryu", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.95" @@ -1402,6 +1551,17 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "lexical-core", + "memchr", + "version_check", +] + [[package]] name = "notify" version = "4.0.17" @@ -1651,6 +1811,12 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + [[package]] name = "parking_lot" version = "0.11.1" @@ -2152,6 +2318,7 @@ dependencies = [ "onefuzz-telemetry", "reqwest 0.11.3", "tokio 1.6.1", + "wiremock", ] [[package]] @@ -2305,6 +2472,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_qs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5af82de3c6549b001bec34961ff2d6a54339a87bab37ce901b693401f27de6cb" +dependencies = [ + "data-encoding", + "percent-encoding", + "serde", + "thiserror", +] + [[package]] name = "serde_urlencoded" version = "0.7.0" @@ -2955,6 +3134,12 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "walkdir" version = "2.3.2" @@ -3139,6 +3324,26 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "wiremock" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deed3c6d9aba42c805725854efc01823f59a00cd3af7763c433962227a843c8" +dependencies = [ + "async-trait", + "deadpool", + "futures", + "futures-timer", + "http-types", + "hyper 0.14.8", + "log", + "once_cell", + "regex", + "serde", + "serde_json", + "tokio 1.6.1", +] + [[package]] name = "ws2_32-sys" version = "0.2.1" diff --git a/src/agent/reqwest-retry/Cargo.toml b/src/agent/reqwest-retry/Cargo.toml index 5da527e30..d8fd12425 100644 --- a/src/agent/reqwest-retry/Cargo.toml +++ b/src/agent/reqwest-retry/Cargo.toml @@ -15,3 +15,4 @@ reqwest = { version = "0.11.3", features = ["json", "stream"] } [dev-dependencies] tokio = { version = "1.5.0", features = ["macros"] } +wiremock = "0.5" diff --git a/src/agent/reqwest-retry/src/lib.rs b/src/agent/reqwest-retry/src/lib.rs index 9c7c045e3..f759fec3a 100644 --- a/src/agent/reqwest-retry/src/lib.rs +++ b/src/agent/reqwest-retry/src/lib.rs @@ -175,6 +175,25 @@ impl SendRetry for reqwest::RequestBuilder { #[cfg(test)] mod test { use super::*; + use wiremock::matchers::path; + use wiremock::{Mock, MockServer, ResponseTemplate}; + + async fn build_server() -> Result { + let server = MockServer::start().await; + server + .register(Mock::given(path("/200")).respond_with(ResponseTemplate::new(200))) + .await; + server + .register(Mock::given(path("/400")).respond_with(ResponseTemplate::new(400))) + .await; + server + .register(Mock::given(path("/401")).respond_with(ResponseTemplate::new(401))) + .await; + server + .register(Mock::given(path("/404")).respond_with(ResponseTemplate::new(404))) + .await; + Ok(server) + } fn always_fail(_: StatusCode) -> RetryCheck { RetryCheck::Fail @@ -189,8 +208,9 @@ mod test { #[tokio::test] async fn retry_success() -> Result<()> { + let server = build_server().await?; reqwest::Client::new() - .get("https://httpstat.us/200") + .get(format!("{}/200", &server.uri())) .send_retry_default() .await? .error_for_status()?; @@ -199,15 +219,15 @@ mod test { #[tokio::test] async fn retry_socket_failure() -> Result<()> { - let invalid_url = "http://127.0.0.1:81/test.txt"; + let server = build_server().await?; let resp = reqwest::Client::new() - .get(invalid_url) + .get(format!("{}/404", &server.uri())) .send_retry(always_retry, Duration::from_millis(1), 3) .await; match resp { - Ok(_) => { - anyhow::bail!("response should have failed: {}", invalid_url); + Ok(result) => { + anyhow::bail!("response should have failed: {:?}", result); } Err(err) => { let as_text = format!("{:?}", err); @@ -220,9 +240,9 @@ mod test { #[tokio::test] async fn retry_fail_normal() -> Result<()> { - let invalid_url = "https://httpstat.us/400"; + let server = build_server().await?; let resp = reqwest::Client::new() - .get(invalid_url) + .get(format!("{}/400", &server.uri())) .send_retry(always_retry, Duration::from_millis(1), 3) .await; @@ -241,9 +261,9 @@ mod test { #[tokio::test] async fn retry_fail_fast() -> Result<()> { - let invalid_url = "https://httpstat.us/400"; + let server = build_server().await?; let resp = reqwest::Client::new() - .get(invalid_url) + .get(format!("{}/400", &server.uri())) .send_retry(always_fail, Duration::from_millis(1), 3) .await; @@ -255,9 +275,9 @@ mod test { #[tokio::test] async fn retry_400_success() -> Result<()> { - let invalid_url = "https://httpstat.us/400"; + let server = build_server().await?; let resp = reqwest::Client::new() - .get(invalid_url) + .get(format!("{}/400", &server.uri())) .send_retry(succeed_400, Duration::from_millis(1), 3) .await?; @@ -267,9 +287,9 @@ mod test { #[tokio::test] async fn retry_400_with_retry() -> Result<()> { - let invalid_url = "https://httpstat.us/401"; + let server = build_server().await?; let resp = reqwest::Client::new() - .get(invalid_url) + .get(format!("{}/401", &server.uri())) .send_retry(succeed_400, Duration::from_millis(1), 3) .await;