@fluidframework/telemetry-utils 2.0.0-rc.2.0.2 → 2.0.0-rc.3.0.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.
- package/CHANGELOG.md +23 -0
- package/api-report/telemetry-utils.api.md +6 -6
- package/dist/config.d.ts +2 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -2
- package/dist/config.js.map +1 -1
- package/dist/error.d.ts +4 -2
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +5 -5
- package/dist/error.js.map +1 -1
- package/dist/errorLogging.d.ts +3 -2
- package/dist/errorLogging.d.ts.map +1 -1
- package/dist/errorLogging.js.map +1 -1
- package/dist/eventEmitterWithErrorHandling.d.ts +1 -1
- package/dist/eventEmitterWithErrorHandling.d.ts.map +1 -1
- package/dist/eventEmitterWithErrorHandling.js +2 -2
- package/dist/eventEmitterWithErrorHandling.js.map +1 -1
- package/dist/events.d.ts +1 -1
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js.map +1 -1
- package/dist/fluidErrorBase.d.ts.map +1 -1
- package/dist/fluidErrorBase.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +28 -0
- package/dist/logger.d.ts +2 -2
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/mockLogger.d.ts +1 -1
- package/dist/mockLogger.d.ts.map +1 -1
- package/dist/mockLogger.js +3 -3
- package/dist/mockLogger.js.map +1 -1
- package/dist/public.d.ts +20 -0
- package/dist/sampledTelemetryHelper.d.ts +2 -2
- package/dist/sampledTelemetryHelper.d.ts.map +1 -1
- package/dist/sampledTelemetryHelper.js.map +1 -1
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -0
- package/dist/utils.js.map +1 -1
- package/internal.d.ts +11 -0
- package/legacy.d.ts +11 -0
- package/lib/config.d.ts +2 -2
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +5 -1
- package/lib/config.js.map +1 -1
- package/lib/error.d.ts +4 -2
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +1 -1
- package/lib/error.js.map +1 -1
- package/lib/errorLogging.d.ts +3 -2
- package/lib/errorLogging.d.ts.map +1 -1
- package/lib/errorLogging.js.map +1 -1
- package/lib/eventEmitterWithErrorHandling.d.ts +1 -1
- package/lib/eventEmitterWithErrorHandling.d.ts.map +1 -1
- package/lib/eventEmitterWithErrorHandling.js.map +1 -1
- package/lib/events.d.ts +1 -1
- package/lib/events.d.ts.map +1 -1
- package/lib/events.js.map +1 -1
- package/lib/fluidErrorBase.d.ts.map +1 -1
- package/lib/fluidErrorBase.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +28 -0
- package/lib/logger.d.ts +2 -2
- package/lib/logger.d.ts.map +1 -1
- package/lib/logger.js +2 -2
- package/lib/logger.js.map +1 -1
- package/lib/mockLogger.d.ts +1 -1
- package/lib/mockLogger.d.ts.map +1 -1
- package/lib/mockLogger.js +2 -2
- package/lib/mockLogger.js.map +1 -1
- package/lib/public.d.ts +20 -0
- package/lib/sampledTelemetryHelper.d.ts +2 -2
- package/lib/sampledTelemetryHelper.d.ts.map +1 -1
- package/lib/sampledTelemetryHelper.js.map +1 -1
- package/lib/utils.d.ts +4 -0
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +4 -0
- package/lib/utils.js.map +1 -1
- package/package.json +27 -48
- package/src/config.ts +5 -3
- package/src/error.ts +4 -4
- package/src/errorLogging.ts +6 -8
- package/src/eventEmitterWithErrorHandling.ts +2 -1
- package/src/events.ts +2 -1
- package/src/fluidErrorBase.ts +1 -0
- package/src/index.ts +1 -0
- package/src/logger.ts +7 -6
- package/src/mockLogger.ts +4 -3
- package/src/sampledTelemetryHelper.ts +3 -2
- package/src/utils.ts +2 -0
- package/api-extractor-cjs.json +0 -8
- package/dist/telemetry-utils-alpha.d.ts +0 -282
- package/dist/telemetry-utils-beta.d.ts +0 -239
- package/dist/telemetry-utils-public.d.ts +0 -239
- package/dist/telemetry-utils-untrimmed.d.ts +0 -1077
- package/lib/telemetry-utils-alpha.d.ts +0 -282
- package/lib/telemetry-utils-beta.d.ts +0 -239
- package/lib/telemetry-utils-public.d.ts +0 -239
- package/lib/telemetry-utils-untrimmed.d.ts +0 -1077
- package/lib/test/EventEmitterWithErrorHandling.spec.js +0 -86
- package/lib/test/EventEmitterWithErrorHandling.spec.js.map +0 -1
- package/lib/test/childLogger.spec.js +0 -233
- package/lib/test/childLogger.spec.js.map +0 -1
- package/lib/test/config.spec.js +0 -229
- package/lib/test/config.spec.js.map +0 -1
- package/lib/test/error.spec.js +0 -161
- package/lib/test/error.spec.js.map +0 -1
- package/lib/test/errorLogging.spec.js +0 -801
- package/lib/test/errorLogging.spec.js.map +0 -1
- package/lib/test/errorTypeLoggingTest.spec.js +0 -107
- package/lib/test/errorTypeLoggingTest.spec.js.map +0 -1
- package/lib/test/mockLogger.spec.js +0 -164
- package/lib/test/mockLogger.spec.js.map +0 -1
- package/lib/test/multiSinkLogger.spec.js +0 -84
- package/lib/test/multiSinkLogger.spec.js.map +0 -1
- package/lib/test/performanceEvent.spec.js +0 -86
- package/lib/test/performanceEvent.spec.js.map +0 -1
- package/lib/test/sampledTelemetryHelper.spec.js +0 -169
- package/lib/test/sampledTelemetryHelper.spec.js.map +0 -1
- package/lib/test/telemetryLogger.spec.js +0 -357
- package/lib/test/telemetryLogger.spec.js.map +0 -1
- package/lib/test/thresholdCounter.spec.js +0 -51
- package/lib/test/thresholdCounter.spec.js.map +0 -1
- package/lib/test/types/validateTelemetryUtilsPrevious.generated.js +0 -132
- package/lib/test/types/validateTelemetryUtilsPrevious.generated.js.map +0 -1
- package/lib/test/utils.spec.js +0 -284
- package/lib/test/utils.spec.js.map +0 -1
- /package/{dist → lib}/tsdoc-metadata.json +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errorLogging.spec.js","sourceRoot":"","sources":["../../src/test/errorLogging.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable unicorn/consistent-function-scoping */\n/* eslint-disable unicorn/no-null */\n\nimport { strict as assert } from \"node:assert\";\nimport sinon from \"sinon\";\nimport { v4 as uuid } from \"uuid\";\nimport type {\n\tITelemetryBaseEvent,\n\tITelemetryBaseProperties,\n} from \"@fluidframework/core-interfaces\";\nimport { TelemetryDataTag, TelemetryLogger, TaggedLoggerAdapter } from \"../logger.js\";\nimport {\n\tLoggingError,\n\tisTaggedTelemetryPropertyValue,\n\tnormalizeError,\n\tIFluidErrorAnnotations,\n\twrapError,\n\twrapErrorAndLog,\n\textractLogSafeErrorProperties,\n\tisExternalError,\n} from \"../errorLogging.js\";\nimport {\n\thasErrorInstanceId,\n\tIFluidErrorBase,\n\tisFluidError,\n\tisValidLegacyError,\n} from \"../fluidErrorBase.js\";\nimport { MockLogger } from \"../mockLogger.js\";\nimport type { ITelemetryPropertiesExt } from \"../telemetryTypes.js\";\n\ndescribe(\"Error Logging\", () => {\n\tdescribe(\"TelemetryLogger.prepareErrorObject\", () => {\n\t\tfunction freshEvent(): ITelemetryBaseEvent {\n\t\t\treturn { category: \"cat1\", eventName: \"event1\" };\n\t\t}\n\t\tfunction createILoggingError(props: ITelemetryBaseProperties): {\n\t\t\tgetTelemetryProperties: () => ITelemetryBaseProperties;\n\t\t} {\n\t\t\treturn { ...props, getTelemetryProperties: (): ITelemetryBaseProperties => props };\n\t\t}\n\n\t\tit(\"non-object error added to event\", () => {\n\t\t\tlet event = freshEvent();\n\t\t\tTelemetryLogger.prepareErrorObject(event, \"hello\", false);\n\t\t\tassert.strictEqual(event.error, \"hello\", \"string should work\");\n\t\t\tevent = freshEvent();\n\t\t\tTelemetryLogger.prepareErrorObject(event, 42, false);\n\t\t\tassert.strictEqual(event.error, \"42\", \"number should work\");\n\t\t\tevent = freshEvent();\n\t\t\tTelemetryLogger.prepareErrorObject(event, true, false);\n\t\t\tassert.strictEqual(event.error, \"true\", \"boolean should work\");\n\t\t\tevent = freshEvent();\n\t\t\tTelemetryLogger.prepareErrorObject(event, undefined, false);\n\t\t\tassert.strictEqual(event.error, \"undefined\", \"undefined should work\");\n\n\t\t\t// Technically this violates TelemetryBaseEventPropertyType's type constraint but it's actually supported\n\t\t\tevent = freshEvent();\n\t\t\tTelemetryLogger.prepareErrorObject(event, null, false);\n\t\t\tassert.strictEqual(event.error, \"null\", \"null should work\");\n\t\t});\n\t\tit(\"stack and message added to event (stack should exclude message)\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = new Error(\"boom\");\n\t\t\terror.name = \"MyErrorName\";\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert(event.error === \"boom\");\n\t\t\tassert((event.stack as string).includes(\"MyErrorName\"));\n\t\t\tassert(!(event.stack as string).includes(\"boom\"));\n\t\t});\n\t\tit(\"containsPII (legacy) is ignored\", () => {\n\t\t\t// Previously, setting containsPII = true on an error obj would (attempt to) redact its message\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = new Error(\"boom\");\n\t\t\terror.name = \"MyErrorName\";\n\t\t\t(error as any).containsPII = true;\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert(event.error === \"boom\");\n\t\t\tassert((event.stack as string).includes(\"MyErrorName\"));\n\t\t});\n\t\tit(\"getTelemetryProperties - tags on overwritten Error base props\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = createILoggingError({\n\t\t\t\tmessage: { value: \"Mark Fields\", tag: \"UserData\" }, // hopefully no one does this!\n\t\t\t\tstack: { value: \"tagged\", tag: TelemetryDataTag.CodeArtifact },\n\t\t\t});\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert.deepStrictEqual(event.message, { value: \"Mark Fields\", tag: \"UserData\" });\n\t\t\tassert.deepStrictEqual(event.error, \"[object Object]\"); // weird but ok\n\t\t\tassert.deepStrictEqual(event.stack, {\n\t\t\t\tvalue: \"tagged\",\n\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t});\n\t\t});\n\t\tit(\"getTelemetryProperties absent - no further props added\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = { ...new Error(\"boom\"), foo: \"foo\", bar: 2 };\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert(event.foo === undefined && event.bar === undefined);\n\t\t});\n\t\tit(\"getTelemetryProperties overlaps event - do not overwrite\", () => {\n\t\t\tconst event = { ...freshEvent(), foo: \"event_foo\", bar: 42 };\n\t\t\tconst error = createILoggingError({ foo: \"error_foo\", bar: -1 });\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert(event.foo === \"event_foo\" && event.bar === 42);\n\t\t});\n\t\tit(\"getTelemetryProperties present - add additional props\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = createILoggingError({ foo: \"foo\", bar: 2 });\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert(event.foo === \"foo\" && event.bar === 2);\n\t\t});\n\t\tit(\"fetchStack false - Don't add a stack if missing\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = { message: \"I have no stack\" };\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert.strictEqual(event.stack, undefined);\n\t\t});\n\t\tit(\"fetchStack true - Don't add a stack if present\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = new Error(\"boom\");\n\t\t\terror.name = \"MyName\";\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, false);\n\t\t\tassert((event.stack as string).includes(\"MyName\"));\n\t\t});\n\t\tit(\"fetchStack true - Add a stack if missing\", () => {\n\t\t\tconst event = freshEvent();\n\t\t\tconst error = { message: \"I have no stack - boom\", name: \"MyName\" };\n\t\t\tTelemetryLogger.prepareErrorObject(event, error, true);\n\t\t\tassert.strictEqual(typeof event.stack, \"string\");\n\t\t\tassert(!(event.stack as string).includes(\"MyName\"));\n\t\t});\n\t});\n\tdescribe(\"TaggedLoggerAdapter\", () => {\n\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\tclass TestTelemetryLogger extends TelemetryLogger {\n\t\t\tpublic events: ITelemetryBaseEvent[] = [];\n\t\t\tpublic send(event: ITelemetryBaseEvent): void {\n\t\t\t\tevents.push(this.prepareEvent(event));\n\t\t\t}\n\t\t}\n\t\tconst adaptedLogger = new TaggedLoggerAdapter(new TestTelemetryLogger(\"namespace\"));\n\n\t\tit(\"TaggedLoggerAdapter - tagged UserData is removed\", () => {\n\t\t\tconst event = {\n\t\t\t\tcategory: \"cat\",\n\t\t\t\teventName: \"event\",\n\t\t\t\tuserDataObject: {\n\t\t\t\t\ttag: TelemetryDataTag.UserData,\n\t\t\t\t\tvalue: \"someUserData\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tadaptedLogger.send(event);\n\t\t\tassert.strictEqual(\n\t\t\t\tevents[0].userDataObject,\n\t\t\t\t\"REDACTED (UserData)\",\n\t\t\t\t\"someUserData should be redacted\",\n\t\t\t);\n\t\t\tevents.pop();\n\t\t});\n\t\tit(\"TaggedLoggerAdapter - tagged CodeArtifact are preserved\", () => {\n\t\t\tconst event = {\n\t\t\t\tcategory: \"cat\",\n\t\t\t\teventName: \"event\",\n\t\t\t\tpackageDataObject: {\n\t\t\t\t\ttag: TelemetryDataTag.CodeArtifact,\n\t\t\t\t\tvalue: \"somePackageData\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tadaptedLogger.send(event);\n\t\t\tassert.strictEqual(\n\t\t\t\tevents[0].packageDataObject,\n\t\t\t\t\"somePackageData\",\n\t\t\t\t\"somePackageData should be preserved\",\n\t\t\t);\n\t\t\tevents.pop();\n\t\t});\n\t\tit(\"TaggedLoggerAdapter - tagged [unrecognized tag] are removed\", () => {\n\t\t\tconst event = {\n\t\t\t\tcategory: \"cat\",\n\t\t\t\teventName: \"event\",\n\t\t\t\tunknownTaggedObject: {\n\t\t\t\t\ttag: \"someUnknownTag\",\n\t\t\t\t\tvalue: \"someEvilData\",\n\t\t\t\t},\n\t\t\t};\n\t\t\tadaptedLogger.send(event);\n\t\t\tassert.strictEqual(\n\t\t\t\tevents[0].unknownTaggedObject,\n\t\t\t\t\"REDACTED (unknown tag)\",\n\t\t\t\t\"someUnknownTag should be redacted\",\n\t\t\t);\n\t\t\tevents.pop();\n\t\t});\n\t});\n\tdescribe(\"TaggedTelemetryData\", () => {\n\t\tit(\"Ensure backwards compatibility\", () => {\n\t\t\t// The values of the enum should never change (even if the keys are renamed)\n\t\t\tassert(TelemetryDataTag.CodeArtifact === (\"CodeArtifact\" as TelemetryDataTag));\n\t\t\tassert(TelemetryDataTag.UserData === (\"UserData\" as TelemetryDataTag));\n\t\t});\n\t});\n\tdescribe(\"isTaggedTelemetryPropertyValue\", () => {\n\t\tit(\"non-object input not ok\", () => {\n\t\t\tassert.strictEqual(isTaggedTelemetryPropertyValue(\"hello\"), false);\n\t\t\tassert.strictEqual(isTaggedTelemetryPropertyValue(123), false);\n\t\t\tassert.strictEqual(isTaggedTelemetryPropertyValue(false), false);\n\t\t\tassert.strictEqual(isTaggedTelemetryPropertyValue(undefined), false);\n\t\t\tassert.strictEqual(isTaggedTelemetryPropertyValue(null as any), false);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue(function x() {\n\t\t\t\t\treturn 54;\n\t\t\t\t} as any),\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tassert.strictEqual(isTaggedTelemetryPropertyValue(Symbol(\"okay\") as any), false);\n\t\t});\n\t\tit(\"non-object value ok\", () => {\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: \"hello\", tag: \"any string\" }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: 123, tag: \"any string\" }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: false, tag: \"any string\" }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: undefined, tag: \"any string\" }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t});\n\t\tit(\"Check result for various invalid inputs (per typings)\", () => {\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ tag: \"any string\" } as any),\n\t\t\t\ttrue,\n\t\t\t\t\"value prop may be absent\",\n\t\t\t);\n\t\t\t// The type guard used is a bit imprecise. Here is proof (these \"shouldn't\" be ok)\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({\n\t\t\t\t\tvalue: function x() {\n\t\t\t\t\t\treturn 54;\n\t\t\t\t\t} as any,\n\t\t\t\t\ttag: \"any string\",\n\t\t\t\t}),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: Symbol(\"okay\") as any, tag: \"any string\" }),\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: \"hello\", tag: 1 } as any),\n\t\t\t\tfalse,\n\t\t\t\t\"number tag is bad\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: \"hello\", tag: false } as any),\n\t\t\t\tfalse,\n\t\t\t\t\"boolean tag is bad\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: \"hello\", tag: {} } as any),\n\t\t\t\tfalse,\n\t\t\t\t\"object tag is bad\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: \"hello\", tag: null } as any),\n\t\t\t\tfalse,\n\t\t\t\t\"null tag is bad\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tisTaggedTelemetryPropertyValue({ value: \"hello\" } as any),\n\t\t\t\tfalse,\n\t\t\t\t\"undefined (missing) tag is bad\",\n\t\t\t);\n\t\t});\n\t});\n\tdescribe(\"LoggingError\", () => {\n\t\tit(\"ctor props are assigned to the object\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", {\n\t\t\t\tp1: 1,\n\t\t\t\tp2: \"two\",\n\t\t\t\tp3: true,\n\t\t\t\ttagged: { value: 4, tag: \"CodeArtifact\" },\n\t\t\t});\n\t\t\tconst errorAsAny = loggingError as any;\n\t\t\tassert.strictEqual(errorAsAny.message, \"myMessage\");\n\t\t\tassert.strictEqual(errorAsAny.p1, 1);\n\t\t\tassert.strictEqual(errorAsAny.p2, \"two\");\n\t\t\tassert.strictEqual(errorAsAny.p3, true);\n\t\t\tassert.deepStrictEqual(errorAsAny.tagged, { value: 4, tag: \"CodeArtifact\" });\n\t\t});\n\t\tit(\"errorInstanceId unique each time\", () => {\n\t\t\tconst e1 = new LoggingError(\"1\");\n\t\t\tconst e2 = new LoggingError(\"2\");\n\t\t\tassert.equal(e1.errorInstanceId.length, 36, \"should be guid-length\");\n\t\t\tassert.equal(e2.errorInstanceId.length, 36, \"should be guid-length\");\n\t\t\tassert.notEqual(\n\t\t\t\te1.errorInstanceId,\n\t\t\t\te2.errorInstanceId,\n\t\t\t\t\"each error instance should get unique id\",\n\t\t\t);\n\t\t});\n\t\tit(\"getTelemetryProperties extracts all untagged ctor props\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", { p1: 1, p2: \"two\", p3: true });\n\t\t\tconst props = loggingError.getTelemetryProperties();\n\t\t\tassert.strictEqual(props.message, \"myMessage\");\n\t\t\tassert.strictEqual(typeof props.stack, \"string\");\n\t\t\tassert.strictEqual(props.name, undefined); // Error.name is not logged\n\t\t\tassert.strictEqual(props.p1, 1);\n\t\t\tassert.strictEqual(props.p2, \"two\");\n\t\t\tassert.strictEqual(props.p3, true);\n\t\t});\n\t\tit(\"getTelemetryProperties respects omitPropsFromLogging\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", {}, new Set([\"foo\"]));\n\t\t\t(loggingError as any).foo = \"secrets!\";\n\t\t\t(loggingError as any).bar = \"normal\";\n\t\t\tconst props = loggingError.getTelemetryProperties();\n\t\t\tassert.strictEqual(\n\t\t\t\tprops.omitPropsFromLogging,\n\t\t\t\tundefined,\n\t\t\t\t\"omitPropsFromLogging itself should be omitted\",\n\t\t\t);\n\t\t\tassert.strictEqual(props.foo, undefined, \"foo should have been omitted\");\n\t\t\tassert.strictEqual(props.bar, \"normal\", \"bar should not be omitted\");\n\t\t});\n\t\tit(\"addTelemetryProperties - adds to object, returned from getTelemetryProperties, doesn't overwrite\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", { p1: 1, p2: \"two\", p3: true });\n\t\t\t(loggingError as any).p1 = \"should not be overwritten\";\n\t\t\tloggingError.addTelemetryProperties({\n\t\t\t\tp1: \"ignored\",\n\t\t\t\tp4: 4,\n\t\t\t\tp5: true,\n\t\t\t\tp6: { value: 5, tag: \"CodeArtifact\" },\n\t\t\t\tp7: [\"a\", \"b\", \"c\"],\n\t\t\t\tp8: [1, 2, 3],\n\t\t\t\tp9: [true, true, false],\n\t\t\t\tp10: { one: \"1\" },\n\t\t\t\tp11: undefined,\n\t\t\t\tp12: { value: [\"1\", 2, true], tag: \"CodeArtifact\" },\n\t\t\t});\n\t\t\tconst props = loggingError.getTelemetryProperties();\n\t\t\tassert.strictEqual(props.p1, \"should not be overwritten\");\n\t\t\tassert.strictEqual(props.p4, 4);\n\t\t\tassert.strictEqual(props.p5, true);\n\t\t\tassert.deepStrictEqual(props.p6, { value: 5, tag: \"CodeArtifact\" });\n\t\t\tassert.strictEqual(props.p7, '[\"a\",\"b\",\"c\"]');\n\t\t\tassert.strictEqual(props.p8, \"[1,2,3]\");\n\t\t\tassert.strictEqual(props.p9, \"[true,true,false]\");\n\t\t\tassert.strictEqual(props.p10, `{\"one\":\"1\"}`);\n\t\t\tassert.strictEqual(props.p11, undefined);\n\t\t\tassert.deepStrictEqual(props.p12, { value: `[\"1\",2,true]`, tag: \"CodeArtifact\" });\n\t\t\tconst errorAsAny = loggingError as any;\n\t\t\tassert.strictEqual(errorAsAny.p1, \"should not be overwritten\");\n\t\t\tassert.strictEqual(errorAsAny.p4, 4);\n\t\t\tassert.strictEqual(errorAsAny.p5, true);\n\t\t\tassert.deepStrictEqual(errorAsAny.p6, { value: 5, tag: \"CodeArtifact\" });\n\t\t\tassert.deepStrictEqual(errorAsAny.p7, [\"a\", \"b\", \"c\"]);\n\t\t\tassert.deepStrictEqual(errorAsAny.p8, [1, 2, 3]);\n\t\t\tassert.deepStrictEqual(errorAsAny.p9, [true, true, false]);\n\t\t\tassert.deepStrictEqual(errorAsAny.p10, { one: \"1\" });\n\t\t\tassert.strictEqual(errorAsAny.p11, undefined);\n\t\t\tassert.deepStrictEqual(errorAsAny.p12, { value: [\"1\", 2, true], tag: \"CodeArtifact\" });\n\t\t});\n\t\tit(\"Set valid props via 'as any' - returned from getTelemetryProperties, overwrites\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", { p1: 1, p2: \"two\", p3: true });\n\t\t\tloggingError.addTelemetryProperties({ p1: \"should be overwritten\" });\n\t\t\tconst errorAsAny = loggingError as any;\n\t\t\t// Things that could be set with addTelemetryProperties\n\t\t\terrorAsAny.p1 = \"one\";\n\t\t\terrorAsAny.p4 = 4;\n\t\t\terrorAsAny.p5 = true;\n\t\t\terrorAsAny.p6 = { value: 5, tag: \"CodeArtifact\" };\n\t\t\terrorAsAny.userData6 = { value: 5, tag: \"UserData\" };\n\t\t\terrorAsAny.p7 = [\"a\", \"b\", \"c\"];\n\t\t\terrorAsAny.p8 = [1, 2, 3];\n\t\t\terrorAsAny.p9 = [true, true, false];\n\t\t\terrorAsAny.p10 = { one: \"1\" };\n\t\t\terrorAsAny.p11 = undefined;\n\t\t\terrorAsAny.p12 = { value: [\"1\", 2, true], tag: \"CodeArtifact\" };\n\t\t\t// Things that can't be set with addTelemetryProperties\n\t\t\terrorAsAny.p13 = null; // Null\n\t\t\terrorAsAny.p14 = [\"a\", \"b\", \"c\", null]; // Array with nulls\n\t\t\terrorAsAny.p15 = [[1, 2]]; // Nested array\n\t\t\tconst props = loggingError.getTelemetryProperties();\n\t\t\tassert.strictEqual(props.p1, \"one\");\n\t\t\tassert.strictEqual(props.p4, 4);\n\t\t\tassert.strictEqual(props.p5, true);\n\t\t\tassert.deepStrictEqual(props.p6, { value: 5, tag: \"CodeArtifact\" });\n\t\t\tassert.deepStrictEqual(props.userData6, { value: 5, tag: \"UserData\" });\n\t\t\tassert.strictEqual(props.p7, `[\"a\",\"b\",\"c\"]`);\n\t\t\tassert.strictEqual(props.p8, `[1,2,3]`);\n\t\t\tassert.strictEqual(props.p9, `[true,true,false]`);\n\t\t\tassert.strictEqual(props.p10, `{\"one\":\"1\"}`);\n\t\t\tassert.strictEqual(props.p11, undefined);\n\t\t\tassert.deepStrictEqual(props.p12, { value: `[\"1\",2,true]`, tag: \"CodeArtifact\" });\n\t\t\tassert.strictEqual(props.p13, \"null\");\n\t\t\tassert.strictEqual(props.p14, `[\"a\",\"b\",\"c\",null]`);\n\t\t\tassert.strictEqual(props.p15, \"[[1,2]]\");\n\t\t});\n\t\tit(\"addTelemetryProperties - Does not overwrite base class Error fields (untagged)\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\");\n\t\t\tconst propsWillBeIgnored = { message: \"surprise1\", stack: \"surprise2\" };\n\t\t\tloggingError.addTelemetryProperties(propsWillBeIgnored);\n\t\t\tconst props = loggingError.getTelemetryProperties();\n\t\t\tdelete props.fluidErrorCode; // It's on there for back compat, not trying to test it here\n\t\t\tconst { message, stack, errorInstanceId } = loggingError;\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tprops,\n\t\t\t\t{ message, stack, errorInstanceId },\n\t\t\t\t\"addTelemetryProperties should not overwrite existing props\",\n\t\t\t);\n\t\t});\n\t\tit(\"addTelemetryProperties - Does not overwrite base class Error fields (tagged)\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\");\n\t\t\tconst propsWillBeIgnored = {\n\t\t\t\tmessage: { value: \"Mark Fields\", tag: \"UserData\" },\n\t\t\t\tstack: { value: \"surprise2\", tag: \"CodeArtifact\" },\n\t\t\t};\n\t\t\tloggingError.addTelemetryProperties(propsWillBeIgnored);\n\t\t\tconst props = loggingError.getTelemetryProperties();\n\t\t\tdelete props.fluidErrorCode; // It's on there for back compat, not trying to test it here\n\t\t\tconst { message, stack, errorInstanceId } = loggingError;\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tprops,\n\t\t\t\t{ message, stack, errorInstanceId },\n\t\t\t\t\"addTelemetryProperties should not overwrite existing props\",\n\t\t\t);\n\t\t});\n\t\tit(\"addTelemetryProperties - Does not overwrite existing telemetry props\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", { p1: 1 });\n\t\t\tloggingError.addTelemetryProperties({ p1: \"one\" });\n\t\t\tassert(loggingError.getTelemetryProperties().p1 === 1);\n\t\t\tloggingError.addTelemetryProperties({ p1: \"uno\" });\n\t\t\tassert(loggingError.getTelemetryProperties().p1 === 1);\n\t\t});\n\t\tit(\"typeCheck - Correctly type checks an instace of LoggingError\", () => {\n\t\t\tconst loggingError = new LoggingError(\"myMessage\", { p1: 1 });\n\t\t\tconst normalizedLoggingError = normalizeError(loggingError);\n\t\t\tconst basicError = new Error(\"basicErrorMessage\");\n\t\t\tassert.strictEqual(\n\t\t\t\tLoggingError.typeCheck(loggingError),\n\t\t\t\ttrue,\n\t\t\t\t\"LoggingError is a LoggingError\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tLoggingError.typeCheck(normalizedLoggingError),\n\t\t\t\ttrue,\n\t\t\t\t\"Normalized Error is a LoggingError\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tLoggingError.typeCheck(basicError),\n\t\t\t\tfalse,\n\t\t\t\t\"Error is not a LoggingError\",\n\t\t\t);\n\t\t});\n\t});\n\tdescribe(\"extractLogSafeErrorProperties\", () => {\n\t\tfunction createSampleError(): Error {\n\t\t\ttry {\n\t\t\t\tconst error = new Error(\"asdf\");\n\t\t\t\terror.name = \"FooError\";\n\t\t\t\tthrow error;\n\t\t\t} catch (error) {\n\t\t\t\treturn error as Error;\n\t\t\t}\n\t\t}\n\n\t\tit(\"non-object error yields correct message\", () => {\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(\"hello\", false /* sanitizeStack */).message,\n\t\t\t\t\"hello\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(42, false /* sanitizeStack */).message,\n\t\t\t\t\"42\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(true, false /* sanitizeStack */).message,\n\t\t\t\t\"true\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(undefined, false /* sanitizeStack */).message,\n\t\t\t\t\"undefined\",\n\t\t\t);\n\t\t});\n\t\tit(\"object error yields correct message\", () => {\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ message: \"hello\" }, false /* sanitizeStack */)\n\t\t\t\t\t.message,\n\t\t\t\t\"hello\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ message: 42 }, false /* sanitizeStack */).message,\n\t\t\t\t\"[object Object]\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ foo: 42 }, false /* sanitizeStack */).message,\n\t\t\t\t\"[object Object]\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties([1, 2, 3], false /* sanitizeStack */).message,\n\t\t\t\t\"1,2,3\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(null, false /* sanitizeStack */).message,\n\t\t\t\t\"null\",\n\t\t\t);\n\t\t});\n\t\tit(\"extract errorType\", () => {\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ errorType: \"hello\" }, false /* sanitizeStack */)\n\t\t\t\t\t.errorType,\n\t\t\t\t\"hello\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ foo: \"hello\" }, false /* sanitizeStack */)\n\t\t\t\t\t.errorType,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ errorType: 42 }, false /* sanitizeStack */)\n\t\t\t\t\t.errorType,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(42, false /* sanitizeStack */).errorType,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t});\n\t\tit(\"extract stack\", () => {\n\t\t\tconst e1 = createSampleError();\n\n\t\t\tconst stack = extractLogSafeErrorProperties(e1, false /* sanitizeStack */).stack;\n\t\t\tassert(typeof stack === \"string\");\n\t\t\tassert(stack?.includes(\"asdf\"), \"stack is expected to contain the message\");\n\t\t\tassert(stack?.includes(\"FooError\"), \"stack is expected to contain the name\");\n\n\t\t\tconst sanitizedStack = extractLogSafeErrorProperties(\n\t\t\t\te1,\n\t\t\t\ttrue /* sanitizeStack */,\n\t\t\t).stack;\n\t\t\tassert(typeof sanitizedStack === \"string\");\n\t\t\tassert(\n\t\t\t\t!sanitizedStack?.includes(\"asdf\"),\n\t\t\t\t\"message should have been removed from sanitized stack\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tsanitizedStack?.includes(\"FooError\"),\n\t\t\t\t\"name should still be in the sanitized stack\",\n\t\t\t);\n\t\t});\n\t\tit(\"extract stack non-standard values\", () => {\n\t\t\t// sanitizeStack true\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ stack: \"hello\" }, true /* sanitizeStack */).stack,\n\t\t\t\t\"\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(\n\t\t\t\t\t{ stack: \"hello\", name: \"name\" },\n\t\t\t\t\ttrue /* sanitizeStack */,\n\t\t\t\t).stack,\n\t\t\t\t\"name\",\n\t\t\t);\n\t\t\t// sanitizeStack false\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ stack: \"hello\" }, false /* sanitizeStack */).stack,\n\t\t\t\t\"hello\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(\n\t\t\t\t\t{ stack: \"hello\", name: \"name\" },\n\t\t\t\t\tfalse /* sanitizeStack */,\n\t\t\t\t).stack,\n\t\t\t\t\"hello\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ foo: \"hello\" }, false /* sanitizeStack */).stack,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties({ stack: 42 }, false /* sanitizeStack */).stack,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\textractLogSafeErrorProperties(42, false /* sanitizeStack */).stack,\n\t\t\t\tundefined,\n\t\t\t);\n\t\t});\n\t});\n\tdescribe(\"normalizeError\", () => {\n\t\tdescribe(\"preserves properties\", () => {\n\t\t\tit(\"missing properties are not set\", () => {\n\t\t\t\t// eslint-disable-next-line unicorn/error-message\n\t\t\t\tconst unknownError = new Error();\n\n\t\t\t\tconst newError: IFluidErrorBase & {\n\t\t\t\t\tcanRetry?: boolean;\n\t\t\t\t\tretryAfterSeconds?: number;\n\t\t\t\t} = normalizeError(unknownError);\n\n\t\t\t\tassert.strictEqual(newError.canRetry, undefined, \"canRetry not undefined\");\n\t\t\t\tassert.strictEqual(\n\t\t\t\t\tnewError.retryAfterSeconds,\n\t\t\t\t\tundefined,\n\t\t\t\t\t\"retryAfterSeconds not undefined\",\n\t\t\t\t);\n\t\t\t});\n\t\t\tit(\"existing retry properties are present in normalized error\", () => {\n\t\t\t\tconst unknownError: { canRetry?: boolean; retryAfterSeconds?: number } & Error =\n\t\t\t\t\t// eslint-disable-next-line unicorn/error-message\n\t\t\t\t\tnew Error();\n\t\t\t\tunknownError.canRetry = true;\n\t\t\t\tunknownError.retryAfterSeconds = 100;\n\n\t\t\t\tconst newError: IFluidErrorBase & {\n\t\t\t\t\tcanRetry?: boolean;\n\t\t\t\t\tretryAfterSeconds?: number;\n\t\t\t\t} = normalizeError(unknownError);\n\n\t\t\t\tassert.strictEqual(newError.canRetry, true, \"canRetry not true\");\n\t\t\t\tassert.strictEqual(newError.retryAfterSeconds, 100, \"retryAfterSeconds not 100\");\n\t\t\t});\n\t\t});\n\t});\n});\n\nclass TestFluidError implements IFluidErrorBase {\n\treadonly atpStub: sinon.SinonStub;\n\treadonly gtpSpy: sinon.SinonSpy;\n\texpectedTelemetryProps: ITelemetryBaseProperties;\n\n\treadonly errorType: string;\n\treadonly message: string;\n\treadonly stack?: string;\n\treadonly name: string = \"Error\";\n\treadonly errorInstanceId: string;\n\n\tconstructor(\n\t\terrorProps: Omit<\n\t\t\tIFluidErrorBase,\n\t\t\t\"getTelemetryProperties\" | \"addTelemetryProperties\" | \"errorInstanceId\" | \"name\"\n\t\t>,\n\t) {\n\t\tthis.errorType = errorProps.errorType;\n\t\tthis.message = errorProps.message;\n\t\tthis.stack = errorProps.stack;\n\t\tthis.errorInstanceId = uuid();\n\n\t\tthis.atpStub = sinon.stub(this, \"addTelemetryProperties\");\n\t\tthis.gtpSpy = sinon.spy(this, \"getTelemetryProperties\");\n\t\tthis.expectedTelemetryProps = { ...errorProps };\n\t}\n\n\tgetTelemetryProperties(): ITelemetryBaseProperties {\n\t\t// Don't actually return any props. We'll use the spy to ensure it was called\n\t\treturn {};\n\t}\n\n\taddTelemetryProperties(props: ITelemetryPropertiesExt): void {\n\t\tthrow new Error(\"Not Implemented - Expected to be Stubbed via Sinon\");\n\t}\n\n\twithoutProperty(propName: keyof IFluidErrorBase): this {\n\t\tconst objectWithoutProp = {};\n\t\tobjectWithoutProp[propName] = undefined;\n\t\tObject.assign(this, objectWithoutProp);\n\t\treturn this;\n\t}\n\n\twithExpectedTelemetryProps(props: ITelemetryBaseProperties): this {\n\t\tObject.assign(this.expectedTelemetryProps, props);\n\t\treturn this;\n\t}\n}\n\nconst annotationCases: Record<string, IFluidErrorAnnotations> = {\n\tnoAnnotations: {},\n\tjustProps: { props: { foo: \"bar\", one: 1, u: undefined, t: true } },\n};\n\ndescribe(\"normalizeError\", () => {\n\tdescribe(\"Valid Errors (Legacy and Current)\", () => {\n\t\tfor (const annotationCase of Object.keys(annotationCases)) {\n\t\t\tconst annotations = annotationCases[annotationCase];\n\t\t\tit(`Valid legacy error - Patch and return (annotations: ${annotationCase})`, () => {\n\t\t\t\t// Arrange\n\t\t\t\tconst errorProps = { errorType: \"et1\", message: \"m1\" };\n\t\t\t\tconst legacyError = new TestFluidError(errorProps).withoutProperty(\n\t\t\t\t\t\"errorInstanceId\",\n\t\t\t\t);\n\n\t\t\t\t// Act\n\t\t\t\tconst normalizedError = normalizeError(legacyError, annotations);\n\n\t\t\t\t// Assert\n\t\t\t\tassert.equal(\n\t\t\t\t\tnormalizedError,\n\t\t\t\t\tlegacyError,\n\t\t\t\t\t\"normalize should yield the same error as passed in\",\n\t\t\t\t);\n\t\t\t\tassert.equal(normalizedError.errorType, \"et1\", \"errorType should be unchanged\");\n\t\t\t\tassert.equal(normalizedError.message, \"m1\", \"message should be unchanged\");\n\t\t\t\tassert.equal(normalizedError.errorInstanceId.length, 36, \"should be guid-length\");\n\t\t\t\tif (annotations.props !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tlegacyError.atpStub.calledWith(annotations.props),\n\t\t\t\t\t\t\"addTelemetryProperties should have been called\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t\tit(`Valid Fluid Error - untouched (annotations: ${annotationCase})`, () => {\n\t\t\t\t// Arrange\n\t\t\t\tconst fluidError = new TestFluidError({ errorType: \"et1\", message: \"m1\" });\n\t\t\t\t// We don't expect legacyError to be modified itself at all\n\t\t\t\tObject.freeze(fluidError);\n\n\t\t\t\t// Act\n\t\t\t\tconst normalizedError = normalizeError(fluidError, annotations);\n\n\t\t\t\t// Assert\n\t\t\t\tassert(normalizedError === fluidError);\n\t\t\t\tif (annotations.props !== undefined) {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tfluidError.atpStub.calledWith(annotations.props),\n\t\t\t\t\t\t\"addTelemetryProperties should have been called\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tit(\"Valid Fluid Error - stack not added if missing\", () => {\n\t\t\t// Arrange\n\t\t\tconst fluidError = new TestFluidError({\n\t\t\t\terrorType: \"et1\",\n\t\t\t\tmessage: \"m1\",\n\t\t\t}).withoutProperty(\"stack\");\n\t\t\t// We don't expect legacyError to be modified itself at all\n\t\t\tObject.freeze(fluidError);\n\n\t\t\t// Act\n\t\t\tconst normalizedError = normalizeError(fluidError, {});\n\n\t\t\t// Assert\n\t\t\tassert(normalizedError === fluidError);\n\t\t\tassert(normalizedError.stack === undefined);\n\t\t});\n\t\tit(\"Frozen legacy error - Throws\", () => {\n\t\t\t// Arrange\n\t\t\tconst errorProps = { errorType: \"et1\", message: \"m1\" };\n\t\t\tconst legacyError = new TestFluidError(errorProps).withoutProperty(\"errorInstanceId\");\n\t\t\tObject.freeze(legacyError);\n\n\t\t\t// Act/Assert\n\t\t\tassert.throws(\n\t\t\t\t() => normalizeError(legacyError, {}),\n\t\t\t\t/Cannot assign to read only property/,\n\t\t\t);\n\t\t});\n\t});\n\tdescribe(\"Errors Needing Normalization\", () => {\n\t\tclass NamedError extends Error {\n\t\t\tname = \"CoolErrorName\";\n\t\t}\n\t\tconst sampleFluidError = (): TestFluidError =>\n\t\t\tnew TestFluidError({\n\t\t\t\terrorType: \"someType\",\n\t\t\t\tmessage: \"Hello\",\n\t\t\t\tstack: \"cool stack trace\",\n\t\t\t});\n\t\tconst typicalOutput = (\n\t\t\tmessage: string,\n\t\t\tstackHint: \"<<natural stack>>\" | \"<<stack from input>>\",\n\t\t): TestFluidError =>\n\t\t\tnew TestFluidError({\n\t\t\t\terrorType: \"genericError\",\n\t\t\t\tmessage,\n\t\t\t\tstack: stackHint,\n\t\t\t});\n\t\tconst testCases: { [label: string]: () => { input: any; expectedOutput: TestFluidError } } =\n\t\t\t{\n\t\t\t\t\"Fluid Error minus errorType\": () => ({\n\t\t\t\t\tinput: sampleFluidError().withoutProperty(\"errorType\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"Hello\", \"<<stack from input>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Fluid Error minus message\": () => ({\n\t\t\t\t\tinput: sampleFluidError().withoutProperty(\"message\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"[object Object]\", \"<<stack from input>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Fluid Error minus getTelemetryProperties\": () => ({\n\t\t\t\t\tinput: sampleFluidError().withoutProperty(\"getTelemetryProperties\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"Hello\", \"<<stack from input>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Fluid Error minus addTelemetryProperties\": () => ({\n\t\t\t\t\tinput: sampleFluidError().withoutProperty(\"addTelemetryProperties\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"Hello\", \"<<stack from input>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Fluid Error minus errorType (no stack)\": () => ({\n\t\t\t\t\tinput: sampleFluidError().withoutProperty(\"errorType\").withoutProperty(\"stack\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"Hello\", \"<<natural stack>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Fluid Error minus message (no stack)\": () => ({\n\t\t\t\t\tinput: sampleFluidError().withoutProperty(\"message\").withoutProperty(\"stack\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"[object Object]\", \"<<natural stack>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Error object\": () => ({\n\t\t\t\t\tinput: new NamedError(\"boom\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"boom\",\n\t\t\t\t\t\t\"<<stack from input>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"LoggingError\": () => ({\n\t\t\t\t\tinput: new LoggingError(\"boom\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\"boom\", \"<<stack from input>>\"),\n\t\t\t\t}),\n\t\t\t\t\"Empty object\": () => ({\n\t\t\t\t\tinput: {},\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"[object Object]\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"object with stack\": () => ({\n\t\t\t\t\tinput: { message: \"whatever\", stack: \"fake stack goes here\" },\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"whatever\",\n\t\t\t\t\t\t\"<<stack from input>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"object with non-string message and name\": () => ({\n\t\t\t\t\tinput: { message: 42, name: true },\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"[object Object]\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"nullValue\": () => ({\n\t\t\t\t\tinput: null,\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"null\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"undef\": () => ({\n\t\t\t\t\tinput: undefined,\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"undefined\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ typeofError: \"undefined\", untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"false\": () => ({\n\t\t\t\t\tinput: false,\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"false\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ typeofError: \"boolean\", untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"true\": () => ({\n\t\t\t\t\tinput: true,\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"true\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ typeofError: \"boolean\", untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"number\": () => ({\n\t\t\t\t\tinput: 3.14,\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"3.14\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ typeofError: \"number\", untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"symbol\": () => ({\n\t\t\t\t\tinput: Symbol(\"Unique\"),\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"Symbol(Unique)\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ typeofError: \"symbol\", untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"function\": () => ({\n\t\t\t\t\tinput: (): void => {},\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"() => { }\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ typeofError: \"function\", untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"emptyArray\": () => ({\n\t\t\t\t\tinput: [],\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t\t\"array\": () => ({\n\t\t\t\t\tinput: [1, 2, 3],\n\t\t\t\t\texpectedOutput: typicalOutput(\n\t\t\t\t\t\t\"1,2,3\",\n\t\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t).withExpectedTelemetryProps({ untrustedOrigin: 1 }),\n\t\t\t\t}),\n\t\t\t};\n\t\tfunction assertMatching(\n\t\t\tactual: IFluidErrorBase,\n\t\t\texpected: TestFluidError,\n\t\t\tannotations: IFluidErrorAnnotations = {},\n\t\t\tinputStack: string | undefined,\n\t\t): void {\n\t\t\texpected.withExpectedTelemetryProps({\n\t\t\t\t...annotations.props,\n\t\t\t\terrorInstanceId: actual.errorInstanceId,\n\t\t\t\tfluidErrorCode: \"-\", // Present for back-compat\n\t\t\t});\n\n\t\t\tassertMatchingMessageAndStack(actual, expected, inputStack);\n\n\t\t\tassert.equal(actual.errorType, expected.errorType, \"errorType should match\");\n\t\t\tassert.equal(actual.name, expected.name, \"name should match\");\n\t\t\tassert.equal(actual.errorInstanceId.length, 36, \"should be guid-length\");\n\t\t\tassert.deepStrictEqual(\n\t\t\t\tactual.getTelemetryProperties(),\n\t\t\t\texpected.expectedTelemetryProps,\n\t\t\t\t\"telemetry props should match\",\n\t\t\t);\n\t\t}\n\t\tfunction assertMatchingMessageAndStack(\n\t\t\tactual: IFluidErrorBase,\n\t\t\texpected: TestFluidError,\n\t\t\tinputStack: string | undefined,\n\t\t): void {\n\t\t\tassert.equal(actual.message, expected.message, \"message should match\");\n\t\t\tconst actualStack = actual.stack;\n\t\t\tassert(actualStack !== undefined, \"stack should be present as a string\");\n\t\t\tif (actualStack.includes(\"at normalizeError\")) {\n\t\t\t\t// This indicates the stack was populated naturally by new SimpleFluidError\n\t\t\t\tassert.equal(\n\t\t\t\t\texpected.stack,\n\t\t\t\t\t\"<<natural stack>>\",\n\t\t\t\t\t\"<<natural stack>> hint should be used if not overwritten\",\n\t\t\t\t);\n\t\t\t\texpected.withExpectedTelemetryProps({ stack: actualStack });\n\t\t\t} else {\n\t\t\t\tassert.equal(\n\t\t\t\t\tactualStack,\n\t\t\t\t\tinputStack,\n\t\t\t\t\t\"If stack wasn't generated, it should match input stack\",\n\t\t\t\t);\n\t\t\t\tassert.equal(\n\t\t\t\t\texpected.stack,\n\t\t\t\t\t\"<<stack from input>>\",\n\t\t\t\t\t\"<<stack from input>> hint should be used if using stack from input error object\",\n\t\t\t\t);\n\t\t\t\texpected.withExpectedTelemetryProps({ stack: inputStack });\n\t\t\t}\n\t\t}\n\t\tfor (const annotationCase of Object.keys(annotationCases)) {\n\t\t\tconst annotations = annotationCases[annotationCase];\n\t\t\tlet doneOnceForThisAnnotationCase = false;\n\t\t\tfor (const caseName of Object.keys(testCases)) {\n\t\t\t\tconst getTestCase = testCases[caseName];\n\t\t\t\tif (!doneOnceForThisAnnotationCase) {\n\t\t\t\t\tdoneOnceForThisAnnotationCase = true;\n\t\t\t\t\t// Each test case only differs by what stack/error are. Test the rest only once per annotation case.\n\t\t\t\t\tit(`Normalize untrusted error full validation: (${annotationCase})`, () => {\n\t\t\t\t\t\t// Arrange\n\t\t\t\t\t\tconst { input, expectedOutput } = getTestCase();\n\n\t\t\t\t\t\t// Act\n\t\t\t\t\t\tconst normalized = normalizeError(input, annotations);\n\n\t\t\t\t\t\t// Assert\n\t\t\t\t\t\tassert.notEqual(\n\t\t\t\t\t\t\tinput,\n\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\"input should have yielded a new error object\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tassertMatching(normalized, expectedOutput, annotations, input?.stack);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tinput instanceof TestFluidError &&\n\t\t\t\t\t\t\tinput.getTelemetryProperties !== undefined\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\t\tinput.gtpSpy.calledOnce,\n\t\t\t\t\t\t\t\t\"input.getTelemetryProperties should have been called by normalizeError\",\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Bonus\n\t\t\t\t\t\tnormalized.addTelemetryProperties({ foo: \"bar\" });\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tnormalized.getTelemetryProperties().foo,\n\t\t\t\t\t\t\t\"bar\",\n\t\t\t\t\t\t\t\"can add telemetry props after normalization\",\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tit(`Normalize untrusted error message/stack: ${caseName} (${annotationCase})`, () => {\n\t\t\t\t\t// Arrange\n\t\t\t\t\tconst { input, expectedOutput } = getTestCase();\n\n\t\t\t\t\t// Act\n\t\t\t\t\tconst normalized = normalizeError(input, annotations);\n\n\t\t\t\t\t// Assert\n\t\t\t\t\tassert.notEqual(\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\"input should have yielded a new error object\",\n\t\t\t\t\t);\n\t\t\t\t\tassertMatchingMessageAndStack(normalized, expectedOutput, input?.stack);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n});\n\n/**\n * Create an error missing errorType that will not be recognized as a valid Fluid error\n */\nconst createExternalError = (m: string): Error => new Error(m);\n\n/**\n * Create a simple valid Fluid error\n */\nconst createTestError = (\n\tm: string,\n): LoggingError & {\n\terrorType: string;\n} =>\n\tObject.assign(new LoggingError(m), {\n\t\terrorType: \"someErrorType\",\n\t});\n\ndescribe(\"wrapError\", () => {\n\tit(\"Copy message, stack, and props\", () => {\n\t\tconst innerError = new LoggingError(\"hello\", { someProp: 123 });\n\t\tinnerError.stack = \"extra special stack\";\n\t\tconst newError = wrapError(innerError, createTestError);\n\t\tassert.equal(newError.message, innerError.message, \"messages should match\");\n\t\tassert.equal(newError.stack, innerError.stack, \"stacks should match\");\n\t\tassert.equal(newError.getTelemetryProperties().someProp, 123, \"Props should be preserved\");\n\t});\n\tit(\"Include matching errorInstanceId and innerErrorInstanceId in telemetry props\", () => {\n\t\tconst innerError = new LoggingError(\"hello\");\n\t\tconst newError = wrapError(innerError, createTestError);\n\t\tassert(newError.errorInstanceId === innerError.errorInstanceId);\n\t\tassert(\n\t\t\tnewError.getTelemetryProperties().innerErrorInstanceId === innerError.errorInstanceId,\n\t\t);\n\t});\n\tit(\"Properly set untrustedOrigin\", () => {\n\t\tconst untrustedError = createExternalError(\"untrusted\");\n\n\t\tconst singleWrapped = wrapError(untrustedError, createTestError);\n\t\tassert(\n\t\t\tsingleWrapped.getTelemetryProperties().untrustedOrigin === 1,\n\t\t\t\"wrapped external error should be 'untrustedOrigin'\",\n\t\t);\n\n\t\tconst doubleWrapped = wrapError(singleWrapped, createTestError);\n\t\tassert(\n\t\t\tdoubleWrapped.getTelemetryProperties().untrustedOrigin === 1,\n\t\t\t\"doubly-wrapped external error should be 'untrustedOrigin'\",\n\t\t);\n\n\t\tconst normalizedError = normalizeError(untrustedError);\n\t\tconst wrappedNormalized = wrapError(normalizedError, createTestError);\n\t\tassert(\n\t\t\twrappedNormalized.getTelemetryProperties().untrustedOrigin === 1,\n\t\t\t\"normalized-then-wrapped external error should be 'untrustedOrigin'\",\n\t\t);\n\n\t\tconst trustedError = createTestError(\"trusted\");\n\t\tconst wrappedTrusted = wrapError(trustedError, createTestError);\n\t\tassert(\n\t\t\twrappedTrusted.getTelemetryProperties().untrustedOrigin === undefined,\n\t\t\t\"wrapped Fluid error should not be 'untrustedOrigin'\",\n\t\t);\n\t});\n});\ndescribe(\"wrapErrorAndLog\", () => {\n\tconst mockLogger = new MockLogger();\n\tconst innerError = new LoggingError(\"hello\");\n\tconst newError = wrapErrorAndLog(innerError, createTestError, mockLogger.toTelemetryLogger());\n\tassert(\n\t\tmockLogger.matchEvents([\n\t\t\t{\n\t\t\t\teventName: \"WrapError\",\n\t\t\t\twrappedByErrorInstanceId: newError.errorInstanceId,\n\t\t\t\terrorInstanceId: newError.errorInstanceId,\n\t\t\t\terror: \"hello\",\n\t\t\t},\n\t\t]),\n\t\t\"Expected the 'WrapError' event to be logged\",\n\t);\n});\n\ndescribe(\"Error Discovery\", () => {\n\tit(\"isExternalError\", () => {\n\t\tassert(isExternalError(\"some string\"));\n\t\tassert(isExternalError(createExternalError(\"error message\")));\n\t\tassert(isExternalError(normalizeError(\"normalize me but I'm still external\")));\n\t\tassert(\n\t\t\tisExternalError(\n\t\t\t\tnormalizeError(createExternalError(\"normalize me but I'm still external\")),\n\t\t\t),\n\t\t);\n\n\t\tassert(!isExternalError(createTestError(\"hello\")));\n\n\t\tconst wrappedError = wrapError(\"wrap me\", createTestError);\n\t\tassert(!isExternalError(wrappedError));\n\t\tassert(wrappedError.getTelemetryProperties().untrustedOrigin === 1); // But it should still say untrustedOrigin\n\t\tassert(!isExternalError(new LoggingError(\"testLoggingError\")));\n\t});\n\tit(\"isValidLegacyError\", () => {\n\t\tconst validLegacyError = {\n\t\t\tmessage: \"testMessage\",\n\t\t\terrorType: \"someErrorType\",\n\t\t\tgetTelemetryProperties: (): void => {},\n\t\t\taddTelemetryProperties: (): void => {},\n\t\t};\n\t\tassert.strictEqual(isValidLegacyError(validLegacyError), true);\n\t\tassert.strictEqual(isValidLegacyError({ ...validLegacyError, message: undefined }), false);\n\t\tassert.strictEqual(\n\t\t\tisValidLegacyError({ ...validLegacyError, errorType: undefined }),\n\t\t\tfalse,\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tisValidLegacyError({ ...validLegacyError, getTelemetryProperties: undefined }),\n\t\t\tfalse,\n\t\t);\n\t\tassert.strictEqual(\n\t\t\tisValidLegacyError({ ...validLegacyError, addTelemetryProperties: undefined }),\n\t\t\tfalse,\n\t\t);\n\t});\n\n\t// I copied the old version of isFluidError here, it depends on fluidErrorCode.\n\t// I want to make sure that an error built on LoggingError that otherwise matches isFluidError\n\t// will match isFluidError in old code (e.g. when an error flows across layers)\n\tfunction isFluidError_old(e: any): e is IFluidErrorBase {\n\t\tconst hasTelemetryPropFunctions = (x: any): boolean =>\n\t\t\ttypeof x?.getTelemetryProperties === \"function\" &&\n\t\t\ttypeof x?.addTelemetryProperties === \"function\";\n\t\treturn (\n\t\t\ttypeof e?.errorType === \"string\" &&\n\t\t\ttypeof e?.fluidErrorCode === \"string\" &&\n\t\t\ttypeof e?.message === \"string\" &&\n\t\t\thasErrorInstanceId(e) &&\n\t\t\thasTelemetryPropFunctions(e)\n\t\t);\n\t}\n\n\tfunction testFluidError(isFluidErrorImpl: (e: any) => boolean, isOld: boolean): void {\n\t\tit(`isFluidError${isOld ? \"_old\" : \"\"}`, () => {\n\t\t\tassert(\n\t\t\t\t!isFluidErrorImpl(new Error(\"hello\")),\n\t\t\t\t\"Plain Error object is not a Fluid Error\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!isFluidErrorImpl(new LoggingError(\"hello\")),\n\t\t\t\t\"LoggingError is not a Fluid Error (no errorType)\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!isFluidErrorImpl(\n\t\t\t\t\tObject.assign(new Error(\"hello\"), {\n\t\t\t\t\t\terrorType: \"someErrorType\",\n\t\t\t\t\t\t_errorInstanceId: \"12345\",\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\t\"Error with errorType and errorInstanceId but without telemetry prop fns is not a Fluid Error\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!isFluidErrorImpl(createExternalError(\"hello\")),\n\t\t\t\t\"Error without errorType is not a Fluid Error\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!isFluidErrorImpl(\n\t\t\t\t\tObject.assign(createTestError(\"hello\"), { _errorInstanceId: undefined }),\n\t\t\t\t),\n\t\t\t\t\"Valid Fluid Error with errorInstanceId removed is not a Fluid Error\",\n\t\t\t);\n\t\t\tassert(\n\t\t\t\tisFluidErrorImpl(createTestError(\"hello\")),\n\t\t\t\t\"Valid Fluid Error is a Fluid Error\",\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\t!isOld,\n\t\t\t\tisFluidErrorImpl(\n\t\t\t\t\tObject.assign(createTestError(\"hello\"), { fluidErrorCode: undefined }),\n\t\t\t\t),\n\t\t\t\t\"Old isFluidError impl should require fluidErrorCode but New should not\",\n\t\t\t);\n\t\t});\n\t}\n\ttestFluidError(isFluidError, false /* isOld */);\n\ttestFluidError(isFluidError_old, true /* isOld */);\n});\n"]}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "node:assert";
|
|
6
|
-
import { FluidErrorTypes } from "@fluidframework/core-interfaces";
|
|
7
|
-
import { GenericError, DataCorruptionError } from "../error.js";
|
|
8
|
-
import { MockLogger } from "../mockLogger.js";
|
|
9
|
-
import { createChildLogger } from "../logger.js";
|
|
10
|
-
describe("Check if the errorType field matches after sending/receiving via Container error classes", () => {
|
|
11
|
-
// In all tests below, the `stack` prop will be left out of validation because it is difficult to properly
|
|
12
|
-
// mock a stack for a mocked error.
|
|
13
|
-
let mockLogger;
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
mockLogger = new MockLogger();
|
|
16
|
-
});
|
|
17
|
-
describe("Send and receive GenericError instances", () => {
|
|
18
|
-
it("Send and receive a GenericError with no attached error.", () => {
|
|
19
|
-
const testError = new GenericError("genericError");
|
|
20
|
-
mockLogger.toTelemetryLogger().sendErrorEvent({ eventName: "A" }, testError);
|
|
21
|
-
assert(mockLogger.matchEvents([
|
|
22
|
-
{
|
|
23
|
-
eventName: "A",
|
|
24
|
-
category: "error",
|
|
25
|
-
message: "genericError",
|
|
26
|
-
errorType: FluidErrorTypes.genericError,
|
|
27
|
-
error: "genericError",
|
|
28
|
-
},
|
|
29
|
-
]));
|
|
30
|
-
});
|
|
31
|
-
// Dangling error objects of any type will be ignored (see constructor):
|
|
32
|
-
it("Send and receive a GenericError with a dangling error of any type.", () => {
|
|
33
|
-
const testError = new GenericError("genericError", "placeholder");
|
|
34
|
-
mockLogger.toTelemetryLogger().sendErrorEvent({ eventName: "A" }, testError);
|
|
35
|
-
assert(mockLogger.matchEvents([
|
|
36
|
-
{
|
|
37
|
-
eventName: "A",
|
|
38
|
-
category: "error",
|
|
39
|
-
message: "genericError",
|
|
40
|
-
errorType: FluidErrorTypes.genericError,
|
|
41
|
-
error: "genericError",
|
|
42
|
-
},
|
|
43
|
-
]));
|
|
44
|
-
});
|
|
45
|
-
it("Send and receive a GenericError with a dangling error of object type.", () => {
|
|
46
|
-
const testErrorObj = new Error("some error");
|
|
47
|
-
const testError = new GenericError("genericError", testErrorObj);
|
|
48
|
-
mockLogger.toTelemetryLogger().sendErrorEvent({ eventName: "A" }, testError);
|
|
49
|
-
assert(mockLogger.matchEvents([
|
|
50
|
-
{
|
|
51
|
-
eventName: "A",
|
|
52
|
-
category: "error",
|
|
53
|
-
message: "genericError",
|
|
54
|
-
errorType: FluidErrorTypes.genericError,
|
|
55
|
-
error: "genericError",
|
|
56
|
-
},
|
|
57
|
-
]));
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
describe("Send and receive DataCorruptionError instances", () => {
|
|
61
|
-
it("Send and receive a DataCorruptionError.", () => {
|
|
62
|
-
const testError = new DataCorruptionError("dataCorruptionError", {
|
|
63
|
-
clientId: "clientId",
|
|
64
|
-
sequenceNumber: 0,
|
|
65
|
-
message1: "message1",
|
|
66
|
-
message2: "message2",
|
|
67
|
-
exampleExtraTelemetryProp: "exampleExtraTelemetryProp",
|
|
68
|
-
});
|
|
69
|
-
mockLogger.toTelemetryLogger().sendErrorEvent({ eventName: "A" }, testError);
|
|
70
|
-
assert(mockLogger.matchEvents([
|
|
71
|
-
{
|
|
72
|
-
eventName: "A",
|
|
73
|
-
category: "error",
|
|
74
|
-
message: "dataCorruptionError",
|
|
75
|
-
errorType: FluidErrorTypes.dataCorruptionError,
|
|
76
|
-
error: "dataCorruptionError",
|
|
77
|
-
clientId: "clientId",
|
|
78
|
-
sequenceNumber: 0,
|
|
79
|
-
message1: "message1",
|
|
80
|
-
message2: "message2",
|
|
81
|
-
exampleExtraTelemetryProp: "exampleExtraTelemetryProp",
|
|
82
|
-
dataProcessingError: 1,
|
|
83
|
-
},
|
|
84
|
-
]));
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe("Send errors using a logger from createChildLogger", () => {
|
|
88
|
-
it("Send and receive a GenericError.", () => {
|
|
89
|
-
const childLogger = createChildLogger({
|
|
90
|
-
logger: mockLogger,
|
|
91
|
-
namespace: "errorTypeTestNamespace",
|
|
92
|
-
});
|
|
93
|
-
const testError = new GenericError("genericError");
|
|
94
|
-
childLogger.sendErrorEvent({ eventName: "A" }, testError);
|
|
95
|
-
assert(mockLogger.matchEvents([
|
|
96
|
-
{
|
|
97
|
-
eventName: "errorTypeTestNamespace:A",
|
|
98
|
-
category: "error",
|
|
99
|
-
message: "genericError",
|
|
100
|
-
errorType: FluidErrorTypes.genericError,
|
|
101
|
-
error: "genericError",
|
|
102
|
-
},
|
|
103
|
-
]));
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
//# sourceMappingURL=errorTypeLoggingTest.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errorTypeLoggingTest.spec.js","sourceRoot":"","sources":["../../src/test/errorTypeLoggingTest.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { FluidErrorTypes } from \"@fluidframework/core-interfaces\";\nimport { GenericError, DataCorruptionError } from \"../error.js\";\nimport { MockLogger } from \"../mockLogger.js\";\nimport { createChildLogger } from \"../logger.js\";\n\ndescribe(\"Check if the errorType field matches after sending/receiving via Container error classes\", () => {\n\t// In all tests below, the `stack` prop will be left out of validation because it is difficult to properly\n\t// mock a stack for a mocked error.\n\tlet mockLogger: MockLogger;\n\tbeforeEach(() => {\n\t\tmockLogger = new MockLogger();\n\t});\n\n\tdescribe(\"Send and receive GenericError instances\", () => {\n\t\tit(\"Send and receive a GenericError with no attached error.\", () => {\n\t\t\tconst testError = new GenericError(\"genericError\");\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\t// Dangling error objects of any type will be ignored (see constructor):\n\t\tit(\"Send and receive a GenericError with a dangling error of any type.\", () => {\n\t\t\tconst testError = new GenericError(\"genericError\", \"placeholder\");\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t\tit(\"Send and receive a GenericError with a dangling error of object type.\", () => {\n\t\t\tconst testErrorObj = new Error(\"some error\");\n\t\t\tconst testError = new GenericError(\"genericError\", testErrorObj);\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Send and receive DataCorruptionError instances\", () => {\n\t\tit(\"Send and receive a DataCorruptionError.\", () => {\n\t\t\tconst testError = new DataCorruptionError(\"dataCorruptionError\", {\n\t\t\t\tclientId: \"clientId\",\n\t\t\t\tsequenceNumber: 0,\n\t\t\t\tmessage1: \"message1\",\n\t\t\t\tmessage2: \"message2\",\n\t\t\t\texampleExtraTelemetryProp: \"exampleExtraTelemetryProp\",\n\t\t\t});\n\t\t\tmockLogger.toTelemetryLogger().sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"dataCorruptionError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.dataCorruptionError,\n\t\t\t\t\t\terror: \"dataCorruptionError\",\n\t\t\t\t\t\tclientId: \"clientId\",\n\t\t\t\t\t\tsequenceNumber: 0,\n\t\t\t\t\t\tmessage1: \"message1\",\n\t\t\t\t\t\tmessage2: \"message2\",\n\t\t\t\t\t\texampleExtraTelemetryProp: \"exampleExtraTelemetryProp\",\n\t\t\t\t\t\tdataProcessingError: 1,\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"Send errors using a logger from createChildLogger\", () => {\n\t\tit(\"Send and receive a GenericError.\", () => {\n\t\t\tconst childLogger = createChildLogger({\n\t\t\t\tlogger: mockLogger,\n\t\t\t\tnamespace: \"errorTypeTestNamespace\",\n\t\t\t});\n\t\t\tconst testError = new GenericError(\"genericError\");\n\t\t\tchildLogger.sendErrorEvent({ eventName: \"A\" }, testError);\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{\n\t\t\t\t\t\teventName: \"errorTypeTestNamespace:A\",\n\t\t\t\t\t\tcategory: \"error\",\n\t\t\t\t\t\tmessage: \"genericError\",\n\t\t\t\t\t\terrorType: FluidErrorTypes.genericError,\n\t\t\t\t\t\terror: \"genericError\",\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "node:assert";
|
|
6
|
-
import { MockLogger } from "../mockLogger.js";
|
|
7
|
-
describe("MockLogger", () => {
|
|
8
|
-
describe("matchEvents", () => {
|
|
9
|
-
let mockLogger;
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
mockLogger = new MockLogger();
|
|
12
|
-
});
|
|
13
|
-
it("empty log, none expected", () => {
|
|
14
|
-
assert(mockLogger.matchEvents([]));
|
|
15
|
-
});
|
|
16
|
-
it("empty log, one expected", () => {
|
|
17
|
-
assert(!mockLogger.matchEvents([{ eventName: "A", a: 1 }]));
|
|
18
|
-
});
|
|
19
|
-
it("One logged, none expected", () => {
|
|
20
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
21
|
-
assert(mockLogger.matchEvents([]));
|
|
22
|
-
});
|
|
23
|
-
it("One logged, exact match expected", () => {
|
|
24
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
25
|
-
assert(mockLogger.matchEvents([{ eventName: "A", a: 1 }]));
|
|
26
|
-
});
|
|
27
|
-
it("One logged, partial match expected", () => {
|
|
28
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
29
|
-
assert(mockLogger.matchEvents([{ eventName: "A" }]));
|
|
30
|
-
});
|
|
31
|
-
it("One logged, superset expected", () => {
|
|
32
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
33
|
-
assert(!mockLogger.matchEvents([{ eventName: "A", a: 1, x: 0 }]));
|
|
34
|
-
});
|
|
35
|
-
it("One logged, unmatching expected", () => {
|
|
36
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
37
|
-
assert(!mockLogger.matchEvents([{ eventName: "A", a: 999 }]));
|
|
38
|
-
});
|
|
39
|
-
it("One logged, reordered exact match expected", () => {
|
|
40
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
41
|
-
assert(mockLogger.matchEvents([{ a: 1, eventName: "A" }]));
|
|
42
|
-
});
|
|
43
|
-
it("One logged, two expected", () => {
|
|
44
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
45
|
-
assert(!mockLogger.matchEvents([
|
|
46
|
-
{ eventName: "A", a: 1 },
|
|
47
|
-
{ eventName: "B", b: 2 },
|
|
48
|
-
]));
|
|
49
|
-
});
|
|
50
|
-
it("Two logged, two matching expected", () => {
|
|
51
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
52
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
53
|
-
assert(mockLogger.matchEvents([
|
|
54
|
-
{ eventName: "A", a: 1 },
|
|
55
|
-
{ eventName: "B", b: 2 },
|
|
56
|
-
]));
|
|
57
|
-
});
|
|
58
|
-
it("Two logged, some unmatching expected", () => {
|
|
59
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
60
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
61
|
-
assert(!mockLogger.matchEvents([
|
|
62
|
-
{ eventName: "A", a: 1 },
|
|
63
|
-
{ eventName: "B", b: 999 },
|
|
64
|
-
]));
|
|
65
|
-
});
|
|
66
|
-
it("Two logged, one matching expected", () => {
|
|
67
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
68
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
69
|
-
assert(mockLogger.matchEvents([{ eventName: "B", b: 2 }]));
|
|
70
|
-
});
|
|
71
|
-
it("Two logged, two matching out of order expected", () => {
|
|
72
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
73
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
74
|
-
assert(!mockLogger.matchEvents([
|
|
75
|
-
{ eventName: "B", b: 2 },
|
|
76
|
-
{ eventName: "A", a: 1 },
|
|
77
|
-
]));
|
|
78
|
-
});
|
|
79
|
-
it("Two logged, none expected", () => {
|
|
80
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
81
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
82
|
-
assert(mockLogger.matchEvents([]));
|
|
83
|
-
});
|
|
84
|
-
it("Two sequences, matching expected", () => {
|
|
85
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
86
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
87
|
-
assert(mockLogger.matchEvents([
|
|
88
|
-
{ eventName: "A", a: 1 },
|
|
89
|
-
{ eventName: "B", b: 2 },
|
|
90
|
-
]));
|
|
91
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "C", c: 3 });
|
|
92
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "D", d: 4 });
|
|
93
|
-
assert(mockLogger.matchEvents([
|
|
94
|
-
{ eventName: "C", c: 3 },
|
|
95
|
-
{ eventName: "D", d: 4 },
|
|
96
|
-
]));
|
|
97
|
-
});
|
|
98
|
-
it("Two sequences, redundant match expected", () => {
|
|
99
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
100
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
101
|
-
assert(mockLogger.matchEvents([
|
|
102
|
-
{ eventName: "A", a: 1 },
|
|
103
|
-
{ eventName: "B", b: 2 },
|
|
104
|
-
]));
|
|
105
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "C", c: 3 });
|
|
106
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "D", d: 4 });
|
|
107
|
-
assert(!mockLogger.matchEvents([
|
|
108
|
-
{ eventName: "A", a: 1 },
|
|
109
|
-
{ eventName: "B", b: 2 },
|
|
110
|
-
{ eventName: "C", c: 3 },
|
|
111
|
-
{ eventName: "D", d: 4 },
|
|
112
|
-
]));
|
|
113
|
-
});
|
|
114
|
-
it("One sequence, redundant match expected", () => {
|
|
115
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "A", a: 1 });
|
|
116
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: "B", b: 2 });
|
|
117
|
-
assert(mockLogger.matchEvents([
|
|
118
|
-
{ eventName: "A", a: 1 },
|
|
119
|
-
{ eventName: "B", b: 2 },
|
|
120
|
-
]));
|
|
121
|
-
assert(!mockLogger.matchEvents([
|
|
122
|
-
{ eventName: "A", a: 1 },
|
|
123
|
-
{ eventName: "B", b: 2 },
|
|
124
|
-
]));
|
|
125
|
-
});
|
|
126
|
-
it("Details in props are inlined or not as per inlineDetailsProp", () => {
|
|
127
|
-
const details = {
|
|
128
|
-
id: 1,
|
|
129
|
-
type: "test",
|
|
130
|
-
};
|
|
131
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({
|
|
132
|
-
eventName: "A",
|
|
133
|
-
details: JSON.stringify(details),
|
|
134
|
-
});
|
|
135
|
-
// When inlineDetailsProp is true, the properties in details should be inlined.
|
|
136
|
-
assert(mockLogger.matchEvents([{ eventName: "A", id: 1, type: "test" }], true /* inlineDetailsProp */));
|
|
137
|
-
// When inlineDetailsProp is not true, the properties in details should not be inlined.
|
|
138
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({
|
|
139
|
-
eventName: "A",
|
|
140
|
-
details: JSON.stringify(details),
|
|
141
|
-
});
|
|
142
|
-
assert(!mockLogger.matchEvents([{ eventName: "A", id: 1, type: "test" }]));
|
|
143
|
-
// When inlineDetailsProp is not true, the properties in details should not be inlined.
|
|
144
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({
|
|
145
|
-
eventName: "A",
|
|
146
|
-
details: JSON.stringify(details),
|
|
147
|
-
});
|
|
148
|
-
assert(mockLogger.matchEvents([{ eventName: "A", details: JSON.stringify(details) }]));
|
|
149
|
-
});
|
|
150
|
-
it("Details in props must be a JSON stringified string when inlineDetailsProp is true", () => {
|
|
151
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({
|
|
152
|
-
eventName: "A",
|
|
153
|
-
details: 10,
|
|
154
|
-
});
|
|
155
|
-
assert.throws(() => mockLogger.matchEvents([{ eventName: "A", id: 1, type: "test" }], true /* inlineDetailsProp */));
|
|
156
|
-
mockLogger.toTelemetryLogger().sendTelemetryEvent({
|
|
157
|
-
eventName: "A",
|
|
158
|
-
details: "details",
|
|
159
|
-
});
|
|
160
|
-
assert.throws(() => mockLogger.matchEvents([{ eventName: "A", id: 1, type: "test" }], true /* inlineDetailsProp */));
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
//# sourceMappingURL=mockLogger.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mockLogger.spec.js","sourceRoot":"","sources":["../../src/test/mockLogger.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\nimport { MockLogger } from \"../mockLogger.js\";\n\ndescribe(\"MockLogger\", () => {\n\tdescribe(\"matchEvents\", () => {\n\t\tlet mockLogger: MockLogger;\n\t\tbeforeEach(() => {\n\t\t\tmockLogger = new MockLogger();\n\t\t});\n\n\t\tit(\"empty log, none expected\", () => {\n\t\t\tassert(mockLogger.matchEvents([]));\n\t\t});\n\n\t\tit(\"empty log, one expected\", () => {\n\t\t\tassert(!mockLogger.matchEvents([{ eventName: \"A\", a: 1 }]));\n\t\t});\n\n\t\tit(\"One logged, none expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(mockLogger.matchEvents([]));\n\t\t});\n\n\t\tit(\"One logged, exact match expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(mockLogger.matchEvents([{ eventName: \"A\", a: 1 }]));\n\t\t});\n\n\t\tit(\"One logged, partial match expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(mockLogger.matchEvents([{ eventName: \"A\" }]));\n\t\t});\n\n\t\tit(\"One logged, superset expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(!mockLogger.matchEvents([{ eventName: \"A\", a: 1, x: 0 }]));\n\t\t});\n\n\t\tit(\"One logged, unmatching expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(!mockLogger.matchEvents([{ eventName: \"A\", a: 999 }]));\n\t\t});\n\n\t\tit(\"One logged, reordered exact match expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(mockLogger.matchEvents([{ a: 1, eventName: \"A\" }]));\n\t\t});\n\n\t\tit(\"One logged, two expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tassert(\n\t\t\t\t!mockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"Two logged, two matching expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"Two logged, some unmatching expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(\n\t\t\t\t!mockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 999 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"Two logged, one matching expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(mockLogger.matchEvents([{ eventName: \"B\", b: 2 }]));\n\t\t});\n\n\t\tit(\"Two logged, two matching out of order expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(\n\t\t\t\t!mockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"Two logged, none expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(mockLogger.matchEvents([]));\n\t\t});\n\n\t\tit(\"Two sequences, matching expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t]),\n\t\t\t);\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"C\", c: 3 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"D\", d: 4 });\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"C\", c: 3 },\n\t\t\t\t\t{ eventName: \"D\", d: 4 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"Two sequences, redundant match expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t]),\n\t\t\t);\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"C\", c: 3 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"D\", d: 4 });\n\t\t\tassert(\n\t\t\t\t!mockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t\t{ eventName: \"C\", c: 3 },\n\t\t\t\t\t{ eventName: \"D\", d: 4 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"One sequence, redundant match expected\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"A\", a: 1 });\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({ eventName: \"B\", b: 2 });\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t]),\n\t\t\t);\n\t\t\tassert(\n\t\t\t\t!mockLogger.matchEvents([\n\t\t\t\t\t{ eventName: \"A\", a: 1 },\n\t\t\t\t\t{ eventName: \"B\", b: 2 },\n\t\t\t\t]),\n\t\t\t);\n\t\t});\n\n\t\tit(\"Details in props are inlined or not as per inlineDetailsProp\", () => {\n\t\t\tconst details = {\n\t\t\t\tid: 1,\n\t\t\t\ttype: \"test\",\n\t\t\t};\n\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({\n\t\t\t\teventName: \"A\",\n\t\t\t\tdetails: JSON.stringify(details),\n\t\t\t});\n\t\t\t// When inlineDetailsProp is true, the properties in details should be inlined.\n\t\t\tassert(\n\t\t\t\tmockLogger.matchEvents(\n\t\t\t\t\t[{ eventName: \"A\", id: 1, type: \"test\" }],\n\t\t\t\t\ttrue /* inlineDetailsProp */,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\t// When inlineDetailsProp is not true, the properties in details should not be inlined.\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({\n\t\t\t\teventName: \"A\",\n\t\t\t\tdetails: JSON.stringify(details),\n\t\t\t});\n\t\t\tassert(!mockLogger.matchEvents([{ eventName: \"A\", id: 1, type: \"test\" }]));\n\n\t\t\t// When inlineDetailsProp is not true, the properties in details should not be inlined.\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({\n\t\t\t\teventName: \"A\",\n\t\t\t\tdetails: JSON.stringify(details),\n\t\t\t});\n\t\t\tassert(mockLogger.matchEvents([{ eventName: \"A\", details: JSON.stringify(details) }]));\n\t\t});\n\n\t\tit(\"Details in props must be a JSON stringified string when inlineDetailsProp is true\", () => {\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({\n\t\t\t\teventName: \"A\",\n\t\t\t\tdetails: 10,\n\t\t\t});\n\t\t\tassert.throws(() =>\n\t\t\t\tmockLogger.matchEvents(\n\t\t\t\t\t[{ eventName: \"A\", id: 1, type: \"test\" }],\n\t\t\t\t\ttrue /* inlineDetailsProp */,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tmockLogger.toTelemetryLogger().sendTelemetryEvent({\n\t\t\t\teventName: \"A\",\n\t\t\t\tdetails: \"details\",\n\t\t\t});\n\t\t\tassert.throws(() =>\n\t\t\t\tmockLogger.matchEvents(\n\t\t\t\t\t[{ eventName: \"A\", id: 1, type: \"test\" }],\n\t\t\t\t\ttrue /* inlineDetailsProp */,\n\t\t\t\t),\n\t\t\t);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { strict as assert } from "node:assert";
|
|
6
|
-
import { LogLevel } from "@fluidframework/core-interfaces";
|
|
7
|
-
import { createChildLogger, createMultiSinkLogger } from "../logger.js";
|
|
8
|
-
import { MockLogger } from "../mockLogger.js";
|
|
9
|
-
describe("MultiSinkLogger", () => {
|
|
10
|
-
it("Pushes logs to all sinks", () => {
|
|
11
|
-
const logger1 = new MockLogger();
|
|
12
|
-
const logger2 = new MockLogger();
|
|
13
|
-
const multiSink = createMultiSinkLogger({ loggers: [logger1, logger2] });
|
|
14
|
-
multiSink.sendTelemetryEvent({ eventName: "test" });
|
|
15
|
-
logger1.assertMatch([{ category: "generic", eventName: "test" }]);
|
|
16
|
-
logger2.assertMatch([{ category: "generic", eventName: "test" }]);
|
|
17
|
-
});
|
|
18
|
-
it("Appends namespace to all logged events", () => {
|
|
19
|
-
const logger1 = new MockLogger();
|
|
20
|
-
const logger2 = new MockLogger();
|
|
21
|
-
const multiSink = createMultiSinkLogger({ loggers: [logger1, logger2], namespace: "test" });
|
|
22
|
-
multiSink.sendTelemetryEvent({ eventName: "test" });
|
|
23
|
-
logger1.assertMatch([{ category: "generic", eventName: "test:test" }]);
|
|
24
|
-
logger2.assertMatch([{ category: "generic", eventName: "test:test" }]);
|
|
25
|
-
});
|
|
26
|
-
it("Propagates Properties to sinks when tryInheritProperties true", () => {
|
|
27
|
-
const logger1 = new MockLogger();
|
|
28
|
-
const logger2 = new MockLogger();
|
|
29
|
-
const multiSink = createMultiSinkLogger({
|
|
30
|
-
loggers: [
|
|
31
|
-
createChildLogger({ logger: logger1, properties: { all: { test: true } } }),
|
|
32
|
-
logger2,
|
|
33
|
-
],
|
|
34
|
-
tryInheritProperties: true,
|
|
35
|
-
});
|
|
36
|
-
multiSink.sendTelemetryEvent({ eventName: "test" });
|
|
37
|
-
logger1.assertMatch([{ category: "generic", eventName: "test", test: true }]);
|
|
38
|
-
logger2.assertMatch([{ category: "generic", eventName: "test", test: true }]);
|
|
39
|
-
});
|
|
40
|
-
it("Does not Propagates Properties to sinks when tryInheritProperties not set", () => {
|
|
41
|
-
const logger1 = new MockLogger();
|
|
42
|
-
const logger2 = new MockLogger();
|
|
43
|
-
const multiSink = createMultiSinkLogger({
|
|
44
|
-
loggers: [
|
|
45
|
-
createChildLogger({ logger: logger1, properties: { all: { test: true } } }),
|
|
46
|
-
logger2,
|
|
47
|
-
],
|
|
48
|
-
});
|
|
49
|
-
multiSink.sendTelemetryEvent({ eventName: "test" });
|
|
50
|
-
logger1.assertMatch([{ category: "generic", eventName: "test", test: true }]);
|
|
51
|
-
logger2.assertMatch([{ category: "generic", eventName: "test" }]);
|
|
52
|
-
});
|
|
53
|
-
it("MultiSink logger set the logLevel to min logLevel of all loggers", () => {
|
|
54
|
-
const logger1 = new MockLogger(LogLevel.error);
|
|
55
|
-
const logger2 = new MockLogger(LogLevel.default);
|
|
56
|
-
const multiSink = createMultiSinkLogger({
|
|
57
|
-
loggers: [createChildLogger({ logger: logger1 }), logger2],
|
|
58
|
-
});
|
|
59
|
-
assert.strictEqual(multiSink.minLogLevel, LogLevel.default, "Min loglevel should be set correctly");
|
|
60
|
-
// Add logger with a log level as verbose
|
|
61
|
-
multiSink.addLogger(new MockLogger(LogLevel.verbose));
|
|
62
|
-
assert.strictEqual(multiSink.minLogLevel, LogLevel.verbose, "Min loglevel should be set correctly to verbose");
|
|
63
|
-
});
|
|
64
|
-
it("MultiSink logger set the logLevel to default if not supplied with a log level", () => {
|
|
65
|
-
const logger1 = new MockLogger();
|
|
66
|
-
const logger2 = new MockLogger();
|
|
67
|
-
const multiSink = createMultiSinkLogger({
|
|
68
|
-
loggers: [createChildLogger({ logger: logger1 }), logger2],
|
|
69
|
-
});
|
|
70
|
-
assert.strictEqual(multiSink.minLogLevel, LogLevel.default, "Min loglevel should be set correctly to default");
|
|
71
|
-
});
|
|
72
|
-
it("MultiSink logger set the logLevel correctly when no initial loggers are supplied", () => {
|
|
73
|
-
const multiSink = createMultiSinkLogger({
|
|
74
|
-
loggers: [],
|
|
75
|
-
});
|
|
76
|
-
multiSink.addLogger(new MockLogger());
|
|
77
|
-
assert.strictEqual(multiSink.minLogLevel, LogLevel.default, "Min loglevel should be set correctly to default");
|
|
78
|
-
multiSink.addLogger(new MockLogger(LogLevel.default));
|
|
79
|
-
assert.strictEqual(multiSink.minLogLevel, LogLevel.default, "Min loglevel should be set correctly to default");
|
|
80
|
-
multiSink.addLogger(new MockLogger(LogLevel.verbose));
|
|
81
|
-
assert.strictEqual(multiSink.minLogLevel, LogLevel.verbose, "Min loglevel should be set correctly to verbose");
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
//# sourceMappingURL=multiSinkLogger.spec.js.map
|