@webex/internal-plugin-metrics 3.0.0-beta.41 → 3.0.0-beta.410

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 (73) hide show
  1. package/dist/batcher.js +40 -1
  2. package/dist/batcher.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +65 -0
  4. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +528 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics.js +863 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +369 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  11. package/dist/call-diagnostic/config.js +627 -0
  12. package/dist/call-diagnostic/config.js.map +1 -0
  13. package/dist/client-metrics-batcher.js +2 -1
  14. package/dist/client-metrics-batcher.js.map +1 -1
  15. package/dist/config.js +2 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/index.js +33 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/metrics.js +27 -28
  20. package/dist/metrics.js.map +1 -1
  21. package/dist/metrics.types.js +7 -0
  22. package/dist/metrics.types.js.map +1 -0
  23. package/dist/new-metrics.js +300 -0
  24. package/dist/new-metrics.js.map +1 -0
  25. package/dist/prelogin-metrics-batcher.js +82 -0
  26. package/dist/prelogin-metrics-batcher.js.map +1 -0
  27. package/dist/types/batcher.d.ts +7 -0
  28. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  29. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +226 -0
  30. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +425 -0
  31. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +103 -0
  32. package/dist/types/call-diagnostic/config.d.ts +178 -0
  33. package/dist/types/client-metrics-batcher.d.ts +2 -0
  34. package/dist/types/config.d.ts +36 -0
  35. package/dist/types/index.d.ts +15 -0
  36. package/dist/types/metrics.d.ts +3 -0
  37. package/dist/types/metrics.types.d.ts +107 -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 +27 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +16 -8
  44. package/src/batcher.js +38 -0
  45. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +72 -0
  46. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +485 -0
  47. package/src/call-diagnostic/call-diagnostic-metrics.ts +925 -0
  48. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +397 -0
  49. package/src/call-diagnostic/config.ts +685 -0
  50. package/src/client-metrics-batcher.js +1 -0
  51. package/src/config.js +1 -0
  52. package/src/index.ts +56 -0
  53. package/src/metrics.js +21 -24
  54. package/src/metrics.types.ts +177 -0
  55. package/src/new-metrics.ts +278 -0
  56. package/src/prelogin-metrics-batcher.ts +95 -0
  57. package/src/utils.ts +17 -0
  58. package/test/unit/spec/batcher.js +2 -0
  59. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +461 -0
  60. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +693 -0
  61. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2340 -0
  62. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +636 -0
  63. package/test/unit/spec/client-metrics-batcher.js +2 -0
  64. package/test/unit/spec/metrics.js +74 -97
  65. package/test/unit/spec/new-metrics.ts +231 -0
  66. package/test/unit/spec/prelogin-metrics-batcher.ts +251 -0
  67. package/test/unit/spec/utils.ts +22 -0
  68. package/tsconfig.json +6 -0
  69. package/dist/call-diagnostic-events-batcher.js +0 -60
  70. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  71. package/src/call-diagnostic-events-batcher.js +0 -62
  72. package/src/index.js +0 -17
  73. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
