Repository navigation
crowdsim 1.20.5
The authenticated classes were run against a real target for the first time, and two of the three
findings are about a run that looks green while measuring nothing. The definition came from the
generator the StreamWay+ campaign of 2026-09-04 actually used: the sign-in it saturated is not an
identity-provider token endpoint but an application login — POST /api/auth/login, an
application/x-www-form-urlencoded body, the token at data.access_token. That is why the backend
saturated while the identity provider sat at 26%: the load never reached it directly.
Fixed
- A login could not read its token at all, and it aborted the scenario mid-ramp. The run sets
discardResponseBodies: true— headers are the measurement, bodies are RAM — sores.bodyis
undefined, and in the generator's runtimeJSON.parse(undefined)returns undefined instead of
throwing: reading.erroroff it threw aTypeErroron every iteration of both authenticated
classes. The login request now asks for its own body (responseType: 'text'), for that request only,
and an absent body is reported astoken response body is emptyrather than parsed. - A weights class this command cannot count no longer steals the requests of the class that served
them.compileRulesmapped every kind that was notrsctoplain— true when those were the only
two kinds. Aloginclass declared on a page pool then matched every document GET in the log: a
window with three page views and one sign-in produced a mix of 100% login.loginandsignupare
POSTs and this command counts GETs, so they are now carried through to be reported and never
matched, andweightssayscannot be counted from a GET loginstead of0%— a different finding
with a different fix. - A profile that posts its credentials to an application endpoint is no longer refused for a missing
client_id. That field belongs to the OAuth password grant, which is now one mode (mode: "password_grant") beside the default form post; the validator asks for it only there. - The
no summary producedtest still expected exit 0, the behaviour 1.20.4 deliberately changed to
exit 4. A test that asserts the bug is worse than no test.
Added
mode,fieldsandtoken_pathin theauthblock: the form field names, extra fields, a JSON
body, and a dotted path to the token and refresh token in a wrapped response. Guessing that the token
sits at the top level reads as the login works but returns no token, so the path is part of the
profile.- Two counters for the failures that used to be invisible.
cs_deniedcounts 401/403 — an
authenticated class that starts being refused under load is neither a 5xx nor a 404, and until now
nothing counted it, so a run whose whole authenticated half was rejected printed zero errors.
cs_auth_failcounts a login that answered without a usable token, which is not an HTTP error either.
Both appear in the summary line as401/403:andno token:.
Notes
/api/auth/whoamion the smoked target is public: it answers 200 with the same body and no
token, so it cannot validate anauthedclass — an authenticated read needs an endpoint that actually
refuses an anonymous request, and neither the campaign's own test nor this one had one. The login is
proven end-to-end (a real account, a 1.482-character token fromdata.access_token, 29 iterations,
no token: 0); the authenticated read is not proven by that smoke, and this is the caveat to carry
into the first real authenticated campaign.
Container image
docker pull ghcr.io/hiway-media/crowdsim:1.20.5
Install and usage: docs/docker.md