Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-httpclient

Named HTTP clients for Pudu: a client factory, delegating handlers, pooled keep-alive connections, handler lifetimes, logging, and resilience

0.1.1Apache-2.01

InstallClose

MetricsTest.pudu

Pudu36 lines1.9 KB

GitHub ↗
1/** @Test.Handlers.Metrics.Suite — counts and durations of the requests through a pipeline */2module PuduLangHttpClient.Handlers.MetricsTest34import Std.Concurrent.Cancel as Cancel5import Std.Io as Io6import Std.Json as Json7import Std.Test as Test8import PuduLangHttpClient.Handler as Handler9import PuduLangHttpClient.Handlers.Metrics as Metrics10import PuduLangHttpClient as HttpClient11import PuduLangHttpClient.Request as Request12import PuduLangHttpClient.Response as Response13import PuduLangHttpClient.Stub as Stub1415/// Runs the suite.16fn main() -> Int {17  let stub = Stub.create()18  Stub.when(&stub, |request: Request.Request| request.uri.endsWith("/fail"), |_request: Request.Request| Err(HttpClient.ResponseEnded))19  Stub.when(&stub, |_request: Request.Request| true, |request: Request.Request| Ok(Response.answer(&request, match request.uri.split("/").reverse()[0].toInt() { case Some(code) => code case None => 200 })))20  let meter = Metrics.meter()21  let send = Handler.around(Metrics.handler(&meter), Stub.send(&stub))22  for path in ["100", "200", "204", "302", "404", "500", "fail"] { let _sent = send(Request.get("http://a/" + path), Cancel.token()) }23  let snapshot = Metrics.snapshot(&meter)24  let checks = Test.suite("Handlers.Metrics", &[25      Test.equals("every request is counted by status class or as failed", &(snapshot.requests, snapshot.informational, snapshot.successful, snapshot.redirected, snapshot.clientErrors, snapshot.serverErrors, snapshot.failed), &(7, 1, 2, 1, 1, 1, 1)),26      Test.equals("nothing is left in flight", &snapshot.active, &0),27      Test.that("durations are added up and the longest kept", snapshot.totalMillis >= snapshot.longestMillis && snapshot.longestMillis >= 0),28      Test.that("a snapshot writes itself as JSON", Json.encode(&snapshot.encode()).startsWith("\{\"requests\":7,\"active\":0,"))29    ])30  let ran = Test.run(&checks)31  for failure in Test.failuresOf(&ran) {32    let _reported = Io.writeErrorLine(failure)33  }34  Test.report(&ran)35}36