@gigzen/populace 0.1.0 → 1.1.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 +231 -10
- package/action.yml +145 -0
- package/adapters/buzzbuzz.mjs +1 -1
- package/adapters/template-rest.mjs +16 -0
- package/examples/buzzbuzz/populace.config.mjs +3 -3
- package/examples/buzzbuzz-local/populace.config.mjs +63 -0
- package/examples/rest-api/README.md +2 -2
- package/examples/rest-api/adapter.mjs +5 -2
- package/examples/rest-api/server.mjs +4 -4
- package/package.json +6 -2
- package/src/ai.mjs +158 -0
- package/src/cli.mjs +192 -2
- package/src/config.mjs +18 -2
- package/src/engine/personas.mjs +654 -11
- package/src/engine/world.mjs +40 -12
- package/src/explain.mjs +247 -0
- package/src/github-summary.mjs +152 -0
- package/src/openapi.mjs +322 -0
- package/src/progress.mjs +141 -0
- package/src/report.mjs +37 -0
- package/src/selftest.mjs +323 -0
- package/src/update.mjs +141 -0
- package/examples/buzzbuzz/populace-report.html +0 -245
- package/examples/buzzbuzz/populace-report.json +0 -280
- package/examples/buzzbuzz/run-test.ps1 +0 -61
- package/examples/demo/populace-report.html +0 -230
- package/examples/demo/populace-report.json +0 -219
|
@@ -1,245 +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 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 Buzz</h1>
|
|
84
|
-
<span class="sub">test environment · 10 simulated people ·
|
|
85
|
-
14m 38s · Sat, 15 Aug 2026 11:18:42 GMT</span>
|
|
86
|
-
</header>
|
|
87
|
-
|
|
88
|
-
<div class="verdict ok">
|
|
89
|
-
<h2>No failures across 2030 API calls</h2>
|
|
90
|
-
|
|
91
|
-
</div>
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
<div class="stats">
|
|
96
|
-
<div class="stat"><span class="v">2030</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">10</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 10 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">892</td>
|
|
114
|
-
<td class="num zero">0</td>
|
|
115
|
-
<td class="num">711ms</td>
|
|
116
|
-
<td class="num">1.0s</td>
|
|
117
|
-
<td class="barcell"><div class="bar" style="width:100.0%"></div></td>
|
|
118
|
-
</tr>
|
|
119
|
-
|
|
120
|
-
<tr class="">
|
|
121
|
-
<td class="mono name">recentPostsByOthers</td>
|
|
122
|
-
<td class="num">298</td>
|
|
123
|
-
<td class="num zero">0</td>
|
|
124
|
-
<td class="num">241ms</td>
|
|
125
|
-
<td class="num">349ms</td>
|
|
126
|
-
<td class="barcell"><div class="bar" style="width:34.8%"></div></td>
|
|
127
|
-
</tr>
|
|
128
|
-
|
|
129
|
-
<tr class="">
|
|
130
|
-
<td class="mono name">like</td>
|
|
131
|
-
<td class="num">296</td>
|
|
132
|
-
<td class="num zero">0</td>
|
|
133
|
-
<td class="num">238ms</td>
|
|
134
|
-
<td class="num">319ms</td>
|
|
135
|
-
<td class="barcell"><div class="bar" style="width:31.8%"></div></td>
|
|
136
|
-
</tr>
|
|
137
|
-
|
|
138
|
-
<tr class="">
|
|
139
|
-
<td class="mono name">post</td>
|
|
140
|
-
<td class="num">139</td>
|
|
141
|
-
<td class="num zero">0</td>
|
|
142
|
-
<td class="num">240ms</td>
|
|
143
|
-
<td class="num">313ms</td>
|
|
144
|
-
<td class="barcell"><div class="bar" style="width:31.2%"></div></td>
|
|
145
|
-
</tr>
|
|
146
|
-
|
|
147
|
-
<tr class="">
|
|
148
|
-
<td class="mono name">comment</td>
|
|
149
|
-
<td class="num">123</td>
|
|
150
|
-
<td class="num zero">0</td>
|
|
151
|
-
<td class="num">243ms</td>
|
|
152
|
-
<td class="num">326ms</td>
|
|
153
|
-
<td class="barcell"><div class="bar" style="width:32.5%"></div></td>
|
|
154
|
-
</tr>
|
|
155
|
-
|
|
156
|
-
<tr class="">
|
|
157
|
-
<td class="mono name">openConversation</td>
|
|
158
|
-
<td class="num">110</td>
|
|
159
|
-
<td class="num zero">0</td>
|
|
160
|
-
<td class="num">245ms</td>
|
|
161
|
-
<td class="num">336ms</td>
|
|
162
|
-
<td class="barcell"><div class="bar" style="width:33.5%"></div></td>
|
|
163
|
-
</tr>
|
|
164
|
-
|
|
165
|
-
<tr class="">
|
|
166
|
-
<td class="mono name">sendMessage</td>
|
|
167
|
-
<td class="num">110</td>
|
|
168
|
-
<td class="num zero">0</td>
|
|
169
|
-
<td class="num">244ms</td>
|
|
170
|
-
<td class="num">351ms</td>
|
|
171
|
-
<td class="barcell"><div class="bar" style="width:35.0%"></div></td>
|
|
172
|
-
</tr>
|
|
173
|
-
|
|
174
|
-
<tr class="">
|
|
175
|
-
<td class="mono name">listGroups</td>
|
|
176
|
-
<td class="num">16</td>
|
|
177
|
-
<td class="num zero">0</td>
|
|
178
|
-
<td class="num">250ms</td>
|
|
179
|
-
<td class="num">312ms</td>
|
|
180
|
-
<td class="barcell"><div class="bar" style="width:31.1%"></div></td>
|
|
181
|
-
</tr>
|
|
182
|
-
|
|
183
|
-
<tr class="">
|
|
184
|
-
<td class="mono name">joinGroup</td>
|
|
185
|
-
<td class="num">16</td>
|
|
186
|
-
<td class="num zero">0</td>
|
|
187
|
-
<td class="num">235ms</td>
|
|
188
|
-
<td class="num">311ms</td>
|
|
189
|
-
<td class="barcell"><div class="bar" style="width:31.0%"></div></td>
|
|
190
|
-
</tr>
|
|
191
|
-
|
|
192
|
-
<tr class="">
|
|
193
|
-
<td class="mono name">createUser</td>
|
|
194
|
-
<td class="num">10</td>
|
|
195
|
-
<td class="num zero">0</td>
|
|
196
|
-
<td class="num">601ms</td>
|
|
197
|
-
<td class="num">834ms</td>
|
|
198
|
-
<td class="barcell"><div class="bar" style="width:83.2%"></div></td>
|
|
199
|
-
</tr>
|
|
200
|
-
|
|
201
|
-
<tr class="">
|
|
202
|
-
<td class="mono name">setProfile</td>
|
|
203
|
-
<td class="num">10</td>
|
|
204
|
-
<td class="num zero">0</td>
|
|
205
|
-
<td class="num">249ms</td>
|
|
206
|
-
<td class="num">392ms</td>
|
|
207
|
-
<td class="barcell"><div class="bar" style="width:39.1%"></div></td>
|
|
208
|
-
</tr>
|
|
209
|
-
|
|
210
|
-
<tr class="">
|
|
211
|
-
<td class="mono name">deleteUser</td>
|
|
212
|
-
<td class="num">10</td>
|
|
213
|
-
<td class="num zero">0</td>
|
|
214
|
-
<td class="num">320ms</td>
|
|
215
|
-
<td class="num">508ms</td>
|
|
216
|
-
<td class="barcell"><div class="bar" style="width:50.6%"></div></td>
|
|
217
|
-
</tr>
|
|
218
|
-
</tbody>
|
|
219
|
-
</table>
|
|
220
|
-
</div>
|
|
221
|
-
</section>
|
|
222
|
-
|
|
223
|
-
<section>
|
|
224
|
-
<h2>What the population did</h2>
|
|
225
|
-
<div class="panel">
|
|
226
|
-
36 km travelled · 139 posts ·
|
|
227
|
-
296 likes · 123 comments ·
|
|
228
|
-
110 messages · 16 group joins
|
|
229
|
-
</div>
|
|
230
|
-
</section>
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
<section>
|
|
235
|
-
<h2>Cleanup</h2>
|
|
236
|
-
<div><div class="chip ok">Cleanup complete — 10 accounts removed</div></div>
|
|
237
|
-
</section>
|
|
238
|
-
|
|
239
|
-
<footer>
|
|
240
|
-
<span>Generated by Populace 0.1.0 · adapter <span class="mono">../../adapters/buzzbuzz.mjs</span></span>
|
|
241
|
-
<span>Simulated people are generated from patterns. This report shows whether your app
|
|
242
|
-
<strong>works</strong> — not whether anyone wants it.</span>
|
|
243
|
-
</footer>
|
|
244
|
-
|
|
245
|
-
</div></body></html>
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"populace": {
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"generatedAt": "2026-08-15T11:32:20.651Z"
|
|
5
|
-
},
|
|
6
|
-
"run": {
|
|
7
|
-
"app": "Buzz Buzz",
|
|
8
|
-
"adapter": "../../adapters/buzzbuzz.mjs",
|
|
9
|
-
"environment": "test",
|
|
10
|
-
"startedAt": "2026-08-15T11:18:42.515Z",
|
|
11
|
-
"durationMs": 818136,
|
|
12
|
-
"population": {
|
|
13
|
-
"agents": 10,
|
|
14
|
-
"cities": [
|
|
15
|
-
"manila",
|
|
16
|
-
"mumbai"
|
|
17
|
-
],
|
|
18
|
-
"tickSeconds": 5,
|
|
19
|
-
"minutes": 10
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
"verdict": {
|
|
23
|
-
"status": "clean",
|
|
24
|
-
"problems": [],
|
|
25
|
-
"apiFailures": 0,
|
|
26
|
-
"transportFailures": 0,
|
|
27
|
-
"failingMethods": []
|
|
28
|
-
},
|
|
29
|
-
"population": {
|
|
30
|
-
"requested": 10,
|
|
31
|
-
"signedIn": 10,
|
|
32
|
-
"signupFailures": []
|
|
33
|
-
},
|
|
34
|
-
"engineErrors": [],
|
|
35
|
-
"activity": {
|
|
36
|
-
"distanceKm": 36,
|
|
37
|
-
"posts": 139,
|
|
38
|
-
"likes": 296,
|
|
39
|
-
"comments": 123,
|
|
40
|
-
"messages": 110,
|
|
41
|
-
"groupJoins": 16
|
|
42
|
-
},
|
|
43
|
-
"api": {
|
|
44
|
-
"calls": 2030,
|
|
45
|
-
"failures": 0,
|
|
46
|
-
"apiFailures": 0,
|
|
47
|
-
"transportFailures": 0,
|
|
48
|
-
"retries": 0,
|
|
49
|
-
"failureRate": 0,
|
|
50
|
-
"apiFailureRate": 0,
|
|
51
|
-
"network": {
|
|
52
|
-
"retries": 0,
|
|
53
|
-
"transportFailures": 0,
|
|
54
|
-
"retryRate": 0,
|
|
55
|
-
"healthy": true,
|
|
56
|
-
"gaveUp": false,
|
|
57
|
-
"gaveUpAfter": null,
|
|
58
|
-
"outages": 0
|
|
59
|
-
},
|
|
60
|
-
"durationMs": 818132,
|
|
61
|
-
"methods": [
|
|
62
|
-
{
|
|
63
|
-
"method": "reportLocation",
|
|
64
|
-
"calls": 892,
|
|
65
|
-
"failures": 0,
|
|
66
|
-
"apiFailures": 0,
|
|
67
|
-
"transportFailures": 0,
|
|
68
|
-
"retries": 0,
|
|
69
|
-
"failureRate": 0,
|
|
70
|
-
"latencyMs": {
|
|
71
|
-
"p50": 711,
|
|
72
|
-
"p95": 1003,
|
|
73
|
-
"p99": 2371,
|
|
74
|
-
"max": 3178
|
|
75
|
-
},
|
|
76
|
-
"errors": []
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
"method": "recentPostsByOthers",
|
|
80
|
-
"calls": 298,
|
|
81
|
-
"failures": 0,
|
|
82
|
-
"apiFailures": 0,
|
|
83
|
-
"transportFailures": 0,
|
|
84
|
-
"retries": 0,
|
|
85
|
-
"failureRate": 0,
|
|
86
|
-
"latencyMs": {
|
|
87
|
-
"p50": 241,
|
|
88
|
-
"p95": 349,
|
|
89
|
-
"p99": 416,
|
|
90
|
-
"max": 622
|
|
91
|
-
},
|
|
92
|
-
"errors": []
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
"method": "like",
|
|
96
|
-
"calls": 296,
|
|
97
|
-
"failures": 0,
|
|
98
|
-
"apiFailures": 0,
|
|
99
|
-
"transportFailures": 0,
|
|
100
|
-
"retries": 0,
|
|
101
|
-
"failureRate": 0,
|
|
102
|
-
"latencyMs": {
|
|
103
|
-
"p50": 238,
|
|
104
|
-
"p95": 319,
|
|
105
|
-
"p99": 385,
|
|
106
|
-
"max": 760
|
|
107
|
-
},
|
|
108
|
-
"errors": []
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"method": "post",
|
|
112
|
-
"calls": 139,
|
|
113
|
-
"failures": 0,
|
|
114
|
-
"apiFailures": 0,
|
|
115
|
-
"transportFailures": 0,
|
|
116
|
-
"retries": 0,
|
|
117
|
-
"failureRate": 0,
|
|
118
|
-
"latencyMs": {
|
|
119
|
-
"p50": 240,
|
|
120
|
-
"p95": 313,
|
|
121
|
-
"p99": 383,
|
|
122
|
-
"max": 614
|
|
123
|
-
},
|
|
124
|
-
"errors": []
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
"method": "comment",
|
|
128
|
-
"calls": 123,
|
|
129
|
-
"failures": 0,
|
|
130
|
-
"apiFailures": 0,
|
|
131
|
-
"transportFailures": 0,
|
|
132
|
-
"retries": 0,
|
|
133
|
-
"failureRate": 0,
|
|
134
|
-
"latencyMs": {
|
|
135
|
-
"p50": 243,
|
|
136
|
-
"p95": 326,
|
|
137
|
-
"p99": 387,
|
|
138
|
-
"max": 683
|
|
139
|
-
},
|
|
140
|
-
"errors": []
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"method": "openConversation",
|
|
144
|
-
"calls": 110,
|
|
145
|
-
"failures": 0,
|
|
146
|
-
"apiFailures": 0,
|
|
147
|
-
"transportFailures": 0,
|
|
148
|
-
"retries": 0,
|
|
149
|
-
"failureRate": 0,
|
|
150
|
-
"latencyMs": {
|
|
151
|
-
"p50": 245,
|
|
152
|
-
"p95": 336,
|
|
153
|
-
"p99": 375,
|
|
154
|
-
"max": 626
|
|
155
|
-
},
|
|
156
|
-
"errors": []
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
"method": "sendMessage",
|
|
160
|
-
"calls": 110,
|
|
161
|
-
"failures": 0,
|
|
162
|
-
"apiFailures": 0,
|
|
163
|
-
"transportFailures": 0,
|
|
164
|
-
"retries": 0,
|
|
165
|
-
"failureRate": 0,
|
|
166
|
-
"latencyMs": {
|
|
167
|
-
"p50": 244,
|
|
168
|
-
"p95": 351,
|
|
169
|
-
"p99": 393,
|
|
170
|
-
"max": 780
|
|
171
|
-
},
|
|
172
|
-
"errors": []
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
"method": "listGroups",
|
|
176
|
-
"calls": 16,
|
|
177
|
-
"failures": 0,
|
|
178
|
-
"apiFailures": 0,
|
|
179
|
-
"transportFailures": 0,
|
|
180
|
-
"retries": 0,
|
|
181
|
-
"failureRate": 0,
|
|
182
|
-
"latencyMs": {
|
|
183
|
-
"p50": 250,
|
|
184
|
-
"p95": 312,
|
|
185
|
-
"p99": 312,
|
|
186
|
-
"max": 312
|
|
187
|
-
},
|
|
188
|
-
"errors": []
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
"method": "joinGroup",
|
|
192
|
-
"calls": 16,
|
|
193
|
-
"failures": 0,
|
|
194
|
-
"apiFailures": 0,
|
|
195
|
-
"transportFailures": 0,
|
|
196
|
-
"retries": 0,
|
|
197
|
-
"failureRate": 0,
|
|
198
|
-
"latencyMs": {
|
|
199
|
-
"p50": 235,
|
|
200
|
-
"p95": 311,
|
|
201
|
-
"p99": 311,
|
|
202
|
-
"max": 311
|
|
203
|
-
},
|
|
204
|
-
"errors": []
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"method": "createUser",
|
|
208
|
-
"calls": 10,
|
|
209
|
-
"failures": 0,
|
|
210
|
-
"apiFailures": 0,
|
|
211
|
-
"transportFailures": 0,
|
|
212
|
-
"retries": 0,
|
|
213
|
-
"failureRate": 0,
|
|
214
|
-
"latencyMs": {
|
|
215
|
-
"p50": 601,
|
|
216
|
-
"p95": 834,
|
|
217
|
-
"p99": 834,
|
|
218
|
-
"max": 834
|
|
219
|
-
},
|
|
220
|
-
"errors": []
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
"method": "setProfile",
|
|
224
|
-
"calls": 10,
|
|
225
|
-
"failures": 0,
|
|
226
|
-
"apiFailures": 0,
|
|
227
|
-
"transportFailures": 0,
|
|
228
|
-
"retries": 0,
|
|
229
|
-
"failureRate": 0,
|
|
230
|
-
"latencyMs": {
|
|
231
|
-
"p50": 249,
|
|
232
|
-
"p95": 392,
|
|
233
|
-
"p99": 392,
|
|
234
|
-
"max": 392
|
|
235
|
-
},
|
|
236
|
-
"errors": []
|
|
237
|
-
},
|
|
238
|
-
{
|
|
239
|
-
"method": "deleteUser",
|
|
240
|
-
"calls": 10,
|
|
241
|
-
"failures": 0,
|
|
242
|
-
"apiFailures": 0,
|
|
243
|
-
"transportFailures": 0,
|
|
244
|
-
"retries": 0,
|
|
245
|
-
"failureRate": 0,
|
|
246
|
-
"latencyMs": {
|
|
247
|
-
"p50": 320,
|
|
248
|
-
"p95": 508,
|
|
249
|
-
"p99": 508,
|
|
250
|
-
"max": 508
|
|
251
|
-
},
|
|
252
|
-
"errors": []
|
|
253
|
-
}
|
|
254
|
-
]
|
|
255
|
-
},
|
|
256
|
-
"coverage": {
|
|
257
|
-
"label": "13/13",
|
|
258
|
-
"implemented": [
|
|
259
|
-
"createUser",
|
|
260
|
-
"setProfile",
|
|
261
|
-
"refreshSession",
|
|
262
|
-
"reportLocation",
|
|
263
|
-
"post",
|
|
264
|
-
"recentPostsByOthers",
|
|
265
|
-
"like",
|
|
266
|
-
"comment",
|
|
267
|
-
"openConversation",
|
|
268
|
-
"sendMessage",
|
|
269
|
-
"listGroups",
|
|
270
|
-
"joinGroup",
|
|
271
|
-
"deleteUser"
|
|
272
|
-
],
|
|
273
|
-
"notTested": []
|
|
274
|
-
},
|
|
275
|
-
"cleanup": {
|
|
276
|
-
"removed": 10,
|
|
277
|
-
"notDeleted": [],
|
|
278
|
-
"failed": []
|
|
279
|
-
}
|
|
280
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Run the Buzz 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
|