@react-native-windows/telemetry 0.76.0-preview.2 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * @format
6
6
  */
7
- import * as appInsights from 'applicationinsights';
7
+ import * as coreOneDS from '@microsoft/1ds-core-js';
8
8
  import { Telemetry, TelemetryOptions } from '../telemetry';
9
9
  export declare class TelemetryTest extends Telemetry {
10
10
  protected static hasTestTelemetryProviders: boolean;
@@ -22,7 +22,5 @@ export declare class TelemetryTest extends Telemetry {
22
22
  /** Retrieves the value of the preserveErrorMessages option. */
23
23
  static getPreserveErrorMessages(): boolean;
24
24
  /** Adds a telemetry processor, usually for verifying the envelope. */
25
- static addTelemetryProcessor(telemetryProcessor: (envelope: appInsights.Contracts.EnvelopeTelemetry, contextObjects?: {
26
- [name: string]: any;
27
- }) => boolean): void;
25
+ static addTelemetryInitializer(telemetryInitializer: (envelope: coreOneDS.ITelemetryItem) => boolean): void;
28
26
  }
@@ -45,21 +45,20 @@ class TelemetryTest extends telemetry_1.Telemetry {
45
45
  telemetry_1.Telemetry.reset();
46
46
  }
47
47
  // Ensure that we don't actually fire events when testing
48
- telemetry_1.Telemetry.isTest = true;
48
+ telemetry_1.Telemetry.isTestEnvironment = true;
49
49
  await telemetry_1.Telemetry.setup(options);
50
50
  }
51
51
  /** Run at the end of each test where telemetry was fired. */
