@webex/internal-plugin-metrics 3.0.0-next.4 → 3.0.0-next.6

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 (28) hide show
  1. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +55 -13
  2. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics.js +34 -29
  4. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +5 -1
  6. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/metrics.js +1 -1
  9. package/dist/metrics.types.js.map +1 -1
  10. package/dist/new-metrics.js +5 -4
  11. package/dist/new-metrics.js.map +1 -1
  12. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +25 -7
  13. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +6 -9
  14. package/dist/types/index.d.ts +2 -2
  15. package/dist/types/metrics.types.d.ts +1 -1
  16. package/package.json +13 -13
  17. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +53 -12
  18. package/src/call-diagnostic/call-diagnostic-metrics.ts +6 -0
  19. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +5 -1
  20. package/src/index.ts +2 -0
  21. package/src/metrics.types.ts +4 -1
  22. package/src/new-metrics.ts +2 -2
  23. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +8 -4
  24. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +156 -1
  25. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +6 -0
  26. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +7 -1
  27. package/test/unit/spec/new-metrics.ts +29 -31
  28. package/test/unit/spec/prelogin-metrics-batcher.ts +1 -0
@@ -41,11 +41,41 @@ describe('internal-plugin-metrics', () => {
41
41
  assert.deepEqual(cdl.latencyTimestamps.get('client.alert.displayed'), now.getTime());
42
42
  });
43
43
 
44
- it('should save latency correctly', () => {
44
+ it('should save latency correctly by default and overwrites', () => {
45
45
  assert.deepEqual(cdl.precomputedLatencies.size, 0);
46
46
  cdl.saveLatency('internal.client.pageJMT', 10);
47
47
  assert.deepEqual(cdl.precomputedLatencies.size, 1);
48
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);
49
79
  });
50
80
 
51
81
  it('should save only first timestamp correctly', () => {
@@ -111,6 +141,89 @@ describe('internal-plugin-metrics', () => {
111
141
  assert.deepEqual(cdl.getMeetingInfoReqResp(), 10);
112
142
  });
113
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
+
114
227
  describe('saveTimestamp', () => {
115
228
  afterEach(() => {
116
229
  sinon.restore();
@@ -512,9 +625,51 @@ describe('internal-plugin-metrics', () => {
512
625
  assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
513
626
  });
514
627
 
628
+ it('calculates getU2CTime correctly', () => {
629
+ it('returns undefined when no precomputed value available', () => {
630
+ assert.deepEqual(cdl.getU2CTime(), undefined);
631
+ });
632
+
633
+ it('returns the correct value', () => {
634
+ cdl.saveLatency('internal.get.u2c.time', 123);
635
+
636
+ assert.deepEqual(cdl.getU2CTime(), 123);
637
+ });
638
+
639
+ it('returns the correct whole number', () => {
640
+ cdl.saveLatency('internal.get.u2c.time', 321.44);
641
+
642
+ assert.deepEqual(cdl.getU2CTime(), 321);
643
+ });
644
+ });
645
+
515
646
  it('calculates getDownloadTimeJMT correctly', () => {
516
647
  cdl.saveLatency('internal.download.time', 1000);
517
648
  assert.deepEqual(cdl.getDownloadTimeJMT(), 1000);
518
649
  });
650
+
651
+ describe('getOtherAppApiReqResp', () => {
652
+ it('returns undefined when no precomputed value available', () => {
653
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), undefined);
654
+ });
655
+
656
+ it('returns undefined if it is less than 0', () => {
657
+ cdl.saveLatency('internal.other.app.api.time', 0);
658
+
659
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), undefined);
660
+ });
661
+
662
+ it('returns the correct value', () => {
663
+ cdl.saveLatency('internal.other.app.api.time', 123);
664
+
665
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), 123);
666
+ });
667
+
668
+ it('returns the correct whole number', () => {
669
+ cdl.saveLatency('internal.other.app.api.time', 321.44);
670
+
671
+ assert.deepEqual(cdl.getOtherAppApiReqResp(), 321);
672
+ });
673
+ });
519
674
  });
520
675
  });
