@webex/internal-plugin-metrics 3.0.0-bnr.5 → 3.0.0-next.2

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.
Files changed (78) hide show
  1. package/.eslintrc.js +6 -0
  2. package/babel.config.js +3 -0
  3. package/dist/batcher.js +41 -3
  4. package/dist/batcher.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +64 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +474 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.js +850 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  11. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +349 -0
  12. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  13. package/dist/call-diagnostic/config.js +609 -0
  14. package/dist/call-diagnostic/config.js.map +1 -0
  15. package/dist/client-metrics-batcher.js +3 -3
  16. package/dist/client-metrics-batcher.js.map +1 -1
  17. package/dist/config.js +6 -9
  18. package/dist/config.js.map +1 -1
  19. package/dist/index.js +35 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/metrics.js +28 -22
  22. package/dist/metrics.js.map +1 -1
  23. package/dist/metrics.types.js +7 -0
  24. package/dist/metrics.types.js.map +1 -0
  25. package/dist/new-metrics.js +302 -0
  26. package/dist/new-metrics.js.map +1 -0
  27. package/dist/prelogin-metrics-batcher.js +81 -0
  28. package/dist/prelogin-metrics-batcher.js.map +1 -0
  29. package/dist/types/batcher.d.ts +5 -0
  30. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +204 -0
  31. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +427 -0
  32. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +103 -0
  33. package/dist/types/call-diagnostic/config.d.ts +178 -0
  34. package/dist/types/config.d.ts +18 -0
  35. package/dist/types/index.d.ts +15 -3
  36. package/dist/types/metrics.d.ts +1 -0
  37. package/dist/types/metrics.types.d.ts +105 -0
  38. package/dist/types/new-metrics.d.ts +131 -0
  39. package/dist/types/prelogin-metrics-batcher.d.ts +2 -0
  40. package/dist/types/utils.d.ts +6 -0
  41. package/dist/utils.js +26 -0
  42. package/dist/utils.js.map +1 -0
  43. package/jest.config.js +3 -0
  44. package/package.json +34 -10
  45. package/process +1 -0
  46. package/src/batcher.js +38 -0
  47. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +72 -0
  48. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +435 -0
  49. package/src/call-diagnostic/call-diagnostic-metrics.ts +913 -0
  50. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +392 -0
  51. package/src/call-diagnostic/config.ts +685 -0
  52. package/src/client-metrics-batcher.js +1 -0
  53. package/src/config.js +1 -0
  54. package/src/index.ts +54 -0
  55. package/src/metrics.js +20 -16
  56. package/src/metrics.types.ts +168 -0
  57. package/src/new-metrics.ts +278 -0
  58. package/src/prelogin-metrics-batcher.ts +95 -0
  59. package/src/utils.ts +17 -0
  60. package/test/unit/spec/batcher.js +2 -0
  61. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +458 -0
  62. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +520 -0
  63. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2297 -0
  64. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +628 -0
  65. package/test/unit/spec/client-metrics-batcher.js +2 -0
  66. package/test/unit/spec/metrics.js +76 -95
  67. package/test/unit/spec/new-metrics.ts +233 -0
  68. package/test/unit/spec/prelogin-metrics-batcher.ts +250 -0
  69. package/test/unit/spec/utils.ts +22 -0
  70. package/tsconfig.json +6 -0
  71. package/dist/call-diagnostic-events-batcher.js +0 -60
  72. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  73. package/dist/internal-plugin-metrics.d.ts +0 -21
  74. package/dist/tsdoc-metadata.json +0 -11
  75. package/src/call-diagnostic-events-batcher.js +0 -62
  76. package/src/index.js +0 -17
  77. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
  78. package/dist/types/{call-diagnostic-events-batcher.d.ts → call-diagnostic/call-diagnostic-metrics-batcher.d.ts} +1 -1