52
52
  static endTest(finalCallback) {
53
53
  var _a;
54
- (_a = telemetry_1.Telemetry.client) === null || _a === void 0 ? void 0 : _a.flush({
55
- callback: _ => {
56
- if (TelemetryTest.hasTestTelemetryProviders) {
57
- expect(TelemetryTest.testTelemetryProvidersRan).toBe(true);
58
- }
59
- if (finalCallback) {
60
- finalCallback();
61
- }
62
- },
54
+ (_a = telemetry_1.Telemetry.appInsightsCore) === null || _a === void 0 ? void 0 : _a.flush(undefined /* isAsync */, () => {
55
+ // Your callback logic here
56
+ if (TelemetryTest.hasTestTelemetryProviders) {
57
+ expect(TelemetryTest.testTelemetryProvidersRan).toBe(true);
58
+ }
59
+ if (finalCallback) {
60
+ finalCallback();
61
+ }
63
62
  });
64
63
  }
65
64
  /** Sets that the telemetry provider has run. */
@@ -68,8 +67,7 @@ class TelemetryTest extends telemetry_1.Telemetry {
68
67
  }
69
68
  /** Retrieves the value of a common property.*/
70
69
  static getCommonProperty(key) {
71
- var _a;
72
- return (_a = TelemetryTest.client) === null || _a === void 0 ? void 0 : _a.commonProperties[key];
70
+ return TelemetryTest.commonProperties[key];
73
71
  }
74
72
  /** Retrieves the version of the specified tool/package. */
75
73
  static getVersion(key) {
@@ -82,9 +80,9 @@ class TelemetryTest extends telemetry_1.Telemetry {
82
80
  return TelemetryTest.options.preserveErrorMessages;
83
81
  }
84
82
  /** Adds a telemetry processor, usually for verifying the envelope. */
85
- static addTelemetryProcessor(telemetryProcessor) {
83
+ static addTelemetryInitializer(telemetryInitializer) {
86
84
  var _a;
87
- (_a = TelemetryTest.client) === null || _a === void 0 ? void 0 : _a.addTelemetryProcessor(telemetryProcessor);
85
+ (_a = TelemetryTest.appInsightsCore) === null || _a === void 0 ? void 0 : _a.addTelemetryInitializer(telemetryInitializer);
88
86
  TelemetryTest.hasTestTelemetryProviders = true;
89
87
  }
90
88
  }
@@ -117,13 +115,12 @@ test('setup() verify static common property values with sync sources', async ()
117
115
  await TelemetryTest.startTest();
118
116
  const props = {
119
117
  deviceArchitecture: () => basePropUtils.deviceArchitecture(),
120
- devicePlatform: () => basePropUtils.devicePlatform(),
118
+ nodePlatform: () => basePropUtils.nodePlatform(),
121
119
  deviceNumCPUs: () => basePropUtils.deviceNumCPUs().toString(),
122
120
  deviceTotalMemory: () => basePropUtils.deviceTotalMemory().toString(),
123
121
  ciCaptured: () => basePropUtils.captureCI().toString(),
124
122
  ciType: () => basePropUtils.ciType(),
125
123
  isMsftInternal: () => basePropUtils.isMsftInternal().toString(),
126
- sampleRate: () => basePropUtils.sampleRate().toString(),
127
124
  isTest: () => 'true',
128
125
  };
129
126
  for (const key in props) {
@@ -285,54 +282,50 @@ async function runTestCommandE2E(commandBody) {
285
282
  }
286
283
  /** Verifies the contents of events fired during the 'test-command'. */
287
284
  function verifyTestCommandTelemetryProcessor(caughtErrors, expectedResultCode, expectedError) {
288
- return (envelope, _) => {
289
- var _a, _b, _c, _d;
285
+ return envelope => {
286
+ var _a, _b;
287
+ TelemetryTest.setTestTelemetryProvidersRan();
290
288
  try {
291
289
  // Processor has run, so the test can (potentially) pass
292
- TelemetryTest.setTestTelemetryProvidersRan();
293
- // Verify roleInstance has been removed
294
- expect(envelope.tags['ai.cloud.roleInstance']).toBeUndefined();
295
- const properties = (_a = envelope.data.baseData) === null || _a === void 0 ? void 0 : _a.properties;
290
+ const properties = envelope.baseData;
296
291
  expect(properties).toBeDefined();
297
292
  // Verify basics
298
- expect(properties.commandName).toBe('test-command');
293
+ const commonProperties = properties.common;
294
+ expect(commonProperties.commandName).toBe('test-command');
299
295
  // Verify versions info
300
- const versions = JSON.parse(properties.versions);
296
+ const versions = properties.versions;
301
297
  expect(versions).toBeDefined();
302
- // Verify project info
303
- const project = JSON.parse(properties.project);
304
- expect(project).toStrictEqual(getTestCommandProjectInfo());
305
298
  expect(Object.keys(versions).length).toBeGreaterThan(0);
306
299
  for (const key of Object.keys(versions)) {
307
300
  expect(versions[key]).toBe(TelemetryTest.getVersion(key));
308
301
  }
309
- if (envelope.data.baseType === 'ExceptionData') {
310
- // Verify event name
311
- expect(properties.eventName).toBe(telemetry_1.CodedErrorEventName);
302
+ // Verify project info
303
+ const project = properties.project;
304
+ expect(project).toStrictEqual(getTestCommandProjectInfo());
305
+ // Verify properties exclusive to error scenarios
306
+ if (envelope.name === telemetry_1.CodedErrorEventName) {
312
307
  // Verify exception info
313
- const exceptions = (_b = envelope.data.baseData) === null || _b === void 0 ? void 0 : _b.exceptions;
314
- expect(exceptions).toBeDefined();
315
- expect(exceptions.length).toBe(1);
316
- expect(exceptions[0].message).toBeDefined();
317
- expect(exceptions[0].message).not.toBe('');
318
- expect(exceptions[0].message).toBe(TelemetryTest.getPreserveErrorMessages()
308
+ const exceptionData = envelope.data.exceptionData;
309
+ expect(exceptionData).toBeDefined();
310
+ expect(exceptionData.message).toBeDefined();
311
+ expect(exceptionData.message).not.toBe('');
312
+ expect(exceptionData.message).toBe(TelemetryTest.getPreserveErrorMessages()
319
313
  ? errorUtils.sanitizeErrorMessage((expectedError === null || expectedError === void 0 ? void 0 : expectedError.message) || 'None')
320
314
  : '[Removed]');
321
315
  // Verify coded error info
322
- const codedError = JSON.parse(properties.codedError);
316
+ const codedError = envelope.data.codedError;
323
317
  expect(codedError).toBeDefined();
324
318
  expect(codedError.type).toBe(expectedError instanceof errorUtils.CodedError
325
319
  ? expectedError.type
326
320
  : 'Unknown');
327
- expect(codedError.data).toStrictEqual((_c = expectedError.data) !== null && _c !== void 0 ? _c : {});
321
+ expect(codedError.data).toStrictEqual((_a = expectedError.data) !== null && _a !== void 0 ? _a : {});
328
322
  }
329
323
  else {
330
- // Verify event name
331
- expect((_d = envelope.data.baseData) === null || _d === void 0 ? void 0 : _d.name).toBe(telemetry_1.CommandEventName);
332
- expect(properties.eventName).toBe(telemetry_1.CommandEventName);
324
+ // If this is not error scenario, it must be a command successful event.
325
+ expect(envelope.name).toBe(telemetry_1.CommandEventName);
333
326
  // Verify command info
334
327
  const expectedInfo = getTestCommandStartInfo();
335
- const command = JSON.parse(properties.command);
328
+ const command = envelope.data.command;
336
329
  expect(command).toBeDefined();
337
330
  expect(command.args).toStrictEqual(expectedInfo.args);
338
331
  expect(command.options).toStrictEqual(expectedInfo.options);
@@ -341,7 +334,7 @@ function verifyTestCommandTelemetryProcessor(caughtErrors, expectedResultCode, e
341
334
  expect(command.resultCode).toBe(expectedResultCode !== null && expectedResultCode !== void 0 ? expectedResultCode : 'Success');
342
335
  // Verify extra props
343
336
  const extraProps = getExtraProps();
344
- expect(JSON.parse(properties.extraProps)).toStrictEqual(extraProps);
337
+ expect((_b = envelope.data) === null || _b === void 0 ? void 0 : _b.additionalData).toStrictEqual(extraProps);
345
338
  }
346
339
  }
347
340
  catch (ex) {
@@ -354,7 +347,7 @@ test('Telemetry run test command end to end, verify event fires', async () => {
354
347
  await TelemetryTest.startTest();
355
348
  // AI eats errors thrown in telemetry processors
356
349
  const caughtErrors = [];
357
- TelemetryTest.addTelemetryProcessor(verifyTestCommandTelemetryProcessor(caughtErrors));
350
+ TelemetryTest.addTelemetryInitializer(verifyTestCommandTelemetryProcessor(caughtErrors));
358
351
  await runTestCommandE2E(testCommandBody);
359
352
  TelemetryTest.endTest(() => {
360
353
  // Check if any errors were thrown
@@ -370,7 +363,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Code
370
363
  const expectedError = new errorUtils.CodedError('MSBuildError', 'test error');
371
364
  // AI eats errors thrown in telemetry processors
372
365
  const caughtErrors = [];
373
- TelemetryTest.addTelemetryProcessor(verifyTestCommandTelemetryProcessor(caughtErrors, expectedError.type, expectedError));
366
+ TelemetryTest.addTelemetryInitializer(verifyTestCommandTelemetryProcessor(caughtErrors, expectedError.type, expectedError));
374
367
  await runTestCommandE2E(() => testCommandBody(expectedError));
375
368
  TelemetryTest.endTest(() => {
376
369
  // Check if any errors were thrown
@@ -382,7 +375,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Code
382
375
  const expectedError = new errorUtils.CodedError('MSBuildError', 'error FOO2020: test error');
383
376
  // AI eats errors thrown in telemetry processors
384
377
  const caughtErrors = [];
385
- TelemetryTest.addTelemetryProcessor(verifyTestCommandTelemetryProcessor(caughtErrors, expectedError.type, expectedError));
378
+ TelemetryTest.addTelemetryInitializer(verifyTestCommandTelemetryProcessor(caughtErrors, expectedError.type, expectedError));
386
379
  await runTestCommandE2E(() => testCommandBody(expectedError));
387
380
  TelemetryTest.endTest(() => {
388
381
  // Check if any errors were thrown
@@ -394,7 +387,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Code
394
387
  const expectedError = new errorUtils.CodedError('MSBuildError', 'test error', { foo: 42 });
395
388
  // AI eats errors thrown in telemetry processors
396
389
  const caughtErrors = [];
397
- TelemetryTest.addTelemetryProcessor(verifyTestCommandTelemetryProcessor(caughtErrors, expectedError.type, expectedError));
390
+ TelemetryTest.addTelemetryInitializer(verifyTestCommandTelemetryProcessor(caughtErrors, expectedError.type, expectedError));
398
391
  await runTestCommandE2E(() => testCommandBody(expectedError));
399
392
  TelemetryTest.endTest(() => {
400
393
  // Check if any errors were thrown
@@ -406,7 +399,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Erro
406
399
  const expectedError = new Error('error FOO2020: test error');
407
400
  // AI eats errors thrown in telemetry processors
408
401
  const caughtErrors = [];
409
- TelemetryTest.addTelemetryProcessor(verifyTestCommandTelemetryProcessor(caughtErrors, 'Unknown', expectedError));
402
+ TelemetryTest.addTelemetryInitializer(verifyTestCommandTelemetryProcessor(caughtErrors, 'Unknown', expectedError));
410
403
  await runTestCommandE2E(() => testCommandBody(expectedError));
411
404
  TelemetryTest.endTest(() => {
412
405
  // Check if any errors were thrown
@@ -418,7 +411,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Erro
418
411
  const expectedError = new Error();
419
412
  // AI eats errors thrown in telemetry processors
420
413
  const caughtErrors = [];
421
- TelemetryTest.addTelemetryProcessor(verifyTestCommandTelemetryProcessor(caughtErrors, 'Unknown', expectedError));
414
+ TelemetryTest.addTelemetryInitializer(verifyTestCommandTelemetryProcessor(caughtErrors, 'Unknown', expectedError));
422
415
  await runTestCommandE2E(() => testCommandBody(expectedError));
423
416
  TelemetryTest.endTest(() => {
424
417
  // Check if any errors were thrown
@@ -433,29 +426,28 @@ function a(s) {
433
426
  }
434
427
  /** Verifies the contents of an exception's message and stack frames */
435
428
  function getVerifyStackTelemetryProcessor(caughtErrors, expectedError) {
436
- return (envelope, _) => {
429
+ return envelope => {
437
430
  try {
438
431
  // Processor has run, so the test can (potentially) pass
439
432
  TelemetryTest.setTestTelemetryProvidersRan();
440
- if (envelope.data.baseType === 'ExceptionData') {
441
- const data = envelope.data.baseData;
442
- expect(data.exceptions).toBeDefined();
443
- expect(data.exceptions.length).toBe(1);
444
- expect(data.exceptions[0].message).toBeDefined();
445
- expect(data.exceptions[0].message).not.toBe('');
446
- expect(data.exceptions[0].message).toBe(TelemetryTest.getPreserveErrorMessages()
433
+ if (envelope.name === telemetry_1.CodedErrorEventName) {
434
+ const data = envelope.data;
435
+ expect(data.exceptionData).toBeDefined();
436
+ expect(data.exceptionData.message).toBeDefined();
437
+ expect(data.exceptionData.message).not.toBe('');
438
+ expect(data.exceptionData.message).toBe(TelemetryTest.getPreserveErrorMessages()
447
439
  ? errorUtils.sanitizeErrorMessage(expectedError.message || 'None')
448
440
  : '[Removed]');
449
- const stack = data.exceptions[0].parsedStack;
441
+ const stack = data.exceptionData.parsedStack;
450
442
  expect(stack).toBeDefined();
451
443
  expect(stack.length).toBeGreaterThan(2);
452
444
  const filename = path.relative(process.cwd(), __filename);
453
- expect(stack[0].method).toEqual('b');
454
- expect(stack[1].method).toEqual('b');
455
- expect(stack[2].method).toEqual('a');
456
- expect(stack[0].fileName).toEqual(`[project_dir]\\???.ts(${filename.length})`);
457
- expect(stack[1].fileName).toEqual(`[project_dir]\\???.ts(${filename.length})`);
458
- expect(stack[2].fileName).toEqual(`[project_dir]\\???.ts(${filename.length})`);
445
+ expect(stack[0].functionName).toEqual('b');
446
+ expect(stack[1].functionName).toEqual('b');
447
+ expect(stack[2].functionName).toEqual('a');
448
+ expect(stack[0].filePath).toEqual(`[project_dir]\\???.ts(${filename.length})`);
449
+ expect(stack[1].filePath).toEqual(`[project_dir]\\???.ts(${filename.length})`);
450
+ expect(stack[2].filePath).toEqual(`[project_dir]\\???.ts(${filename.length})`);
459
451
  }
460
452
  }
461
453
  catch (ex) {
@@ -469,7 +461,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Erro
469
461
  const expectedError = new Error('hello world');
470
462
  // AI eats errors thrown in telemetry processors
471
463
  const caughtErrors = [];
472
- TelemetryTest.addTelemetryProcessor(getVerifyStackTelemetryProcessor(caughtErrors, expectedError));
464
+ TelemetryTest.addTelemetryInitializer(getVerifyStackTelemetryProcessor(caughtErrors, expectedError));
473
465
  await runTestCommandE2E(async () => {
474
466
  await promiseDelay(100);
475
467
  a('world');
@@ -484,7 +476,7 @@ test.each(testTelemetryOptions)('Telemetry run test command end to end with Erro
484
476
  const expectedError = new Error(`hello ${process.cwd()}`);
485
477
  // AI eats errors thrown in telemetry processors
486
478
  const caughtErrors = [];
487
- TelemetryTest.addTelemetryProcessor(getVerifyStackTelemetryProcessor(caughtErrors, expectedError));
479
+ TelemetryTest.addTelemetryInitializer(getVerifyStackTelemetryProcessor(caughtErrors, expectedError));
488
480
  await runTestCommandE2E(async () => {
489
481
  await promiseDelay(100);
490
482
  a(process.cwd());
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../src/e2etest/telemetry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport * as appInsights from 'applicationinsights';\nimport * as path from 'path';\n\nimport {\n Telemetry,\n TelemetryOptions,\n CommandStartInfo,\n CommandEndInfo,\n CommandEventName,\n CodedErrorEventName,\n} from '../telemetry';\nimport * as basePropUtils from '../utils/basePropUtils';\nimport * as errorUtils from '../utils/errorUtils';\nimport * as projectUtils from '../utils/projectUtils';\nimport * as versionUtils from '../utils/versionUtils';\n\nexport class TelemetryTest extends Telemetry {\n protected static hasTestTelemetryProviders: boolean;\n protected static testTelemetryProvidersRan: boolean;\n\n /** Run at the beginning of each test. */\n static async startTest(options?: Partial<TelemetryOptions>) {\n TelemetryTest.hasTestTelemetryProviders = false;\n TelemetryTest.testTelemetryProvidersRan = false;\n\n if (TelemetryTest.isEnabled()) {\n Telemetry.reset();\n }\n\n // Ensure that we don't actually fire events when testing\n Telemetry.isTest = true;\n\n await Telemetry.setup(options);\n }\n\n /** Run at the end of each test where telemetry was fired. */\n static endTest(finalCallback?: () => void): void {\n Telemetry.client?.flush({\n callback: _ => {\n if (TelemetryTest.hasTestTelemetryProviders) {\n expect(TelemetryTest.testTelemetryProvidersRan).toBe(true);\n }\n if (finalCallback) {\n finalCallback();\n }\n },\n });\n }\n\n /** Sets that the telemetry provider has run. */\n static setTestTelemetryProvidersRan() {\n TelemetryTest.testTelemetryProvidersRan = true;\n }\n\n /** Retrieves the value of a common property.*/\n static getCommonProperty(key: string): string | undefined {\n return TelemetryTest.client?.commonProperties[key];\n }\n\n /** Retrieves the version of the specified tool/package. */\n static getVersion(key: string): string | null {\n return key in TelemetryTest.versionsProp\n ? TelemetryTest.versionsProp[key]\n : null;\n }\n\n /** Retrieves the value of the preserveErrorMessages option. */\n static getPreserveErrorMessages(): boolean {\n return TelemetryTest.options.preserveErrorMessages;\n }\n\n /** Adds a telemetry processor, usually for verifying the envelope. */\n static addTelemetryProcessor(\n telemetryProcessor: (\n envelope: appInsights.Contracts.EnvelopeTelemetry,\n contextObjects?: {\n [name: string]: any;\n },\n ) => boolean,\n ): void {\n TelemetryTest.client?.addTelemetryProcessor(telemetryProcessor);\n TelemetryTest.hasTestTelemetryProviders = true;\n }\n}\n\ntest('setup() verify session id is valid and a common property', async () => {\n await TelemetryTest.startTest();\n\n const sessionId = TelemetryTest.getSessionId();\n expect(sessionId).toBeDefined();\n expect(sessionId!).toHaveLength(32);\n expect(sessionId!).toBe(basePropUtils.getSessionId());\n expect(TelemetryTest.getCommonProperty('sessionId')).toBe(sessionId!);\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify static common property values with async sources', async () => {\n await TelemetryTest.startTest();\n\n const props: Record<string, () => Promise<string | undefined>> = {\n deviceId: basePropUtils.deviceId,\n deviceLocale: basePropUtils.deviceLocale,\n };\n\n for (const key in props) {\n if (!(key in Object.prototype)) {\n const value = TelemetryTest.getCommonProperty(key);\n expect(value).toBeDefined();\n expect(value).toBe(await props[key]());\n }\n }\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify static common property values with sync sources', async () => {\n await TelemetryTest.startTest();\n\n const props: Record<string, () => string | undefined> = {\n deviceArchitecture: () => basePropUtils.deviceArchitecture(),\n devicePlatform: () => basePropUtils.devicePlatform(),\n deviceNumCPUs: () => basePropUtils.deviceNumCPUs().toString(),\n deviceTotalMemory: () => basePropUtils.deviceTotalMemory().toString(),\n ciCaptured: () => basePropUtils.captureCI().toString(),\n ciType: () => basePropUtils.ciType(),\n isMsftInternal: () => basePropUtils.isMsftInternal().toString(),\n sampleRate: () => basePropUtils.sampleRate().toString(),\n isTest: () => 'true',\n };\n\n for (const key in props) {\n if (!(key in Object.prototype)) {\n const value = TelemetryTest.getCommonProperty(key);\n expect(value).toBeDefined();\n expect(value).toBe(props[key]());\n }\n }\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify other common property values are defined', async () => {\n await TelemetryTest.startTest();\n\n const props: string[] = ['deviceDiskFreeSpace'];\n\n for (const key of props) {\n const value = TelemetryTest.getCommonProperty(key);\n expect(value).toBeDefined();\n }\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify tool versions are populated', async () => {\n await TelemetryTest.startTest();\n\n const props: Record<string, () => Promise<string | null>> = {\n node: versionUtils.getNodeVersion,\n npm: versionUtils.getNpmVersion,\n yarn: versionUtils.getYarnVersion,\n VisualStudio: versionUtils.getVisualStudioVersion,\n };\n\n for (const key in props) {\n if (!(key in Object.prototype)) {\n const value = await props[key]();\n expect(value).toBe(TelemetryTest.getVersion(key));\n }\n }\n\n TelemetryTest.endTest();\n});\n\ntest('tryUpdateVersionsProp() returns true for adding a new version', async () => {\n await TelemetryTest.startTest();\n\n const name = 'test';\n const version = '1.0';\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => version),\n ).toBe(true);\n expect(TelemetryTest.getVersion(name)).toBe(version);\n\n TelemetryTest.endTest();\n});\n\ntest('tryUpdateVersionsProp() returns false for adding an existing version with refresh is false', async () => {\n await TelemetryTest.startTest();\n\n const name = 'test';\n const version = '1.0';\n\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => version),\n ).toBe(true);\n\n let getValueCalled = false;\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => {\n getValueCalled = true;\n return version;\n }),\n ).toBe(false);\n\n expect(getValueCalled).toBe(false);\n\n TelemetryTest.endTest();\n});\n\ntest('tryUpdateVersionsProp() returns true for adding an existing version with refresh is true', async () => {\n await TelemetryTest.startTest();\n\n const name = 'test';\n const version = '1.0';\n\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => version),\n ).toBe(true);\n\n let getValueCalled = false;\n expect(\n await TelemetryTest.tryUpdateVersionsProp(\n name,\n async () => {\n getValueCalled = true;\n return version;\n },\n true,\n ),\n ).toBe(true);\n\n expect(getValueCalled).toBe(true);\n\n TelemetryTest.endTest();\n});\n\n/** Returns the CommandStartInfo for our fake 'test-command'. */\nfunction getTestCommandStartInfo(): CommandStartInfo {\n return {\n commandName: 'test-command',\n args: {\n testArg1: 'true',\n testArg2: '10',\n testArg3: 'testValue',\n },\n options: {\n testArg0: 'unsetArg',\n testArg1: true,\n testArg2: 10,\n testArg3: 'testValue',\n },\n defaultOptions: {\n testArg0: 'unsetArg',\n testArg1: false,\n testArg2: 0,\n testArg3: 'defaultValue',\n },\n };\n}\n\n/** Returns the CommandEndInfo for our fake 'test-command'. */\nfunction getTestCommandEndInfo(\n resultCode: errorUtils.CodedErrorType,\n): CommandEndInfo {\n return {\n resultCode,\n };\n}\n\nfunction getTestCommandProjectInfo(): projectUtils.AppProjectInfo {\n return {\n id: projectUtils.getProjectId('test-app-project'),\n platforms: ['windows'],\n rnwLang: 'cpp',\n usesTS: true,\n usesRNConfig: false,\n jsEngine: 'Chakra',\n rnwSource: 'Source',\n dependencies: [\n {\n id: projectUtils.getProjectId('test-module-project'),\n platforms: ['android', 'windows'],\n rnwLang: 'cpp',\n },\n ],\n };\n}\n\nfunction getExtraProps(): Record<string, any> {\n return {\n extraProp1: true,\n extraProp2: 1234,\n extraProp3: 'test',\n extraProp4: ['test'],\n extraProp5: {\n nestedProp1: true,\n nestedProp2: 1234,\n },\n };\n}\n\n/** Asynchronously waits the number in ms. */\nasync function promiseDelay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/** The body of the fake 'test-command' which will throw the provided error. */\nasync function testCommandBody(errorToThrow?: Error): Promise<void> {\n await promiseDelay(100);\n if (errorToThrow) {\n throw errorToThrow;\n }\n}\n\n/** Runs the complete 'test-command' with the right Telemetry setup and cleanup. */\nasync function runTestCommandE2E(commandBody: () => Promise<void>) {\n TelemetryTest.startCommand(getTestCommandStartInfo());\n TelemetryTest.setProjectInfo(getTestCommandProjectInfo());\n let errorCode: errorUtils.CodedErrorType = 'Success';\n let caughtError: Error | undefined;\n try {\n await commandBody();\n } catch (ex) {\n caughtError = ex instanceof Error ? (ex as Error) : new Error(String(ex));\n errorCode =\n caughtError instanceof errorUtils.CodedError\n ? (caughtError as errorUtils.CodedError).type\n : 'Unknown';\n TelemetryTest.trackException(caughtError);\n }\n TelemetryTest.endCommand(getTestCommandEndInfo(errorCode), getExtraProps());\n}\n\n/** Verifies the contents of events fired during the 'test-command'. */\nfunction verifyTestCommandTelemetryProcessor(\n caughtErrors: Error[],\n expectedResultCode?: errorUtils.CodedErrorType,\n expectedError?: Error,\n): (\n envelope: appInsights.Contracts.EnvelopeTelemetry,\n contextObjects?: {\n [name: string]: any;\n },\n) => boolean {\n return (envelope, _) => {\n try {\n // Processor has run, so the test can (potentially) pass\n TelemetryTest.setTestTelemetryProvidersRan();\n\n // Verify roleInstance has been removed\n expect(envelope.tags['ai.cloud.roleInstance']).toBeUndefined();\n\n const properties = envelope.data.baseData?.properties;\n expect(properties).toBeDefined();\n\n // Verify basics\n expect(properties.commandName).toBe('test-command');\n\n // Verify versions info\n const versions = JSON.parse(properties.versions);\n expect(versions).toBeDefined();\n\n // Verify project info\n const project = JSON.parse(properties.project);\n expect(project).toStrictEqual(getTestCommandProjectInfo());\n\n expect(Object.keys(versions).length).toBeGreaterThan(0);\n for (const key of Object.keys(versions)) {\n expect(versions[key]).toBe(TelemetryTest.getVersion(key));\n }\n\n if (envelope.data.baseType === 'ExceptionData') {\n // Verify event name\n expect(properties.eventName).toBe(CodedErrorEventName);\n\n // Verify exception info\n const exceptions = envelope.data.baseData?.exceptions;\n expect(exceptions).toBeDefined();\n expect(exceptions.length).toBe(1);\n expect(exceptions[0].message).toBeDefined();\n expect(exceptions[0].message).not.toBe('');\n\n expect(exceptions[0].message).toBe(\n TelemetryTest.getPreserveErrorMessages()\n ? errorUtils.sanitizeErrorMessage(expectedError?.message || 'None')\n : '[Removed]',\n );\n\n // Verify coded error info\n const codedError = JSON.parse(properties.codedError);\n expect(codedError).toBeDefined();\n\n expect(codedError.type).toBe(\n expectedError instanceof errorUtils.CodedError\n ? expectedError.type\n : 'Unknown',\n );\n\n expect(codedError.data).toStrictEqual(\n (expectedError as errorUtils.CodedError).data ?? {},\n );\n } else {\n // Verify event name\n expect(envelope.data.baseData?.name).toBe(CommandEventName);\n expect(properties.eventName).toBe(CommandEventName);\n\n // Verify command info\n const expectedInfo = getTestCommandStartInfo();\n\n const command = JSON.parse(properties.command);\n expect(command).toBeDefined();\n expect(command.args).toStrictEqual(expectedInfo.args);\n expect(command.options).toStrictEqual(expectedInfo.options);\n expect(command.defaultOptions).toStrictEqual(\n expectedInfo.defaultOptions,\n );\n expect(command.durationInSecs).toBeGreaterThan(0);\n expect(command.resultCode).toBe(expectedResultCode ?? 'Success');\n\n // Verify extra props\n const extraProps = getExtraProps();\n expect(JSON.parse(properties.extraProps)).toStrictEqual(extraProps);\n }\n } catch (ex) {\n caughtErrors.push(\n ex instanceof Error ? (ex as Error) : new Error(String(ex)),\n );\n }\n\n return true;\n };\n}\n\ntest('Telemetry run test command end to end, verify event fires', async () => {\n await TelemetryTest.startTest();\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n verifyTestCommandTelemetryProcessor(caughtErrors),\n );\n\n await runTestCommandE2E(testCommandBody);\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n});\n\nconst testTelemetryOptions = [\n {preserveErrorMessages: false},\n {preserveErrorMessages: true},\n];\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with CodedError, verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new errorUtils.CodedError(\n 'MSBuildError',\n 'test error',\n );\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n expectedError.type,\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with CodedError (with error in message), verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new errorUtils.CodedError(\n 'MSBuildError',\n 'error FOO2020: test error',\n );\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n expectedError.type,\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with CodedError (with data), verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new errorUtils.CodedError(\n 'MSBuildError',\n 'test error',\n {foo: 42},\n );\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n expectedError.type,\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error, verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error('error FOO2020: test error');\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n 'Unknown',\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error (no message), verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error();\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n 'Unknown',\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\nfunction b(s: string) {\n throw new Error('hello ' + s);\n}\n\nfunction a(s: string) {\n b(s);\n}\n\n/** Verifies the contents of an exception's message and stack frames */\nfunction getVerifyStackTelemetryProcessor(\n caughtErrors: Error[],\n expectedError: Error,\n): (\n envelope: appInsights.Contracts.EnvelopeTelemetry,\n contextObjects?: {\n [name: string]: any;\n },\n) => boolean {\n return (envelope, _) => {\n try {\n // Processor has run, so the test can (potentially) pass\n TelemetryTest.setTestTelemetryProvidersRan();\n\n if (envelope.data.baseType === 'ExceptionData') {\n const data = (envelope.data as any).baseData;\n expect(data.exceptions).toBeDefined();\n expect(data.exceptions.length).toBe(1);\n expect(data.exceptions[0].message).toBeDefined();\n expect(data.exceptions[0].message).not.toBe('');\n\n expect(data.exceptions[0].message).toBe(\n TelemetryTest.getPreserveErrorMessages()\n ? errorUtils.sanitizeErrorMessage(expectedError.message || 'None')\n : '[Removed]',\n );\n\n const stack = data.exceptions[0].parsedStack;\n expect(stack).toBeDefined();\n expect(stack.length).toBeGreaterThan(2);\n\n const filename = path.relative(process.cwd(), __filename);\n expect(stack[0].method).toEqual('b');\n expect(stack[1].method).toEqual('b');\n expect(stack[2].method).toEqual('a');\n expect(stack[0].fileName).toEqual(\n `[project_dir]\\\\???.ts(${filename.length})`,\n );\n expect(stack[1].fileName).toEqual(\n `[project_dir]\\\\???.ts(${filename.length})`,\n );\n expect(stack[2].fileName).toEqual(\n `[project_dir]\\\\???.ts(${filename.length})`,\n );\n }\n } catch (ex) {\n caughtErrors.push(\n ex instanceof Error ? (ex as Error) : new Error(String(ex)),\n );\n }\n\n return true;\n };\n}\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error, verify sanitized message and stack %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error('hello world');\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n getVerifyStackTelemetryProcessor(caughtErrors, expectedError),\n );\n\n await runTestCommandE2E(async () => {\n await promiseDelay(100);\n a('world');\n });\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error, verify sanitized message with path and stack %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error(`hello ${process.cwd()}`);\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryProcessor(\n getVerifyStackTelemetryProcessor(caughtErrors, expectedError),\n );\n\n await runTestCommandE2E(async () => {\n await promiseDelay(100);\n a(process.cwd());\n });\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n"]}
1
+ {"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../src/e2etest/telemetry.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright (c) Microsoft Corporation.\n * Licensed under the MIT License.\n *\n * @format\n */\n\nimport * as coreOneDS from '@microsoft/1ds-core-js';\nimport * as path from 'path';\n\nimport {\n Telemetry,\n TelemetryOptions,\n CommandStartInfo,\n CommandEndInfo,\n CommandEventName,\n CodedErrorEventName,\n} from '../telemetry';\n\nimport * as basePropUtils from '../utils/basePropUtils';\nimport * as errorUtils from '../utils/errorUtils';\nimport * as projectUtils from '../utils/projectUtils';\nimport * as versionUtils from '../utils/versionUtils';\n\nexport class TelemetryTest extends Telemetry {\n protected static hasTestTelemetryProviders: boolean;\n protected static testTelemetryProvidersRan: boolean;\n\n /** Run at the beginning of each test. */\n static async startTest(options?: Partial<TelemetryOptions>) {\n TelemetryTest.hasTestTelemetryProviders = false;\n TelemetryTest.testTelemetryProvidersRan = false;\n\n if (TelemetryTest.isEnabled()) {\n Telemetry.reset();\n }\n\n // Ensure that we don't actually fire events when testing\n Telemetry.isTestEnvironment = true;\n\n await Telemetry.setup(options);\n }\n\n /** Run at the end of each test where telemetry was fired. */\n static endTest(finalCallback?: () => void): void {\n Telemetry.appInsightsCore?.flush(undefined /* isAsync */, () => {\n // Your callback logic here\n if (TelemetryTest.hasTestTelemetryProviders) {\n expect(TelemetryTest.testTelemetryProvidersRan).toBe(true);\n }\n if (finalCallback) {\n finalCallback();\n }\n });\n }\n\n /** Sets that the telemetry provider has run. */\n static setTestTelemetryProvidersRan() {\n TelemetryTest.testTelemetryProvidersRan = true;\n }\n\n /** Retrieves the value of a common property.*/\n static getCommonProperty(key: string): string | undefined {\n return TelemetryTest.commonProperties[key];\n }\n\n /** Retrieves the version of the specified tool/package. */\n static getVersion(key: string): string | null {\n return key in TelemetryTest.versionsProp\n ? TelemetryTest.versionsProp[key]\n : null;\n }\n\n /** Retrieves the value of the preserveErrorMessages option. */\n static getPreserveErrorMessages(): boolean {\n return TelemetryTest.options.preserveErrorMessages;\n }\n\n /** Adds a telemetry processor, usually for verifying the envelope. */\n static addTelemetryInitializer(\n telemetryInitializer: (envelope: coreOneDS.ITelemetryItem) => boolean,\n ): void {\n TelemetryTest.appInsightsCore?.addTelemetryInitializer(\n telemetryInitializer,\n );\n TelemetryTest.hasTestTelemetryProviders = true;\n }\n}\n\ntest('setup() verify session id is valid and a common property', async () => {\n await TelemetryTest.startTest();\n\n const sessionId = TelemetryTest.getSessionId();\n expect(sessionId).toBeDefined();\n expect(sessionId!).toHaveLength(32);\n expect(sessionId!).toBe(basePropUtils.getSessionId());\n expect(TelemetryTest.getCommonProperty('sessionId')).toBe(sessionId!);\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify static common property values with async sources', async () => {\n await TelemetryTest.startTest();\n\n const props: Record<string, () => Promise<string | undefined>> = {\n deviceId: basePropUtils.deviceId,\n deviceLocale: basePropUtils.deviceLocale,\n };\n\n for (const key in props) {\n if (!(key in Object.prototype)) {\n const value = TelemetryTest.getCommonProperty(key);\n expect(value).toBeDefined();\n expect(value).toBe(await props[key]());\n }\n }\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify static common property values with sync sources', async () => {\n await TelemetryTest.startTest();\n\n const props: Record<string, () => string | undefined> = {\n deviceArchitecture: () => basePropUtils.deviceArchitecture(),\n nodePlatform: () => basePropUtils.nodePlatform(),\n deviceNumCPUs: () => basePropUtils.deviceNumCPUs().toString(),\n deviceTotalMemory: () => basePropUtils.deviceTotalMemory().toString(),\n ciCaptured: () => basePropUtils.captureCI().toString(),\n ciType: () => basePropUtils.ciType(),\n isMsftInternal: () => basePropUtils.isMsftInternal().toString(),\n isTest: () => 'true',\n };\n\n for (const key in props) {\n if (!(key in Object.prototype)) {\n const value = TelemetryTest.getCommonProperty(key);\n expect(value).toBeDefined();\n expect(value).toBe(props[key]());\n }\n }\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify other common property values are defined', async () => {\n await TelemetryTest.startTest();\n\n const props: string[] = ['deviceDiskFreeSpace'];\n\n for (const key of props) {\n const value = TelemetryTest.getCommonProperty(key);\n expect(value).toBeDefined();\n }\n\n TelemetryTest.endTest();\n});\n\ntest('setup() verify tool versions are populated', async () => {\n await TelemetryTest.startTest();\n\n const props: Record<string, () => Promise<string | null>> = {\n node: versionUtils.getNodeVersion,\n npm: versionUtils.getNpmVersion,\n yarn: versionUtils.getYarnVersion,\n VisualStudio: versionUtils.getVisualStudioVersion,\n };\n\n for (const key in props) {\n if (!(key in Object.prototype)) {\n const value = await props[key]();\n expect(value).toBe(TelemetryTest.getVersion(key));\n }\n }\n\n TelemetryTest.endTest();\n});\n\ntest('tryUpdateVersionsProp() returns true for adding a new version', async () => {\n await TelemetryTest.startTest();\n\n const name = 'test';\n const version = '1.0';\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => version),\n ).toBe(true);\n expect(TelemetryTest.getVersion(name)).toBe(version);\n\n TelemetryTest.endTest();\n});\n\ntest('tryUpdateVersionsProp() returns false for adding an existing version with refresh is false', async () => {\n await TelemetryTest.startTest();\n\n const name = 'test';\n const version = '1.0';\n\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => version),\n ).toBe(true);\n\n let getValueCalled = false;\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => {\n getValueCalled = true;\n return version;\n }),\n ).toBe(false);\n\n expect(getValueCalled).toBe(false);\n\n TelemetryTest.endTest();\n});\n\ntest('tryUpdateVersionsProp() returns true for adding an existing version with refresh is true', async () => {\n await TelemetryTest.startTest();\n\n const name = 'test';\n const version = '1.0';\n\n expect(\n await TelemetryTest.tryUpdateVersionsProp(name, async () => version),\n ).toBe(true);\n\n let getValueCalled = false;\n expect(\n await TelemetryTest.tryUpdateVersionsProp(\n name,\n async () => {\n getValueCalled = true;\n return version;\n },\n true,\n ),\n ).toBe(true);\n\n expect(getValueCalled).toBe(true);\n\n TelemetryTest.endTest();\n});\n\n/** Returns the CommandStartInfo for our fake 'test-command'. */\nfunction getTestCommandStartInfo(): CommandStartInfo {\n return {\n commandName: 'test-command',\n args: {\n testArg1: 'true',\n testArg2: '10',\n testArg3: 'testValue',\n },\n options: {\n testArg0: 'unsetArg',\n testArg1: true,\n testArg2: 10,\n testArg3: 'testValue',\n },\n defaultOptions: {\n testArg0: 'unsetArg',\n testArg1: false,\n testArg2: 0,\n testArg3: 'defaultValue',\n },\n };\n}\n\n/** Returns the CommandEndInfo for our fake 'test-command'. */\nfunction getTestCommandEndInfo(\n resultCode: errorUtils.CodedErrorType,\n): CommandEndInfo {\n return {\n resultCode,\n };\n}\n\nfunction getTestCommandProjectInfo(): projectUtils.AppProjectInfo {\n return {\n id: projectUtils.getProjectId('test-app-project'),\n platforms: ['windows'],\n rnwLang: 'cpp',\n usesTS: true,\n usesRNConfig: false,\n jsEngine: 'Chakra',\n rnwSource: 'Source',\n dependencies: [\n {\n id: projectUtils.getProjectId('test-module-project'),\n platforms: ['android', 'windows'],\n rnwLang: 'cpp',\n },\n ],\n };\n}\n\nfunction getExtraProps(): Record<string, any> {\n return {\n extraProp1: true,\n extraProp2: 1234,\n extraProp3: 'test',\n extraProp4: ['test'],\n extraProp5: {\n nestedProp1: true,\n nestedProp2: 1234,\n },\n };\n}\n\n/** Asynchronously waits the number in ms. */\nasync function promiseDelay(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/** The body of the fake 'test-command' which will throw the provided error. */\nasync function testCommandBody(errorToThrow?: Error): Promise<void> {\n await promiseDelay(100);\n if (errorToThrow) {\n throw errorToThrow;\n }\n}\n\n/** Runs the complete 'test-command' with the right Telemetry setup and cleanup. */\nasync function runTestCommandE2E(commandBody: () => Promise<void>) {\n TelemetryTest.startCommand(getTestCommandStartInfo());\n TelemetryTest.setProjectInfo(getTestCommandProjectInfo());\n let errorCode: errorUtils.CodedErrorType = 'Success';\n let caughtError: Error | undefined;\n try {\n await commandBody();\n } catch (ex) {\n caughtError = ex instanceof Error ? (ex as Error) : new Error(String(ex));\n errorCode =\n caughtError instanceof errorUtils.CodedError\n ? (caughtError as errorUtils.CodedError).type\n : 'Unknown';\n TelemetryTest.trackException(caughtError);\n }\n TelemetryTest.endCommand(getTestCommandEndInfo(errorCode), getExtraProps());\n}\n\n/** Verifies the contents of events fired during the 'test-command'. */\nfunction verifyTestCommandTelemetryProcessor(\n caughtErrors: Error[],\n expectedResultCode?: errorUtils.CodedErrorType,\n expectedError?: Error,\n): (envelope: coreOneDS.ITelemetryItem) => boolean {\n return envelope => {\n TelemetryTest.setTestTelemetryProvidersRan();\n\n try {\n // Processor has run, so the test can (potentially) pass\n const properties = envelope.baseData;\n expect(properties).toBeDefined();\n\n // Verify basics\n const commonProperties = properties!.common;\n expect(commonProperties.commandName).toBe('test-command');\n\n // Verify versions info\n const versions = properties!.versions;\n expect(versions).toBeDefined();\n\n expect(Object.keys(versions).length).toBeGreaterThan(0);\n for (const key of Object.keys(versions)) {\n expect(versions[key]).toBe(TelemetryTest.getVersion(key));\n }\n\n // Verify project info\n const project = properties!.project;\n expect(project).toStrictEqual(getTestCommandProjectInfo());\n\n // Verify properties exclusive to error scenarios\n if (envelope.name === CodedErrorEventName) {\n // Verify exception info\n const exceptionData = envelope.data!.exceptionData;\n expect(exceptionData).toBeDefined();\n expect(exceptionData.message).toBeDefined();\n expect(exceptionData.message).not.toBe('');\n\n expect(exceptionData.message).toBe(\n TelemetryTest.getPreserveErrorMessages()\n ? errorUtils.sanitizeErrorMessage(expectedError?.message || 'None')\n : '[Removed]',\n );\n\n // Verify coded error info\n const codedError = envelope.data!.codedError;\n expect(codedError).toBeDefined();\n\n expect(codedError.type).toBe(\n expectedError instanceof errorUtils.CodedError\n ? expectedError.type\n : 'Unknown',\n );\n\n expect(codedError.data).toStrictEqual(\n (expectedError as errorUtils.CodedError).data ?? {},\n );\n } else {\n // If this is not error scenario, it must be a command successful event.\n expect(envelope.name).toBe(CommandEventName);\n\n // Verify command info\n const expectedInfo = getTestCommandStartInfo();\n\n const command = envelope.data!.command;\n expect(command).toBeDefined();\n expect(command.args).toStrictEqual(expectedInfo.args);\n expect(command.options).toStrictEqual(expectedInfo.options);\n expect(command.defaultOptions).toStrictEqual(\n expectedInfo.defaultOptions,\n );\n expect(command.durationInSecs).toBeGreaterThan(0);\n expect(command.resultCode).toBe(expectedResultCode ?? 'Success');\n\n // Verify extra props\n const extraProps = getExtraProps();\n expect(envelope.data?.additionalData).toStrictEqual(extraProps);\n }\n } catch (ex) {\n caughtErrors.push(\n ex instanceof Error ? (ex as Error) : new Error(String(ex)),\n );\n }\n\n return true;\n };\n}\n\ntest('Telemetry run test command end to end, verify event fires', async () => {\n await TelemetryTest.startTest();\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n verifyTestCommandTelemetryProcessor(caughtErrors),\n );\n\n await runTestCommandE2E(testCommandBody);\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n});\n\nconst testTelemetryOptions = [\n {preserveErrorMessages: false},\n {preserveErrorMessages: true},\n];\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with CodedError, verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new errorUtils.CodedError(\n 'MSBuildError',\n 'test error',\n );\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n expectedError.type,\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with CodedError (with error in message), verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new errorUtils.CodedError(\n 'MSBuildError',\n 'error FOO2020: test error',\n );\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n expectedError.type,\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with CodedError (with data), verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new errorUtils.CodedError(\n 'MSBuildError',\n 'test error',\n {foo: 42},\n );\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n expectedError.type,\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error, verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error('error FOO2020: test error');\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n 'Unknown',\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error (no message), verify events fire %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error();\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n verifyTestCommandTelemetryProcessor(\n caughtErrors,\n 'Unknown',\n expectedError,\n ),\n );\n\n await runTestCommandE2E(() => testCommandBody(expectedError));\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\nfunction b(s: string) {\n throw new Error('hello ' + s);\n}\n\nfunction a(s: string) {\n b(s);\n}\n\n/** Verifies the contents of an exception's message and stack frames */\nfunction getVerifyStackTelemetryProcessor(\n caughtErrors: Error[],\n expectedError: Error,\n): (envelope: coreOneDS.ITelemetryItem) => boolean {\n return envelope => {\n try {\n // Processor has run, so the test can (potentially) pass\n TelemetryTest.setTestTelemetryProvidersRan();\n\n if (envelope.name === CodedErrorEventName) {\n const data = envelope.data as any;\n expect(data.exceptionData).toBeDefined();\n expect(data.exceptionData.message).toBeDefined();\n expect(data.exceptionData.message).not.toBe('');\n\n expect(data.exceptionData.message).toBe(\n TelemetryTest.getPreserveErrorMessages()\n ? errorUtils.sanitizeErrorMessage(expectedError.message || 'None')\n : '[Removed]',\n );\n\n const stack = data.exceptionData.parsedStack;\n expect(stack).toBeDefined();\n expect(stack.length).toBeGreaterThan(2);\n\n const filename = path.relative(process.cwd(), __filename);\n expect(stack[0].functionName).toEqual('b');\n expect(stack[1].functionName).toEqual('b');\n expect(stack[2].functionName).toEqual('a');\n expect(stack[0].filePath).toEqual(\n `[project_dir]\\\\???.ts(${filename.length})`,\n );\n expect(stack[1].filePath).toEqual(\n `[project_dir]\\\\???.ts(${filename.length})`,\n );\n expect(stack[2].filePath).toEqual(\n `[project_dir]\\\\???.ts(${filename.length})`,\n );\n }\n } catch (ex) {\n caughtErrors.push(\n ex instanceof Error ? (ex as Error) : new Error(String(ex)),\n );\n }\n\n return true;\n };\n}\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error, verify sanitized message and stack %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error('hello world');\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n getVerifyStackTelemetryProcessor(caughtErrors, expectedError),\n );\n\n await runTestCommandE2E(async () => {\n await promiseDelay(100);\n a('world');\n });\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n\ntest.each(testTelemetryOptions)(\n 'Telemetry run test command end to end with Error, verify sanitized message with path and stack %s',\n async options => {\n await TelemetryTest.startTest(options);\n\n const expectedError = new Error(`hello ${process.cwd()}`);\n\n // AI eats errors thrown in telemetry processors\n const caughtErrors: Error[] = [];\n TelemetryTest.addTelemetryInitializer(\n getVerifyStackTelemetryProcessor(caughtErrors, expectedError),\n );\n\n await runTestCommandE2E(async () => {\n await promiseDelay(100);\n a(process.cwd());\n });\n\n TelemetryTest.endTest(() => {\n // Check if any errors were thrown\n expect(caughtErrors).toHaveLength(0);\n });\n },\n);\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  * @format
5
5
  */
6
- import * as appInsights from 'applicationinsights';
6
+ import * as coreOneDS from '@microsoft/1ds-core-js';
7
7
  import * as errorUtils from './utils/errorUtils';
8
8
  import * as projectUtils from './utils/projectUtils';
9
9
  export interface TelemetryOptions {
@@ -35,38 +35,26 @@ export declare const NuGetPackagesWeTrack: string[];
35
35
  * The Telemetry class is responsible for reporting telemetry for RNW CLI.
36
36
  */
37
37
  export declare class Telemetry {
38
- protected static client?: appInsights.TelemetryClient;
38
+ protected static appInsightsCore?: coreOneDS.AppInsightsCore;
39
39
  protected static options: TelemetryOptions;
40
- protected static isTest: boolean;
40
+ protected static isTestEnvironment: boolean;
41
41
  protected static commandInfo: CommandInfo;
42
42
  protected static versionsProp: Record<string, string>;
43
43
  protected static projectProp?: projectUtils.AppProjectInfo | projectUtils.DependencyProjectInfo;
44
+ protected static commonProperties: {
45
+ [key: string]: string;
46
+ };
44
47
  protected static getDefaultSetupString(): string;
45
48
  protected static reset(): void;
46
49
  static isEnabled(): boolean;
47
50
  static getSessionId(): string;
48
51
  /** Sets up the Telemetry static to be used elsewhere. */
49
52
  static setup(options?: Partial<TelemetryOptions>): Promise<void>;
50
- /** Sets up Telemetry.client. */
53
+ private static basicTelemetryInitializer;
54
+ /** Sets up Telemetry.appInsightsCore. */
51
55
  private static setupClient;
52
56
  /** Sets up any base properties that all telemetry events require. */
53
57
  private static setupBaseProperties;
54
- /** Sets up any telemetry processors. */
55
- private static setupTelemetryProcessors;
56
- /**
57
- * Performs the processing necessary (mostly PII sanitization) for all events.
58
- * @param envelope The ApplicationInsights event envelope.
59
- * @param _contextObjects An optional context object.
60
- * @returns Whether to kee
61
- */
62
- private static basicTelemetryProcessor;
63
- /**
64
- * Performs the processing necessary (mostly PII sanitization) for error events.
65
- * @param envelope
66
- * @param _contextObjects
67
- * @returns
68
- */
69
- private static errorTelemetryProcessor;
70
58
  /** Tries to update the version of the named package/tool by calling getValue(). */
71
59
  static tryUpdateVersionsProp(name: string, getValue: () => Promise<string | null>, forceRefresh?: boolean): Promise<boolean>;
72
60
  /** Populates the versions property of tools we care to track. */
@@ -78,7 +66,9 @@ export declare class Telemetry {
78
66
  static setProjectInfo(info: projectUtils.AppProjectInfo | projectUtils.DependencyProjectInfo): void;
79
67
  static startCommand(info: CommandStartInfo): void;
80
68
  static endCommand(info: CommandEndInfo, extraProps?: Record<string, any>): void;
69
+ private static trackEvent;
81
70
  private static trackCommandEvent;
82
71
  static trackException(error: Error, extraProps?: Record<string, any>): void;
72
+ static convertErrorIntoExceptionData(error: Error): Record<string, any>;
83
73
  }
84
74
  export {};