@@ -302,6 +302,11 @@ describe('internal-plugin-metrics', () => {
302
302
 
303
303
  describe('#getIdentifiers', () => {
304
304
  it('should build identifiers correctly', () => {
305
+ webex.internal.device = {
306
+ ...webex.internal.device,
307
+ config: {installationId: 'installationId'},
308
+ };
309
+
305
310
  const res = cd.getIdentifiers({
306
311
  mediaConnections: [
307
312
  {mediaAgentAlias: 'mediaAgentAlias', mediaAgentGroupId: 'mediaAgentGroupId'},
@@ -315,6 +320,7 @@ describe('internal-plugin-metrics', () => {
315
320
  locusId: 'url',
316
321
  locusStartTime: 'lastActive',
317
322
  locusUrl: 'locus/url',
323
+ machineId: 'installationId',
318
324
  mediaAgentAlias: 'mediaAgentAlias',
319
325
  mediaAgentGroupId: 'mediaAgentGroupId',
320
326
  orgId: 'orgId',
@@ -301,6 +301,11 @@ describe('internal-plugin-metrics', () => {
301
301
 
302
302
  [
303
303
  ['client.exit.app', {}],
304
+ ['client.login.end', {
305
+ joinTimes: {
306
+ otherAppApiReqResp: undefined,
307
+ }
308
+ }],
304
309
  ['client.webexapp.launched', {
305
310
  joinTimes: {
306
311
  downloadTime: undefined,
@@ -312,6 +317,7 @@ describe('internal-plugin-metrics', () => {
312
317
  joinTimes: {
313
318
  clickToInterstitial: undefined,
314
319
  meetingInfoReqResp: undefined,
320
+ refreshCaptchaServiceReqResp: undefined,
315
321
  },
316
322
  },
317
323
  ],
@@ -322,6 +328,7 @@ describe('internal-plugin-metrics', () => {
322
328
  showInterstitialTime: undefined,
323
329
  meetingInfoReqResp: undefined,
324
330
  registerWDMDeviceJMT: undefined,
331
+ getU2CTime: undefined
325
332
  },
326
333
  },
327
334
  ],
@@ -332,7 +339,6 @@ describe('internal-plugin-metrics', () => {
332
339
  meetingInfoReqResp: undefined,
333
340
  callInitJoinReq: undefined,
334
341
  joinReqResp: undefined,
335
- joinReqSentReceived: undefined,
336
342
  pageJmt: undefined,
337
343
  clickToInterstitial: undefined,
338
344
  interstitialToJoinOK: undefined,
@@ -1,29 +1,31 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
- import {NewMetrics} from '@webex/internal-plugin-metrics';
2
+ import {NewMetrics, CallDiagnosticLatencies} from '@webex/internal-plugin-metrics';
3
3
  import MockWebex from '@webex/test-helper-mock-webex';
4
4
  import sinon from 'sinon';
5
5
  import {Utils} from '@webex/internal-plugin-metrics';
6
6
 
7
7
  describe('internal-plugin-metrics', () => {
8
8
 
9
+ const mockWebex = () => new MockWebex({
10
+ children: {
11
+ newMetrics: NewMetrics,
12
+ },
13
+ meetings: {
14
+ meetingCollection: {
15
+ get: sinon.stub(),
16
+ },
17
+ },
18
+ request: sinon.stub().resolves({}),
19
+ logger: {
20
+ log: sinon.stub(),
21
+ error: sinon.stub(),
22
+ }
23
+ });
24
+
9
25
  describe('check submitClientEvent when webex is not ready', () => {
10
26
  let webex;
11
27
  //@ts-ignore
12
- webex = new MockWebex({
13
- children: {
14
- newMetrics: NewMetrics,
15
- },
16
- meetings: {
17
- meetingCollection: {
18
- get: sinon.stub(),
19
- },
20
- },
21
- request: sinon.stub().resolves({}),
22
- logger: {
23
- log: sinon.stub(),
24
- error: sinon.stub(),
25
- }
26
- });
28
+ webex = mockWebex();
27
29
 
28
30
  it('checks the log', () => {
29
31
  webex.internal.newMetrics.submitClientEvent({
@@ -38,26 +40,22 @@ describe('internal-plugin-metrics', () => {
38
40
  );
39
41
  });
40
42
  });
43
+
44
+ describe('new-metrics contstructor', () => {
45
+ it('checks callDiagnosticLatencies is defined before ready emit', () => {
46
+
47
+ const webex = mockWebex();
48
+
49
+ assert.instanceOf(webex.internal.newMetrics.callDiagnosticLatencies, CallDiagnosticLatencies);
50
+ });
51
+ });
52
+
41
53
  describe('new-metrics', () => {
42
54
  let webex;
43
55
 
44
56
  beforeEach(() => {
45
57
  //@ts-ignore
46
- webex = new MockWebex({
47
- children: {
48
- newMetrics: NewMetrics,
49
- },
50
- meetings: {
51
- meetingCollection: {
52
- get: sinon.stub(),
53
- },
54
- },
55
- request: sinon.stub().resolves({}),
56
- logger: {
57
- log: sinon.stub(),
58
- error: sinon.stub(),
59
- }
60
- });
58
+ webex = mockWebex();
61
59
 
62
60
  webex.emit('ready');
63
61
 
@@ -74,6 +74,7 @@ describe('internal-plugin-metrics', () => {
74
74
  joinTimes: {
75
75
  meetingInfoReqResp: undefined,
76
76
  clickToInterstitial: undefined,
77
+ refreshCaptchaServiceReqResp: undefined,
77
78
  },
78
79
  name: 'client.interstitial-window.launched',
79
80
  },