From 6a0c2449e4c4d22cf18e508bd1f13088a3314ca7 Mon Sep 17 00:00:00 2001 From: Mateus Cruz Date: Sun, 11 Feb 2024 16:44:31 -0300 Subject: test: concurrency test --- lib/handler.ml | 6 +++ .../RinhaBackendCrebitosSimulation.scala | 53 ++++++++++++++++------ 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/lib/handler.ml b/lib/handler.ml index fb43239..c1ba53d 100644 --- a/lib/handler.ml +++ b/lib/handler.ml @@ -44,6 +44,12 @@ let create_transaction client_id (db_pool : pool) (request : Request.t) = in (match insert_result with | Ok () -> + let client = + Option.get + @@ Option.join + @@ Result.to_option + @@ Query.find_client client_id conn + in let json : Yojson.Safe.t = `Assoc [ "limite", `Int client.mov_limit; "saldo", `Int client.balance ] in diff --git a/load-test/user-files/simulations/rinhabackend/RinhaBackendCrebitosSimulation.scala b/load-test/user-files/simulations/rinhabackend/RinhaBackendCrebitosSimulation.scala index 1ad31cb..b6e0ace 100644 --- a/load-test/user-files/simulations/rinhabackend/RinhaBackendCrebitosSimulation.scala +++ b/load-test/user-files/simulations/rinhabackend/RinhaBackendCrebitosSimulation.scala @@ -111,6 +111,25 @@ class RinhaBackendCrebitosSimulation ) ) + val validacaDebitosConcorrentesNumRequests = 25 + val validacaDebitosConcorrentesTransacaoes = scenario("validação concorrência transações") + .exec( + http("validações concorrência") + .post("/clientes/4/transacoes") + .header("content-type", "application/json") + .body(StringBody("""{"valor": 1, "tipo": "d", "descricao": "validacao"}""")) + .check(status.is(200)) + ) + + val validacaDebitosConcorrentesExtrato = scenario("validação concorrência extrato") + .exec( + http("validações concorrência") + .get("/clientes/4/extrato") + .check( + jmesPath("saldo.total").ofType[Int].is(validacaDebitosConcorrentesNumRequests * -1) + ) + ) + val saldosIniciaisClientes = Array( Map("id" -> 1, "limite" -> 1000 * 100), Map("id" -> 2, "limite" -> 800 * 100), @@ -217,20 +236,28 @@ class RinhaBackendCrebitosSimulation comportam individualmente. */ setUp( - criteriosClientes.inject( - atOnceUsers(1) + validacaDebitosConcorrentesTransacaoes.inject( + atOnceUsers(validacaDebitosConcorrentesNumRequests) + ).andThen( + validacaDebitosConcorrentesExtrato.inject( + atOnceUsers(1) + ) ).andThen( - debitos.inject( - rampUsersPerSec(1).to(220).during(2.minutes), - constantUsersPerSec(220).during(2.minutes) - ), - creditos.inject( - rampUsersPerSec(1).to(110).during(2.minutes), - constantUsersPerSec(110).during(2.minutes) - ), - extratos.inject( - rampUsersPerSec(1).to(10).during(2.minutes), - constantUsersPerSec(10).during(2.minutes) + criteriosClientes.inject( + atOnceUsers(1) + ).andThen( + debitos.inject( + rampUsersPerSec(1).to(220).during(2.minutes), + constantUsersPerSec(220).during(2.minutes) + ), + creditos.inject( + rampUsersPerSec(1).to(110).during(2.minutes), + constantUsersPerSec(110).during(2.minutes) + ), + extratos.inject( + rampUsersPerSec(1).to(10).during(2.minutes), + constantUsersPerSec(10).during(2.minutes) + ) ) ) ).protocols(httpProtocol) -- cgit v1.2.3