move to wiremock for testing (#971)

This commit is contained in:
bmc-msft
2021-06-09 12:04:10 -04:00
committed by GitHub
parent 78d5a58965
commit 3794bb0c68
3 changed files with 239 additions and 13 deletions

205
src/agent/Cargo.lock generated
View File

@ -64,6 +64,23 @@ version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0ffd3d69bd89910509a5d31d1f1353f38ccffdd116dd0099bbd6627f7bd8ad8" 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]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.50" version = "0.1.50"
@ -169,6 +186,12 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
[[package]]
name = "cache-padded"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
[[package]] [[package]]
name = "cassowary" name = "cassowary"
version = "0.3.0" version = "0.3.0"
@ -221,6 +244,26 @@ dependencies = [
"vec_map", "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]] [[package]]
name = "core-foundation" name = "core-foundation"
version = "0.9.1" version = "0.9.1"
@ -338,6 +381,16 @@ dependencies = [
"scopeguard", "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]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.7.2" version = "0.7.2"
@ -404,6 +457,26 @@ dependencies = [
"winapi 0.3.9", "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]] [[package]]
name = "debugger" name = "debugger"
version = "0.1.0" version = "0.1.0"
@ -513,12 +586,27 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "event-listener"
version = "2.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
[[package]] [[package]]
name = "fallible-iterator" name = "fallible-iterator"
version = "0.2.0" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
[[package]]
name = "fastrand"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb"
dependencies = [
"instant",
]
[[package]] [[package]]
name = "filetime" name = "filetime"
version = "0.2.14" version = "0.2.14"
@ -703,6 +791,21 @@ version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" 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]] [[package]]
name = "futures-macro" name = "futures-macro"
version = "0.3.15" version = "0.3.15"
@ -728,6 +831,12 @@ version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae"
[[package]]
name = "futures-timer"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.15" version = "0.3.15"
@ -918,6 +1027,27 @@ dependencies = [
"pin-project-lite 0.2.6", "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]] [[package]]
name = "httparse" name = "httparse"
version = "1.4.1" version = "1.4.1"
@ -1047,6 +1177,12 @@ dependencies = [
"hashbrown", "hashbrown",
] ]
[[package]]
name = "infer"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac"
[[package]] [[package]]
name = "inotify" name = "inotify"
version = "0.7.1" version = "0.7.1"
@ -1146,6 +1282,19 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" 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]] [[package]]
name = "libc" name = "libc"
version = "0.2.95" version = "0.2.95"
@ -1402,6 +1551,17 @@ dependencies = [
"libc", "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]] [[package]]
name = "notify" name = "notify"
version = "4.0.17" version = "4.0.17"
@ -1651,6 +1811,12 @@ dependencies = [
"winapi 0.3.9", "winapi 0.3.9",
] ]
[[package]]
name = "parking"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.11.1" version = "0.11.1"
@ -2152,6 +2318,7 @@ dependencies = [
"onefuzz-telemetry", "onefuzz-telemetry",
"reqwest 0.11.3", "reqwest 0.11.3",
"tokio 1.6.1", "tokio 1.6.1",
"wiremock",
] ]
[[package]] [[package]]
@ -2305,6 +2472,18 @@ dependencies = [
"serde", "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]] [[package]]
name = "serde_urlencoded" name = "serde_urlencoded"
version = "0.7.0" version = "0.7.0"
@ -2955,6 +3134,12 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe"
[[package]]
name = "waker-fn"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
[[package]] [[package]]
name = "walkdir" name = "walkdir"
version = "2.3.2" version = "2.3.2"
@ -3139,6 +3324,26 @@ dependencies = [
"winapi 0.3.9", "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]] [[package]]
name = "ws2_32-sys" name = "ws2_32-sys"
version = "0.2.1" version = "0.2.1"

View File

@ -15,3 +15,4 @@ reqwest = { version = "0.11.3", features = ["json", "stream"] }
[dev-dependencies] [dev-dependencies]
tokio = { version = "1.5.0", features = ["macros"] } tokio = { version = "1.5.0", features = ["macros"] }
wiremock = "0.5"

View File

@ -175,6 +175,25 @@ impl SendRetry for reqwest::RequestBuilder {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use wiremock::matchers::path;
use wiremock::{Mock, MockServer, ResponseTemplate};
async fn build_server() -> Result<MockServer> {
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 { fn always_fail(_: StatusCode) -> RetryCheck {
RetryCheck::Fail RetryCheck::Fail
@ -189,8 +208,9 @@ mod test {
#[tokio::test] #[tokio::test]
async fn retry_success() -> Result<()> { async fn retry_success() -> Result<()> {
let server = build_server().await?;
reqwest::Client::new() reqwest::Client::new()
.get("https://httpstat.us/200") .get(format!("{}/200", &server.uri()))
.send_retry_default() .send_retry_default()
.await? .await?
.error_for_status()?; .error_for_status()?;
@ -199,15 +219,15 @@ mod test {
#[tokio::test] #[tokio::test]
async fn retry_socket_failure() -> Result<()> { 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() let resp = reqwest::Client::new()
.get(invalid_url) .get(format!("{}/404", &server.uri()))
.send_retry(always_retry, Duration::from_millis(1), 3) .send_retry(always_retry, Duration::from_millis(1), 3)
.await; .await;
match resp { match resp {
Ok(_) => { Ok(result) => {
anyhow::bail!("response should have failed: {}", invalid_url); anyhow::bail!("response should have failed: {:?}", result);
} }
Err(err) => { Err(err) => {
let as_text = format!("{:?}", err); let as_text = format!("{:?}", err);
@ -220,9 +240,9 @@ mod test {
#[tokio::test] #[tokio::test]
async fn retry_fail_normal() -> Result<()> { async fn retry_fail_normal() -> Result<()> {
let invalid_url = "https://httpstat.us/400"; let server = build_server().await?;
let resp = reqwest::Client::new() let resp = reqwest::Client::new()
.get(invalid_url) .get(format!("{}/400", &server.uri()))
.send_retry(always_retry, Duration::from_millis(1), 3) .send_retry(always_retry, Duration::from_millis(1), 3)
.await; .await;
@ -241,9 +261,9 @@ mod test {
#[tokio::test] #[tokio::test]
async fn retry_fail_fast() -> Result<()> { async fn retry_fail_fast() -> Result<()> {
let invalid_url = "https://httpstat.us/400"; let server = build_server().await?;
let resp = reqwest::Client::new() let resp = reqwest::Client::new()
.get(invalid_url) .get(format!("{}/400", &server.uri()))
.send_retry(always_fail, Duration::from_millis(1), 3) .send_retry(always_fail, Duration::from_millis(1), 3)
.await; .await;
@ -255,9 +275,9 @@ mod test {
#[tokio::test] #[tokio::test]
async fn retry_400_success() -> Result<()> { async fn retry_400_success() -> Result<()> {
let invalid_url = "https://httpstat.us/400"; let server = build_server().await?;
let resp = reqwest::Client::new() let resp = reqwest::Client::new()
.get(invalid_url) .get(format!("{}/400", &server.uri()))
.send_retry(succeed_400, Duration::from_millis(1), 3) .send_retry(succeed_400, Duration::from_millis(1), 3)
.await?; .await?;
@ -267,9 +287,9 @@ mod test {
#[tokio::test] #[tokio::test]
async fn retry_400_with_retry() -> Result<()> { async fn retry_400_with_retry() -> Result<()> {
let invalid_url = "https://httpstat.us/401"; let server = build_server().await?;
let resp = reqwest::Client::new() let resp = reqwest::Client::new()
.get(invalid_url) .get(format!("{}/401", &server.uri()))
.send_retry(succeed_400, Duration::from_millis(1), 3) .send_retry(succeed_400, Duration::from_millis(1), 3)
.await; .await;