@gigzen/populace 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/examples/buzzbuzz-local/populace.config.mjs +63 -0
- package/package.json +4 -1
- package/src/cli.mjs +70 -2
- package/src/config.mjs +18 -2
- package/src/engine/world.mjs +37 -9
- package/src/progress.mjs +153 -0
- package/src/selftest.mjs +72 -0
- package/examples/buzzbuzz/populace-report.html +0 -254
- package/examples/buzzbuzz/populace-report.json +0 -298
- package/examples/buzzbuzz/run-test.ps1 +0 -61
- package/examples/demo/populace-report.html +0 -230
- package/examples/demo/populace-report.json +0 -219
- package/examples/rest-api/populace-report.html +0 -245
- package/examples/rest-api/populace-report.json +0 -280
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en"><head><meta charset="utf-8">
|
|
3
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
4
|
-
<title>Populace report — Buzz</title>
|
|
5
|
-
<style>
|
|
6
|
-
:root{
|
|
7
|
-
--paper:#F4F5F7;--card:#fff;--ink:#12181D;--body:#3A454E;--muted:#6B7883;
|
|
8
|
-
--rule:#DDE2E7;--accent:#A85A0B;--ok:#2C6E4C;--bad:#A63127;--warn:#9A6A08;
|
|
9
|
-
--bar:#C9D4DC;--barbad:#E0A99F;
|
|
10
|
-
--mono:ui-monospace,"SF Mono","Cascadia Mono",Menlo,Consolas,monospace;
|
|
11
|
-
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;
|
|
12
|
-
}
|
|
13
|
-
@media (prefers-color-scheme:dark){:root{
|
|
14
|
-
--paper:#0E1418;--card:#161E24;--ink:#E8EEF3;--body:#B0BDC7;--muted:#7B8994;
|
|
15
|
-
--rule:#26323A;--accent:#E0A45C;--ok:#5FAB80;--bad:#DE7568;--warn:#D2A24E;
|
|
16
|
-
--bar:#2E3A43;--barbad:#5C332C;}}
|
|
17
|
-
:root[data-theme="dark"]{--paper:#0E1418;--card:#161E24;--ink:#E8EEF3;--body:#B0BDC7;
|
|
18
|
-
--muted:#7B8994;--rule:#26323A;--accent:#E0A45C;--ok:#5FAB80;--bad:#DE7568;
|
|
19
|
-
--warn:#D2A24E;--bar:#2E3A43;--barbad:#5C332C;}
|
|
20
|
-
:root[data-theme="light"]{--paper:#F4F5F7;--card:#fff;--ink:#12181D;--body:#3A454E;
|
|
21
|
-
--muted:#6B7883;--rule:#DDE2E7;--accent:#A85A0B;--ok:#2C6E4C;--bad:#A63127;
|
|
22
|
-
--warn:#9A6A08;--bar:#C9D4DC;--barbad:#E0A99F;}
|
|
23
|
-
*{box-sizing:border-box}
|
|
24
|
-
body{margin:0;background:var(--paper);color:var(--body);font-family:var(--sans);
|
|
25
|
-
font-size:15.5px;line-height:1.6;-webkit-font-smoothing:antialiased}
|
|
26
|
-
.wrap{max-width:900px;margin:0 auto;padding:0 22px 80px}
|
|
27
|
-
h1,h2,h3{color:var(--ink);margin:0;text-wrap:balance}
|
|
28
|
-
h1{font-family:var(--mono);font-size:clamp(22px,4vw,30px);letter-spacing:-.02em}
|
|
29
|
-
h2{font-size:17px;font-family:var(--mono);letter-spacing:-.01em}
|
|
30
|
-
.mono{font-family:var(--mono)}
|
|
31
|
-
header{padding:44px 0 24px;border-bottom:2px solid var(--ink);display:flex;
|
|
32
|
-
flex-direction:column;gap:10px}
|
|
33
|
-
.sub{font-family:var(--mono);font-size:12.5px;color:var(--muted)}
|
|
34
|
-
.verdict{margin-top:26px;padding:20px 22px;border-radius:6px;display:flex;
|
|
35
|
-
flex-direction:column;gap:8px;border-left:4px solid}
|
|
36
|
-
.verdict.ok{background:color-mix(in srgb,var(--ok) 8%,transparent);border-color:var(--ok)}
|
|
37
|
-
.verdict.bad{background:color-mix(in srgb,var(--bad) 8%,transparent);border-color:var(--bad)}
|
|
38
|
-
.verdict h2{color:var(--ink)}
|
|
39
|
-
.verdict ul{margin:4px 0 0;padding-left:20px}
|
|
40
|
-
.stats{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));margin-top:26px}
|
|
41
|
-
.stat{background:var(--card);border:1px solid var(--rule);border-radius:6px;padding:15px 16px}
|
|
42
|
-
.stat .v{font-family:var(--mono);font-size:23px;color:var(--ink);font-weight:600;
|
|
43
|
-
letter-spacing:-.02em;font-variant-numeric:tabular-nums;display:block}
|
|
44
|
-
.stat .l{font-family:var(--mono);font-size:10px;letter-spacing:.12em;
|
|
45
|
-
text-transform:uppercase;color:var(--muted)}
|
|
46
|
-
section{margin-top:42px;display:flex;flex-direction:column;gap:14px}
|
|
47
|
-
.panel{background:var(--card);border:1px solid var(--rule);border-radius:6px;padding:20px 22px}
|
|
48
|
-
.panel.danger{border-color:var(--bad);border-left-width:4px}
|
|
49
|
-
.panel.danger h2{color:var(--bad)}
|
|
50
|
-
.tablewrap{overflow-x:auto;border:1px solid var(--rule);border-radius:6px;background:var(--card)}
|
|
51
|
-
table{border-collapse:collapse;width:100%;min-width:600px}
|
|
52
|
-
th,td{padding:10px 14px;text-align:left;border-bottom:1px solid var(--rule)}
|
|
53
|
-
th{font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;
|
|
54
|
-
color:var(--muted);font-weight:600}
|
|
55
|
-
td.num{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;font-size:13.5px}
|
|
56
|
-
td.name{font-size:13.5px;color:var(--ink);white-space:nowrap}
|
|
57
|
-
td.zero{color:var(--muted)}
|
|
58
|
-
td.fail{color:var(--bad);font-weight:600}
|
|
59
|
-
.x{color:var(--bad);margin-right:6px}
|
|
60
|
-
.barcell{width:120px}
|
|
61
|
-
.bar{height:7px;background:var(--bar);border-radius:4px}
|
|
62
|
-
.row-bad .bar{background:var(--barbad)}
|
|
63
|
-
tr.errrow td{padding-top:0;border-bottom:1px solid var(--rule)}
|
|
64
|
-
.err{font-family:var(--mono);font-size:12px;color:var(--bad);padding:3px 0 3px 26px}
|
|
65
|
-
.errn{color:var(--muted);margin-right:8px}
|
|
66
|
-
.trace{font-family:var(--mono);font-size:11.5px;white-space:pre-wrap;overflow-x:auto;
|
|
67
|
-
background:var(--paper);padding:14px;border-radius:5px;margin:0;color:var(--body)}
|
|
68
|
-
ul.cov{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
|
|
69
|
-
ul.cov li{display:flex;gap:14px;flex-wrap:wrap;align-items:baseline;font-size:14px}
|
|
70
|
-
ul.cov .mono{color:var(--ink);min-width:170px;font-size:13px}
|
|
71
|
-
.would{color:var(--muted);font-size:13.5px}
|
|
72
|
-
.chip{display:inline-block;font-family:var(--mono);font-size:12px;padding:7px 13px;
|
|
73
|
-
border-radius:5px;border:1px solid}
|
|
74
|
-
.chip.ok{color:var(--ok);border-color:var(--ok);background:color-mix(in srgb,var(--ok) 8%,transparent)}
|
|
75
|
-
.chip.bad{color:var(--bad);border-color:var(--bad);background:color-mix(in srgb,var(--bad) 8%,transparent)}
|
|
76
|
-
.chip.warn{color:var(--warn);border-color:var(--warn);background:color-mix(in srgb,var(--warn) 8%,transparent)}
|
|
77
|
-
footer{margin-top:52px;padding-top:20px;border-top:1px solid var(--rule);
|
|
78
|
-
font-size:13px;color:var(--muted);display:flex;flex-direction:column;gap:6px}
|
|
79
|
-
</style></head><body>
|
|
80
|
-
<div class="wrap">
|
|
81
|
-
|
|
82
|
-
<header>
|
|
83
|
-
<h1>Buzz</h1>
|
|
84
|
-
<span class="sub">test environment · 30 simulated people ·
|
|
85
|
-
32m 51s · Thu, 20 Aug 2026 16:58:01 GMT</span>
|
|
86
|
-
</header>
|
|
87
|
-
|
|
88
|
-
<div class="verdict ok">
|
|
89
|
-
<h2>No failures across 46885 API calls</h2>
|
|
90
|
-
|
|
91
|
-
</div>
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
<div class="stats">
|
|
96
|
-
<div class="stat"><span class="v">46885</span><span class="l">API calls</span></div>
|
|
97
|
-
<div class="stat"><span class="v" style="color:var(--ok)">0</span><span class="l">failed</span></div>
|
|
98
|
-
<div class="stat"><span class="v">0.0%</span><span class="l">failure rate</span></div>
|
|
99
|
-
<div class="stat"><span class="v">30</span><span class="l">concurrent users</span></div>
|
|
100
|
-
<div class="stat"><span class="v">13/13</span><span class="l">coverage</span></div>
|
|
101
|
-
</div>
|
|
102
|
-
|
|
103
|
-
<section>
|
|
104
|
-
<h2>Your API under 30 concurrent users</h2>
|
|
105
|
-
<div class="tablewrap">
|
|
106
|
-
<table>
|
|
107
|
-
<thead><tr><th>Method</th><th style="text-align:right">Calls</th>
|
|
108
|
-
<th style="text-align:right">Fails</th><th style="text-align:right">p50</th>
|
|
109
|
-
<th style="text-align:right">p95</th><th>p95 relative</th></tr></thead>
|
|
110
|
-
<tbody>
|
|
111
|
-
<tr class="">
|
|
112
|
-
<td class="mono name">reportLocation</td>
|
|
113
|
-
<td class="num">20547</td>
|
|
114
|
-
<td class="num zero">0</td>
|
|
115
|
-
<td class="num">47ms</td>
|
|
116
|
-
<td class="num">72ms</td>
|
|
117
|
-
<td class="barcell"><div class="bar" style="width:37.3%"></div></td>
|
|
118
|
-
</tr>
|
|
119
|
-
|
|
120
|
-
<tr class="">
|
|
121
|
-
<td class="mono name">recentPostsByOthers</td>
|
|
122
|
-
<td class="num">7021</td>
|
|
123
|
-
<td class="num zero">0</td>
|
|
124
|
-
<td class="num">12ms</td>
|
|
125
|
-
<td class="num">27ms</td>
|
|
126
|
-
<td class="barcell"><div class="bar" style="width:14.0%"></div></td>
|
|
127
|
-
</tr>
|
|
128
|
-
|
|
129
|
-
<tr class="">
|
|
130
|
-
<td class="mono name">like</td>
|
|
131
|
-
<td class="num">7021</td>
|
|
132
|
-
<td class="num zero">0</td>
|
|
133
|
-
<td class="num">8ms</td>
|
|
134
|
-
<td class="num">16ms</td>
|
|
135
|
-
<td class="barcell"><div class="bar" style="width:8.3%"></div></td>
|
|
136
|
-
</tr>
|
|
137
|
-
|
|
138
|
-
<tr class="">
|
|
139
|
-
<td class="mono name">post</td>
|
|
140
|
-
<td class="num">3054</td>
|
|
141
|
-
<td class="num zero">0</td>
|
|
142
|
-
<td class="num">12ms</td>
|
|
143
|
-
<td class="num">22ms</td>
|
|
144
|
-
<td class="barcell"><div class="bar" style="width:11.4%"></div></td>
|
|
145
|
-
</tr>
|
|
146
|
-
|
|
147
|
-
<tr class="">
|
|
148
|
-
<td class="mono name">comment</td>
|
|
149
|
-
<td class="num">2840</td>
|
|
150
|
-
<td class="num zero">0</td>
|
|
151
|
-
<td class="num">7ms</td>
|
|
152
|
-
<td class="num">13ms</td>
|
|
153
|
-
<td class="barcell"><div class="bar" style="width:6.7%"></div></td>
|
|
154
|
-
</tr>
|
|
155
|
-
|
|
156
|
-
<tr class="">
|
|
157
|
-
<td class="mono name">openConversation</td>
|
|
158
|
-
<td class="num">2713</td>
|
|
159
|
-
<td class="num zero">0</td>
|
|
160
|
-
<td class="num">8ms</td>
|
|
161
|
-
<td class="num">18ms</td>
|
|
162
|
-
<td class="barcell"><div class="bar" style="width:9.3%"></div></td>
|
|
163
|
-
</tr>
|
|
164
|
-
|
|
165
|
-
<tr class="">
|
|
166
|
-
<td class="mono name">sendMessage</td>
|
|
167
|
-
<td class="num">2713</td>
|
|
168
|
-
<td class="num zero">0</td>
|
|
169
|
-
<td class="num">9ms</td>
|
|
170
|
-
<td class="num">19ms</td>
|
|
171
|
-
<td class="barcell"><div class="bar" style="width:9.8%"></div></td>
|
|
172
|
-
</tr>
|
|
173
|
-
|
|
174
|
-
<tr class="">
|
|
175
|
-
<td class="mono name">listGroups</td>
|
|
176
|
-
<td class="num">428</td>
|
|
177
|
-
<td class="num zero">0</td>
|
|
178
|
-
<td class="num">8ms</td>
|
|
179
|
-
<td class="num">17ms</td>
|
|
180
|
-
<td class="barcell"><div class="bar" style="width:8.8%"></div></td>
|
|
181
|
-
</tr>
|
|
182
|
-
|
|
183
|
-
<tr class="">
|
|
184
|
-
<td class="mono name">joinGroup</td>
|
|
185
|
-
<td class="num">428</td>
|
|
186
|
-
<td class="num zero">0</td>
|
|
187
|
-
<td class="num">7ms</td>
|
|
188
|
-
<td class="num">16ms</td>
|
|
189
|
-
<td class="barcell"><div class="bar" style="width:8.3%"></div></td>
|
|
190
|
-
</tr>
|
|
191
|
-
|
|
192
|
-
<tr class="">
|
|
193
|
-
<td class="mono name">createUser</td>
|
|
194
|
-
<td class="num">30</td>
|
|
195
|
-
<td class="num zero">0</td>
|
|
196
|
-
<td class="num">149ms</td>
|
|
197
|
-
<td class="num">193ms</td>
|
|
198
|
-
<td class="barcell"><div class="bar" style="width:100.0%"></div></td>
|
|
199
|
-
</tr>
|
|
200
|
-
|
|
201
|
-
<tr class="">
|
|
202
|
-
<td class="mono name">setProfile</td>
|
|
203
|
-
<td class="num">30</td>
|
|
204
|
-
<td class="num zero">0</td>
|
|
205
|
-
<td class="num">16ms</td>
|
|
206
|
-
<td class="num">22ms</td>
|
|
207
|
-
<td class="barcell"><div class="bar" style="width:11.4%"></div></td>
|
|
208
|
-
</tr>
|
|
209
|
-
|
|
210
|
-
<tr class="">
|
|
211
|
-
<td class="mono name">refreshSession</td>
|
|
212
|
-
<td class="num">30</td>
|
|
213
|
-
<td class="num zero">0</td>
|
|
214
|
-
<td class="num">144ms</td>
|
|
215
|
-
<td class="num">190ms</td>
|
|
216
|
-
<td class="barcell"><div class="bar" style="width:98.4%"></div></td>
|
|
217
|
-
</tr>
|
|
218
|
-
|
|
219
|
-
<tr class="">
|
|
220
|
-
<td class="mono name">deleteUser</td>
|
|
221
|
-
<td class="num">30</td>
|
|
222
|
-
<td class="num zero">0</td>
|
|
223
|
-
<td class="num">16ms</td>
|
|
224
|
-
<td class="num">31ms</td>
|
|
225
|
-
<td class="barcell"><div class="bar" style="width:16.1%"></div></td>
|
|
226
|
-
</tr>
|
|
227
|
-
</tbody>
|
|
228
|
-
</table>
|
|
229
|
-
</div>
|
|
230
|
-
</section>
|
|
231
|
-
|
|
232
|
-
<section>
|
|
233
|
-
<h2>What the population did</h2>
|
|
234
|
-
<div class="panel">
|
|
235
|
-
341.9 km travelled · 3054 posts ·
|
|
236
|
-
7021 likes · 2840 comments ·
|
|
237
|
-
2713 messages · 428 group joins
|
|
238
|
-
</div>
|
|
239
|
-
</section>
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
<section>
|
|
244
|
-
<h2>Cleanup</h2>
|
|
245
|
-
<div><div class="chip ok">Cleanup complete — 30 accounts removed</div></div>
|
|
246
|
-
</section>
|
|
247
|
-
|
|
248
|
-
<footer>
|
|
249
|
-
<span>Generated by Populace 0.1.0 · adapter <span class="mono">../../adapters/buzzbuzz.mjs</span></span>
|
|
250
|
-
<span>Simulated people are generated from patterns. This report shows whether your app
|
|
251
|
-
<strong>works</strong> — not whether anyone wants it.</span>
|
|
252
|
-
</footer>
|
|
253
|
-
|
|
254
|
-
</div></body></html>
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"populace": {
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"generatedAt": "2026-08-20T17:29:52.161Z"
|
|
5
|
-
},
|
|
6
|
-
"run": {
|
|
7
|
-
"app": "Buzz",
|
|
8
|
-
"adapter": "../../adapters/buzzbuzz.mjs",
|
|
9
|
-
"environment": "test",
|
|
10
|
-
"startedAt": "2026-08-20T16:58:01.553Z",
|
|
11
|
-
"durationMs": 1910608,
|
|
12
|
-
"population": {
|
|
13
|
-
"agents": 30,
|
|
14
|
-
"cities": [
|
|
15
|
-
"manila",
|
|
16
|
-
"mumbai",
|
|
17
|
-
"delhi",
|
|
18
|
-
"jakarta"
|
|
19
|
-
],
|
|
20
|
-
"tickSeconds": 2,
|
|
21
|
-
"minutes": 30
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"verdict": {
|
|
25
|
-
"status": "clean",
|
|
26
|
-
"problems": [],
|
|
27
|
-
"apiFailures": 0,
|
|
28
|
-
"transportFailures": 0,
|
|
29
|
-
"failingMethods": []
|
|
30
|
-
},
|
|
31
|
-
"population": {
|
|
32
|
-
"requested": 30,
|
|
33
|
-
"signedIn": 30,
|
|
34
|
-
"signupFailures": []
|
|
35
|
-
},
|
|
36
|
-
"engineErrors": [],
|
|
37
|
-
"activity": {
|
|
38
|
-
"distanceKm": 341.9,
|
|
39
|
-
"posts": 3054,
|
|
40
|
-
"likes": 7021,
|
|
41
|
-
"comments": 2840,
|
|
42
|
-
"messages": 2713,
|
|
43
|
-
"groupJoins": 428
|
|
44
|
-
},
|
|
45
|
-
"api": {
|
|
46
|
-
"calls": 46885,
|
|
47
|
-
"failures": 0,
|
|
48
|
-
"apiFailures": 0,
|
|
49
|
-
"transportFailures": 0,
|
|
50
|
-
"retries": 0,
|
|
51
|
-
"failureRate": 0,
|
|
52
|
-
"apiFailureRate": 0,
|
|
53
|
-
"network": {
|
|
54
|
-
"retries": 0,
|
|
55
|
-
"transportFailures": 0,
|
|
56
|
-
"retryRate": 0,
|
|
57
|
-
"healthy": true,
|
|
58
|
-
"gaveUp": false,
|
|
59
|
-
"gaveUpAfter": null,
|
|
60
|
-
"outages": 0
|
|
61
|
-
},
|
|
62
|
-
"durationMs": 1910592,
|
|
63
|
-
"methods": [
|
|
64
|
-
{
|
|
65
|
-
"method": "reportLocation",
|
|
66
|
-
"calls": 20547,
|
|
67
|
-
"failures": 0,
|
|
68
|
-
"apiFailures": 0,
|
|
69
|
-
"transportFailures": 0,
|
|
70
|
-
"retries": 0,
|
|
71
|
-
"failureRate": 0,
|
|
72
|
-
"latencyMs": {
|
|
73
|
-
"p50": 47,
|
|
74
|
-
"p95": 72,
|
|
75
|
-
"p99": 102,
|
|
76
|
-
"max": 214
|
|
77
|
-
},
|
|
78
|
-
"errors": []
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"method": "recentPostsByOthers",
|
|
82
|
-
"calls": 7021,
|
|
83
|
-
"failures": 0,
|
|
84
|
-
"apiFailures": 0,
|
|
85
|
-
"transportFailures": 0,
|
|
86
|
-
"retries": 0,
|
|
87
|
-
"failureRate": 0,
|
|
88
|
-
"latencyMs": {
|
|
89
|
-
"p50": 12,
|
|
90
|
-
"p95": 27,
|
|
91
|
-
"p99": 35,
|
|
92
|
-
"max": 59
|
|
93
|
-
},
|
|
94
|
-
"errors": []
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
"method": "like",
|
|
98
|
-
"calls": 7021,
|
|
99
|
-
"failures": 0,
|
|
100
|
-
"apiFailures": 0,
|
|
101
|
-
"transportFailures": 0,
|
|
102
|
-
"retries": 0,
|
|
103
|
-
"failureRate": 0,
|
|
104
|
-
"latencyMs": {
|
|
105
|
-
"p50": 8,
|
|
106
|
-
"p95": 16,
|
|
107
|
-
"p99": 23,
|
|
108
|
-
"max": 43
|
|
109
|
-
},
|
|
110
|
-
"errors": []
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
"method": "post",
|
|
114
|
-
"calls": 3054,
|
|
115
|
-
"failures": 0,
|
|
116
|
-
"apiFailures": 0,
|
|
117
|
-
"transportFailures": 0,
|
|
118
|
-
"retries": 0,
|
|
119
|
-
"failureRate": 0,
|
|
120
|
-
"latencyMs": {
|
|
121
|
-
"p50": 12,
|
|
122
|
-
"p95": 22,
|
|
123
|
-
"p99": 29,
|
|
124
|
-
"max": 58
|
|
125
|
-
},
|
|
126
|
-
"errors": []
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
"method": "comment",
|
|
130
|
-
"calls": 2840,
|
|
131
|
-
"failures": 0,
|
|
132
|
-
"apiFailures": 0,
|
|
133
|
-
"transportFailures": 0,
|
|
134
|
-
"retries": 0,
|
|
135
|
-
"failureRate": 0,
|
|
136
|
-
"latencyMs": {
|
|
137
|
-
"p50": 7,
|
|
138
|
-
"p95": 13,
|
|
139
|
-
"p99": 19,
|
|
140
|
-
"max": 35
|
|
141
|
-
},
|
|
142
|
-
"errors": []
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"method": "openConversation",
|
|
146
|
-
"calls": 2713,
|
|
147
|
-
"failures": 0,
|
|
148
|
-
"apiFailures": 0,
|
|
149
|
-
"transportFailures": 0,
|
|
150
|
-
"retries": 0,
|
|
151
|
-
"failureRate": 0,
|
|
152
|
-
"latencyMs": {
|
|
153
|
-
"p50": 8,
|
|
154
|
-
"p95": 18,
|
|
155
|
-
"p99": 25,
|
|
156
|
-
"max": 53
|
|
157
|
-
},
|
|
158
|
-
"errors": []
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
"method": "sendMessage",
|
|
162
|
-
"calls": 2713,
|
|
163
|
-
"failures": 0,
|
|
164
|
-
"apiFailures": 0,
|
|
165
|
-
"transportFailures": 0,
|
|
166
|
-
"retries": 0,
|
|
167
|
-
"failureRate": 0,
|
|
168
|
-
"latencyMs": {
|
|
169
|
-
"p50": 9,
|
|
170
|
-
"p95": 19,
|
|
171
|
-
"p99": 23,
|
|
172
|
-
"max": 32
|
|
173
|
-
},
|
|
174
|
-
"errors": []
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
"method": "listGroups",
|
|
178
|
-
"calls": 428,
|
|
179
|
-
"failures": 0,
|
|
180
|
-
"apiFailures": 0,
|
|
181
|
-
"transportFailures": 0,
|
|
182
|
-
"retries": 0,
|
|
183
|
-
"failureRate": 0,
|
|
184
|
-
"latencyMs": {
|
|
185
|
-
"p50": 8,
|
|
186
|
-
"p95": 17,
|
|
187
|
-
"p99": 22,
|
|
188
|
-
"max": 44
|
|
189
|
-
},
|
|
190
|
-
"errors": []
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
"method": "joinGroup",
|
|
194
|
-
"calls": 428,
|
|
195
|
-
"failures": 0,
|
|
196
|
-
"apiFailures": 0,
|
|
197
|
-
"transportFailures": 0,
|
|
198
|
-
"retries": 0,
|
|
199
|
-
"failureRate": 0,
|
|
200
|
-
"latencyMs": {
|
|
201
|
-
"p50": 7,
|
|
202
|
-
"p95": 16,
|
|
203
|
-
"p99": 20,
|
|
204
|
-
"max": 28
|
|
205
|
-
},
|
|
206
|
-
"errors": []
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
"method": "createUser",
|
|
210
|
-
"calls": 30,
|
|
211
|
-
"failures": 0,
|
|
212
|
-
"apiFailures": 0,
|
|
213
|
-
"transportFailures": 0,
|
|
214
|
-
"retries": 0,
|
|
215
|
-
"failureRate": 0,
|
|
216
|
-
"latencyMs": {
|
|
217
|
-
"p50": 149,
|
|
218
|
-
"p95": 193,
|
|
219
|
-
"p99": 312,
|
|
220
|
-
"max": 312
|
|
221
|
-
},
|
|
222
|
-
"errors": []
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
"method": "setProfile",
|
|
226
|
-
"calls": 30,
|
|
227
|
-
"failures": 0,
|
|
228
|
-
"apiFailures": 0,
|
|
229
|
-
"transportFailures": 0,
|
|
230
|
-
"retries": 0,
|
|
231
|
-
"failureRate": 0,
|
|
232
|
-
"latencyMs": {
|
|
233
|
-
"p50": 16,
|
|
234
|
-
"p95": 22,
|
|
235
|
-
"p99": 23,
|
|
236
|
-
"max": 23
|
|
237
|
-
},
|
|
238
|
-
"errors": []
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
"method": "refreshSession",
|
|
242
|
-
"calls": 30,
|
|
243
|
-
"failures": 0,
|
|
244
|
-
"apiFailures": 0,
|
|
245
|
-
"transportFailures": 0,
|
|
246
|
-
"retries": 0,
|
|
247
|
-
"failureRate": 0,
|
|
248
|
-
"latencyMs": {
|
|
249
|
-
"p50": 144,
|
|
250
|
-
"p95": 190,
|
|
251
|
-
"p99": 194,
|
|
252
|
-
"max": 194
|
|
253
|
-
},
|
|
254
|
-
"errors": []
|
|
255
|
-
},
|
|
256
|
-
{
|
|
257
|
-
"method": "deleteUser",
|
|
258
|
-
"calls": 30,
|
|
259
|
-
"failures": 0,
|
|
260
|
-
"apiFailures": 0,
|
|
261
|
-
"transportFailures": 0,
|
|
262
|
-
"retries": 0,
|
|
263
|
-
"failureRate": 0,
|
|
264
|
-
"latencyMs": {
|
|
265
|
-
"p50": 16,
|
|
266
|
-
"p95": 31,
|
|
267
|
-
"p99": 60,
|
|
268
|
-
"max": 60
|
|
269
|
-
},
|
|
270
|
-
"errors": []
|
|
271
|
-
}
|
|
272
|
-
]
|
|
273
|
-
},
|
|
274
|
-
"coverage": {
|
|
275
|
-
"label": "13/13",
|
|
276
|
-
"implemented": [
|
|
277
|
-
"createUser",
|
|
278
|
-
"setProfile",
|
|
279
|
-
"refreshSession",
|
|
280
|
-
"reportLocation",
|
|
281
|
-
"post",
|
|
282
|
-
"recentPostsByOthers",
|
|
283
|
-
"like",
|
|
284
|
-
"comment",
|
|
285
|
-
"openConversation",
|
|
286
|
-
"sendMessage",
|
|
287
|
-
"listGroups",
|
|
288
|
-
"joinGroup",
|
|
289
|
-
"deleteUser"
|
|
290
|
-
],
|
|
291
|
-
"notTested": []
|
|
292
|
-
},
|
|
293
|
-
"cleanup": {
|
|
294
|
-
"removed": 30,
|
|
295
|
-
"notDeleted": [],
|
|
296
|
-
"failed": []
|
|
297
|
-
}
|
|
298
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Run the Buzz simulation from Windows PowerShell.
|
|
2
|
-
#
|
|
3
|
-
# Exists because the bash one-liner does not work here: PowerShell 5.1 has no
|
|
4
|
-
# `&&` statement separator and no `VAR=value command` prefix, so pasting the
|
|
5
|
-
# Unix form fails with "The token '&&' is not a valid statement separator".
|
|
6
|
-
#
|
|
7
|
-
# .\run-test.ps1 # 6 drivers, 5 minutes
|
|
8
|
-
# .\run-test.ps1 -Agents 4 -Minutes 3
|
|
9
|
-
# .\run-test.ps1 -Clean # just remove any leftover accounts
|
|
10
|
-
#
|
|
11
|
-
# Run it from anywhere; it locates itself.
|
|
12
|
-
|
|
13
|
-
param(
|
|
14
|
-
[int]$Agents = 6,
|
|
15
|
-
[int]$Minutes = 5,
|
|
16
|
-
[switch]$Clean
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
$ErrorActionPreference = "Stop"
|
|
20
|
-
Set-Location $PSScriptRoot
|
|
21
|
-
|
|
22
|
-
# Deliberately no NODE_OPTIONS here. An earlier version set
|
|
23
|
-
# --dns-result-order=ipv6first to work around connection failures on a NAT64
|
|
24
|
-
# link. Measuring it afterwards showed 40/40 successful connections both with
|
|
25
|
-
# and without the flag — the failures were the link recovering on its own, not
|
|
26
|
-
# address-family ordering. The workaround was cargo cult, so it is gone.
|
|
27
|
-
|
|
28
|
-
# The isolated test project. Never a production host — populace.config.mjs
|
|
29
|
-
# lists the live ones in neverRunAgainst and refuses them before loading.
|
|
30
|
-
$env:BUZZBUZZ_TEST_URL = "https://jqepegeifmnfofeyebrz.supabase.co"
|
|
31
|
-
$env:BUZZBUZZ_TEST_KEY = "sb_publishable_ZkOhFsiQBrKMB5pc2Ub1Vw_V5oxsBE1"
|
|
32
|
-
|
|
33
|
-
$cli = Join-Path $PSScriptRoot "..\..\src\cli.mjs"
|
|
34
|
-
|
|
35
|
-
if ($Clean) {
|
|
36
|
-
node $cli clean
|
|
37
|
-
exit $LASTEXITCODE
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
Write-Host ""
|
|
41
|
-
Write-Host " Checking the target before running..." -ForegroundColor Cyan
|
|
42
|
-
node $cli doctor
|
|
43
|
-
if ($LASTEXITCODE -ne 0) {
|
|
44
|
-
Write-Host ""
|
|
45
|
-
Write-Host " doctor says not ready — stopping here rather than burning a run." -ForegroundColor Yellow
|
|
46
|
-
exit 1
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
node $cli run --agents $Agents --minutes $Minutes
|
|
50
|
-
$code = $LASTEXITCODE
|
|
51
|
-
|
|
52
|
-
# A run exits non-zero when it FINDS something. That is the tool working, not
|
|
53
|
-
# the tool failing, so say so rather than leaving a bare red exit code.
|
|
54
|
-
Write-Host ""
|
|
55
|
-
if ($code -eq 0) {
|
|
56
|
-
Write-Host " Run finished with no failures." -ForegroundColor Green
|
|
57
|
-
} else {
|
|
58
|
-
Write-Host " Run finished and found problems — see the report above." -ForegroundColor Yellow
|
|
59
|
-
Write-Host " That is the expected outcome when there is something to find." -ForegroundColor DarkGray
|
|
60
|
-
}
|
|
61
|
-
exit $code
|