@@ -0,0 +1,693 @@
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 by default and overwrites', () => {
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
+ cdl.saveLatency('internal.client.pageJMT', 20);
50
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
51
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 20);
52
+ });
53
+
54
+ it('should overwrite latency when overwrite is true', () => {
55
+ assert.deepEqual(cdl.precomputedLatencies.size, 0);
56
+ cdl.saveLatency('internal.client.pageJMT', 10, true);
57
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
58
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
59
+ cdl.saveLatency('internal.client.pageJMT', 20, true);
60
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
61
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 20);
62
+ });
63
+
64
+ it('should save latency correctly when overwrite is false', () => {
65
+ assert.deepEqual(cdl.precomputedLatencies.size, 0);
66
+ cdl.saveLatency('internal.client.pageJMT', 10, false);
67
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
68
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
69
+ });
70
+
71
+ it('should save latency correctly when overwrite is false and there is existing value', () => {
72
+ assert.deepEqual(cdl.precomputedLatencies.size, 0);
73
+ cdl.saveLatency('internal.client.pageJMT', 10);
74
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
75
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 10);
76
+ cdl.saveLatency('internal.client.pageJMT', 10, false);
77
+ assert.deepEqual(cdl.precomputedLatencies.size, 1);
78
+ assert.deepEqual(cdl.precomputedLatencies.get('internal.client.pageJMT'), 20);
79
+ });
80
+
81
+ it('should save only first timestamp correctly', () => {
82
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
83
+ cdl.saveFirstTimestampOnly('client.alert.displayed', 10);
84
+ cdl.saveFirstTimestampOnly('client.alert.displayed', 20);
85
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), 10);
86
+ });
87
+
88
+ it('should save only first timestamp correctly for client.media.tx.start and client.media.rx.start', () => {
89
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
90
+ cdl.saveFirstTimestampOnly('client.media.tx.start', 10);
91
+ cdl.saveFirstTimestampOnly('client.media.tx.start', 20);
92
+ cdl.saveFirstTimestampOnly('client.media.rx.start', 12);
93
+ cdl.saveFirstTimestampOnly('client.media.rx.start', 22);
94
+ assert.deepEqual(cdl.latencyTimestamps.get('client.media.tx.start'), 10);
95
+ assert.deepEqual(cdl.latencyTimestamps.get('client.media.rx.start'), 12);
96
+ });
97
+
98
+ it('should update existing property and now add new keys', () => {
99
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
100
+ cdl.saveTimestamp({key: 'client.alert.displayed'});
101
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), now.getTime());
102
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 1234});
103
+ assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), 1234);
104
+ assert.deepEqual(cdl.latencyTimestamps.size, 1);
105
+ });
106
+
107
+ it('should clear all timestamps correctly', () => {
108
+ cdl.saveTimestamp({key: 'client.alert.displayed'});
109
+ cdl.saveTimestamp({key: 'client.alert.removed'});
110
+ assert.deepEqual(cdl.latencyTimestamps.size, 2);
111
+ cdl.clearTimestamps();
112
+ assert.deepEqual(cdl.latencyTimestamps.size, 0);
113
+ });
114
+
115
+ it('should calculate diff between timestamps correctly', () => {
116
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 10});
117
+ cdl.saveTimestamp({key: 'client.alert.removed', value: 20});
118
+ const res = cdl.getDiffBetweenTimestamps('client.alert.displayed', 'client.alert.removed');
119
+ assert.deepEqual(res, 10);
120
+ });
121
+
122
+ it('it returns undefined if either one is doesnt exist', () => {
123
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 10});
124
+ const res1 = cdl.getDiffBetweenTimestamps('client.alert.displayed', 'client.alert.removed');
125
+ assert.deepEqual(res1, undefined);
126
+ const res2 = cdl.getDiffBetweenTimestamps('client.alert.removed', 'client.alert.displayed');
127
+ assert.deepEqual(res2, undefined);
128
+ });
129
+
130
+ it('calculates getMeetingInfoReqResp correctly', () => {
131
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 10});
132
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 20});
133
+ assert.deepEqual(cdl.getMeetingInfoReqResp(), 10);
134
+ });
135
+
136
+ it('calculates getMeetingInfoReqResp correctly when duplicate requests/responses are sent', () => {
137
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 8});
138
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 18});
139
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 47});
140
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 48});
141
+ assert.deepEqual(cdl.getMeetingInfoReqResp(), 10);
142
+ });
143
+
144
+ describe('measureLatency', () => {
145
+ let clock;
146
+ let saveLatencySpy;
147
+
148
+ beforeEach(() => {
149
+ clock = sinon.useFakeTimers();
150
+
151
+ saveLatencySpy = sinon.stub(cdl, 'saveLatency');
152
+ });
153
+
154
+ afterEach(() => {
155
+ clock.restore();
156
+ sinon.restore();
157
+ });
158
+
159
+ it('checks measureLatency with overwrite false', async () => {
160
+ const key = 'internal.client.pageJMT';
161
+ const overwrite = false;
162
+ const callbackStub = sinon.stub().callsFake(() => {
163
+ clock.tick(50);
164
+ return Promise.resolve('test');
165
+ });
166
+
167
+ const promise = cdl.measureLatency(callbackStub, 'internal.client.pageJMT', overwrite);
168
+
169
+ const resolvedValue = await promise;
170
+ assert.deepEqual(resolvedValue, 'test');
171
+ assert.calledOnceWithExactly(callbackStub);
172
+ assert.calledOnceWithExactly(saveLatencySpy, key, 50, overwrite)
173
+ });
174
+
175
+ it('checks measureLatency with overwrite true', async () => {
176
+ const key = 'internal.download.time';
177
+ const overwrite = true;
178
+ const callbackStub = sinon.stub().callsFake(() => {
179
+ clock.tick(20);
180
+ return Promise.resolve('test123');
181
+ });
182
+
183
+ const promise = cdl.measureLatency(callbackStub, 'internal.download.time', overwrite);
184
+
185
+ const resolvedValue = await promise;
186
+ assert.deepEqual(resolvedValue, 'test123');
187
+ assert.calledOnceWithExactly(callbackStub);
188
+ assert.calledOnceWithExactly(saveLatencySpy, key, 20, overwrite)
189
+ });
190
+
191
+ it('checks measureLatency when callBack rejects', async () => {
192
+ const key = 'internal.client.pageJMT';
193
+ const overwrite = true;
194
+ const error = new Error('some error');
195
+ const callbackStub = sinon.stub().callsFake(() => {
196
+ clock.tick(50);
197
+ return Promise.reject(error);
198
+ });
199
+
200
+ const promise = cdl.measureLatency(callbackStub, 'internal.client.pageJMT', overwrite);
201
+
202
+ const rejectedValue = await assert.isRejected(promise);
203
+ assert.deepEqual(rejectedValue, error);
204
+ assert.calledOnceWithExactly(callbackStub);
205
+ assert.calledOnceWithExactly(saveLatencySpy, key, 50, overwrite)
206
+ });
207
+ });
208
+
209
+ describe('getRefreshCaptchaReqResp', () => {
210
+ it('returns undefined when no precomputed value available', () => {
211
+ assert.deepEqual(cdl.getRefreshCaptchaReqResp(), undefined);
212
+ });
213
+
214
+ it('returns the correct value', () => {
215
+ cdl.saveLatency('internal.refresh.captcha.time', 123);
216
+
217
+ assert.deepEqual(cdl.getRefreshCaptchaReqResp(), 123);
218
+ });
219
+
220
+ it('returns the correct whole number', () => {
221
+ cdl.saveLatency('internal.refresh.captcha.time', 321.44);
222
+
223
+ assert.deepEqual(cdl.getRefreshCaptchaReqResp(), 321);
224
+ });
225
+ });
226
+
227
+ describe('getExchangeCITokenJMT', () => {
228
+ it('returns undefined when no precomputed value available', () => {
229
+ assert.deepEqual(cdl.getExchangeCITokenJMT(), undefined);
230
+ });
231
+
232
+ it('returns the correct value', () => {
233
+ cdl.saveLatency('internal.exchange.ci.token.time', 123);
234
+
235
+ assert.deepEqual(cdl.getExchangeCITokenJMT(), 123);
236
+ });
237
+
238
+ it('returns the correct whole number', () => {
239
+ cdl.saveLatency('internal.exchange.ci.token.time', 321.44);
240
+
241
+ assert.deepEqual(cdl.getExchangeCITokenJMT(), 321);
242
+ });
243
+ });
244
+
245
+ describe('saveTimestamp', () => {
246
+ afterEach(() => {
247
+ sinon.restore();
248
+ });
249
+
250
+ it('calls saveFirstTimestamp for meeting info request', () => {
251
+ const saveFirstTimestamp = sinon.stub(cdl, 'saveFirstTimestampOnly');
252
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.request', value: 10});
253
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 15});
254
+ assert.deepEqual(saveFirstTimestamp.callCount, 1);
255
+ });
256
+
257
+ it('calls saveFirstTimestamp for meeting info response', () => {
258
+ const saveFirstTimestamp = sinon.stub(cdl, 'saveFirstTimestampOnly');
259
+ cdl.saveTimestamp({key: 'client.alert.displayed', value: 15});
260
+ cdl.saveTimestamp({key: 'internal.client.meetinginfo.response', value: 20});
261
+ assert.deepEqual(saveFirstTimestamp.callCount, 1);
262
+ });
263
+ });
264
+
265
+ it('calculates getShowInterstitialTime correctly', () => {
266
+ cdl.saveTimestamp({key: 'client.interstitial-window.start-launch', value: 10});
267
+ cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 20});
268
+ assert.deepEqual(cdl.getShowInterstitialTime(), 10);
269
+ });
270
+
271
+ it('calculates getCallInitJoinReq correctly', () => {
272
+ cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
273
+ cdl.saveTimestamp({key: 'client.locus.join.request', value: 20});
274
+ assert.deepEqual(cdl.getCallInitJoinReq(), 10);
275
+ });
276
+
277
+ it('calculates getRegisterWDMDeviceJMT correctly', () => {
278
+ cdl.saveTimestamp({key: 'internal.register.device.request', value: 10});
279
+ cdl.saveTimestamp({key: 'internal.register.device.response', value: 20});
280
+ assert.deepEqual(cdl.getRegisterWDMDeviceJMT(), 10);
281
+ });
282
+
283
+ it('calculates getJoinReqResp correctly', () => {
284
+ cdl.saveTimestamp({
285
+ key: 'client.locus.join.request',
286
+ value: 10,
287
+ });
288
+ cdl.saveTimestamp({
289
+ key: 'client.locus.join.response',
290
+ value: 20,
291
+ });
292
+ assert.deepEqual(cdl.getJoinReqResp(), 10);
293
+ });
294
+
295
+ it('calculates getTurnDiscoveryTime correctly', () => {
296
+ cdl.saveTimestamp({
297
+ key: 'internal.client.add-media.turn-discovery.start',
298
+ value: 10,
299
+ });
300
+ cdl.saveTimestamp({
301
+ key: 'internal.client.add-media.turn-discovery.end',
302
+ value: 20,
303
+ });
304
+ assert.deepEqual(cdl.getTurnDiscoveryTime(), 10);
305
+ });
306
+
307
+ it('calculates getLocalSDPGenRemoteSDPRecv correctly', () => {
308
+ cdl.saveTimestamp({
309
+ key: 'client.media-engine.local-sdp-generated',
310
+ value: 10,
311
+ });
312
+ cdl.saveTimestamp({
313
+ key: 'client.media-engine.remote-sdp-received',
314
+ value: 20,
315
+ });
316
+ assert.deepEqual(cdl.getLocalSDPGenRemoteSDPRecv(), 10);
317
+ });
318
+
319
+ it('calculates getICESetupTime correctly', () => {
320
+ cdl.saveTimestamp({
321
+ key: 'client.ice.start',
322
+ value: 10,
323
+ });
324
+ cdl.saveTimestamp({
325
+ key: 'client.ice.end',
326
+ value: 20,
327
+ });
328
+ assert.deepEqual(cdl.getICESetupTime(), 10);
329
+ });
330
+
331
+ it('calculates getAudioICESetupTime correctly', () => {
332
+ cdl.saveTimestamp({
333
+ key: 'client.ice.start',
334
+ value: 10,
335
+ });
336
+ cdl.saveTimestamp({
337
+ key: 'client.ice.end',
338
+ value: 20,
339
+ });
340
+ assert.deepEqual(cdl.getAudioICESetupTime(), 10);
341
+ });
342
+
343
+ it('calculates getVideoICESetupTime correctly', () => {
344
+ cdl.saveTimestamp({
345
+ key: 'client.ice.start',
346
+ value: 10,
347
+ });
348
+ cdl.saveTimestamp({
349
+ key: 'client.ice.end',
350
+ value: 20,
351
+ });
352
+ assert.deepEqual(cdl.getVideoICESetupTime(), 10);
353
+ });
354
+
355
+ it('calculates getShareICESetupTime correctly', () => {
356
+ cdl.saveTimestamp({
357
+ key: 'client.ice.start',
358
+ value: 10,
359
+ });
360
+ cdl.saveTimestamp({
361
+ key: 'client.ice.end',
362
+ value: 20,
363
+ });
364
+ assert.deepEqual(cdl.getShareICESetupTime(), 10);
365
+ });
366
+
367
+ it('calculates getStayLobbyTime correctly', () => {
368
+ cdl.saveTimestamp({
369
+ key: 'client.locus.join.response',
370
+ value: 10,
371
+ });
372
+ cdl.saveTimestamp({
373
+ key: 'internal.host.meeting.participant.admitted',
374
+ value: 20,
375
+ });
376
+ assert.deepEqual(cdl.getStayLobbyTime(), 10);
377
+ });
378
+
379
+ it('calculates getPageJMT correctly', () => {
380
+ cdl.saveLatency('internal.client.pageJMT', 10);
381
+ assert.deepEqual(cdl.getPageJMT(), 10);
382
+ });
383
+
384
+ it('calculates getClickToInterstitial correctly', () => {
385
+ cdl.saveTimestamp({
386
+ key: 'internal.client.meeting.click.joinbutton',
387
+ value: 10,
388
+ });
389
+ cdl.saveTimestamp({
390
+ key: 'internal.client.meeting.interstitial-window.showed',
391
+ value: 20,
392
+ });
393
+ assert.deepEqual(cdl.getClickToInterstitial(), 10);
394
+ });
395
+
396
+ it('calculates getClickToInterstitial without join button timestamp', () => {
397
+ cdl.saveLatency('internal.click.to.interstitial', 5);
398
+ cdl.saveTimestamp({
399
+ key: 'internal.client.meeting.interstitial-window.showed',
400
+ value: 20,
401
+ });
402
+ assert.deepEqual(cdl.getClickToInterstitial(), 5);
403
+ });
404
+
405
+ it('calculates getInterstitialToJoinOK correctly', () => {
406
+ cdl.saveTimestamp({
407
+ key: 'internal.client.interstitial-window.click.joinbutton',
408
+ value: 10,
409
+ });
410
+ cdl.saveTimestamp({
411
+ key: 'client.locus.join.response',
412
+ value: 20,
413
+ });
414
+ assert.deepEqual(cdl.getInterstitialToJoinOK(), 10);
415
+ });
416
+
417
+ it('calculates getCallInitMediaEngineReady correctly', () => {
418
+ cdl.saveTimestamp({
419
+ key: 'internal.client.interstitial-window.click.joinbutton',
420
+ value: 10,
421
+ });
422
+ cdl.saveTimestamp({
423
+ key: 'client.media-engine.ready',
424
+ value: 20,
425
+ });
426
+ assert.deepEqual(cdl.getCallInitMediaEngineReady(), 10);
427
+ });
428
+
429
+ it('calculates getTotalJMT correctly', () => {
430
+ cdl.saveTimestamp({
431
+ key: 'internal.client.interstitial-window.click.joinbutton',
432
+ value: 5,
433
+ });
434
+ cdl.saveTimestamp({
435
+ key: 'internal.client.meeting.click.joinbutton',
436
+ value: 10,
437
+ });
438
+ cdl.saveTimestamp({
439
+ key: 'internal.client.meeting.interstitial-window.showed',
440
+ value: 20,
441
+ });
442
+ cdl.saveTimestamp({
443
+ key: 'client.locus.join.response',
444
+ value: 40,
445
+ });
446
+ assert.deepEqual(cdl.getTotalJMT(), 45);
447
+ });
448
+
449
+ it('calculates getTotalMediaJMT correctly', () => {
450
+ cdl.saveTimestamp({
451
+ key: 'internal.client.meeting.click.joinbutton',
452
+ value: 5,
453
+ });
454
+ cdl.saveTimestamp({
455
+ key: 'internal.client.meeting.interstitial-window.showed',
456
+ value: 8,
457
+ });
458
+ cdl.saveTimestamp({
459
+ key: 'internal.client.interstitial-window.click.joinbutton',
460
+ value: 10,
461
+ });
462
+ cdl.saveTimestamp({
463
+ key: 'client.locus.join.request',
464
+ value: 12,
465
+ });
466
+ cdl.saveTimestamp({
467
+ key: 'client.locus.join.response',
468
+ value: 20,
469
+ });
470
+ cdl.saveTimestamp({
471
+ key: 'internal.host.meeting.participant.admitted',
472
+ value: 24,
473
+ });
474
+ cdl.saveTimestamp({
475
+ key: 'client.ice.start',
476
+ value: 30,
477
+ });
478
+ cdl.saveTimestamp({
479
+ key: 'client.ice.end',
480
+ value: 40,
481
+ });
482
+ assert.deepEqual(cdl.getTotalMediaJMT(), 27);
483
+ });
484
+
485
+ it('calculates getTotalMediaJMT correctly with allowMediaInLobby true', () => {
486
+ cdl.saveTimestamp({
487
+ key: 'internal.client.meeting.click.joinbutton',
488
+ value: 5,
489
+ options: {meetingId: 'meeting-id'},
490
+ });
491
+ cdl.saveTimestamp({
492
+ key: 'internal.client.meeting.interstitial-window.showed',
493
+ value: 8,
494
+ });
495
+ cdl.saveTimestamp({
496
+ key: 'internal.client.interstitial-window.click.joinbutton',
497
+ value: 10,
498
+ });
499
+ cdl.saveTimestamp({
500
+ key: 'client.locus.join.request',
501
+ value: 12,
502
+ });
503
+ cdl.saveTimestamp({
504
+ key: 'client.locus.join.response',
505
+ value: 20,
506
+ });
507
+ cdl.saveTimestamp({
508
+ key: 'internal.host.meeting.participant.admitted',
509
+ value: 24,
510
+ });
511
+ cdl.saveTimestamp({
512
+ key: 'client.ice.start',
513
+ value: 30,
514
+ });
515
+ cdl.saveTimestamp({
516
+ key: 'client.ice.end',
517
+ value: 40,
518
+ });
519
+ assert.deepEqual(cdl.getTotalMediaJMT(), 31);
520
+ });
521
+
522
+ it('calculates getJoinConfJMT correctly', () => {
523
+ cdl.saveTimestamp({
524
+ key: 'client.locus.join.request',
525
+ value: 10,
526
+ });
527
+ cdl.saveTimestamp({
528
+ key: 'client.locus.join.response',
529
+ value: 20,
530
+ });
531
+ cdl.saveTimestamp({
532
+ key: 'client.ice.start',
533
+ value: 30,
534
+ });
535
+ cdl.saveTimestamp({
536
+ key: 'client.ice.end',
537
+ value: 40,
538
+ });
539
+ assert.deepEqual(cdl.getJoinConfJMT(), 20);
540
+ });
541
+
542
+ it('calculates getClientJMT correctly', () => {
543
+ cdl.saveTimestamp({
544
+ key: 'internal.client.interstitial-window.click.joinbutton',
545
+ value: 2,
546
+ });
547
+ cdl.saveTimestamp({
548
+ key: 'client.locus.join.request',
549
+ value: 6,
550
+ });
551
+ cdl.saveTimestamp({
552
+ key: 'client.locus.join.response',
553
+ value: 8,
554
+ });
555
+ cdl.saveTimestamp({
556
+ key: 'client.ice.start',
557
+ value: 10,
558
+ });
559
+ cdl.saveTimestamp({
560
+ key: 'client.ice.end',
561
+ value: 11,
562
+ });
563
+ assert.deepEqual(cdl.getClientJMT(), 3);
564
+ });
565
+
566
+ it('calculates getAudioJoinRespRxStart correctly', () => {
567
+ cdl.saveTimestamp({
568
+ key: 'client.locus.join.response',
569
+ value: 5,
570
+ });
571
+ cdl.saveTimestamp({
572
+ key: 'client.media.rx.start',
573
+ value: 7,
574
+ });
575
+ assert.deepEqual(cdl.getAudioJoinRespRxStart(), 2);
576
+ });
577
+
578
+ it('calculates getVideoJoinRespRxStart correctly', () => {
579
+ cdl.saveTimestamp({
580
+ key: 'client.locus.join.response',
581
+ value: 5,
582
+ });
583
+ cdl.saveTimestamp({
584
+ key: 'client.media.rx.start',
585
+ value: 7,
586
+ });
587
+ assert.deepEqual(cdl.getVideoJoinRespRxStart(), 2);
588
+ });
589
+
590
+ it('calculates getAudioJoinRespTxStart correctly', () => {
591
+ cdl.saveTimestamp({
592
+ key: 'client.locus.join.response',
593
+ value: 5,
594
+ });
595
+ cdl.saveTimestamp({
596
+ key: 'client.media.tx.start',
597
+ value: 7,
598
+ });
599
+ assert.deepEqual(cdl.getAudioJoinRespTxStart(), 2);
600
+ });
601
+
602
+ it('calculates getVideoJoinRespTxStart correctly', () => {
603
+ cdl.saveTimestamp({
604
+ key: 'client.locus.join.response',
605
+ value: 5,
606
+ });
607
+ cdl.saveTimestamp({
608
+ key: 'client.media.tx.start',
609
+ value: 7,
610
+ });
611
+ assert.deepEqual(cdl.getVideoJoinRespTxStart(), 2);
612
+ });
613
+
614
+ it('calculates getInterstitialToMediaOKJMT correctly', () => {
615
+ cdl.saveTimestamp({
616
+ key: 'internal.client.interstitial-window.click.joinbutton',
617
+ value: 4,
618
+ });
619
+ cdl.saveTimestamp({
620
+ key: 'client.locus.join.response',
621
+ value: 10,
622
+ });
623
+ cdl.saveTimestamp({
624
+ key: 'internal.host.meeting.participant.admitted',
625
+ value: 12,
626
+ });
627
+ cdl.saveTimestamp({
628
+ key: 'client.ice.end',
629
+ value: 14,
630
+ });
631
+ assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 8);
632
+ });
633
+
634
+ it('calculates getInterstitialToMediaOKJMT correctly without lobby', () => {
635
+ cdl.saveTimestamp({
636
+ key: 'internal.client.interstitial-window.click.joinbutton',
637
+ value: 4,
638
+ });
639
+ cdl.saveTimestamp({
640
+ key: 'client.ice.end',
641
+ value: 14,
642
+ });
643
+ assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
644
+ });
645
+
646
+ it('calculates getU2CTime correctly', () => {
647
+ it('returns undefined when no precomputed value available', () => {
648
+ assert.deepEqual(cdl.getU2CTime(), undefined);
649
+ });
650
+
651
+ it('returns the correct value', () => {
652
+ cdl.saveLatency('internal.get.u2c.time', 123);
653
+
654
+ assert.deepEqual(cdl.getU2CTime(), 123);
655
+ });
656
+
657
+ it('returns the correct whole number', () => {
658
+ cdl.saveLatency('internal.get.u2c.time', 321.44);
659
+
660
+ assert.deepEqual(cdl.getU2CTime(), 321);
661
+ });
662
+ });
663
+
664
+ it('calculates getDownloadTimeJMT correctly', () => {
665
+ cdl.saveLatency('internal.download.time', 1000);
666
+ assert.deepEqual(cdl.getDownloadTimeJMT(), 1000);
667
+ });
668
+
669
+ describe('getOtherAppApiReqResp', () => {
670
+ it('returns undefined when no precomputed value available', () => {
671
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), undefined);
672
+ });
673
+
674
+ it('returns undefined if it is less than 0', () => {
675
+ cdl.saveLatency('internal.other.app.api.time', 0);
676
+
677
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), undefined);
678
+ });
679
+
680
+ it('returns the correct value', () => {
681
+ cdl.saveLatency('internal.other.app.api.time', 123);
682
+
683
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), 123);
684
+ });
685
+
686
+ it('returns the correct whole number', () => {
687
+ cdl.saveLatency('internal.other.app.api.time', 321.44);
688
+
689
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), 321);
690
+ });
691
+ });
692
+ });
693
+ });