@@ -0,0 +1,520 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import CallDiagnosticLatencies from '../../../../src/call-diagnostic/call-diagnostic-metrics-latencies';
3
+ import sinon from 'sinon';
4
+
5
+ describe('internal-plugin-metrics', () => {
6
+ describe('CallDiagnosticLatencies', () => {
7
+ let cdl: CallDiagnosticLatencies;
8
+ var now = new Date();
9
+
10
+ beforeEach(() => {
11
+ sinon.createSandbox();
12
+ sinon.useFakeTimers(now.getTime());
13
+ const webex = {
14
+ meetings: {
15
+ meetingCollection: {
16
+ get: (id: string) => {
17
+ if (id === 'meeting-id') {
18
+ return {id: 'meeting-id', allowMediaInLobby: true};
19
+ }
20
+ },
21
+ },
22
+ },
23
+ };
24
+
25
+ cdl = new CallDiagnosticLatencies(
26
+ {},
27
+ {
28
+ parent: webex,
29
+ }
30
+ );
31
+ });
32
+
33
+ afterEach(() => {
34
+ sinon.restore();
35
+ });
36
+
37
+ it('should save timestamp correctly', () => {
38
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
39
+ cdl.saveTimestamp({key: 'client.alert.displayed'});
40
+ assert.deepEqual(cdl.latencyTimestamps.size, 1);
41
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), now.getTime());
42
+ });
43
+
44
+ it('should save latency correctly', () => {
45
+ assert.deepEqual(cdl.precomputedLatencies.size, 0);
46
+ cdl.saveLatency('internal.client.pageJMT', 10);
47
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
48
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
49
+ });
50
+
51
+ it('should save only first timestamp correctly', () => {
52
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
53
+ cdl.saveFirstTimestampOnly('client.alert.displayed', 10);
54
+ cdl.saveFirstTimestampOnly('client.alert.displayed', 20);
55
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), 10);
56
+ });
57
+
58
+ it('should save only first timestamp correctly for client.media.tx.start and client.media.rx.start', () => {
59
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
60
+ cdl.saveFirstTimestampOnly('client.media.tx.start', 10);
61
+ cdl.saveFirstTimestampOnly('client.media.tx.start', 20);
62
+ cdl.saveFirstTimestampOnly('client.media.rx.start', 12);
63
+ cdl.saveFirstTimestampOnly('client.media.rx.start', 22);
64
+ assert.deepEqual(cdl.latencyTimestamps.get('client.media.tx.start'), 10);
65
+ assert.deepEqual(cdl.latencyTimestamps.get('client.media.rx.start'), 12);
66
+ });
67
+
68
+ it('should update existing property and now add new keys', () => {
69
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
70
+ cdl.saveTimestamp({key: 'client.alert.displayed'});
71
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), now.getTime());
72
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 1234});
73
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), 1234);
74
+ assert.deepEqual(cdl.latencyTimestamps.size, 1);
75
+ });
76
+
77
+ it('should clear all timestamps correctly', () => {
78
+ cdl.saveTimestamp({key: 'client.alert.displayed'});
79
+ cdl.saveTimestamp({key: 'client.alert.removed'});
80
+ assert.deepEqual(cdl.latencyTimestamps.size, 2);
81
+ cdl.clearTimestamps();
82
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
83
+ });
84
+
85
+ it('should calculate diff between timestamps correctly', () => {
86
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 10});
87
+ cdl.saveTimestamp({key: 'client.alert.removed', value: 20});
88
+ const res = cdl.getDiffBetweenTimestamps('client.alert.displayed', 'client.alert.removed');
89
+ assert.deepEqual(res, 10);
90
+ });
91
+
92
+ it('it returns undefined if either one is doesnt exist', () => {
93
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 10});
94
+ const res1 = cdl.getDiffBetweenTimestamps('client.alert.displayed', 'client.alert.removed');
95
+ assert.deepEqual(res1, undefined);
96
+ const res2 = cdl.getDiffBetweenTimestamps('client.alert.removed', 'client.alert.displayed');
97
+ assert.deepEqual(res2, undefined);
98
+ });
99
+
100
+ it('calculates getMeetingInfoReqResp correctly', () => {
101
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 10});
102
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 20});
103
+ assert.deepEqual(cdl.getMeetingInfoReqResp(), 10);
104
+ });
105
+
106
+ it('calculates getMeetingInfoReqResp correctly when duplicate requests/responses are sent', () => {
107
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 8});
108
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 18});
109
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 47});
110
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 48});
111
+ assert.deepEqual(cdl.getMeetingInfoReqResp(), 10);
112
+ });
113
+
114
+ describe('saveTimestamp', () => {
115
+ afterEach(() => {
116
+ sinon.restore();
117
+ });
118
+
119
+ it('calls saveFirstTimestamp for meeting info request', () => {
120
+ const saveFirstTimestamp = sinon.stub(cdl, 'saveFirstTimestampOnly');
121
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 10});
122
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 15});
123
+ assert.deepEqual(saveFirstTimestamp.callCount, 1);
124
+ });
125
+
126
+ it('calls saveFirstTimestamp for meeting info response', () => {
127
+ const saveFirstTimestamp = sinon.stub(cdl, 'saveFirstTimestampOnly');
128
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 15});
129
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 20});
130
+ assert.deepEqual(saveFirstTimestamp.callCount, 1);
131
+ });
132
+ });
133
+
134
+ it('calculates getShowInterstitialTime correctly', () => {
135
+ cdl.saveTimestamp({key: 'client.interstitial-window.start-launch', value: 10});
136
+ cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 20});
137
+ assert.deepEqual(cdl.getShowInterstitialTime(), 10);
138
+ });
139
+
140
+ it('calculates getCallInitJoinReq correctly', () => {
141
+ cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
142
+ cdl.saveTimestamp({key: 'client.locus.join.request', value: 20});
143
+ assert.deepEqual(cdl.getCallInitJoinReq(), 10);
144
+ });
145
+
146
+ it('calculates getRegisterWDMDeviceJMT correctly', () => {
147
+ cdl.saveTimestamp({key: 'internal.register.device.request', value: 10});
148
+ cdl.saveTimestamp({key: 'internal.register.device.response', value: 20});
149
+ assert.deepEqual(cdl.getRegisterWDMDeviceJMT(), 10);
150
+ });
151
+
152
+ it('calculates getJoinReqResp correctly', () => {
153
+ cdl.saveTimestamp({
154
+ key: 'client.locus.join.request',
155
+ value: 10,
156
+ });
157
+ cdl.saveTimestamp({
158
+ key: 'client.locus.join.response',
159
+ value: 20,
160
+ });
161
+ assert.deepEqual(cdl.getJoinReqResp(), 10);
162
+ });
163
+
164
+ it('calculates getTurnDiscoveryTime correctly', () => {
165
+ cdl.saveTimestamp({
166
+ key: 'internal.client.add-media.turn-discovery.start',
167
+ value: 10,
168
+ });
169
+ cdl.saveTimestamp({
170
+ key: 'internal.client.add-media.turn-discovery.end',
171
+ value: 20,
172
+ });
173
+ assert.deepEqual(cdl.getTurnDiscoveryTime(), 10);
174
+ });
175
+
176
+ it('calculates getLocalSDPGenRemoteSDPRecv correctly', () => {
177
+ cdl.saveTimestamp({
178
+ key: 'client.media-engine.local-sdp-generated',
179
+ value: 10,
180
+ });
181
+ cdl.saveTimestamp({
182
+ key: 'client.media-engine.remote-sdp-received',
183
+ value: 20,
184
+ });
185
+ assert.deepEqual(cdl.getLocalSDPGenRemoteSDPRecv(), 10);
186
+ });
187
+
188
+ it('calculates getICESetupTime correctly', () => {
189
+ cdl.saveTimestamp({
190
+ key: 'client.ice.start',
191
+ value: 10,
192
+ });
193
+ cdl.saveTimestamp({
194
+ key: 'client.ice.end',
195
+ value: 20,
196
+ });
197
+ assert.deepEqual(cdl.getICESetupTime(), 10);
198
+ });
199
+
200
+ it('calculates getAudioICESetupTime correctly', () => {
201
+ cdl.saveTimestamp({
202
+ key: 'client.ice.start',
203
+ value: 10,
204
+ });
205
+ cdl.saveTimestamp({
206
+ key: 'client.ice.end',
207
+ value: 20,
208
+ });
209
+ assert.deepEqual(cdl.getAudioICESetupTime(), 10);
210
+ });
211
+
212
+ it('calculates getVideoICESetupTime correctly', () => {
213
+ cdl.saveTimestamp({
214
+ key: 'client.ice.start',
215
+ value: 10,
216
+ });
217
+ cdl.saveTimestamp({
218
+ key: 'client.ice.end',
219
+ value: 20,
220
+ });
221
+ assert.deepEqual(cdl.getVideoICESetupTime(), 10);
222
+ });
223
+
224
+ it('calculates getShareICESetupTime correctly', () => {
225
+ cdl.saveTimestamp({
226
+ key: 'client.ice.start',
227
+ value: 10,
228
+ });
229
+ cdl.saveTimestamp({
230
+ key: 'client.ice.end',
231
+ value: 20,
232
+ });
233
+ assert.deepEqual(cdl.getShareICESetupTime(), 10);
234
+ });
235
+
236
+ it('calculates getStayLobbyTime correctly', () => {
237
+ cdl.saveTimestamp({
238
+ key: 'client.locus.join.response',
239
+ value: 10,
240
+ });
241
+ cdl.saveTimestamp({
242
+ key: 'internal.host.meeting.participant.admitted',
243
+ value: 20,
244
+ });
245
+ assert.deepEqual(cdl.getStayLobbyTime(), 10);
246
+ });
247
+
248
+ it('calculates getPageJMT correctly', () => {
249
+ cdl.saveLatency('internal.client.pageJMT', 10);
250
+ assert.deepEqual(cdl.getPageJMT(), 10);
251
+ });
252
+
253
+ it('calculates getClickToInterstitial correctly', () => {
254
+ cdl.saveTimestamp({
255
+ key: 'internal.client.meeting.click.joinbutton',
256
+ value: 10,
257
+ });
258
+ cdl.saveTimestamp({
259
+ key: 'internal.client.meeting.interstitial-window.showed',
260
+ value: 20,
261
+ });
262
+ assert.deepEqual(cdl.getClickToInterstitial(), 10);
263
+ });
264
+
265
+ it('calculates getClickToInterstitial without join button timestamp', () => {
266
+ cdl.saveLatency('internal.click.to.interstitial', 5);
267
+ cdl.saveTimestamp({
268
+ key: 'internal.client.meeting.interstitial-window.showed',
269
+ value: 20,
270
+ });
271
+ assert.deepEqual(cdl.getClickToInterstitial(), 5);
272
+ });
273
+
274
+ it('calculates getInterstitialToJoinOK correctly', () => {
275
+ cdl.saveTimestamp({
276
+ key: 'internal.client.interstitial-window.click.joinbutton',
277
+ value: 10,
278
+ });
279
+ cdl.saveTimestamp({
280
+ key: 'client.locus.join.response',
281
+ value: 20,
282
+ });
283
+ assert.deepEqual(cdl.getInterstitialToJoinOK(), 10);
284
+ });
285
+
286
+ it('calculates getCallInitMediaEngineReady correctly', () => {
287
+ cdl.saveTimestamp({
288
+ key: 'internal.client.interstitial-window.click.joinbutton',
289
+ value: 10,
290
+ });
291
+ cdl.saveTimestamp({
292
+ key: 'client.media-engine.ready',
293
+ value: 20,
294
+ });
295
+ assert.deepEqual(cdl.getCallInitMediaEngineReady(), 10);
296
+ });
297
+
298
+ it('calculates getTotalJMT correctly', () => {
299
+ cdl.saveTimestamp({
300
+ key: 'internal.client.interstitial-window.click.joinbutton',
301
+ value: 5,
302
+ });
303
+ cdl.saveTimestamp({
304
+ key: 'internal.client.meeting.click.joinbutton',
305
+ value: 10,
306
+ });
307
+ cdl.saveTimestamp({
308
+ key: 'internal.client.meeting.interstitial-window.showed',
309
+ value: 20,
310
+ });
311
+ cdl.saveTimestamp({
312
+ key: 'client.locus.join.response',
313
+ value: 40,
314
+ });
315
+ assert.deepEqual(cdl.getTotalJMT(), 45);
316
+ });
317
+
318
+ it('calculates getTotalMediaJMT correctly', () => {
319
+ cdl.saveTimestamp({
320
+ key: 'internal.client.meeting.click.joinbutton',
321
+ value: 5,
322
+ });
323
+ cdl.saveTimestamp({
324
+ key: 'internal.client.meeting.interstitial-window.showed',
325
+ value: 8,
326
+ });
327
+ cdl.saveTimestamp({
328
+ key: 'internal.client.interstitial-window.click.joinbutton',
329
+ value: 10,
330
+ });
331
+ cdl.saveTimestamp({
332
+ key: 'client.locus.join.request',
333
+ value: 12,
334
+ });
335
+ cdl.saveTimestamp({
336
+ key: 'client.locus.join.response',
337
+ value: 20,
338
+ });
339
+ cdl.saveTimestamp({
340
+ key: 'internal.host.meeting.participant.admitted',
341
+ value: 24,
342
+ });
343
+ cdl.saveTimestamp({
344
+ key: 'client.ice.start',
345
+ value: 30,
346
+ });
347
+ cdl.saveTimestamp({
348
+ key: 'client.ice.end',
349
+ value: 40,
350
+ });
351
+ assert.deepEqual(cdl.getTotalMediaJMT(), 27);
352
+ });
353
+
354
+ it('calculates getTotalMediaJMT correctly with allowMediaInLobby true', () => {
355
+ cdl.saveTimestamp({
356
+ key: 'internal.client.meeting.click.joinbutton',
357
+ value: 5,
358
+ options: {meetingId: 'meeting-id'},
359
+ });
360
+ cdl.saveTimestamp({
361
+ key: 'internal.client.meeting.interstitial-window.showed',
362
+ value: 8,
363
+ });
364
+ cdl.saveTimestamp({
365
+ key: 'internal.client.interstitial-window.click.joinbutton',
366
+ value: 10,
367
+ });
368
+ cdl.saveTimestamp({
369
+ key: 'client.locus.join.request',
370
+ value: 12,
371
+ });
372
+ cdl.saveTimestamp({
373
+ key: 'client.locus.join.response',
374
+ value: 20,
375
+ });
376
+ cdl.saveTimestamp({
377
+ key: 'internal.host.meeting.participant.admitted',
378
+ value: 24,
379
+ });
380
+ cdl.saveTimestamp({
381
+ key: 'client.ice.start',
382
+ value: 30,
383
+ });
384
+ cdl.saveTimestamp({
385
+ key: 'client.ice.end',
386
+ value: 40,
387
+ });
388
+ assert.deepEqual(cdl.getTotalMediaJMT(), 31);
389
+ });
390
+
391
+ it('calculates getJoinConfJMT correctly', () => {
392
+ cdl.saveTimestamp({
393
+ key: 'client.locus.join.request',
394
+ value: 10,
395
+ });
396
+ cdl.saveTimestamp({
397
+ key: 'client.locus.join.response',
398
+ value: 20,
399
+ });
400
+ cdl.saveTimestamp({
401
+ key: 'client.ice.start',
402
+ value: 30,
403
+ });
404
+ cdl.saveTimestamp({
405
+ key: 'client.ice.end',
406
+ value: 40,
407
+ });
408
+ assert.deepEqual(cdl.getJoinConfJMT(), 20);
409
+ });
410
+
411
+ it('calculates getClientJMT correctly', () => {
412
+ cdl.saveTimestamp({
413
+ key: 'internal.client.interstitial-window.click.joinbutton',
414
+ value: 2,
415
+ });
416
+ cdl.saveTimestamp({
417
+ key: 'client.locus.join.request',
418
+ value: 6,
419
+ });
420
+ cdl.saveTimestamp({
421
+ key: 'client.locus.join.response',
422
+ value: 8,
423
+ });
424
+ cdl.saveTimestamp({
425
+ key: 'client.ice.start',
426
+ value: 10,
427
+ });
428
+ cdl.saveTimestamp({
429
+ key: 'client.ice.end',
430
+ value: 11,
431
+ });
432
+ assert.deepEqual(cdl.getClientJMT(), 3);
433
+ });
434
+
435
+ it('calculates getAudioJoinRespRxStart correctly', () => {
436
+ cdl.saveTimestamp({
437
+ key: 'client.locus.join.response',
438
+ value: 5,
439
+ });
440
+ cdl.saveTimestamp({
441
+ key: 'client.media.rx.start',
442
+ value: 7,
443
+ });
444
+ assert.deepEqual(cdl.getAudioJoinRespRxStart(), 2);
445
+ });
446
+
447
+ it('calculates getVideoJoinRespRxStart correctly', () => {
448
+ cdl.saveTimestamp({
449
+ key: 'client.locus.join.response',
450
+ value: 5,
451
+ });
452
+ cdl.saveTimestamp({
453
+ key: 'client.media.rx.start',
454
+ value: 7,
455
+ });
456
+ assert.deepEqual(cdl.getVideoJoinRespRxStart(), 2);
457
+ });
458
+
459
+ it('calculates getAudioJoinRespTxStart correctly', () => {
460
+ cdl.saveTimestamp({
461
+ key: 'client.locus.join.response',
462
+ value: 5,
463
+ });
464
+ cdl.saveTimestamp({
465
+ key: 'client.media.tx.start',
466
+ value: 7,
467
+ });
468
+ assert.deepEqual(cdl.getAudioJoinRespTxStart(), 2);
469
+ });
470
+
471
+ it('calculates getVideoJoinRespTxStart correctly', () => {
472
+ cdl.saveTimestamp({
473
+ key: 'client.locus.join.response',
474
+ value: 5,
475
+ });
476
+ cdl.saveTimestamp({
477
+ key: 'client.media.tx.start',
478
+ value: 7,
479
+ });
480
+ assert.deepEqual(cdl.getVideoJoinRespTxStart(), 2);
481
+ });
482
+
483
+ it('calculates getInterstitialToMediaOKJMT correctly', () => {
484
+ cdl.saveTimestamp({
485
+ key: 'internal.client.interstitial-window.click.joinbutton',
486
+ value: 4,
487
+ });
488
+ cdl.saveTimestamp({
489
+ key: 'client.locus.join.response',
490
+ value: 10,
491
+ });
492
+ cdl.saveTimestamp({
493
+ key: 'internal.host.meeting.participant.admitted',
494
+ value: 12,
495
+ });
496
+ cdl.saveTimestamp({
497
+ key: 'client.ice.end',
498
+ value: 14,
499
+ });
500
+ assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 8);
501
+ });
502
+
503
+ it('calculates getInterstitialToMediaOKJMT correctly without lobby', () => {
504
+ cdl.saveTimestamp({
505
+ key: 'internal.client.interstitial-window.click.joinbutton',
506
+ value: 4,
507
+ });
508
+ cdl.saveTimestamp({
509
+ key: 'client.ice.end',
510
+ value: 14,
511
+ });
512
+ assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
513
+ });
514
+
515
+ it('calculates getDownloadTimeJMT correctly', () => {
516
+ cdl.saveLatency('internal.download.time', 1000);
517
+ assert.deepEqual(cdl.getDownloadTimeJMT(), 1000);
518
+ });
519
+ });
520
+ });