@fluidframework/test-utils 2.4.0-297385 → 2.4.0-299374
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/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/testObjectProvider.d.ts.map +1 -1
- package/dist/testObjectProvider.js +45 -12
- package/dist/testObjectProvider.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/testObjectProvider.d.ts.map +1 -1
- package/lib/testObjectProvider.js +40 -7
- package/lib/testObjectProvider.js.map +1 -1
- package/package.json +24 -24
- package/src/packageVersion.ts +1 -1
- package/src/testObjectProvider.ts +49 -6
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/test-utils";
|
|
8
|
-
export declare const pkgVersion = "2.4.0-
|
|
8
|
+
export declare const pkgVersion = "2.4.0-299374";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/test-utils";
|
|
11
|
-
exports.pkgVersion = "2.4.0-
|
|
11
|
+
exports.pkgVersion = "2.4.0-299374";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,4BAA4B,CAAC;AACvC,QAAA,UAAU,GAAG,cAAc,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/test-utils\";\nexport const pkgVersion = \"2.4.0-
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,4BAA4B,CAAC;AACvC,QAAA,UAAU,GAAG,cAAc,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/test-utils\";\nexport const pkgVersion = \"2.4.0-299374\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.d.ts","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAmB,MAAM,yCAAyC,CAAC;AACvF,OAAO,EACN,UAAU,EACV,iBAAiB,EACjB,WAAW,EAEX,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACN,YAAY,EACZ,MAAM,EAEN,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"testObjectProvider.d.ts","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
exports.getUnexpectedLogErrorException = exports.TestObjectProviderWithVersionedLoad = exports.TestObjectProvider = exports.EventAndErrorTrackingLogger = exports.createDocumentId = exports.DataObjectFactoryType = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/container-loader/internal");
|
|
9
9
|
const internal_2 = require("@fluidframework/core-utils/internal");
|
|
10
|
-
const internal_3 = require("@fluidframework/
|
|
10
|
+
const internal_3 = require("@fluidframework/odsp-driver/internal");
|
|
11
|
+
const internal_4 = require("@fluidframework/telemetry-utils/internal");
|
|
11
12
|
const uuid_1 = require("uuid");
|
|
12
13
|
const loaderContainerTracker_js_1 = require("./loaderContainerTracker.js");
|
|
13
14
|
const localCodeLoader_js_1 = require("./localCodeLoader.js");
|
|
@@ -175,7 +176,7 @@ class TestObjectProvider {
|
|
|
175
176
|
get logger() {
|
|
176
177
|
if (this._logger === undefined) {
|
|
177
178
|
this._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());
|
|
178
|
-
this._logger = (0,
|
|
179
|
+
this._logger = (0, internal_4.createChildLogger)({
|
|
179
180
|
logger: this._tracker,
|
|
180
181
|
properties: {
|
|
181
182
|
all: {
|
|
@@ -235,7 +236,7 @@ class TestObjectProvider {
|
|
|
235
236
|
* {@inheritDoc ITestObjectProvider.createLoader}
|
|
236
237
|
*/
|
|
237
238
|
createLoader(packageEntries, loaderProps) {
|
|
238
|
-
const logger = (0,
|
|
239
|
+
const logger = (0, internal_4.createMultiSinkLogger)({
|
|
239
240
|
loggers: [this.logger, loaderProps?.logger],
|
|
240
241
|
});
|
|
241
242
|
const loader = new this.LoaderConstructor({
|
|
@@ -260,7 +261,7 @@ class TestObjectProvider {
|
|
|
260
261
|
this._documentCreated = true;
|
|
261
262
|
// r11s driver will generate a new ID for the new container.
|
|
262
263
|
// update the document ID with the actual ID of the attached container.
|
|
263
|
-
this.
|
|
264
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
264
265
|
return container;
|
|
265
266
|
}
|
|
266
267
|
/**
|
|
@@ -282,7 +283,7 @@ class TestObjectProvider {
|
|
|
282
283
|
}
|
|
283
284
|
await container.attach(this.driver.createCreateNewRequest(this.documentId));
|
|
284
285
|
this._documentCreated = true;
|
|
285
|
-
this.
|
|
286
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
286
287
|
}
|
|
287
288
|
/**
|
|
288
289
|
* {@inheritDoc ITestObjectProvider.loadContainer}
|
|
@@ -315,7 +316,7 @@ class TestObjectProvider {
|
|
|
315
316
|
this._documentCreated = true;
|
|
316
317
|
// r11s driver will generate a new ID for the new container.
|
|
317
318
|
// update the document ID with the actual ID of the attached container.
|
|
318
|
-
this.
|
|
319
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
319
320
|
return container;
|
|
320
321
|
}
|
|
321
322
|
/**
|
|
@@ -364,6 +365,11 @@ class TestObjectProvider {
|
|
|
364
365
|
*/
|
|
365
366
|
updateDocumentId(resolvedUrl) {
|
|
366
367
|
this._documentIdStrategy.update(resolvedUrl);
|
|
368
|
+
this.logger.send({
|
|
369
|
+
category: "generic",
|
|
370
|
+
eventName: "DocumentIdUpdated",
|
|
371
|
+
...getUrlTelemetryProps(resolvedUrl),
|
|
372
|
+
});
|
|
367
373
|
}
|
|
368
374
|
/**
|
|
369
375
|
* {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}
|
|
@@ -410,7 +416,7 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
410
416
|
get logger() {
|
|
411
417
|
if (this._logger === undefined) {
|
|
412
418
|
this._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());
|
|
413
|
-
this._logger = (0,
|
|
419
|
+
this._logger = (0, internal_4.createChildLogger)({
|
|
414
420
|
logger: this._tracker,
|
|
415
421
|
properties: this.telemetryProps,
|
|
416
422
|
});
|
|
@@ -473,7 +479,7 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
473
479
|
: this.createFluidEntryPointForLoading;
|
|
474
480
|
}
|
|
475
481
|
createLoaderForCreating(packageEntries, loaderProps) {
|
|
476
|
-
const logger = (0,
|
|
482
|
+
const logger = (0, internal_4.createMultiSinkLogger)({
|
|
477
483
|
loggers: [this.logger, loaderProps?.logger],
|
|
478
484
|
});
|
|
479
485
|
const loader = new this.LoaderConstructorForCreating({
|
|
@@ -487,7 +493,7 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
487
493
|
return loader;
|
|
488
494
|
}
|
|
489
495
|
createLoaderForLoading(packageEntries, loaderProps) {
|
|
490
|
-
const logger = (0,
|
|
496
|
+
const logger = (0, internal_4.createMultiSinkLogger)({
|
|
491
497
|
loggers: [this.logger, loaderProps?.logger],
|
|
492
498
|
});
|
|
493
499
|
const loader = new this.LoaderConstructorForLoading({
|
|
@@ -526,7 +532,7 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
526
532
|
this._documentCreated = true;
|
|
527
533
|
// r11s driver will generate a new ID for the new container.
|
|
528
534
|
// update the document ID with the actual ID of the attached container.
|
|
529
|
-
this.
|
|
535
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
530
536
|
return container;
|
|
531
537
|
}
|
|
532
538
|
/**
|
|
@@ -548,7 +554,7 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
548
554
|
}
|
|
549
555
|
await container.attach(this.driver.createCreateNewRequest(this.documentId));
|
|
550
556
|
this._documentCreated = true;
|
|
551
|
-
this.
|
|
557
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
552
558
|
}
|
|
553
559
|
/**
|
|
554
560
|
* {@inheritDoc ITestObjectProvider.loadContainer}
|
|
@@ -583,7 +589,7 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
583
589
|
this._documentCreated = true;
|
|
584
590
|
// r11s driver will generate a new ID for the new container.
|
|
585
591
|
// update the document ID with the actual ID of the attached container.
|
|
586
|
-
this.
|
|
592
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
587
593
|
return container;
|
|
588
594
|
}
|
|
589
595
|
/**
|
|
@@ -635,6 +641,11 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
635
641
|
*/
|
|
636
642
|
updateDocumentId(resolvedUrl) {
|
|
637
643
|
this._documentIdStrategy.update(resolvedUrl);
|
|
644
|
+
this.logger.send({
|
|
645
|
+
category: "generic",
|
|
646
|
+
eventName: "DocumentIdUpdated",
|
|
647
|
+
...getUrlTelemetryProps(resolvedUrl),
|
|
648
|
+
});
|
|
638
649
|
}
|
|
639
650
|
/**
|
|
640
651
|
* {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}
|
|
@@ -645,6 +656,28 @@ class TestObjectProviderWithVersionedLoad {
|
|
|
645
656
|
}
|
|
646
657
|
}
|
|
647
658
|
exports.TestObjectProviderWithVersionedLoad = TestObjectProviderWithVersionedLoad;
|
|
659
|
+
/**
|
|
660
|
+
* Get identifying information for a resolved URL.
|
|
661
|
+
* @remarks BEWARE: this function is only appropriate for usage in tests, as it logs unhashed document IDs,
|
|
662
|
+
* which is a privacy concern for production scenarios.
|
|
663
|
+
*/
|
|
664
|
+
function getUrlTelemetryProps(resolvedUrl) {
|
|
665
|
+
if (!resolvedUrl) {
|
|
666
|
+
return {};
|
|
667
|
+
}
|
|
668
|
+
const props = {
|
|
669
|
+
url: resolvedUrl.url,
|
|
670
|
+
id: resolvedUrl.id,
|
|
671
|
+
};
|
|
672
|
+
if ((0, internal_3.isOdspResolvedUrl)(resolvedUrl)) {
|
|
673
|
+
Object.assign(props, {
|
|
674
|
+
siteUrl: resolvedUrl.siteUrl,
|
|
675
|
+
driveId: resolvedUrl.driveId,
|
|
676
|
+
itemId: resolvedUrl.itemId,
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
return (0, internal_4.tagData)(internal_4.TelemetryDataTag.UserData, props);
|
|
680
|
+
}
|
|
648
681
|
/** Summarize the event with just the primary properties, for succinct output in case of test failure */
|
|
649
682
|
const primaryEventProps = ({ category, eventName, error, errorType, }) => ({
|
|
650
683
|
category,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.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 { ITestDriver, TestDriverTypes } from \"@fluid-internal/test-driver-definitions\";\nimport {\n\tIContainer,\n\tIFluidCodeDetails,\n\tIHostLoader,\n\tILoader,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tILoaderProps,\n\tLoader,\n\twaitContainerToCatchUp as waitContainerToCatchUp_original,\n} from \"@fluidframework/container-loader/internal\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime/internal\";\nimport {\n\tIRequestHeader,\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\ttype ITelemetryGenericEventExt,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n\ttype ITelemetryLoggerPropertyBags,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { LoaderContainerTracker } from \"./loaderContainerTracker.js\";\nimport { LocalCodeLoader, fluidEntryPoint } from \"./localCodeLoader.js\";\nimport { createAndAttachContainer } from \"./localLoader.js\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject.js\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n\tpackage: \"defaultTestPackage\",\n\tconfig: {},\n};\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IOpProcessingController {\n\tprocessIncoming(...containers: IContainer[]): Promise<void>;\n\tprocessOutgoing(...containers: IContainer[]): Promise<void>;\n\tpauseProcessing(...containers: IContainer[]): Promise<void>;\n\tresumeProcessing(...containers: IContainer[]): void;\n}\n\n/**\n * @internal\n */\nexport interface ITestObjectProvider {\n\t/**\n\t * Indicates which type of test object provider is being used.\n\t */\n\ttype: \"TestObjectProvider\" | \"TestObjectProviderWithVersionedLoad\";\n\n\t/**\n\t * The document id to retrieve or create containers\n\t */\n\tdocumentId: string;\n\n\t/**\n\t * Creates the document service after extracting different endpoints URLs from a resolved URL.\n\t */\n\tdocumentServiceFactory: IDocumentServiceFactory;\n\n\t/**\n\t * Test driver used to create the IDocumentServiceFactory. Varies depending on the test type.\n\t */\n\tdriver: ITestDriver;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\tlogger: ITelemetryBaseLogger;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\ttracker: IEventAndErrorTrackingLogger;\n\n\t/**\n\t * Used to create a url for the created container with any data store path given in the relative url.\n\t */\n\turlResolver: IUrlResolver;\n\n\t/**\n\t * Default IFluidCodeDetails used to create containers.\n\t */\n\tdefaultCodeDetails: IFluidCodeDetails;\n\n\t/**\n\t * Contains functions to pause/resume op processing.\n\t */\n\topProcessingController: IOpProcessingController;\n\n\t/**\n\t * Represents the entry point for a Fluid container.\n\t */\n\tcreateFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint;\n\n\t/**\n\t * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t * @param loaderProps - Optional loader properties\n\t * @param forceUseCreateVersion - For Cross-Version compat testing, create a loader based on the create version\n\t */\n\tcreateLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion?: boolean,\n\t): IHostLoader;\n\n\t/**\n\t * Create a container using a default document id and code details.\n\t * Container created is automatically added to the OpProcessingController to manage op flow\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\n\tcreateContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Create a detached container much like createContainer, but without attaching it to the document service.\n\t */\n\tcreateDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Attaches a detached container to the document service.\n\t */\n\tattachDetachedContainer(container: IContainer): Promise<void>;\n\n\t/**\n\t * Loads a container using the default document id\n\t */\n\tloadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestLoader(testContainerConfig?: ITestContainerConfig): IHostLoader;\n\n\t/**\n\t * Make a container using a default document id and code details\n\t * Container loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>;\n\n\t/**\n\t * Load a container using a default document id and code details.\n\t * IContainer loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t * @param requestHeader - optional headers to be supplied to the loader\n\t */\n\tloadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdateDocumentId(url: IResolvedUrl | undefined): void;\n\n\t/**\n\t * Make sure all the tracked containers are synchronized.\n\t */\n\tensureSynchronized(...containers: IContainer[]): Promise<void>;\n\n\t/**\n\t * Reset the tracker, closing all containers and stop tracking them.\n\t */\n\tresetLoaderContainerTracker(syncSummarizerClients?: boolean);\n\n\t/**\n\t * Resets and closes all tracked containers and class states.\n\t */\n\treset(): void;\n}\n\n/**\n * @internal\n */\nexport enum DataObjectFactoryType {\n\tPrimed, // default\n\tTest,\n}\n\n/**\n * @internal\n */\nexport interface ITestContainerConfig {\n\t/** TestFluidDataObject instead of PrimedDataStore */\n\tfluidDataObjectType?: DataObjectFactoryType;\n\n\t/** An array of channel name and DDS factory pair to create on container creation time */\n\tregistry?: ChannelFactoryRegistry;\n\n\t/** Container runtime options for the container instance */\n\truntimeOptions?: IContainerRuntimeOptions;\n\n\t/** Whether this runtime should be instantiated using a mixed-in attributor class */\n\tenableAttribution?: boolean;\n\n\t/** For Cross-Version compat testing, load using the create version (e.g. use this to get a Summarizer on the create version) */\n\tforceUseCreateVersion?: true;\n\n\t/** Loader options for the loader used to create containers */\n\tloaderProps?: Partial<ILoaderProps>;\n}\n\n/**\n * @internal\n */\nexport const createDocumentId = (): string => uuid();\n\n/**\n * Used to retrieve, update, and reset document id based on the type of driver being used.\n *\n * @internal\n */\nexport interface IDocumentIdStrategy {\n\t/**\n\t * Get document id\n\t */\n\tget(): string;\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdate(resolvedUrl?: IResolvedUrl): void;\n\t/**\n\t * Reset document id to a new document id\n\t */\n\treset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n\tlet documentId = createDocumentId();\n\tswitch (type) {\n\t\tcase \"odsp\":\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: () => {}, // do not update the document ID in odsp test cases\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: (resolvedUrl?: IResolvedUrl) => {\n\t\t\t\t\t// Extract the document ID from the resolved container's URL and reset the ID property\n\t\t\t\t\tdocumentId = resolvedUrl?.id ?? documentId;\n\t\t\t\t},\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/** @internal */\nexport interface IEventAndErrorTrackingLogger {\n\tregisterExpectedEvent: (...orderedExpectedEvents: ITelemetryGenericEventExt[]) => void;\n\treportAndClearTrackedEvents: () => {\n\t\texpectedNotFound: { index: number; event: ITelemetryGenericEventExt }[];\n\t\tunexpectedErrors: ITelemetryBaseEvent[];\n\t};\n}\n\n/**\n * This class tracks events. It allows specifying expected events, which will be looked for in order.\n * It also tracks all unexpected errors.\n * At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and\n * any expected events that have not occurred.\n * @internal\n */\nexport class EventAndErrorTrackingLogger\n\timplements ITelemetryBaseLogger, IEventAndErrorTrackingLogger\n{\n\t/**\n\t * Even if these error events are logged, tests should still be allowed to pass\n\t * Additionally, if downgrade is true, then log as generic (e.g. to avoid polluting the e2e test logs)\n\t */\n\tprivate readonly allowedErrors: { eventName: string; downgrade?: true }[] = [\n\t\t// This log was removed in current version as unnecessary, but it's still present in previous versions\n\t\t{\n\t\t\teventName: \"fluid:telemetry:Container:NoRealStorageInDetachedContainer\",\n\t\t\tdowngrade: true,\n\t\t},\n\t\t// This log's category changes depending on the op latency. test results shouldn't be affected but if we see lots we'd like an alert from the logs.\n\t\t{ eventName: \"fluid:telemetry:OpRoundtripTime\" },\n\t];\n\n\tconstructor(private readonly baseLogger?: ITelemetryBaseLogger) {}\n\n\tprivate readonly expectedEvents: { index: number; event: ITelemetryGenericEventExt }[] = [];\n\tprivate readonly unexpectedErrors: ITelemetryBaseEvent[] = [];\n\n\tpublic registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEventExt[]) {\n\t\tif (this.expectedEvents.length !== 0) {\n\t\t\t// we don't have to error here. just no reason not to. given the events must be\n\t\t\t// ordered it could be tricky to figure out problems around multiple registrations.\n\t\t\tthrow new Error(\n\t\t\t\t\"Expected events already registered.\\n\" +\n\t\t\t\t\t\"Call reportAndClearTrackedEvents to clear them before registering more\",\n\t\t\t);\n\t\t}\n\t\tthis.expectedEvents.push(\n\t\t\t...orderedExpectedEvents.map((event, index) => ({ index, event })),\n\t\t);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tif (this.expectedEvents.length > 0) {\n\t\t\tconst ee = this.expectedEvents[0].event;\n\t\t\tif (ee.eventName === event.eventName) {\n\t\t\t\tlet matches = true;\n\t\t\t\tfor (const key of Object.keys(ee)) {\n\t\t\t\t\tif (ee[key] !== event[key]) {\n\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (matches) {\n\t\t\t\t\t// we found an expected event\n\t\t\t\t\t// so remove it from the list of expected events\n\t\t\t\t\t// and if it is an error, change it to generic\n\t\t\t\t\t// this helps keep our telemetry clear of\n\t\t\t\t\t// expected errors.\n\t\t\t\t\tthis.expectedEvents.shift();\n\t\t\t\t\tif (event.category === \"error\") {\n\t\t\t\t\t\tevent.category = \"generic\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.category === \"error\") {\n\t\t\t// Check to see if this error is allowed and if its category should be downgraded\n\t\t\tconst allowedError = this.allowedErrors.find(\n\t\t\t\t({ eventName }) => eventName === event.eventName,\n\t\t\t);\n\n\t\t\tif (allowedError === undefined) {\n\t\t\t\tthis.unexpectedErrors.push(event);\n\t\t\t} else if (allowedError.downgrade) {\n\t\t\t\tevent.category = \"generic\";\n\t\t\t}\n\t\t}\n\n\t\tthis.baseLogger?.send(event);\n\t}\n\n\tpublic reportAndClearTrackedEvents() {\n\t\tconst expectedNotFound = this.expectedEvents.splice(0, this.expectedEvents.length);\n\t\tconst unexpectedErrors = this.unexpectedErrors.splice(0, this.unexpectedErrors.length);\n\t\treturn {\n\t\t\texpectedNotFound,\n\t\t\tunexpectedErrors,\n\t\t};\n\t}\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n * @internal\n */\nexport class TestObjectProvider implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProvider\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n\t * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n\t * and factory for TestFluidObject\n\t */\n\tconstructor(\n\t\tprivate readonly LoaderConstructor: typeof Loader,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.driver}\n\t\t */\n\t\tpublic readonly driver: ITestDriver,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t\t */\n\t\tpublic readonly createFluidEntryPoint: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driver.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger(): ITelemetryBaseLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: {\n\t\t\t\t\tall: {\n\t\t\t\t\t\ttestType: this.type,\n\t\t\t\t\t\tdriverType: this.driver.type,\n\t\t\t\t\t\tdriverEndpointName: this.driver.endpointName,\n\t\t\t\t\t\tdriverTenantName: this.driver.tenantName,\n\t\t\t\t\t\tdriverUserIndex: this.driver.userIndex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driver.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driver.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructor({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\turl: await this.driver.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\n\t\tconst container = await this.resolveContainer(loader, requestHeader, pendingLocalState);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Implements {@link ITestObjectProvider}, but uses different versions to create and load containers.\n *\n * @internal\n */\nexport class TestObjectProviderWithVersionedLoad implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProviderWithVersionedLoad\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Used to determine which APIs to use when creating a loader.\n\t *\n\t * The first load will always use the create APIs, and then useCreateApi will be set to false to ensure all\n\t * subsequent loads use the load APIs.\n\t */\n\tprivate useCreateApi: boolean = true;\n\n\tconstructor(\n\t\tprivate readonly LoaderConstructorForCreating: typeof Loader,\n\t\tprivate readonly LoaderConstructorForLoading: typeof Loader,\n\t\tprivate readonly driverForCreating: ITestDriver,\n\t\tprivate readonly driverForLoading: ITestDriver,\n\t\tprivate readonly createFluidEntryPointForCreating: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly createFluidEntryPointForLoading: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly telemetryProps?: ITelemetryLoggerPropertyBags,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driverForCreating.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger() {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: this.telemetryProps,\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driverForCreating.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driverForCreating.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.driver}\n\t */\n\tpublic get driver(): ITestDriver {\n\t\treturn this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t */\n\tpublic get createFluidEntryPoint(): (\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t) => fluidEntryPoint {\n\t\treturn this.useCreateApi\n\t\t\t? this.createFluidEntryPointForCreating\n\t\t\t: this.createFluidEntryPointForLoading;\n\t}\n\n\tprivate createLoaderForCreating(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForCreating({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\tprivate createLoaderForLoading(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForLoading({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion = false,\n\t) {\n\t\tconst useCreateVersion = forceUseCreateVersion === true || this.useCreateApi;\n\t\tif (this.useCreateApi) {\n\t\t\t// After we create the first loader, we can set this.useCreateApi to false.\n\t\t\tthis.useCreateApi = false;\n\t\t}\n\t\tif (useCreateVersion) {\n\t\t\treturn this.createLoaderForCreating(packageEntries, loaderProps);\n\t\t}\n\t\treturn this.createLoaderForLoading(packageEntries, loaderProps);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, driver, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tdriver?: ITestDriver,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\turl: await driver!.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t\ttestContainerConfig?.forceUseCreateVersion,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\t// Keep track of which Loader we are about to use so we can pass the correct driver through\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await this.resolveContainer(\n\t\t\tloader,\n\t\t\trequestHeader,\n\t\t\tdriver,\n\t\t\tpendingLocalState,\n\t\t);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis.useCreateApi = true;\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/** Summarize the event with just the primary properties, for succinct output in case of test failure */\nconst primaryEventProps = ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n}: ITelemetryBaseEvent) => ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n\t[\"...\"]: \"*** Additional properties not shown, see full log for details ***\",\n});\n\n/**\n * @internal\n */\nexport function getUnexpectedLogErrorException(\n\tlogger: IEventAndErrorTrackingLogger | undefined,\n\tprefix?: string,\n) {\n\tif (logger === undefined) {\n\t\treturn;\n\t}\n\tconst results = logger.reportAndClearTrackedEvents();\n\tif (results.unexpectedErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Unexpected Errors in Logs:\\n${JSON.stringify(\n\t\t\t\tresults.unexpectedErrors.map(primaryEventProps),\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n\tif (results.expectedNotFound.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Expected Events not found:\\n${JSON.stringify(\n\t\t\t\tresults.expectedNotFound,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.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 { ITestDriver, TestDriverTypes } from \"@fluid-internal/test-driver-definitions\";\nimport {\n\tIContainer,\n\tIFluidCodeDetails,\n\tIHostLoader,\n\tILoader,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tILoaderProps,\n\tLoader,\n\twaitContainerToCatchUp as waitContainerToCatchUp_original,\n} from \"@fluidframework/container-loader/internal\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime/internal\";\nimport {\n\tIRequestHeader,\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryBaseProperties,\n\tTelemetryBaseEventPropertyType,\n} from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { isOdspResolvedUrl } from \"@fluidframework/odsp-driver/internal\";\nimport {\n\ttype ITelemetryGenericEventExt,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n\ttype ITelemetryLoggerPropertyBags,\n\tTelemetryDataTag,\n\ttagData,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { LoaderContainerTracker } from \"./loaderContainerTracker.js\";\nimport { LocalCodeLoader, fluidEntryPoint } from \"./localCodeLoader.js\";\nimport { createAndAttachContainer } from \"./localLoader.js\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject.js\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n\tpackage: \"defaultTestPackage\",\n\tconfig: {},\n};\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IOpProcessingController {\n\tprocessIncoming(...containers: IContainer[]): Promise<void>;\n\tprocessOutgoing(...containers: IContainer[]): Promise<void>;\n\tpauseProcessing(...containers: IContainer[]): Promise<void>;\n\tresumeProcessing(...containers: IContainer[]): void;\n}\n\n/**\n * @internal\n */\nexport interface ITestObjectProvider {\n\t/**\n\t * Indicates which type of test object provider is being used.\n\t */\n\ttype: \"TestObjectProvider\" | \"TestObjectProviderWithVersionedLoad\";\n\n\t/**\n\t * The document id to retrieve or create containers\n\t */\n\tdocumentId: string;\n\n\t/**\n\t * Creates the document service after extracting different endpoints URLs from a resolved URL.\n\t */\n\tdocumentServiceFactory: IDocumentServiceFactory;\n\n\t/**\n\t * Test driver used to create the IDocumentServiceFactory. Varies depending on the test type.\n\t */\n\tdriver: ITestDriver;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\tlogger: ITelemetryBaseLogger;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\ttracker: IEventAndErrorTrackingLogger;\n\n\t/**\n\t * Used to create a url for the created container with any data store path given in the relative url.\n\t */\n\turlResolver: IUrlResolver;\n\n\t/**\n\t * Default IFluidCodeDetails used to create containers.\n\t */\n\tdefaultCodeDetails: IFluidCodeDetails;\n\n\t/**\n\t * Contains functions to pause/resume op processing.\n\t */\n\topProcessingController: IOpProcessingController;\n\n\t/**\n\t * Represents the entry point for a Fluid container.\n\t */\n\tcreateFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint;\n\n\t/**\n\t * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t * @param loaderProps - Optional loader properties\n\t * @param forceUseCreateVersion - For Cross-Version compat testing, create a loader based on the create version\n\t */\n\tcreateLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion?: boolean,\n\t): IHostLoader;\n\n\t/**\n\t * Create a container using a default document id and code details.\n\t * Container created is automatically added to the OpProcessingController to manage op flow\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\n\tcreateContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Create a detached container much like createContainer, but without attaching it to the document service.\n\t */\n\tcreateDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Attaches a detached container to the document service.\n\t */\n\tattachDetachedContainer(container: IContainer): Promise<void>;\n\n\t/**\n\t * Loads a container using the default document id\n\t */\n\tloadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestLoader(testContainerConfig?: ITestContainerConfig): IHostLoader;\n\n\t/**\n\t * Make a container using a default document id and code details\n\t * Container loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>;\n\n\t/**\n\t * Load a container using a default document id and code details.\n\t * IContainer loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t * @param requestHeader - optional headers to be supplied to the loader\n\t */\n\tloadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdateDocumentId(url: IResolvedUrl | undefined): void;\n\n\t/**\n\t * Make sure all the tracked containers are synchronized.\n\t */\n\tensureSynchronized(...containers: IContainer[]): Promise<void>;\n\n\t/**\n\t * Reset the tracker, closing all containers and stop tracking them.\n\t */\n\tresetLoaderContainerTracker(syncSummarizerClients?: boolean);\n\n\t/**\n\t * Resets and closes all tracked containers and class states.\n\t */\n\treset(): void;\n}\n\n/**\n * @internal\n */\nexport enum DataObjectFactoryType {\n\tPrimed, // default\n\tTest,\n}\n\n/**\n * @internal\n */\nexport interface ITestContainerConfig {\n\t/** TestFluidDataObject instead of PrimedDataStore */\n\tfluidDataObjectType?: DataObjectFactoryType;\n\n\t/** An array of channel name and DDS factory pair to create on container creation time */\n\tregistry?: ChannelFactoryRegistry;\n\n\t/** Container runtime options for the container instance */\n\truntimeOptions?: IContainerRuntimeOptions;\n\n\t/** Whether this runtime should be instantiated using a mixed-in attributor class */\n\tenableAttribution?: boolean;\n\n\t/** For Cross-Version compat testing, load using the create version (e.g. use this to get a Summarizer on the create version) */\n\tforceUseCreateVersion?: true;\n\n\t/** Loader options for the loader used to create containers */\n\tloaderProps?: Partial<ILoaderProps>;\n}\n\n/**\n * @internal\n */\nexport const createDocumentId = (): string => uuid();\n\n/**\n * Used to retrieve, update, and reset document id based on the type of driver being used.\n *\n * @internal\n */\nexport interface IDocumentIdStrategy {\n\t/**\n\t * Get document id\n\t */\n\tget(): string;\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdate(resolvedUrl?: IResolvedUrl): void;\n\t/**\n\t * Reset document id to a new document id\n\t */\n\treset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n\tlet documentId = createDocumentId();\n\tswitch (type) {\n\t\tcase \"odsp\":\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: () => {}, // do not update the document ID in odsp test cases\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: (resolvedUrl?: IResolvedUrl) => {\n\t\t\t\t\t// Extract the document ID from the resolved container's URL and reset the ID property\n\t\t\t\t\tdocumentId = resolvedUrl?.id ?? documentId;\n\t\t\t\t},\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/** @internal */\nexport interface IEventAndErrorTrackingLogger {\n\tregisterExpectedEvent: (...orderedExpectedEvents: ITelemetryGenericEventExt[]) => void;\n\treportAndClearTrackedEvents: () => {\n\t\texpectedNotFound: { index: number; event: ITelemetryGenericEventExt }[];\n\t\tunexpectedErrors: ITelemetryBaseEvent[];\n\t};\n}\n\n/**\n * This class tracks events. It allows specifying expected events, which will be looked for in order.\n * It also tracks all unexpected errors.\n * At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and\n * any expected events that have not occurred.\n * @internal\n */\nexport class EventAndErrorTrackingLogger\n\timplements ITelemetryBaseLogger, IEventAndErrorTrackingLogger\n{\n\t/**\n\t * Even if these error events are logged, tests should still be allowed to pass\n\t * Additionally, if downgrade is true, then log as generic (e.g. to avoid polluting the e2e test logs)\n\t */\n\tprivate readonly allowedErrors: { eventName: string; downgrade?: true }[] = [\n\t\t// This log was removed in current version as unnecessary, but it's still present in previous versions\n\t\t{\n\t\t\teventName: \"fluid:telemetry:Container:NoRealStorageInDetachedContainer\",\n\t\t\tdowngrade: true,\n\t\t},\n\t\t// This log's category changes depending on the op latency. test results shouldn't be affected but if we see lots we'd like an alert from the logs.\n\t\t{ eventName: \"fluid:telemetry:OpRoundtripTime\" },\n\t];\n\n\tconstructor(private readonly baseLogger?: ITelemetryBaseLogger) {}\n\n\tprivate readonly expectedEvents: { index: number; event: ITelemetryGenericEventExt }[] = [];\n\tprivate readonly unexpectedErrors: ITelemetryBaseEvent[] = [];\n\n\tpublic registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEventExt[]) {\n\t\tif (this.expectedEvents.length !== 0) {\n\t\t\t// we don't have to error here. just no reason not to. given the events must be\n\t\t\t// ordered it could be tricky to figure out problems around multiple registrations.\n\t\t\tthrow new Error(\n\t\t\t\t\"Expected events already registered.\\n\" +\n\t\t\t\t\t\"Call reportAndClearTrackedEvents to clear them before registering more\",\n\t\t\t);\n\t\t}\n\t\tthis.expectedEvents.push(\n\t\t\t...orderedExpectedEvents.map((event, index) => ({ index, event })),\n\t\t);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tif (this.expectedEvents.length > 0) {\n\t\t\tconst ee = this.expectedEvents[0].event;\n\t\t\tif (ee.eventName === event.eventName) {\n\t\t\t\tlet matches = true;\n\t\t\t\tfor (const key of Object.keys(ee)) {\n\t\t\t\t\tif (ee[key] !== event[key]) {\n\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (matches) {\n\t\t\t\t\t// we found an expected event\n\t\t\t\t\t// so remove it from the list of expected events\n\t\t\t\t\t// and if it is an error, change it to generic\n\t\t\t\t\t// this helps keep our telemetry clear of\n\t\t\t\t\t// expected errors.\n\t\t\t\t\tthis.expectedEvents.shift();\n\t\t\t\t\tif (event.category === \"error\") {\n\t\t\t\t\t\tevent.category = \"generic\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.category === \"error\") {\n\t\t\t// Check to see if this error is allowed and if its category should be downgraded\n\t\t\tconst allowedError = this.allowedErrors.find(\n\t\t\t\t({ eventName }) => eventName === event.eventName,\n\t\t\t);\n\n\t\t\tif (allowedError === undefined) {\n\t\t\t\tthis.unexpectedErrors.push(event);\n\t\t\t} else if (allowedError.downgrade) {\n\t\t\t\tevent.category = \"generic\";\n\t\t\t}\n\t\t}\n\n\t\tthis.baseLogger?.send(event);\n\t}\n\n\tpublic reportAndClearTrackedEvents() {\n\t\tconst expectedNotFound = this.expectedEvents.splice(0, this.expectedEvents.length);\n\t\tconst unexpectedErrors = this.unexpectedErrors.splice(0, this.unexpectedErrors.length);\n\t\treturn {\n\t\t\texpectedNotFound,\n\t\t\tunexpectedErrors,\n\t\t};\n\t}\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n * @internal\n */\nexport class TestObjectProvider implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProvider\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n\t * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n\t * and factory for TestFluidObject\n\t */\n\tconstructor(\n\t\tprivate readonly LoaderConstructor: typeof Loader,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.driver}\n\t\t */\n\t\tpublic readonly driver: ITestDriver,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t\t */\n\t\tpublic readonly createFluidEntryPoint: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driver.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger(): ITelemetryBaseLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: {\n\t\t\t\t\tall: {\n\t\t\t\t\t\ttestType: this.type,\n\t\t\t\t\t\tdriverType: this.driver.type,\n\t\t\t\t\t\tdriverEndpointName: this.driver.endpointName,\n\t\t\t\t\t\tdriverTenantName: this.driver.tenantName,\n\t\t\t\t\t\tdriverUserIndex: this.driver.userIndex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driver.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driver.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructor({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\turl: await this.driver.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\n\t\tconst container = await this.resolveContainer(loader, requestHeader, pendingLocalState);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t\tthis.logger.send({\n\t\t\tcategory: \"generic\",\n\t\t\teventName: \"DocumentIdUpdated\",\n\t\t\t...getUrlTelemetryProps(resolvedUrl),\n\t\t});\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Implements {@link ITestObjectProvider}, but uses different versions to create and load containers.\n *\n * @internal\n */\nexport class TestObjectProviderWithVersionedLoad implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProviderWithVersionedLoad\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Used to determine which APIs to use when creating a loader.\n\t *\n\t * The first load will always use the create APIs, and then useCreateApi will be set to false to ensure all\n\t * subsequent loads use the load APIs.\n\t */\n\tprivate useCreateApi: boolean = true;\n\n\tconstructor(\n\t\tprivate readonly LoaderConstructorForCreating: typeof Loader,\n\t\tprivate readonly LoaderConstructorForLoading: typeof Loader,\n\t\tprivate readonly driverForCreating: ITestDriver,\n\t\tprivate readonly driverForLoading: ITestDriver,\n\t\tprivate readonly createFluidEntryPointForCreating: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly createFluidEntryPointForLoading: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly telemetryProps?: ITelemetryLoggerPropertyBags,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driverForCreating.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger() {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: this.telemetryProps,\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driverForCreating.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driverForCreating.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.driver}\n\t */\n\tpublic get driver(): ITestDriver {\n\t\treturn this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t */\n\tpublic get createFluidEntryPoint(): (\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t) => fluidEntryPoint {\n\t\treturn this.useCreateApi\n\t\t\t? this.createFluidEntryPointForCreating\n\t\t\t: this.createFluidEntryPointForLoading;\n\t}\n\n\tprivate createLoaderForCreating(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForCreating({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\tprivate createLoaderForLoading(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForLoading({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion = false,\n\t) {\n\t\tconst useCreateVersion = forceUseCreateVersion === true || this.useCreateApi;\n\t\tif (this.useCreateApi) {\n\t\t\t// After we create the first loader, we can set this.useCreateApi to false.\n\t\t\tthis.useCreateApi = false;\n\t\t}\n\t\tif (useCreateVersion) {\n\t\t\treturn this.createLoaderForCreating(packageEntries, loaderProps);\n\t\t}\n\t\treturn this.createLoaderForLoading(packageEntries, loaderProps);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, driver, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tdriver?: ITestDriver,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\turl: await driver!.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t\ttestContainerConfig?.forceUseCreateVersion,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\t// Keep track of which Loader we are about to use so we can pass the correct driver through\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await this.resolveContainer(\n\t\t\tloader,\n\t\t\trequestHeader,\n\t\t\tdriver,\n\t\t\tpendingLocalState,\n\t\t);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis.useCreateApi = true;\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t\tthis.logger.send({\n\t\t\tcategory: \"generic\",\n\t\t\teventName: \"DocumentIdUpdated\",\n\t\t\t...getUrlTelemetryProps(resolvedUrl),\n\t\t});\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Get identifying information for a resolved URL.\n * @remarks BEWARE: this function is only appropriate for usage in tests, as it logs unhashed document IDs,\n * which is a privacy concern for production scenarios.\n */\nfunction getUrlTelemetryProps(\n\tresolvedUrl: IResolvedUrl | undefined,\n): ITelemetryBaseProperties {\n\tif (!resolvedUrl) {\n\t\treturn {};\n\t}\n\n\tconst props: Record<string, TelemetryBaseEventPropertyType> = {\n\t\turl: resolvedUrl.url,\n\t\tid: resolvedUrl.id,\n\t};\n\n\tif (isOdspResolvedUrl(resolvedUrl)) {\n\t\tObject.assign(props, {\n\t\t\tsiteUrl: resolvedUrl.siteUrl,\n\t\t\tdriveId: resolvedUrl.driveId,\n\t\t\titemId: resolvedUrl.itemId,\n\t\t});\n\t}\n\n\treturn tagData(TelemetryDataTag.UserData, props);\n}\n\n/** Summarize the event with just the primary properties, for succinct output in case of test failure */\nconst primaryEventProps = ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n}: ITelemetryBaseEvent) => ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n\t[\"...\"]: \"*** Additional properties not shown, see full log for details ***\",\n});\n\n/**\n * @internal\n */\nexport function getUnexpectedLogErrorException(\n\tlogger: IEventAndErrorTrackingLogger | undefined,\n\tprefix?: string,\n) {\n\tif (logger === undefined) {\n\t\treturn;\n\t}\n\tconst results = logger.reportAndClearTrackedEvents();\n\tif (results.unexpectedErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Unexpected Errors in Logs:\\n${JSON.stringify(\n\t\t\t\tresults.unexpectedErrors.map(primaryEventProps),\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n\tif (results.expectedNotFound.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Expected Events not found:\\n${JSON.stringify(\n\t\t\t\tresults.expectedNotFound,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/test-utils";
|
|
8
|
-
export declare const pkgVersion = "2.4.0-
|
|
8
|
+
export declare const pkgVersion = "2.4.0-299374";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,4BAA4B,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/test-utils\";\nexport const pkgVersion = \"2.4.0-
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,4BAA4B,CAAC;AACpD,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/test-utils\";\nexport const pkgVersion = \"2.4.0-299374\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.d.ts","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAmB,MAAM,yCAAyC,CAAC;AACvF,OAAO,EACN,UAAU,EACV,iBAAiB,EACjB,WAAW,EAEX,MAAM,gDAAgD,CAAC;AACxD,OAAO,EACN,YAAY,EACZ,MAAM,EAEN,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"testObjectProvider.d.ts","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { waitContainerToCatchUp as waitContainerToCatchUp_original, } from "@fluidframework/container-loader/internal";
|
|
6
6
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
|
-
import {
|
|
7
|
+
import { isOdspResolvedUrl } from "@fluidframework/odsp-driver/internal";
|
|
8
|
+
import { createChildLogger, createMultiSinkLogger, TelemetryDataTag, tagData, } from "@fluidframework/telemetry-utils/internal";
|
|
8
9
|
import { v4 as uuid } from "uuid";
|
|
9
10
|
import { LoaderContainerTracker } from "./loaderContainerTracker.js";
|
|
10
11
|
import { LocalCodeLoader } from "./localCodeLoader.js";
|
|
@@ -255,7 +256,7 @@ export class TestObjectProvider {
|
|
|
255
256
|
this._documentCreated = true;
|
|
256
257
|
// r11s driver will generate a new ID for the new container.
|
|
257
258
|
// update the document ID with the actual ID of the attached container.
|
|
258
|
-
this.
|
|
259
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
259
260
|
return container;
|
|
260
261
|
}
|
|
261
262
|
/**
|
|
@@ -277,7 +278,7 @@ export class TestObjectProvider {
|
|
|
277
278
|
}
|
|
278
279
|
await container.attach(this.driver.createCreateNewRequest(this.documentId));
|
|
279
280
|
this._documentCreated = true;
|
|
280
|
-
this.
|
|
281
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
281
282
|
}
|
|
282
283
|
/**
|
|
283
284
|
* {@inheritDoc ITestObjectProvider.loadContainer}
|
|
@@ -310,7 +311,7 @@ export class TestObjectProvider {
|
|
|
310
311
|
this._documentCreated = true;
|
|
311
312
|
// r11s driver will generate a new ID for the new container.
|
|
312
313
|
// update the document ID with the actual ID of the attached container.
|
|
313
|
-
this.
|
|
314
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
314
315
|
return container;
|
|
315
316
|
}
|
|
316
317
|
/**
|
|
@@ -359,6 +360,11 @@ export class TestObjectProvider {
|
|
|
359
360
|
*/
|
|
360
361
|
updateDocumentId(resolvedUrl) {
|
|
361
362
|
this._documentIdStrategy.update(resolvedUrl);
|
|
363
|
+
this.logger.send({
|
|
364
|
+
category: "generic",
|
|
365
|
+
eventName: "DocumentIdUpdated",
|
|
366
|
+
...getUrlTelemetryProps(resolvedUrl),
|
|
367
|
+
});
|
|
362
368
|
}
|
|
363
369
|
/**
|
|
364
370
|
* {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}
|
|
@@ -520,7 +526,7 @@ export class TestObjectProviderWithVersionedLoad {
|
|
|
520
526
|
this._documentCreated = true;
|
|
521
527
|
// r11s driver will generate a new ID for the new container.
|
|
522
528
|
// update the document ID with the actual ID of the attached container.
|
|
523
|
-
this.
|
|
529
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
524
530
|
return container;
|
|
525
531
|
}
|
|
526
532
|
/**
|
|
@@ -542,7 +548,7 @@ export class TestObjectProviderWithVersionedLoad {
|
|
|
542
548
|
}
|
|
543
549
|
await container.attach(this.driver.createCreateNewRequest(this.documentId));
|
|
544
550
|
this._documentCreated = true;
|
|
545
|
-
this.
|
|
551
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
546
552
|
}
|
|
547
553
|
/**
|
|
548
554
|
* {@inheritDoc ITestObjectProvider.loadContainer}
|
|
@@ -577,7 +583,7 @@ export class TestObjectProviderWithVersionedLoad {
|
|
|
577
583
|
this._documentCreated = true;
|
|
578
584
|
// r11s driver will generate a new ID for the new container.
|
|
579
585
|
// update the document ID with the actual ID of the attached container.
|
|
580
|
-
this.
|
|
586
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
581
587
|
return container;
|
|
582
588
|
}
|
|
583
589
|
/**
|
|
@@ -629,6 +635,11 @@ export class TestObjectProviderWithVersionedLoad {
|
|
|
629
635
|
*/
|
|
630
636
|
updateDocumentId(resolvedUrl) {
|
|
631
637
|
this._documentIdStrategy.update(resolvedUrl);
|
|
638
|
+
this.logger.send({
|
|
639
|
+
category: "generic",
|
|
640
|
+
eventName: "DocumentIdUpdated",
|
|
641
|
+
...getUrlTelemetryProps(resolvedUrl),
|
|
642
|
+
});
|
|
632
643
|
}
|
|
633
644
|
/**
|
|
634
645
|
* {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}
|
|
@@ -638,6 +649,28 @@ export class TestObjectProviderWithVersionedLoad {
|
|
|
638
649
|
this._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);
|
|
639
650
|
}
|
|
640
651
|
}
|
|
652
|
+
/**
|
|
653
|
+
* Get identifying information for a resolved URL.
|
|
654
|
+
* @remarks BEWARE: this function is only appropriate for usage in tests, as it logs unhashed document IDs,
|
|
655
|
+
* which is a privacy concern for production scenarios.
|
|
656
|
+
*/
|
|
657
|
+
function getUrlTelemetryProps(resolvedUrl) {
|
|
658
|
+
if (!resolvedUrl) {
|
|
659
|
+
return {};
|
|
660
|
+
}
|
|
661
|
+
const props = {
|
|
662
|
+
url: resolvedUrl.url,
|
|
663
|
+
id: resolvedUrl.id,
|
|
664
|
+
};
|
|
665
|
+
if (isOdspResolvedUrl(resolvedUrl)) {
|
|
666
|
+
Object.assign(props, {
|
|
667
|
+
siteUrl: resolvedUrl.siteUrl,
|
|
668
|
+
driveId: resolvedUrl.driveId,
|
|
669
|
+
itemId: resolvedUrl.itemId,
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
return tagData(TelemetryDataTag.UserData, props);
|
|
673
|
+
}
|
|
641
674
|
/** Summarize the event with just the primary properties, for succinct output in case of test failure */
|
|
642
675
|
const primaryEventProps = ({ category, eventName, error, errorType, }) => ({
|
|
643
676
|
category,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.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 { ITestDriver, TestDriverTypes } from \"@fluid-internal/test-driver-definitions\";\nimport {\n\tIContainer,\n\tIFluidCodeDetails,\n\tIHostLoader,\n\tILoader,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tILoaderProps,\n\tLoader,\n\twaitContainerToCatchUp as waitContainerToCatchUp_original,\n} from \"@fluidframework/container-loader/internal\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime/internal\";\nimport {\n\tIRequestHeader,\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\ttype ITelemetryGenericEventExt,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n\ttype ITelemetryLoggerPropertyBags,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { LoaderContainerTracker } from \"./loaderContainerTracker.js\";\nimport { LocalCodeLoader, fluidEntryPoint } from \"./localCodeLoader.js\";\nimport { createAndAttachContainer } from \"./localLoader.js\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject.js\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n\tpackage: \"defaultTestPackage\",\n\tconfig: {},\n};\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IOpProcessingController {\n\tprocessIncoming(...containers: IContainer[]): Promise<void>;\n\tprocessOutgoing(...containers: IContainer[]): Promise<void>;\n\tpauseProcessing(...containers: IContainer[]): Promise<void>;\n\tresumeProcessing(...containers: IContainer[]): void;\n}\n\n/**\n * @internal\n */\nexport interface ITestObjectProvider {\n\t/**\n\t * Indicates which type of test object provider is being used.\n\t */\n\ttype: \"TestObjectProvider\" | \"TestObjectProviderWithVersionedLoad\";\n\n\t/**\n\t * The document id to retrieve or create containers\n\t */\n\tdocumentId: string;\n\n\t/**\n\t * Creates the document service after extracting different endpoints URLs from a resolved URL.\n\t */\n\tdocumentServiceFactory: IDocumentServiceFactory;\n\n\t/**\n\t * Test driver used to create the IDocumentServiceFactory. Varies depending on the test type.\n\t */\n\tdriver: ITestDriver;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\tlogger: ITelemetryBaseLogger;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\ttracker: IEventAndErrorTrackingLogger;\n\n\t/**\n\t * Used to create a url for the created container with any data store path given in the relative url.\n\t */\n\turlResolver: IUrlResolver;\n\n\t/**\n\t * Default IFluidCodeDetails used to create containers.\n\t */\n\tdefaultCodeDetails: IFluidCodeDetails;\n\n\t/**\n\t * Contains functions to pause/resume op processing.\n\t */\n\topProcessingController: IOpProcessingController;\n\n\t/**\n\t * Represents the entry point for a Fluid container.\n\t */\n\tcreateFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint;\n\n\t/**\n\t * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t * @param loaderProps - Optional loader properties\n\t * @param forceUseCreateVersion - For Cross-Version compat testing, create a loader based on the create version\n\t */\n\tcreateLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion?: boolean,\n\t): IHostLoader;\n\n\t/**\n\t * Create a container using a default document id and code details.\n\t * Container created is automatically added to the OpProcessingController to manage op flow\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\n\tcreateContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Create a detached container much like createContainer, but without attaching it to the document service.\n\t */\n\tcreateDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Attaches a detached container to the document service.\n\t */\n\tattachDetachedContainer(container: IContainer): Promise<void>;\n\n\t/**\n\t * Loads a container using the default document id\n\t */\n\tloadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestLoader(testContainerConfig?: ITestContainerConfig): IHostLoader;\n\n\t/**\n\t * Make a container using a default document id and code details\n\t * Container loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>;\n\n\t/**\n\t * Load a container using a default document id and code details.\n\t * IContainer loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t * @param requestHeader - optional headers to be supplied to the loader\n\t */\n\tloadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdateDocumentId(url: IResolvedUrl | undefined): void;\n\n\t/**\n\t * Make sure all the tracked containers are synchronized.\n\t */\n\tensureSynchronized(...containers: IContainer[]): Promise<void>;\n\n\t/**\n\t * Reset the tracker, closing all containers and stop tracking them.\n\t */\n\tresetLoaderContainerTracker(syncSummarizerClients?: boolean);\n\n\t/**\n\t * Resets and closes all tracked containers and class states.\n\t */\n\treset(): void;\n}\n\n/**\n * @internal\n */\nexport enum DataObjectFactoryType {\n\tPrimed, // default\n\tTest,\n}\n\n/**\n * @internal\n */\nexport interface ITestContainerConfig {\n\t/** TestFluidDataObject instead of PrimedDataStore */\n\tfluidDataObjectType?: DataObjectFactoryType;\n\n\t/** An array of channel name and DDS factory pair to create on container creation time */\n\tregistry?: ChannelFactoryRegistry;\n\n\t/** Container runtime options for the container instance */\n\truntimeOptions?: IContainerRuntimeOptions;\n\n\t/** Whether this runtime should be instantiated using a mixed-in attributor class */\n\tenableAttribution?: boolean;\n\n\t/** For Cross-Version compat testing, load using the create version (e.g. use this to get a Summarizer on the create version) */\n\tforceUseCreateVersion?: true;\n\n\t/** Loader options for the loader used to create containers */\n\tloaderProps?: Partial<ILoaderProps>;\n}\n\n/**\n * @internal\n */\nexport const createDocumentId = (): string => uuid();\n\n/**\n * Used to retrieve, update, and reset document id based on the type of driver being used.\n *\n * @internal\n */\nexport interface IDocumentIdStrategy {\n\t/**\n\t * Get document id\n\t */\n\tget(): string;\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdate(resolvedUrl?: IResolvedUrl): void;\n\t/**\n\t * Reset document id to a new document id\n\t */\n\treset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n\tlet documentId = createDocumentId();\n\tswitch (type) {\n\t\tcase \"odsp\":\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: () => {}, // do not update the document ID in odsp test cases\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: (resolvedUrl?: IResolvedUrl) => {\n\t\t\t\t\t// Extract the document ID from the resolved container's URL and reset the ID property\n\t\t\t\t\tdocumentId = resolvedUrl?.id ?? documentId;\n\t\t\t\t},\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/** @internal */\nexport interface IEventAndErrorTrackingLogger {\n\tregisterExpectedEvent: (...orderedExpectedEvents: ITelemetryGenericEventExt[]) => void;\n\treportAndClearTrackedEvents: () => {\n\t\texpectedNotFound: { index: number; event: ITelemetryGenericEventExt }[];\n\t\tunexpectedErrors: ITelemetryBaseEvent[];\n\t};\n}\n\n/**\n * This class tracks events. It allows specifying expected events, which will be looked for in order.\n * It also tracks all unexpected errors.\n * At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and\n * any expected events that have not occurred.\n * @internal\n */\nexport class EventAndErrorTrackingLogger\n\timplements ITelemetryBaseLogger, IEventAndErrorTrackingLogger\n{\n\t/**\n\t * Even if these error events are logged, tests should still be allowed to pass\n\t * Additionally, if downgrade is true, then log as generic (e.g. to avoid polluting the e2e test logs)\n\t */\n\tprivate readonly allowedErrors: { eventName: string; downgrade?: true }[] = [\n\t\t// This log was removed in current version as unnecessary, but it's still present in previous versions\n\t\t{\n\t\t\teventName: \"fluid:telemetry:Container:NoRealStorageInDetachedContainer\",\n\t\t\tdowngrade: true,\n\t\t},\n\t\t// This log's category changes depending on the op latency. test results shouldn't be affected but if we see lots we'd like an alert from the logs.\n\t\t{ eventName: \"fluid:telemetry:OpRoundtripTime\" },\n\t];\n\n\tconstructor(private readonly baseLogger?: ITelemetryBaseLogger) {}\n\n\tprivate readonly expectedEvents: { index: number; event: ITelemetryGenericEventExt }[] = [];\n\tprivate readonly unexpectedErrors: ITelemetryBaseEvent[] = [];\n\n\tpublic registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEventExt[]) {\n\t\tif (this.expectedEvents.length !== 0) {\n\t\t\t// we don't have to error here. just no reason not to. given the events must be\n\t\t\t// ordered it could be tricky to figure out problems around multiple registrations.\n\t\t\tthrow new Error(\n\t\t\t\t\"Expected events already registered.\\n\" +\n\t\t\t\t\t\"Call reportAndClearTrackedEvents to clear them before registering more\",\n\t\t\t);\n\t\t}\n\t\tthis.expectedEvents.push(\n\t\t\t...orderedExpectedEvents.map((event, index) => ({ index, event })),\n\t\t);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tif (this.expectedEvents.length > 0) {\n\t\t\tconst ee = this.expectedEvents[0].event;\n\t\t\tif (ee.eventName === event.eventName) {\n\t\t\t\tlet matches = true;\n\t\t\t\tfor (const key of Object.keys(ee)) {\n\t\t\t\t\tif (ee[key] !== event[key]) {\n\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (matches) {\n\t\t\t\t\t// we found an expected event\n\t\t\t\t\t// so remove it from the list of expected events\n\t\t\t\t\t// and if it is an error, change it to generic\n\t\t\t\t\t// this helps keep our telemetry clear of\n\t\t\t\t\t// expected errors.\n\t\t\t\t\tthis.expectedEvents.shift();\n\t\t\t\t\tif (event.category === \"error\") {\n\t\t\t\t\t\tevent.category = \"generic\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.category === \"error\") {\n\t\t\t// Check to see if this error is allowed and if its category should be downgraded\n\t\t\tconst allowedError = this.allowedErrors.find(\n\t\t\t\t({ eventName }) => eventName === event.eventName,\n\t\t\t);\n\n\t\t\tif (allowedError === undefined) {\n\t\t\t\tthis.unexpectedErrors.push(event);\n\t\t\t} else if (allowedError.downgrade) {\n\t\t\t\tevent.category = \"generic\";\n\t\t\t}\n\t\t}\n\n\t\tthis.baseLogger?.send(event);\n\t}\n\n\tpublic reportAndClearTrackedEvents() {\n\t\tconst expectedNotFound = this.expectedEvents.splice(0, this.expectedEvents.length);\n\t\tconst unexpectedErrors = this.unexpectedErrors.splice(0, this.unexpectedErrors.length);\n\t\treturn {\n\t\t\texpectedNotFound,\n\t\t\tunexpectedErrors,\n\t\t};\n\t}\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n * @internal\n */\nexport class TestObjectProvider implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProvider\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n\t * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n\t * and factory for TestFluidObject\n\t */\n\tconstructor(\n\t\tprivate readonly LoaderConstructor: typeof Loader,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.driver}\n\t\t */\n\t\tpublic readonly driver: ITestDriver,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t\t */\n\t\tpublic readonly createFluidEntryPoint: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driver.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger(): ITelemetryBaseLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: {\n\t\t\t\t\tall: {\n\t\t\t\t\t\ttestType: this.type,\n\t\t\t\t\t\tdriverType: this.driver.type,\n\t\t\t\t\t\tdriverEndpointName: this.driver.endpointName,\n\t\t\t\t\t\tdriverTenantName: this.driver.tenantName,\n\t\t\t\t\t\tdriverUserIndex: this.driver.userIndex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driver.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driver.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructor({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\turl: await this.driver.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\n\t\tconst container = await this.resolveContainer(loader, requestHeader, pendingLocalState);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Implements {@link ITestObjectProvider}, but uses different versions to create and load containers.\n *\n * @internal\n */\nexport class TestObjectProviderWithVersionedLoad implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProviderWithVersionedLoad\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Used to determine which APIs to use when creating a loader.\n\t *\n\t * The first load will always use the create APIs, and then useCreateApi will be set to false to ensure all\n\t * subsequent loads use the load APIs.\n\t */\n\tprivate useCreateApi: boolean = true;\n\n\tconstructor(\n\t\tprivate readonly LoaderConstructorForCreating: typeof Loader,\n\t\tprivate readonly LoaderConstructorForLoading: typeof Loader,\n\t\tprivate readonly driverForCreating: ITestDriver,\n\t\tprivate readonly driverForLoading: ITestDriver,\n\t\tprivate readonly createFluidEntryPointForCreating: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly createFluidEntryPointForLoading: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly telemetryProps?: ITelemetryLoggerPropertyBags,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driverForCreating.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger() {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: this.telemetryProps,\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driverForCreating.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driverForCreating.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.driver}\n\t */\n\tpublic get driver(): ITestDriver {\n\t\treturn this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t */\n\tpublic get createFluidEntryPoint(): (\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t) => fluidEntryPoint {\n\t\treturn this.useCreateApi\n\t\t\t? this.createFluidEntryPointForCreating\n\t\t\t: this.createFluidEntryPointForLoading;\n\t}\n\n\tprivate createLoaderForCreating(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForCreating({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\tprivate createLoaderForLoading(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForLoading({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion = false,\n\t) {\n\t\tconst useCreateVersion = forceUseCreateVersion === true || this.useCreateApi;\n\t\tif (this.useCreateApi) {\n\t\t\t// After we create the first loader, we can set this.useCreateApi to false.\n\t\t\tthis.useCreateApi = false;\n\t\t}\n\t\tif (useCreateVersion) {\n\t\t\treturn this.createLoaderForCreating(packageEntries, loaderProps);\n\t\t}\n\t\treturn this.createLoaderForLoading(packageEntries, loaderProps);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, driver, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tdriver?: ITestDriver,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\turl: await driver!.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t\ttestContainerConfig?.forceUseCreateVersion,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\t// Keep track of which Loader we are about to use so we can pass the correct driver through\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await this.resolveContainer(\n\t\t\tloader,\n\t\t\trequestHeader,\n\t\t\tdriver,\n\t\t\tpendingLocalState,\n\t\t);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis.useCreateApi = true;\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/** Summarize the event with just the primary properties, for succinct output in case of test failure */\nconst primaryEventProps = ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n}: ITelemetryBaseEvent) => ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n\t[\"...\"]: \"*** Additional properties not shown, see full log for details ***\",\n});\n\n/**\n * @internal\n */\nexport function getUnexpectedLogErrorException(\n\tlogger: IEventAndErrorTrackingLogger | undefined,\n\tprefix?: string,\n) {\n\tif (logger === undefined) {\n\t\treturn;\n\t}\n\tconst results = logger.reportAndClearTrackedEvents();\n\tif (results.unexpectedErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Unexpected Errors in Logs:\\n${JSON.stringify(\n\t\t\t\tresults.unexpectedErrors.map(primaryEventProps),\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n\tif (results.expectedNotFound.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Expected Events not found:\\n${JSON.stringify(\n\t\t\t\tresults.expectedNotFound,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.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 { ITestDriver, TestDriverTypes } from \"@fluid-internal/test-driver-definitions\";\nimport {\n\tIContainer,\n\tIFluidCodeDetails,\n\tIHostLoader,\n\tILoader,\n} from \"@fluidframework/container-definitions/internal\";\nimport {\n\tILoaderProps,\n\tLoader,\n\twaitContainerToCatchUp as waitContainerToCatchUp_original,\n} from \"@fluidframework/container-loader/internal\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime/internal\";\nimport {\n\tIRequestHeader,\n\tITelemetryBaseEvent,\n\tITelemetryBaseLogger,\n\tITelemetryBaseProperties,\n\tTelemetryBaseEventPropertyType,\n} from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { isOdspResolvedUrl } from \"@fluidframework/odsp-driver/internal\";\nimport {\n\ttype ITelemetryGenericEventExt,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n\ttype ITelemetryLoggerPropertyBags,\n\tTelemetryDataTag,\n\ttagData,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { LoaderContainerTracker } from \"./loaderContainerTracker.js\";\nimport { LocalCodeLoader, fluidEntryPoint } from \"./localCodeLoader.js\";\nimport { createAndAttachContainer } from \"./localLoader.js\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject.js\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n\tpackage: \"defaultTestPackage\",\n\tconfig: {},\n};\n\n/**\n * @legacy\n * @alpha\n */\nexport interface IOpProcessingController {\n\tprocessIncoming(...containers: IContainer[]): Promise<void>;\n\tprocessOutgoing(...containers: IContainer[]): Promise<void>;\n\tpauseProcessing(...containers: IContainer[]): Promise<void>;\n\tresumeProcessing(...containers: IContainer[]): void;\n}\n\n/**\n * @internal\n */\nexport interface ITestObjectProvider {\n\t/**\n\t * Indicates which type of test object provider is being used.\n\t */\n\ttype: \"TestObjectProvider\" | \"TestObjectProviderWithVersionedLoad\";\n\n\t/**\n\t * The document id to retrieve or create containers\n\t */\n\tdocumentId: string;\n\n\t/**\n\t * Creates the document service after extracting different endpoints URLs from a resolved URL.\n\t */\n\tdocumentServiceFactory: IDocumentServiceFactory;\n\n\t/**\n\t * Test driver used to create the IDocumentServiceFactory. Varies depending on the test type.\n\t */\n\tdriver: ITestDriver;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\tlogger: ITelemetryBaseLogger;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\ttracker: IEventAndErrorTrackingLogger;\n\n\t/**\n\t * Used to create a url for the created container with any data store path given in the relative url.\n\t */\n\turlResolver: IUrlResolver;\n\n\t/**\n\t * Default IFluidCodeDetails used to create containers.\n\t */\n\tdefaultCodeDetails: IFluidCodeDetails;\n\n\t/**\n\t * Contains functions to pause/resume op processing.\n\t */\n\topProcessingController: IOpProcessingController;\n\n\t/**\n\t * Represents the entry point for a Fluid container.\n\t */\n\tcreateFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint;\n\n\t/**\n\t * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t * @param loaderProps - Optional loader properties\n\t * @param forceUseCreateVersion - For Cross-Version compat testing, create a loader based on the create version\n\t */\n\tcreateLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion?: boolean,\n\t): IHostLoader;\n\n\t/**\n\t * Create a container using a default document id and code details.\n\t * Container created is automatically added to the OpProcessingController to manage op flow\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\n\tcreateContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Create a detached container much like createContainer, but without attaching it to the document service.\n\t */\n\tcreateDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Attaches a detached container to the document service.\n\t */\n\tattachDetachedContainer(container: IContainer): Promise<void>;\n\n\t/**\n\t * Loads a container using the default document id\n\t */\n\tloadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestLoader(testContainerConfig?: ITestContainerConfig): IHostLoader;\n\n\t/**\n\t * Make a container using a default document id and code details\n\t * Container loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>;\n\n\t/**\n\t * Load a container using a default document id and code details.\n\t * IContainer loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t * @param requestHeader - optional headers to be supplied to the loader\n\t */\n\tloadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdateDocumentId(url: IResolvedUrl | undefined): void;\n\n\t/**\n\t * Make sure all the tracked containers are synchronized.\n\t */\n\tensureSynchronized(...containers: IContainer[]): Promise<void>;\n\n\t/**\n\t * Reset the tracker, closing all containers and stop tracking them.\n\t */\n\tresetLoaderContainerTracker(syncSummarizerClients?: boolean);\n\n\t/**\n\t * Resets and closes all tracked containers and class states.\n\t */\n\treset(): void;\n}\n\n/**\n * @internal\n */\nexport enum DataObjectFactoryType {\n\tPrimed, // default\n\tTest,\n}\n\n/**\n * @internal\n */\nexport interface ITestContainerConfig {\n\t/** TestFluidDataObject instead of PrimedDataStore */\n\tfluidDataObjectType?: DataObjectFactoryType;\n\n\t/** An array of channel name and DDS factory pair to create on container creation time */\n\tregistry?: ChannelFactoryRegistry;\n\n\t/** Container runtime options for the container instance */\n\truntimeOptions?: IContainerRuntimeOptions;\n\n\t/** Whether this runtime should be instantiated using a mixed-in attributor class */\n\tenableAttribution?: boolean;\n\n\t/** For Cross-Version compat testing, load using the create version (e.g. use this to get a Summarizer on the create version) */\n\tforceUseCreateVersion?: true;\n\n\t/** Loader options for the loader used to create containers */\n\tloaderProps?: Partial<ILoaderProps>;\n}\n\n/**\n * @internal\n */\nexport const createDocumentId = (): string => uuid();\n\n/**\n * Used to retrieve, update, and reset document id based on the type of driver being used.\n *\n * @internal\n */\nexport interface IDocumentIdStrategy {\n\t/**\n\t * Get document id\n\t */\n\tget(): string;\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdate(resolvedUrl?: IResolvedUrl): void;\n\t/**\n\t * Reset document id to a new document id\n\t */\n\treset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n\tlet documentId = createDocumentId();\n\tswitch (type) {\n\t\tcase \"odsp\":\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: () => {}, // do not update the document ID in odsp test cases\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: (resolvedUrl?: IResolvedUrl) => {\n\t\t\t\t\t// Extract the document ID from the resolved container's URL and reset the ID property\n\t\t\t\t\tdocumentId = resolvedUrl?.id ?? documentId;\n\t\t\t\t},\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/** @internal */\nexport interface IEventAndErrorTrackingLogger {\n\tregisterExpectedEvent: (...orderedExpectedEvents: ITelemetryGenericEventExt[]) => void;\n\treportAndClearTrackedEvents: () => {\n\t\texpectedNotFound: { index: number; event: ITelemetryGenericEventExt }[];\n\t\tunexpectedErrors: ITelemetryBaseEvent[];\n\t};\n}\n\n/**\n * This class tracks events. It allows specifying expected events, which will be looked for in order.\n * It also tracks all unexpected errors.\n * At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and\n * any expected events that have not occurred.\n * @internal\n */\nexport class EventAndErrorTrackingLogger\n\timplements ITelemetryBaseLogger, IEventAndErrorTrackingLogger\n{\n\t/**\n\t * Even if these error events are logged, tests should still be allowed to pass\n\t * Additionally, if downgrade is true, then log as generic (e.g. to avoid polluting the e2e test logs)\n\t */\n\tprivate readonly allowedErrors: { eventName: string; downgrade?: true }[] = [\n\t\t// This log was removed in current version as unnecessary, but it's still present in previous versions\n\t\t{\n\t\t\teventName: \"fluid:telemetry:Container:NoRealStorageInDetachedContainer\",\n\t\t\tdowngrade: true,\n\t\t},\n\t\t// This log's category changes depending on the op latency. test results shouldn't be affected but if we see lots we'd like an alert from the logs.\n\t\t{ eventName: \"fluid:telemetry:OpRoundtripTime\" },\n\t];\n\n\tconstructor(private readonly baseLogger?: ITelemetryBaseLogger) {}\n\n\tprivate readonly expectedEvents: { index: number; event: ITelemetryGenericEventExt }[] = [];\n\tprivate readonly unexpectedErrors: ITelemetryBaseEvent[] = [];\n\n\tpublic registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEventExt[]) {\n\t\tif (this.expectedEvents.length !== 0) {\n\t\t\t// we don't have to error here. just no reason not to. given the events must be\n\t\t\t// ordered it could be tricky to figure out problems around multiple registrations.\n\t\t\tthrow new Error(\n\t\t\t\t\"Expected events already registered.\\n\" +\n\t\t\t\t\t\"Call reportAndClearTrackedEvents to clear them before registering more\",\n\t\t\t);\n\t\t}\n\t\tthis.expectedEvents.push(\n\t\t\t...orderedExpectedEvents.map((event, index) => ({ index, event })),\n\t\t);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tif (this.expectedEvents.length > 0) {\n\t\t\tconst ee = this.expectedEvents[0].event;\n\t\t\tif (ee.eventName === event.eventName) {\n\t\t\t\tlet matches = true;\n\t\t\t\tfor (const key of Object.keys(ee)) {\n\t\t\t\t\tif (ee[key] !== event[key]) {\n\t\t\t\t\t\tmatches = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (matches) {\n\t\t\t\t\t// we found an expected event\n\t\t\t\t\t// so remove it from the list of expected events\n\t\t\t\t\t// and if it is an error, change it to generic\n\t\t\t\t\t// this helps keep our telemetry clear of\n\t\t\t\t\t// expected errors.\n\t\t\t\t\tthis.expectedEvents.shift();\n\t\t\t\t\tif (event.category === \"error\") {\n\t\t\t\t\t\tevent.category = \"generic\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.category === \"error\") {\n\t\t\t// Check to see if this error is allowed and if its category should be downgraded\n\t\t\tconst allowedError = this.allowedErrors.find(\n\t\t\t\t({ eventName }) => eventName === event.eventName,\n\t\t\t);\n\n\t\t\tif (allowedError === undefined) {\n\t\t\t\tthis.unexpectedErrors.push(event);\n\t\t\t} else if (allowedError.downgrade) {\n\t\t\t\tevent.category = \"generic\";\n\t\t\t}\n\t\t}\n\n\t\tthis.baseLogger?.send(event);\n\t}\n\n\tpublic reportAndClearTrackedEvents() {\n\t\tconst expectedNotFound = this.expectedEvents.splice(0, this.expectedEvents.length);\n\t\tconst unexpectedErrors = this.unexpectedErrors.splice(0, this.unexpectedErrors.length);\n\t\treturn {\n\t\t\texpectedNotFound,\n\t\t\tunexpectedErrors,\n\t\t};\n\t}\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n * @internal\n */\nexport class TestObjectProvider implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProvider\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n\t * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n\t * and factory for TestFluidObject\n\t */\n\tconstructor(\n\t\tprivate readonly LoaderConstructor: typeof Loader,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.driver}\n\t\t */\n\t\tpublic readonly driver: ITestDriver,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t\t */\n\t\tpublic readonly createFluidEntryPoint: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driver.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger(): ITelemetryBaseLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: {\n\t\t\t\t\tall: {\n\t\t\t\t\t\ttestType: this.type,\n\t\t\t\t\t\tdriverType: this.driver.type,\n\t\t\t\t\t\tdriverEndpointName: this.driver.endpointName,\n\t\t\t\t\t\tdriverTenantName: this.driver.tenantName,\n\t\t\t\t\t\tdriverUserIndex: this.driver.userIndex,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driver.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driver.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructor({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\turl: await this.driver.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\n\t\tconst container = await this.resolveContainer(loader, requestHeader, pendingLocalState);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t\tthis.logger.send({\n\t\t\tcategory: \"generic\",\n\t\t\teventName: \"DocumentIdUpdated\",\n\t\t\t...getUrlTelemetryProps(resolvedUrl),\n\t\t});\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Implements {@link ITestObjectProvider}, but uses different versions to create and load containers.\n *\n * @internal\n */\nexport class TestObjectProviderWithVersionedLoad implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProviderWithVersionedLoad\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _logger: ITelemetryBaseLogger | undefined;\n\tprivate _tracker: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Used to determine which APIs to use when creating a loader.\n\t *\n\t * The first load will always use the create APIs, and then useCreateApi will be set to false to ensure all\n\t * subsequent loads use the load APIs.\n\t */\n\tprivate useCreateApi: boolean = true;\n\n\tconstructor(\n\t\tprivate readonly LoaderConstructorForCreating: typeof Loader,\n\t\tprivate readonly LoaderConstructorForLoading: typeof Loader,\n\t\tprivate readonly driverForCreating: ITestDriver,\n\t\tprivate readonly driverForLoading: ITestDriver,\n\t\tprivate readonly createFluidEntryPointForCreating: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly createFluidEntryPointForLoading: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly telemetryProps?: ITelemetryLoggerPropertyBags,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driverForCreating.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger() {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._tracker = new EventAndErrorTrackingLogger(getTestLogger?.());\n\t\t\tthis._logger = createChildLogger({\n\t\t\t\tlogger: this._tracker,\n\t\t\t\tproperties: this.telemetryProps,\n\t\t\t});\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tpublic get tracker() {\n\t\tvoid this.logger;\n\t\tassert(this._tracker !== undefined, \"should be initialized\");\n\t\treturn this._tracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driverForCreating.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driverForCreating.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.driver}\n\t */\n\tpublic get driver(): ITestDriver {\n\t\treturn this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t */\n\tpublic get createFluidEntryPoint(): (\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t) => fluidEntryPoint {\n\t\treturn this.useCreateApi\n\t\t\t? this.createFluidEntryPointForCreating\n\t\t\t: this.createFluidEntryPointForLoading;\n\t}\n\n\tprivate createLoaderForCreating(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForCreating({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\tprivate createLoaderForLoading(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForLoading({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\tforceUseCreateVersion = false,\n\t) {\n\t\tconst useCreateVersion = forceUseCreateVersion === true || this.useCreateApi;\n\t\tif (this.useCreateApi) {\n\t\t\t// After we create the first loader, we can set this.useCreateApi to false.\n\t\t\tthis.useCreateApi = false;\n\t\t}\n\t\tif (useCreateVersion) {\n\t\t\treturn this.createLoaderForCreating(packageEntries, loaderProps);\n\t\t}\n\t\treturn this.createLoaderForLoading(packageEntries, loaderProps);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.createDetachedContainer}\n\t */\n\tpublic async createDetachedContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps> | undefined,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn loader.createDetachedContainer(defaultCodeDetails);\n\t}\n\n\t/**\n\t * {@inheritdoc ITestObjectProvider.attachDetachedContainer}\n\t */\n\tpublic async attachDetachedContainer(container: IContainer): Promise<void> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tawait container.attach(this.driver.createCreateNewRequest(this.documentId));\n\t\tthis._documentCreated = true;\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingState?: string,\n\t): Promise<IContainer> {\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, driver, pendingState);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tdriver?: ITestDriver,\n\t\tpendingLocalState?: string,\n\t) {\n\t\treturn loader.resolve(\n\t\t\t{\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\turl: await driver!.createContainerUrl(this.documentId),\n\t\t\t\theaders,\n\t\t\t},\n\t\t\tpendingLocalState,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t\ttestContainerConfig?.forceUseCreateVersion,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis.updateDocumentId(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t\tpendingLocalState?: string,\n\t): Promise<IContainer> {\n\t\t// Keep track of which Loader we are about to use so we can pass the correct driver through\n\t\tconst driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await this.resolveContainer(\n\t\t\tloader,\n\t\t\trequestHeader,\n\t\t\tdriver,\n\t\t\tpendingLocalState,\n\t\t);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis.useCreateApi = true;\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._logger = undefined;\n\t\tthis._tracker = undefined;\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._tracker);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(...containers: IContainer[]): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized(...containers);\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t\tthis.logger.send({\n\t\t\tcategory: \"generic\",\n\t\t\teventName: \"DocumentIdUpdated\",\n\t\t\t...getUrlTelemetryProps(resolvedUrl),\n\t\t});\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Get identifying information for a resolved URL.\n * @remarks BEWARE: this function is only appropriate for usage in tests, as it logs unhashed document IDs,\n * which is a privacy concern for production scenarios.\n */\nfunction getUrlTelemetryProps(\n\tresolvedUrl: IResolvedUrl | undefined,\n): ITelemetryBaseProperties {\n\tif (!resolvedUrl) {\n\t\treturn {};\n\t}\n\n\tconst props: Record<string, TelemetryBaseEventPropertyType> = {\n\t\turl: resolvedUrl.url,\n\t\tid: resolvedUrl.id,\n\t};\n\n\tif (isOdspResolvedUrl(resolvedUrl)) {\n\t\tObject.assign(props, {\n\t\t\tsiteUrl: resolvedUrl.siteUrl,\n\t\t\tdriveId: resolvedUrl.driveId,\n\t\t\titemId: resolvedUrl.itemId,\n\t\t});\n\t}\n\n\treturn tagData(TelemetryDataTag.UserData, props);\n}\n\n/** Summarize the event with just the primary properties, for succinct output in case of test failure */\nconst primaryEventProps = ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n}: ITelemetryBaseEvent) => ({\n\tcategory,\n\teventName,\n\terror,\n\terrorType,\n\t[\"...\"]: \"*** Additional properties not shown, see full log for details ***\",\n});\n\n/**\n * @internal\n */\nexport function getUnexpectedLogErrorException(\n\tlogger: IEventAndErrorTrackingLogger | undefined,\n\tprefix?: string,\n) {\n\tif (logger === undefined) {\n\t\treturn;\n\t}\n\tconst results = logger.reportAndClearTrackedEvents();\n\tif (results.unexpectedErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Unexpected Errors in Logs:\\n${JSON.stringify(\n\t\t\t\tresults.unexpectedErrors.map(primaryEventProps),\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n\tif (results.expectedNotFound.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Expected Events not found:\\n${JSON.stringify(\n\t\t\t\tresults.expectedNotFound,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/test-utils",
|
|
3
|
-
"version": "2.4.0-
|
|
3
|
+
"version": "2.4.0-299374",
|
|
4
4
|
"description": "Utilities for Fluid tests",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -67,25 +67,26 @@
|
|
|
67
67
|
"temp-directory": "nyc/.nyc_output"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@fluid-internal/test-driver-definitions": "2.4.0-
|
|
71
|
-
"@fluidframework/aqueduct": "2.4.0-
|
|
72
|
-
"@fluidframework/container-definitions": "2.4.0-
|
|
73
|
-
"@fluidframework/container-loader": "2.4.0-
|
|
74
|
-
"@fluidframework/container-runtime": "2.4.0-
|
|
75
|
-
"@fluidframework/container-runtime-definitions": "2.4.0-
|
|
76
|
-
"@fluidframework/core-interfaces": "2.4.0-
|
|
77
|
-
"@fluidframework/core-utils": "2.4.0-
|
|
78
|
-
"@fluidframework/datastore": "2.4.0-
|
|
79
|
-
"@fluidframework/datastore-definitions": "2.4.0-
|
|
80
|
-
"@fluidframework/driver-definitions": "2.4.0-
|
|
81
|
-
"@fluidframework/driver-utils": "2.4.0-
|
|
82
|
-
"@fluidframework/local-driver": "2.4.0-
|
|
83
|
-
"@fluidframework/map": "2.4.0-
|
|
84
|
-
"@fluidframework/
|
|
85
|
-
"@fluidframework/
|
|
86
|
-
"@fluidframework/
|
|
87
|
-
"@fluidframework/runtime-
|
|
88
|
-
"@fluidframework/
|
|
70
|
+
"@fluid-internal/test-driver-definitions": "2.4.0-299374",
|
|
71
|
+
"@fluidframework/aqueduct": "2.4.0-299374",
|
|
72
|
+
"@fluidframework/container-definitions": "2.4.0-299374",
|
|
73
|
+
"@fluidframework/container-loader": "2.4.0-299374",
|
|
74
|
+
"@fluidframework/container-runtime": "2.4.0-299374",
|
|
75
|
+
"@fluidframework/container-runtime-definitions": "2.4.0-299374",
|
|
76
|
+
"@fluidframework/core-interfaces": "2.4.0-299374",
|
|
77
|
+
"@fluidframework/core-utils": "2.4.0-299374",
|
|
78
|
+
"@fluidframework/datastore": "2.4.0-299374",
|
|
79
|
+
"@fluidframework/datastore-definitions": "2.4.0-299374",
|
|
80
|
+
"@fluidframework/driver-definitions": "2.4.0-299374",
|
|
81
|
+
"@fluidframework/driver-utils": "2.4.0-299374",
|
|
82
|
+
"@fluidframework/local-driver": "2.4.0-299374",
|
|
83
|
+
"@fluidframework/map": "2.4.0-299374",
|
|
84
|
+
"@fluidframework/odsp-driver": "2.4.0-299374",
|
|
85
|
+
"@fluidframework/request-handler": "2.4.0-299374",
|
|
86
|
+
"@fluidframework/routerlicious-driver": "2.4.0-299374",
|
|
87
|
+
"@fluidframework/runtime-definitions": "2.4.0-299374",
|
|
88
|
+
"@fluidframework/runtime-utils": "2.4.0-299374",
|
|
89
|
+
"@fluidframework/telemetry-utils": "2.4.0-299374",
|
|
89
90
|
"best-random": "^1.0.0",
|
|
90
91
|
"debug": "^4.3.4",
|
|
91
92
|
"mocha": "^10.2.0",
|
|
@@ -94,10 +95,10 @@
|
|
|
94
95
|
"devDependencies": {
|
|
95
96
|
"@arethetypeswrong/cli": "^0.15.2",
|
|
96
97
|
"@biomejs/biome": "~1.8.3",
|
|
97
|
-
"@fluid-internal/mocha-test-setup": "2.4.0-
|
|
98
|
-
"@fluid-tools/build-cli": "^0.
|
|
98
|
+
"@fluid-internal/mocha-test-setup": "2.4.0-299374",
|
|
99
|
+
"@fluid-tools/build-cli": "^0.48.0",
|
|
99
100
|
"@fluidframework/build-common": "^2.0.3",
|
|
100
|
-
"@fluidframework/build-tools": "^0.
|
|
101
|
+
"@fluidframework/build-tools": "^0.48.0",
|
|
101
102
|
"@fluidframework/eslint-config-fluid": "^5.4.0",
|
|
102
103
|
"@fluidframework/test-utils-previous": "npm:@fluidframework/test-utils@~2.3.0",
|
|
103
104
|
"@microsoft/api-extractor": "7.47.8",
|
|
@@ -112,7 +113,6 @@
|
|
|
112
113
|
"cross-env": "^7.0.3",
|
|
113
114
|
"diff": "^3.5.0",
|
|
114
115
|
"eslint": "~8.55.0",
|
|
115
|
-
"mocha-json-output-reporter": "^2.0.1",
|
|
116
116
|
"mocha-multi-reporters": "^1.5.1",
|
|
117
117
|
"moment": "^2.21.0",
|
|
118
118
|
"prettier": "~3.0.3",
|
package/src/packageVersion.ts
CHANGED
|
@@ -20,6 +20,8 @@ import {
|
|
|
20
20
|
IRequestHeader,
|
|
21
21
|
ITelemetryBaseEvent,
|
|
22
22
|
ITelemetryBaseLogger,
|
|
23
|
+
ITelemetryBaseProperties,
|
|
24
|
+
TelemetryBaseEventPropertyType,
|
|
23
25
|
} from "@fluidframework/core-interfaces";
|
|
24
26
|
import { assert } from "@fluidframework/core-utils/internal";
|
|
25
27
|
import {
|
|
@@ -27,11 +29,14 @@ import {
|
|
|
27
29
|
IResolvedUrl,
|
|
28
30
|
IUrlResolver,
|
|
29
31
|
} from "@fluidframework/driver-definitions/internal";
|
|
32
|
+
import { isOdspResolvedUrl } from "@fluidframework/odsp-driver/internal";
|
|
30
33
|
import {
|
|
31
34
|
type ITelemetryGenericEventExt,
|
|
32
35
|
createChildLogger,
|
|
33
36
|
createMultiSinkLogger,
|
|
34
37
|
type ITelemetryLoggerPropertyBags,
|
|
38
|
+
TelemetryDataTag,
|
|
39
|
+
tagData,
|
|
35
40
|
} from "@fluidframework/telemetry-utils/internal";
|
|
36
41
|
import { v4 as uuid } from "uuid";
|
|
37
42
|
|
|
@@ -550,7 +555,7 @@ export class TestObjectProvider implements ITestObjectProvider {
|
|
|
550
555
|
this._documentCreated = true;
|
|
551
556
|
// r11s driver will generate a new ID for the new container.
|
|
552
557
|
// update the document ID with the actual ID of the attached container.
|
|
553
|
-
this.
|
|
558
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
554
559
|
return container;
|
|
555
560
|
}
|
|
556
561
|
|
|
@@ -581,7 +586,7 @@ export class TestObjectProvider implements ITestObjectProvider {
|
|
|
581
586
|
}
|
|
582
587
|
await container.attach(this.driver.createCreateNewRequest(this.documentId));
|
|
583
588
|
this._documentCreated = true;
|
|
584
|
-
this.
|
|
589
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
585
590
|
}
|
|
586
591
|
|
|
587
592
|
/**
|
|
@@ -641,7 +646,7 @@ export class TestObjectProvider implements ITestObjectProvider {
|
|
|
641
646
|
this._documentCreated = true;
|
|
642
647
|
// r11s driver will generate a new ID for the new container.
|
|
643
648
|
// update the document ID with the actual ID of the attached container.
|
|
644
|
-
this.
|
|
649
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
645
650
|
return container;
|
|
646
651
|
}
|
|
647
652
|
|
|
@@ -702,6 +707,11 @@ export class TestObjectProvider implements ITestObjectProvider {
|
|
|
702
707
|
*/
|
|
703
708
|
public updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {
|
|
704
709
|
this._documentIdStrategy.update(resolvedUrl);
|
|
710
|
+
this.logger.send({
|
|
711
|
+
category: "generic",
|
|
712
|
+
eventName: "DocumentIdUpdated",
|
|
713
|
+
...getUrlTelemetryProps(resolvedUrl),
|
|
714
|
+
});
|
|
705
715
|
}
|
|
706
716
|
|
|
707
717
|
/**
|
|
@@ -917,7 +927,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
|
|
|
917
927
|
this._documentCreated = true;
|
|
918
928
|
// r11s driver will generate a new ID for the new container.
|
|
919
929
|
// update the document ID with the actual ID of the attached container.
|
|
920
|
-
this.
|
|
930
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
921
931
|
return container;
|
|
922
932
|
}
|
|
923
933
|
|
|
@@ -948,7 +958,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
|
|
|
948
958
|
}
|
|
949
959
|
await container.attach(this.driver.createCreateNewRequest(this.documentId));
|
|
950
960
|
this._documentCreated = true;
|
|
951
|
-
this.
|
|
961
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
952
962
|
}
|
|
953
963
|
|
|
954
964
|
/**
|
|
@@ -1015,7 +1025,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
|
|
|
1015
1025
|
this._documentCreated = true;
|
|
1016
1026
|
// r11s driver will generate a new ID for the new container.
|
|
1017
1027
|
// update the document ID with the actual ID of the attached container.
|
|
1018
|
-
this.
|
|
1028
|
+
this.updateDocumentId(container.resolvedUrl);
|
|
1019
1029
|
return container;
|
|
1020
1030
|
}
|
|
1021
1031
|
|
|
@@ -1083,6 +1093,11 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
|
|
|
1083
1093
|
*/
|
|
1084
1094
|
public updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {
|
|
1085
1095
|
this._documentIdStrategy.update(resolvedUrl);
|
|
1096
|
+
this.logger.send({
|
|
1097
|
+
category: "generic",
|
|
1098
|
+
eventName: "DocumentIdUpdated",
|
|
1099
|
+
...getUrlTelemetryProps(resolvedUrl),
|
|
1100
|
+
});
|
|
1086
1101
|
}
|
|
1087
1102
|
|
|
1088
1103
|
/**
|
|
@@ -1094,6 +1109,34 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
|
|
|
1094
1109
|
}
|
|
1095
1110
|
}
|
|
1096
1111
|
|
|
1112
|
+
/**
|
|
1113
|
+
* Get identifying information for a resolved URL.
|
|
1114
|
+
* @remarks BEWARE: this function is only appropriate for usage in tests, as it logs unhashed document IDs,
|
|
1115
|
+
* which is a privacy concern for production scenarios.
|
|
1116
|
+
*/
|
|
1117
|
+
function getUrlTelemetryProps(
|
|
1118
|
+
resolvedUrl: IResolvedUrl | undefined,
|
|
1119
|
+
): ITelemetryBaseProperties {
|
|
1120
|
+
if (!resolvedUrl) {
|
|
1121
|
+
return {};
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
const props: Record<string, TelemetryBaseEventPropertyType> = {
|
|
1125
|
+
url: resolvedUrl.url,
|
|
1126
|
+
id: resolvedUrl.id,
|
|
1127
|
+
};
|
|
1128
|
+
|
|
1129
|
+
if (isOdspResolvedUrl(resolvedUrl)) {
|
|
1130
|
+
Object.assign(props, {
|
|
1131
|
+
siteUrl: resolvedUrl.siteUrl,
|
|
1132
|
+
driveId: resolvedUrl.driveId,
|
|
1133
|
+
itemId: resolvedUrl.itemId,
|
|
1134
|
+
});
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
return tagData(TelemetryDataTag.UserData, props);
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1097
1140
|
/** Summarize the event with just the primary properties, for succinct output in case of test failure */
|
|
1098
1141
|
const primaryEventProps = ({
|
|
1099
1142
|
category,
|