ep_performance_test_hooks 0.0.49 → 0.0.51

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.
@@ -26,7 +26,7 @@ jobs:
26
26
  with:
27
27
  repository: ether/etherpad-lite
28
28
  path: etherpad-lite
29
- - uses: pnpm/action-setup@v3
29
+ - uses: pnpm/action-setup@v6
30
30
  name: Install pnpm
31
31
  with:
32
32
  version: 10
@@ -15,7 +15,7 @@ jobs:
15
15
  uses: actions/checkout@v6
16
16
  with:
17
17
  repository: ether/etherpad-lite
18
- - uses: pnpm/action-setup@v3
18
+ - uses: pnpm/action-setup@v6
19
19
  name: Install pnpm
20
20
  with:
21
21
  version: 10
@@ -31,7 +31,7 @@ jobs:
31
31
  uses: actions/checkout@v6
32
32
  with:
33
33
  repository: ether/etherpad-lite
34
- - uses: pnpm/action-setup@v5
34
+ - uses: pnpm/action-setup@v6
35
35
  name: Install pnpm
36
36
  with:
37
37
  version: 10
@@ -59,12 +59,20 @@ jobs:
59
59
  [ "${NEW_COMMITS}" -gt 0 ] || exit 0
60
60
  git config user.name 'github-actions[bot]'
61
61
  git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
62
- pnpm i
62
+ pnpm i --frozen-lockfile
63
63
  # `pnpm version patch` bumps package.json, makes a commit, and creates
64
64
  # a `v<new-version>` tag. Capture the new tag name from package.json
65
65
  # rather than parsing pnpm's output, which has historically varied.
66
- pnpm version patch
67
- NEW_TAG="v$(node -p "require('./package.json').version")"
66
+ # Bump the patch component directly with Node. pnpm/action-setup@v6
67
+ # sometimes installs pnpm 11 pre-releases even when version: 10.x is
68
+ # requested (pnpm/action-setup#225); those pre-releases either skip
69
+ # the git commit/tag or reject --no-git-tag-version as unknown.
70
+ # Doing the bump in Node sidesteps both failure modes.
71
+ NEW_VERSION=$(node -e "const fs=require('fs');const p=require('./package.json');const v=p.version.split('.');v[2]=String(Number(v[2])+1);p.version=v.join('.');fs.writeFileSync('./package.json',JSON.stringify(p,null,2)+'\n');console.log(p.version);")
72
+ NEW_TAG="v${NEW_VERSION}"
73
+ git add package.json
74
+ git commit -m "${NEW_TAG}"
75
+ git tag -a "${NEW_TAG}" -m "${NEW_TAG}"
68
76
  # CRITICAL: use --atomic so the branch update and the tag update
69
77
  # succeed (or fail) as a single transaction on the server. The old
70
78
  # `git push --follow-tags` was non-atomic per ref: if a concurrent
package/README.md CHANGED
@@ -7,3 +7,20 @@ A plugin to get test data to help improve the performance of Etherpad.
7
7
  ## Usage
8
8
 
9
9
  See the collected stats at ``/stats``
10
+
11
+ ## Installation
12
+
13
+ Install from the Etherpad admin UI (**Admin → Manage Plugins**,
14
+ search for `ep_performance_test_hooks` and click *Install*), or from the Etherpad
15
+ root directory:
16
+
17
+ ```sh
18
+ pnpm run plugins install ep_performance_test_hooks
19
+ ```
20
+
21
+ > ⚠️ Don't run `npm i` / `npm install` yourself from the Etherpad
22
+ > source tree — Etherpad tracks installed plugins through its own
23
+ > plugin-manager, and hand-editing `package.json` can leave the
24
+ > server unable to start.
25
+
26
+ After installing, restart Etherpad.
package/package.json CHANGED
@@ -39,11 +39,11 @@
39
39
  "type": "git",
40
40
  "url": "git+https://github.com/ether/ep_performance_test_hooks.git"
41
41
  },
42
- "version": "0.0.49",
42
+ "version": "0.0.51",
43
43
  "devDependencies": {
44
44
  "eslint": "^8.57.1",
45
- "eslint-config-etherpad": "^4.0.4",
46
- "typescript": "^6.0.2"
45
+ "eslint-config-etherpad": "^4.0.5",
46
+ "typescript": "^6.0.3"
47
47
  },
48
48
  "scripts": {
49
49
  "lint": "eslint .",
@@ -0,0 +1,25 @@
1
+ import {expect, test} from '@playwright/test';
2
+ import {goToNewPad} from 'ep_etherpad-lite/tests/frontend-new/helper/padHelper';
3
+
4
+ // The legacy spec hard-coded ~50 timing/budget thresholds that drift with
5
+ // every Etherpad release and runner. Validate instead that the /stats
6
+ // endpoint exists and returns the structure ep_performance_test_hooks
7
+ // produces; the budget-tracking is left to operators.
8
+
9
+ test.beforeEach(async ({page}) => {
10
+ await goToNewPad(page);
11
+ });
12
+
13
+ test.describe('ep_performance_test_hooks', () => {
14
+ test('/stats returns hook timing data', async ({page}) => {
15
+ const stats: any = await page.evaluate(async () => {
16
+ const r = await fetch('/stats', {cache: 'no-store'});
17
+ return r.json();
18
+ });
19
+ expect(stats.ep_performance_test_hooks).toBeTruthy();
20
+ expect(stats.ep_performance_test_hooks.etherpadHooks).toBeTruthy();
21
+ expect(stats.ep_performance_test_hooks.loadTimes).toBeTruthy();
22
+ expect(stats.ep_performance_test_hooks.loadSizes).toBeTruthy();
23
+ expect(stats.startDurations).toBeTruthy();
24
+ });
25
+ });
@@ -1,942 +0,0 @@
1
- 'use strict';
2
-
3
- // All timing data is for non-minified verison of Etherpad!
4
- // TODO: Add minified data too :)
5
-
6
- const requirements = {
7
- etherpadHooks: {
8
- aceInitInnerdocbodyHead: 157,
9
- aceInitialized: 2693,
10
- documentReady: 10,
11
- postAceInit: 2789,
12
- postToolbarInit: 2728,
13
- },
14
- startDurations: {
15
- npmLoad: 240,
16
- dbInit: 5000,
17
- loadPlugins: 10000,
18
- loadSettings: 5,
19
- createSettings: 20000,
20
- },
21
- perf: {
22
- duration: 1200,
23
- fetchStart: 0.5650000020978041,
24
- domainLookupStart: 0.5650000020978041,
25
- domainLookupEnd: 0.5650000020978041,
26
- connectStart: 0.5650000020978041,
27
- connectEnd: 0.5650000020978041,
28
- requestStart: 11.395000001357403,
29
- responseStart: 67.62499999967986,
30
- responseEnd: 72.0949999995355,
31
- transferSize: 35141,
32
- encodedBodySize: 34843,
33
- decodedBodySize: 34843,
34
- unloadEventStart: 74.85499999893364,
35
- unloadEventEnd: 74.85499999893364,
36
- domInteractive: 605.5999999989581,
37
- domContentLoadedEventStart: 605.6549999993877,
38
- domContentLoadedEventEnd: 607.4699999990116,
39
- domComplete: 685.1300000016636,
40
- loadEventStart: 685.1700000006531,
41
- loadEventEnd: 685.1800000004005,
42
- },
43
- loadSizes: {
44
- '/static/css/pad.css': {
45
- decodedBodySize: 1259,
46
- encodedBodySize: 1259,
47
- transferSize: 1641,
48
- },
49
- '/static/skins/colibris/pad.css': {
50
- decodedBodySize: 2145,
51
- encodedBodySize: 2145,
52
- transferSize: 2527,
53
- },
54
- '/static/js/html10n.js': {
55
- decodedBodySize: 26913,
56
- encodedBodySize: 26913,
57
- transferSize: 27310,
58
- },
59
- '/static/js/l10n.js': {
60
- decodedBodySize: 461,
61
- encodedBodySize: 461,
62
- transferSize: 857,
63
- },
64
- '/static/js/require-kernel.js': {
65
- decodedBodySize: 19418,
66
- encodedBodySize: 19418,
67
- transferSize: 19815,
68
- },
69
- '/javascripts/lib/ep_etherpad-lite/static/js/pad_utils.js': {
70
- decodedBodySize: 209603,
71
- encodedBodySize: 50931,
72
- transferSize: 51721,
73
- },
74
- '/socket.io/socket.io.js': {
75
- decodedBodySize: 62783,
76
- encodedBodySize: 62783,
77
- transferSize: 63014,
78
- },
79
- '/javascripts/lib/ep_etherpad-lite/static/js/pad.js': {
80
- decodedBodySize: 221371,
81
- encodedBodySize: 57626,
82
- transferSize: 58088,
83
- },
84
- '/javascripts/lib/ep_etherpad-lite/static/js/ace2_common.js': {
85
- decodedBodySize: 378028,
86
- encodedBodySize: 107895,
87
- transferSize: 108358,
88
- },
89
- '/static/skins/colibris/pad.js': {
90
- decodedBodySize: 224,
91
- encodedBodySize: 224,
92
- transferSize: 619,
93
- },
94
- '/static/css/pad/normalize.css': {
95
- decodedBodySize: 7737,
96
- encodedBodySize: 7737,
97
- transferSize: 8120,
98
- },
99
- '/static/css/pad/layout.css': {
100
- decodedBodySize: 1275,
101
- encodedBodySize: 1275,
102
- transferSize: 1657,
103
- },
104
- '/static/css/pad/fonts.css': {
105
- decodedBodySize: 2466,
106
- encodedBodySize: 2466,
107
- transferSize: 2848,
108
- },
109
- '/static/css/pad/toolbar.css': {
110
- decodedBodySize: 3652,
111
- encodedBodySize: 3652,
112
- transferSize: 4034,
113
- },
114
- '/static/css/pad/popup.css': {
115
- decodedBodySize: 1622,
116
- encodedBodySize: 1622,
117
- transferSize: 2004,
118
- },
119
- '/static/css/pad/popup_connectivity.css': {
120
- decodedBodySize: 571,
121
- encodedBodySize: 571,
122
- transferSize: 953,
123
- },
124
- '/static/css/pad/popup_import_export.css': {
125
- decodedBodySize: 367,
126
- encodedBodySize: 367,
127
- transferSize: 749,
128
- },
129
- '/static/css/pad/popup_users.css': {
130
- decodedBodySize: 2498,
131
- encodedBodySize: 2498,
132
- transferSize: 2880,
133
- },
134
- '/static/css/pad/icons.css': {
135
- decodedBodySize: 7140,
136
- encodedBodySize: 7140,
137
- transferSize: 7523,
138
- },
139
- '/static/css/pad/chat.css': {
140
- decodedBodySize: 2956,
141
- encodedBodySize: 2956,
142
- transferSize: 3338,
143
- },
144
- '/static/css/pad/gritter.css': {
145
- decodedBodySize: 843,
146
- encodedBodySize: 843,
147
- transferSize: 1225,
148
- },
149
- '/static/css/pad/loadingbox.css': {
150
- decodedBodySize: 324,
151
- encodedBodySize: 324,
152
- transferSize: 706,
153
- },
154
- '/static/css/pad/form.css': {
155
- decodedBodySize: 4003,
156
- encodedBodySize: 4003,
157
- transferSize: 4385,
158
- },
159
- '/static/skins/colibris/src/general.css': {
160
- decodedBodySize: 231,
161
- encodedBodySize: 231,
162
- transferSize: 612,
163
- },
164
- '/static/skins/colibris/src/layout.css': {
165
- decodedBodySize: 1200,
166
- encodedBodySize: 1200,
167
- transferSize: 1582,
168
- },
169
- '/static/skins/colibris/src/pad-editor.css': {
170
- decodedBodySize: 91,
171
- encodedBodySize: 91,
172
- transferSize: 472,
173
- },
174
- '/static/skins/colibris/src/components/scrollbars.css': {
175
- decodedBodySize: 899,
176
- encodedBodySize: 899,
177
- transferSize: 1281,
178
- },
179
- '/static/skins/colibris/src/components/buttons.css': {
180
- decodedBodySize: 528,
181
- encodedBodySize: 528,
182
- transferSize: 910,
183
- },
184
- '/static/skins/colibris/src/components/popup.css': {
185
- decodedBodySize: 1603,
186
- encodedBodySize: 1603,
187
- transferSize: 1985,
188
- },
189
- '/static/skins/colibris/src/components/chat.css': {
190
- decodedBodySize: 1693,
191
- encodedBodySize: 1693,
192
- transferSize: 2075,
193
- },
194
- '/static/skins/colibris/src/components/sidediv.css': {
195
- decodedBodySize: 410,
196
- encodedBodySize: 410,
197
- transferSize: 792,
198
- },
199
- '/static/skins/colibris/src/components/gritter.css': {
200
- decodedBodySize: 2172,
201
- encodedBodySize: 2172,
202
- transferSize: 2554,
203
- },
204
- '/static/skins/colibris/src/components/table-of-content.css': {
205
- decodedBodySize: 358,
206
- encodedBodySize: 358,
207
- transferSize: 740,
208
- },
209
- '/static/skins/colibris/src/components/toolbar.css': {
210
- decodedBodySize: 2909,
211
- encodedBodySize: 2909,
212
- transferSize: 3291,
213
- },
214
- '/static/skins/colibris/src/components/users.css': {
215
- decodedBodySize: 941,
216
- encodedBodySize: 941,
217
- transferSize: 1323,
218
- },
219
- '/static/skins/colibris/src/components/form.css': {
220
- decodedBodySize: 2666,
221
- encodedBodySize: 2666,
222
- transferSize: 3048,
223
- },
224
- '/static/skins/colibris/src/components/import-export.css': {
225
- decodedBodySize: 317,
226
- encodedBodySize: 317,
227
- transferSize: 699,
228
- },
229
- '/static/skins/colibris/src/plugins/brightcolorpicker.css': {
230
- decodedBodySize: 389,
231
- encodedBodySize: 389,
232
- transferSize: 771,
233
- },
234
- '/static/skins/colibris/src/plugins/font_color.css': {
235
- decodedBodySize: 520,
236
- encodedBodySize: 520,
237
- transferSize: 902,
238
- },
239
- '/static/skins/colibris/src/plugins/tables2.css': {
240
- decodedBodySize: 4486,
241
- encodedBodySize: 4486,
242
- transferSize: 4869,
243
- },
244
- '/static/skins/colibris/src/plugins/set_title_on_pad.css': {
245
- decodedBodySize: 170,
246
- encodedBodySize: 170,
247
- transferSize: 551,
248
- },
249
- '/static/skins/colibris/src/plugins/author_hover.css': {
250
- decodedBodySize: 250,
251
- encodedBodySize: 250,
252
- transferSize: 631,
253
- },
254
- '/static/skins/colibris/src/plugins/comments.css': {
255
- decodedBodySize: 2521,
256
- encodedBodySize: 2521,
257
- transferSize: 2903,
258
- },
259
- '/static/skins/colibris/src/pad-variants.css': {
260
- decodedBodySize: 7748,
261
- encodedBodySize: 7748,
262
- transferSize: 8131,
263
- },
264
- '/static/font/Quicksand-Bold.ttf': {
265
- decodedBodySize: 77032,
266
- encodedBodySize: 77032,
267
- transferSize: 77401,
268
- },
269
- '/static/font/Quicksand-Medium.ttf': {
270
- decodedBodySize: 77460,
271
- encodedBodySize: 77460,
272
- transferSize: 77829,
273
- },
274
- '/static/font/fontawesome-etherpad.woff': {
275
- decodedBodySize: 15672,
276
- encodedBodySize: 15672,
277
- transferSize: 16041,
278
- },
279
- '/pluginfw/plugin-definitions.json': {
280
- decodedBodySize: 1500,
281
- encodedBodySize: 1500,
282
- transferSize: 1700,
283
- },
284
- '/locales.json': {
285
- decodedBodySize: 12111,
286
- encodedBodySize: 12111,
287
- transferSize: 12416,
288
- },
289
- '/javascripts/lib/ep_performance_test_hooks/static/js/performance.js': {
290
- decodedBodySize: 9999,
291
- encodedBodySize: 9999,
292
- transferSize: 9999,
293
- },
294
- '/socket.io/': {
295
- decodedBodySize: 14128,
296
- encodedBodySize: 3333,
297
- transferSize: 3555,
298
- },
299
- },
300
- loadTimes: {
301
- '/static/css/pad.css': {
302
- redirectTime: 0,
303
- domainLookupTime: 0,
304
- tcpTime: 0,
305
- secureConnectionTime: '0',
306
- responseTime: 1.8149999668821692,
307
- fetchUntilResponseEndTime: 32.11499995086342,
308
- requestStartUntilResponseEndTime: 28.025000006891787,
309
- startUntilResponseEndTime: 32.11499995086342,
310
- },
311
- '/static/skins/colibris/pad.css': {
312
- redirectTime: 0,
313
- domainLookupTime: 0,
314
- tcpTime: 0,
315
- secureConnectionTime: '0',
316
- responseTime: 2.0149999763816595,
317
- fetchUntilResponseEndTime: 32.11999998893589,
318
- requestStartUntilResponseEndTime: 27.69000001717359,
319
- startUntilResponseEndTime: 32.11999998893589,
320
- },
321
- '/static/js/html10n.js': {
322
- redirectTime: 0,
323
- domainLookupTime: 0,
324
- tcpTime: 0,
325
- secureConnectionTime: '0',
326
- responseTime: 26.489999960176647,
327
- fetchUntilResponseEndTime: 56.38500000350177,
328
- requestStartUntilResponseEndTime: 51.93999991752207,
329
- startUntilResponseEndTime: 56.38500000350177,
330
- },
331
- '/static/js/l10n.js': {
332
- redirectTime: 0,
333
- domainLookupTime: 0,
334
- tcpTime: 0,
335
- secureConnectionTime: '0',
336
- responseTime: 25.52500006277114,
337
- fetchUntilResponseEndTime: 73.86500004213303,
338
- requestStartUntilResponseEndTime: 72.15500005986542,
339
- startUntilResponseEndTime: 73.86500004213303,
340
- },
341
- '/static/js/require-kernel.js': {
342
- redirectTime: 0,
343
- domainLookupTime: 0,
344
- tcpTime: 0,
345
- secureConnectionTime: '0',
346
- responseTime: 6.754999980330467,
347
- fetchUntilResponseEndTime: 21.35000005364418,
348
- requestStartUntilResponseEndTime: 19.085000036284328,
349
- startUntilResponseEndTime: 21.35000005364418,
350
- },
351
- '/javascripts/lib/ep_etherpad-lite/static/js/pad_utils.js': {
352
- redirectTime: 17.67999993171543,
353
- domainLookupTime: 0,
354
- tcpTime: 0,
355
- secureConnectionTime: '0',
356
- responseTime: 8.450000081211329,
357
- fetchUntilResponseEndTime: 301.02000006008893,
358
- requestStartUntilResponseEndTime: 301.09000009018928,
359
- startUntilResponseEndTime: 301.96999999973923,
360
- },
361
- '/socket.io/socket.io.js': {
362
- redirectTime: 0,
363
- domainLookupTime: 0,
364
- tcpTime: 0,
365
- secureConnectionTime: '0',
366
- responseTime: 26.91500005312264,
367
- fetchUntilResponseEndTime: 71.02000003214926,
368
- requestStartUntilResponseEndTime: 54.955000057816505,
369
- startUntilResponseEndTime: 71.02000003214926,
370
- },
371
- '/javascripts/lib/ep_etherpad-lite/static/js/pad.js': {
372
- redirectTime: 0,
373
- domainLookupTime: 0,
374
- tcpTime: 0,
375
- secureConnectionTime: '0',
376
- responseTime: 66.80999998934567,
377
- fetchUntilResponseEndTime: 241.50000002700835,
378
- requestStartUntilResponseEndTime: 224.34500001836568,
379
- startUntilResponseEndTime: 241.50000002700835,
380
- },
381
- '/javascripts/lib/ep_etherpad-lite/static/js/ace2_common.js': {
382
- redirectTime: 0,
383
- domainLookupTime: 0,
384
- tcpTime: 0,
385
- secureConnectionTime: '0',
386
- responseTime: 33.9049999602139,
387
- fetchUntilResponseEndTime: 115.11000001337379,
388
- requestStartUntilResponseEndTime: 93.93500001169741,
389
- startUntilResponseEndTime: 115.11000001337379,
390
- },
391
- '/static/skins/colibris/pad.js': {
392
- redirectTime: 0,
393
- domainLookupTime: 0,
394
- tcpTime: 0,
395
- secureConnectionTime: '0',
396
- responseTime: 1.8050000071525574,
397
- fetchUntilResponseEndTime: 74.56500001717359,
398
- requestStartUntilResponseEndTime: 54.17499993927777,
399
- startUntilResponseEndTime: 74.56500001717359,
400
- },
401
- '/static/css/pad/normalize.css': {
402
- redirectTime: 0,
403
- domainLookupTime: 0,
404
- tcpTime: 0,
405
- secureConnectionTime: '0',
406
- responseTime: 2.2800000151619315,
407
- fetchUntilResponseEndTime: 86.5650000050664,
408
- requestStartUntilResponseEndTime: 41.05999995954335,
409
- startUntilResponseEndTime: 86.5650000050664,
410
- },
411
- '/static/css/pad/layout.css': {
412
- redirectTime: 0,
413
- domainLookupTime: 0,
414
- tcpTime: 0,
415
- secureConnectionTime: '0',
416
- responseTime: 1.660000067204237,
417
- fetchUntilResponseEndTime: 85.74000000953674,
418
- requestStartUntilResponseEndTime: 39.88000005483627,
419
- startUntilResponseEndTime: 85.74000000953674,
420
- },
421
- '/static/css/pad/fonts.css': {
422
- redirectTime: 0,
423
- domainLookupTime: 0,
424
- tcpTime: 0,
425
- secureConnectionTime: '0',
426
- responseTime: 1.9549999851733446,
427
- fetchUntilResponseEndTime: 85.86500003002584,
428
- requestStartUntilResponseEndTime: 34.605000051669776,
429
- startUntilResponseEndTime: 85.86500003002584,
430
- },
431
- '/static/css/pad/toolbar.css': {
432
- redirectTime: 0,
433
- domainLookupTime: 0,
434
- tcpTime: 0,
435
- secureConnectionTime: '0',
436
- responseTime: 0.750000006519258,
437
- fetchUntilResponseEndTime: 104.4850000180304,
438
- requestStartUntilResponseEndTime: 18.465000088326633,
439
- startUntilResponseEndTime: 104.4850000180304,
440
- },
441
- '/static/css/pad/popup.css': {
442
- redirectTime: 0,
443
- domainLookupTime: 0,
444
- tcpTime: 0,
445
- secureConnectionTime: '0',
446
- responseTime: 7.1000000461936,
447
- fetchUntilResponseEndTime: 121.5749999973923,
448
- requestStartUntilResponseEndTime: 35.38500005379319,
449
- startUntilResponseEndTime: 121.5749999973923,
450
- },
451
- '/static/css/pad/popup_connectivity.css': {
452
- redirectTime: 0,
453
- domainLookupTime: 0,
454
- tcpTime: 0,
455
- secureConnectionTime: '0',
456
- responseTime: 6.905000074766576,
457
- fetchUntilResponseEndTime: 121.00499996449798,
458
- requestStartUntilResponseEndTime: 34.89000000990927,
459
- startUntilResponseEndTime: 121.00499996449798,
460
- },
461
- '/static/css/pad/popup_import_export.css': {
462
- redirectTime: 0,
463
- domainLookupTime: 0,
464
- tcpTime: 0,
465
- secureConnectionTime: '0',
466
- responseTime: 6.690000067465007,
467
- fetchUntilResponseEndTime: 120.45000004582107,
468
- requestStartUntilResponseEndTime: 31.77000000141561,
469
- startUntilResponseEndTime: 120.45000004582107,
470
- },
471
- '/static/css/pad/popup_users.css': {
472
- redirectTime: 0,
473
- domainLookupTime: 0,
474
- tcpTime: 0,
475
- secureConnectionTime: '0',
476
- responseTime: 6.46999990567565,
477
- fetchUntilResponseEndTime: 119.81999990530312,
478
- requestStartUntilResponseEndTime: 30.65999993123114,
479
- startUntilResponseEndTime: 119.81999990530312,
480
- },
481
- '/static/css/pad/icons.css': {
482
- redirectTime: 0,
483
- domainLookupTime: 0,
484
- tcpTime: 0,
485
- secureConnectionTime: '0',
486
- responseTime: 14.04999999795109,
487
- fetchUntilResponseEndTime: 130.6949999416247,
488
- requestStartUntilResponseEndTime: 27.469999971799552,
489
- startUntilResponseEndTime: 130.6949999416247,
490
- },
491
- '/static/css/pad/chat.css': {
492
- redirectTime: 0,
493
- domainLookupTime: 0,
494
- tcpTime: 0,
495
- secureConnectionTime: '0',
496
- responseTime: 2.199999988079071,
497
- fetchUntilResponseEndTime: 132.82499997876585,
498
- requestStartUntilResponseEndTime: 18.745000008493662,
499
- startUntilResponseEndTime: 132.82499997876585,
500
- },
501
- '/static/css/pad/gritter.css': {
502
- redirectTime: 0,
503
- domainLookupTime: 0,
504
- tcpTime: 0,
505
- secureConnectionTime: '0',
506
- responseTime: 2.800000016577542,
507
- fetchUntilResponseEndTime: 150.03999997861683,
508
- requestStartUntilResponseEndTime: 29.229999985545874,
509
- startUntilResponseEndTime: 150.03999997861683,
510
- },
511
- '/static/css/pad/loadingbox.css': {
512
- redirectTime: 0,
513
- domainLookupTime: 0,
514
- tcpTime: 0,
515
- secureConnectionTime: '0',
516
- responseTime: 2.474999986588955,
517
- fetchUntilResponseEndTime: 145.14999999664724,
518
- requestStartUntilResponseEndTime: 24.259999976493418,
519
- startUntilResponseEndTime: 145.14999999664724,
520
- },
521
- '/static/css/pad/form.css': {
522
- redirectTime: 0,
523
- domainLookupTime: 0,
524
- tcpTime: 0,
525
- secureConnectionTime: '0',
526
- responseTime: 4.335000063292682,
527
- fetchUntilResponseEndTime: 151.16999996826053,
528
- requestStartUntilResponseEndTime: 30.29000002425164,
529
- startUntilResponseEndTime: 151.16999996826053,
530
- },
531
- '/static/skins/colibris/src/general.css': {
532
- redirectTime: 0,
533
- domainLookupTime: 0,
534
- tcpTime: 0,
535
- secureConnectionTime: '0',
536
- responseTime: 3.3650000113993883,
537
- fetchUntilResponseEndTime: 148.13999994657934,
538
- requestStartUntilResponseEndTime: 29.144999920390546,
539
- startUntilResponseEndTime: 148.13999994657934,
540
- },
541
- '/static/skins/colibris/src/layout.css': {
542
- redirectTime: 0,
543
- domainLookupTime: 0,
544
- tcpTime: 0,
545
- secureConnectionTime: '0',
546
- responseTime: 5.21499989554286,
547
- fetchUntilResponseEndTime: 149.78999993763864,
548
- requestStartUntilResponseEndTime: 22.0399999525398,
549
- startUntilResponseEndTime: 149.78999993763864,
550
- },
551
- '/static/skins/colibris/src/pad-editor.css': {
552
- redirectTime: 0,
553
- domainLookupTime: 0,
554
- tcpTime: 0,
555
- secureConnectionTime: '0',
556
- responseTime: 6.02000008802861,
557
- fetchUntilResponseEndTime: 152.30000007431954,
558
- requestStartUntilResponseEndTime: 22.520000115036964,
559
- startUntilResponseEndTime: 152.30000007431954,
560
- },
561
- '/static/skins/colibris/src/components/scrollbars.css': {
562
- redirectTime: 0,
563
- domainLookupTime: 0,
564
- tcpTime: 0,
565
- secureConnectionTime: '0',
566
- responseTime: 2.6700000744313,
567
- fetchUntilResponseEndTime: 153.7450000178069,
568
- requestStartUntilResponseEndTime: 11.470000026747584,
569
- startUntilResponseEndTime: 153.7450000178069,
570
- },
571
- '/static/skins/colibris/src/components/buttons.css': {
572
- redirectTime: 0,
573
- domainLookupTime: 0,
574
- tcpTime: 0,
575
- secureConnectionTime: '0',
576
- responseTime: 0.7800000021234155,
577
- fetchUntilResponseEndTime: 166.74499993678182,
578
- requestStartUntilResponseEndTime: 18.57499999459833,
579
- startUntilResponseEndTime: 166.74499993678182,
580
- },
581
- '/static/skins/colibris/src/components/popup.css': {
582
- redirectTime: 0,
583
- domainLookupTime: 0,
584
- tcpTime: 0,
585
- secureConnectionTime: '0',
586
- responseTime: 2.195000066421926,
587
- fetchUntilResponseEndTime: 169.4300000090152,
588
- requestStartUntilResponseEndTime: 21.27000002656132,
589
- startUntilResponseEndTime: 169.4300000090152,
590
- },
591
- '/static/skins/colibris/src/components/chat.css': {
592
- redirectTime: 0,
593
- domainLookupTime: 0,
594
- tcpTime: 0,
595
- secureConnectionTime: '0',
596
- responseTime: 3.2399999909102917,
597
- fetchUntilResponseEndTime: 170.17000005580485,
598
- requestStartUntilResponseEndTime: 21.880000014789402,
599
- startUntilResponseEndTime: 170.17000005580485,
600
- },
601
- '/static/skins/colibris/src/components/sidediv.css': {
602
- redirectTime: 0,
603
- domainLookupTime: 0,
604
- tcpTime: 0,
605
- secureConnectionTime: '0',
606
- responseTime: 3.389999968931079,
607
- fetchUntilResponseEndTime: 171.79000005126,
608
- requestStartUntilResponseEndTime: 23.539999965578318,
609
- startUntilResponseEndTime: 171.79000005126,
610
- },
611
- '/static/skins/colibris/src/components/gritter.css': {
612
- redirectTime: 0,
613
- domainLookupTime: 0,
614
- tcpTime: 0,
615
- secureConnectionTime: '0',
616
- responseTime: 1.3099999632686377,
617
- fetchUntilResponseEndTime: 177.83000005874783,
618
- requestStartUntilResponseEndTime: 27.254999964497983,
619
- startUntilResponseEndTime: 177.83000005874783,
620
- },
621
- '/static/skins/colibris/src/components/table-of-content.css': {
622
- redirectTime: 0,
623
- domainLookupTime: 0,
624
- tcpTime: 0,
625
- secureConnectionTime: '0',
626
- responseTime: 1.129999989643693,
627
- fetchUntilResponseEndTime: 177.18999995850027,
628
- requestStartUntilResponseEndTime: 25.254999985918403,
629
- startUntilResponseEndTime: 177.18999995850027,
630
- },
631
- '/static/skins/colibris/src/components/toolbar.css': {
632
- redirectTime: 0,
633
- domainLookupTime: 0,
634
- tcpTime: 0,
635
- secureConnectionTime: '0',
636
- responseTime: 4.2100000428035855,
637
- fetchUntilResponseEndTime: 194.63500007987022,
638
- requestStartUntilResponseEndTime: 29.93000007700175,
639
- startUntilResponseEndTime: 194.63500007987022,
640
- },
641
- '/static/skins/colibris/src/components/users.css': {
642
- redirectTime: 0,
643
- domainLookupTime: 0,
644
- tcpTime: 0,
645
- secureConnectionTime: '0',
646
- responseTime: 3.5199999110773206,
647
- fetchUntilResponseEndTime: 198.9899999462068,
648
- requestStartUntilResponseEndTime: 31.884999945759773,
649
- startUntilResponseEndTime: 198.9899999462068,
650
- },
651
- '/static/skins/colibris/src/components/form.css': {
652
- redirectTime: 0,
653
- domainLookupTime: 0,
654
- tcpTime: 0,
655
- secureConnectionTime: '0',
656
- responseTime: 5.8750000316649675,
657
- fetchUntilResponseEndTime: 201.2749999994412,
658
- requestStartUntilResponseEndTime: 33.49499998148531,
659
- startUntilResponseEndTime: 201.2749999994412,
660
- },
661
- '/static/skins/colibris/src/components/import-export.css': {
662
- redirectTime: 0,
663
- domainLookupTime: 0,
664
- tcpTime: 0,
665
- secureConnectionTime: '0',
666
- responseTime: 5.639999988488853,
667
- fetchUntilResponseEndTime: 200.56999998632818,
668
- requestStartUntilResponseEndTime: 30.99499992094934,
669
- startUntilResponseEndTime: 200.56999998632818,
670
- },
671
- '/static/skins/colibris/src/plugins/brightcolorpicker.css': {
672
- redirectTime: 0,
673
- domainLookupTime: 0,
674
- tcpTime: 0,
675
- secureConnectionTime: '0',
676
- responseTime: 4.550000070594251,
677
- fetchUntilResponseEndTime: 198.8950000377372,
678
- requestStartUntilResponseEndTime: 23.619999992661178,
679
- startUntilResponseEndTime: 198.8950000377372,
680
- },
681
- '/static/skins/colibris/src/plugins/font_color.css': {
682
- redirectTime: 0,
683
- domainLookupTime: 0,
684
- tcpTime: 0,
685
- secureConnectionTime: '0',
686
- responseTime: 6.0350000858306885,
687
- fetchUntilResponseEndTime: 200.17000008374453,
688
- requestStartUntilResponseEndTime: 24.910000036470592,
689
- startUntilResponseEndTime: 200.17000008374453,
690
- },
691
- '/static/skins/colibris/src/plugins/tables2.css': {
692
- redirectTime: 0,
693
- domainLookupTime: 0,
694
- tcpTime: 0,
695
- secureConnectionTime: '0',
696
- responseTime: 4.865000024437904,
697
- fetchUntilResponseEndTime: 207.4199999915436,
698
- requestStartUntilResponseEndTime: 15.325000043958426,
699
- startUntilResponseEndTime: 207.4199999915436,
700
- },
701
- '/static/skins/colibris/src/plugins/set_title_on_pad.css': {
702
- redirectTime: 0,
703
- domainLookupTime: 0,
704
- tcpTime: 0,
705
- secureConnectionTime: '0',
706
- responseTime: 1.879999996162951,
707
- fetchUntilResponseEndTime: 213.05000002030283,
708
- requestStartUntilResponseEndTime: 16.124999965541065,
709
- startUntilResponseEndTime: 213.05000002030283,
710
- },
711
- '/static/skins/colibris/src/plugins/author_hover.css': {
712
- redirectTime: 0,
713
- domainLookupTime: 0,
714
- tcpTime: 0,
715
- secureConnectionTime: '0',
716
- responseTime: 2.0200000144541264,
717
- fetchUntilResponseEndTime: 212.86500000860542,
718
- requestStartUntilResponseEndTime: 15.275000012479722,
719
- startUntilResponseEndTime: 212.86500000860542,
720
- },
721
- '/static/skins/colibris/src/plugins/comments.css': {
722
- redirectTime: 0,
723
- domainLookupTime: 0,
724
- tcpTime: 0,
725
- secureConnectionTime: '0',
726
- responseTime: 1.4349999837577343,
727
- fetchUntilResponseEndTime: 215.85000003688037,
728
- requestStartUntilResponseEndTime: 16.905000084079802,
729
- startUntilResponseEndTime: 215.85000003688037,
730
- },
731
- '/static/skins/colibris/src/pad-variants.css': {
732
- redirectTime: 0,
733
- domainLookupTime: 0,
734
- tcpTime: 0,
735
- secureConnectionTime: '0',
736
- responseTime: 1.9099999917671084,
737
- fetchUntilResponseEndTime: 215.18999990075827,
738
- requestStartUntilResponseEndTime: 17.110000015236437,
739
- startUntilResponseEndTime: 215.18999990075827,
740
- },
741
- '/static/font/Quicksand-Bold.ttf': {
742
- redirectTime: 0,
743
- domainLookupTime: 0,
744
- tcpTime: 0,
745
- secureConnectionTime: '0',
746
- responseTime: 10.215000016614795,
747
- fetchUntilResponseEndTime: 21.140000084415078,
748
- requestStartUntilResponseEndTime: 19.37500003259629,
749
- startUntilResponseEndTime: 21.140000084415078,
750
- },
751
- '/static/font/Quicksand-Medium.ttf': {
752
- redirectTime: 0,
753
- domainLookupTime: 0,
754
- tcpTime: 0,
755
- secureConnectionTime: '0',
756
- responseTime: 6.495000096037984,
757
- fetchUntilResponseEndTime: 24.8850000789389,
758
- requestStartUntilResponseEndTime: 22.59000006597489,
759
- startUntilResponseEndTime: 24.8850000789389,
760
- },
761
- '/static/font/fontawesome-etherpad.woff': {
762
- redirectTime: 0,
763
- domainLookupTime: 0,
764
- tcpTime: 0,
765
- secureConnectionTime: '0',
766
- responseTime: 6.245000055059791,
767
- fetchUntilResponseEndTime: 26.070000021718442,
768
- requestStartUntilResponseEndTime: 24.12499999627471,
769
- startUntilResponseEndTime: 26.070000021718442,
770
- },
771
- '/pluginfw/plugin-definitions.json': {
772
- redirectTime: 0,
773
- domainLookupTime: 0,
774
- tcpTime: 0,
775
- secureConnectionTime: '0',
776
- responseTime: 0.5700000328943133,
777
- fetchUntilResponseEndTime: 9.550000075250864,
778
- requestStartUntilResponseEndTime: 7.670000079087913,
779
- startUntilResponseEndTime: 9.550000075250864,
780
- },
781
- '/locales.json': {
782
- redirectTime: 0,
783
- domainLookupTime: 0,
784
- tcpTime: 0,
785
- secureConnectionTime: '0',
786
- responseTime: 7.780000101774931,
787
- fetchUntilResponseEndTime: 15.565000008791685,
788
- requestStartUntilResponseEndTime: 14.365000068210065,
789
- startUntilResponseEndTime: 15.565000008791685,
790
- },
791
- '/javascripts/lib/ep_performance_test_hooks/static/js/performance.js': {
792
- redirectTime: 0,
793
- domainLookupTime: 0,
794
- tcpTime: 0,
795
- secureConnectionTime: '0',
796
- responseTime: 76.88000006601214,
797
- fetchUntilResponseEndTime: 119.24999998882413,
798
- requestStartUntilResponseEndTime: 116.28499999642372,
799
- startUntilResponseEndTime: 119.24999998882413,
800
- },
801
- '/socket.io/': {
802
- redirectTime: 0,
803
- domainLookupTime: 0,
804
- tcpTime: 0,
805
- secureConnectionTime: '0',
806
- responseTime: 0.6150000263005495,
807
- fetchUntilResponseEndTime: 37.74499997962266,
808
- requestStartUntilResponseEndTime: 36.220000009052455,
809
- startUntilResponseEndTime: 37.74499997962266,
810
- },
811
- },
812
- };
813
-
814
- describe('Performance tests', function () {
815
- // create a new pad before each test run
816
- beforeEach(function (cb) {
817
- helper.newPad(cb);
818
- this.timeout(60000);
819
- });
820
-
821
- let stats;
822
-
823
- it('Gets test data and ensures they are within criteria', async function () {
824
- this.timeout(60000);
825
- stats = await getStats();
826
- stats.ep_performance_test_hooks.averageSize =
827
- getAverage(stats.ep_performance_test_hooks.loadSizes, 'transferSize');
828
- stats.ep_performance_test_hooks.averageFetchTime =
829
- getAverage(stats.ep_performance_test_hooks.loadTimes, 'fetchUntilResponseEndTime');
830
- testValues(stats);
831
- });
832
-
833
- it('Opens a second pad and it should be quicker and use less bandwidth', async function () {
834
- // Now we have all the initial values, let's bring up a new pad and
835
- // make sure the new values are lower and/or file size is smaller and/or
836
- // page load is quicker :)
837
- const newStats = await getStats();
838
- const newLoadAverage =
839
- getAverage(newStats.ep_performance_test_hooks.loadTimes, 'fetchUntilResponseEndTime');
840
- const newSizeAverage =
841
- getAverage(newStats.ep_performance_test_hooks.loadSizes, 'transferSize');
842
-
843
- if (newLoadAverage >= stats.ep_performance_test_hooks.averageFetchTime) {
844
- throw new Error(
845
- `Average fetch time ${newLoadAverage} was not faster than the
846
- first load ${stats.ep_performance_test_hooks.averageFetchTime}`);
847
- } else {
848
- // all good, but lets just let console know :)
849
- console.info(
850
- `Average fetch time ${newLoadAverage} of 2nd pad load was faster than the first load ` +
851
- `${stats.ep_performance_test_hooks.averageFetchTime}`);
852
- }
853
- if (newSizeAverage >= stats.ep_performance_test_hooks.averageSize) {
854
- throw new Error(
855
- `Average size ${newSizeAverage} was not smaller than the first load ` +
856
- `${stats.ep_performance_test_hooks.averageSize}`);
857
- } else {
858
- // all good, but lets just let console know :)
859
- console.info(
860
- `Average size ${newSizeAverage} of 2nd pad load was smaller than the first load ` +
861
- `${stats.ep_performance_test_hooks.averageSize}`);
862
- }
863
- });
864
- });
865
-
866
- const getAverage = (stats, item) => {
867
- const items = [];
868
- for (const [key] of Object.entries(stats)) {
869
- items.push(stats[key][item]);
870
- }
871
- const itemsAvg = items.reduce((p, c) => p + c, 0) / items.length;
872
- return itemsAvg;
873
- };
874
-
875
- const getStats = () => new Promise(
876
- (resolve, reject) => {
877
- $.ajaxSetup({cache: false});
878
- // used to ensure the request is unique
879
- $.getJSON('/stats', (stats) => {
880
- resolve(stats);
881
- });
882
- });
883
-
884
- const testValues = (stats) => {
885
- const startDurations = stats.startDurations;
886
- const loadTimes = stats.ep_performance_test_hooks.loadTimes;
887
- const loadSizes = stats.ep_performance_test_hooks.loadSizes;
888
- const perf = stats.ep_performance_test_hooks.performance;
889
- const etherpadHooks = stats.ep_performance_test_hooks.etherpadHooks;
890
-
891
- // startup durations push to server -- done! :)
892
- for (const [key, value] of Object.entries(startDurations)) {
893
- const requirement = requirements.startDurations[key];
894
- const x = `${key} too slow with output of ${value}, expected ${requirement}`;
895
- if (value > requirement) throw new Error(x);
896
- }
897
-
898
- // performance from the w3c performance spec
899
- if (!perf.connectStart) throw new Error('no connectStart value available');
900
- const start = perf.connectStart;
901
- for (const [key, value] of Object.entries(perf)) {
902
- const requirement = requirements.perf[key] * 1.1;
903
- const valueLessStart = value - start;
904
- const x = `w3c spec performance: ${key} too slow with output of
905
- ${value - start}, expected ${requirement}`;
906
- if ((requirement > 0) && (valueLessStart > requirement)) throw new Error(x);
907
- }
908
-
909
- // file/resource timings IE /static/css/pad.css
910
- for (const [url, values] of Object.entries(loadTimes)) {
911
- for (const [test, value] of Object.entries(values)) {
912
- // we multiply here because it's approx the amount of latency
913
- // that having the iframe for the test runner seems to introduce?
914
- // I suggest more effort is put into this to validate it's validity
915
- // as a test.
916
- // TODO: Need help here please :)
917
- const requirement = requirements.loadTimes[url][test] * 7;
918
- const x = `file/resource timings: ${url} ${test} too slow with output of
919
- ${value}, expected ${requirement}`;
920
- if ((value >= 100) && (value > requirement)) throw new Error(x);
921
- }
922
- }
923
-
924
- // file/resource sizes IE https://whatever.com/pad.css?v1
925
- for (const [path, values] of Object.entries(loadSizes)) {
926
- for (const [test, value] of Object.entries(values)) {
927
- const requirement = requirements.loadSizes[path][test] * 1.1;
928
- const x = `file/resource size: ${path} ${test} too big with output of
929
- ${value}, expected ${requirement}`;
930
- if (value > requirement) throw new Error(x);
931
- }
932
- }
933
-
934
- // etherpad Hooks with documentReady as a base ref
935
- for (const [key, value] of Object.entries(etherpadHooks)) {
936
- const requirement = requirements.etherpadHooks[key] * 1.1;
937
- const duration = value - etherpadHooks.documentReady;
938
- const x = `hook: ${key} too slow with output of ${value - etherpadHooks.documentReady},
939
- expected ${requirement}`;
940
- if (duration > requirement) throw new Error(x);
941
- }
942
- };