@fluidframework/test-utils 2.21.0 → 2.22.1
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/.eslintrc.cjs +0 -1
- package/CHANGELOG.md +4 -0
- package/README.md +1 -0
- package/dist/loaderContainerTracker.d.ts.map +1 -1
- package/dist/loaderContainerTracker.js +2 -1
- package/dist/loaderContainerTracker.js.map +1 -1
- package/dist/nonEmptyArrayType.d.ts +7 -0
- package/dist/nonEmptyArrayType.d.ts.map +1 -0
- package/dist/nonEmptyArrayType.js +12 -0
- package/dist/nonEmptyArrayType.js.map +1 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/testFluidObject.js +1 -1
- package/dist/testFluidObject.js.map +1 -1
- package/dist/testObjectProvider.d.ts.map +1 -1
- package/dist/testObjectProvider.js +2 -1
- package/dist/testObjectProvider.js.map +1 -1
- package/lib/loaderContainerTracker.d.ts.map +1 -1
- package/lib/loaderContainerTracker.js +2 -1
- package/lib/loaderContainerTracker.js.map +1 -1
- package/lib/nonEmptyArrayType.d.ts +7 -0
- package/lib/nonEmptyArrayType.d.ts.map +1 -0
- package/lib/nonEmptyArrayType.js +8 -0
- package/lib/nonEmptyArrayType.js.map +1 -0
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/testFluidObject.js +1 -1
- package/lib/testFluidObject.js.map +1 -1
- package/lib/testObjectProvider.d.ts.map +1 -1
- package/lib/testObjectProvider.js +2 -1
- package/lib/testObjectProvider.js.map +1 -1
- package/package.json +25 -25
- package/src/loaderContainerTracker.ts +3 -2
- package/src/nonEmptyArrayType.ts +10 -0
- package/src/packageVersion.ts +1 -1
- package/src/testObjectProvider.ts +2 -1
- package/tsconfig.json +0 -1
|
@@ -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,QAAQ,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.
|
|
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,QAAQ,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.22.1\";\n"]}
|
package/lib/testFluidObject.js
CHANGED
|
@@ -69,7 +69,7 @@ export class TestFluidObject {
|
|
|
69
69
|
}
|
|
70
70
|
this.root = (await this.runtime.getChannel("root"));
|
|
71
71
|
};
|
|
72
|
-
this.initializationPromise
|
|
72
|
+
this.initializationPromise ??= doInitialization();
|
|
73
73
|
return this.initializationPromise;
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testFluidObject.js","sourceRoot":"","sources":["../src/testFluidObject.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 { IFluidHandle, IRequest, IResponse } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tFluidDataStoreRuntime,\n\tFluidObjectHandle,\n\tmixinRequestHandler,\n} from \"@fluidframework/datastore/internal\";\nimport {\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISharedMap, SharedMap } from \"@fluidframework/map/internal\";\nimport {\n\tIFluidDataStoreChannel,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreFactory,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { create404Response } from \"@fluidframework/runtime-utils/internal\";\n\nimport { ITestFluidObject } from \"./interfaces.js\";\n\n/**\n * A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.\n * The shared objects can be retrieved by passing the key of the entry to getSharedObject.\n * It exposes the IFluidDataStoreContext and IFluidDataStoreRuntime.\n * @internal\n */\nexport class TestFluidObject implements ITestFluidObject {\n\tpublic get ITestFluidObject() {\n\t\treturn this;\n\t}\n\n\tpublic get IFluidLoadable() {\n\t\treturn this;\n\t}\n\n\tpublic get handle(): IFluidHandle<this> {\n\t\treturn this.innerHandle;\n\t}\n\n\tpublic root!: ISharedMap;\n\tprivate readonly innerHandle: IFluidHandle<this>;\n\tprivate initializationPromise: Promise<void> | undefined;\n\n\t/**\n\t * Creates a new TestFluidObject.\n\t * @param runtime - The data store runtime.\n\t * @param context - The data store context.\n\t * @param factoryEntries - A list of id to IChannelFactory mapping. For each item in the list,\n\t * a shared object is created which can be retrieved by calling getSharedObject() with the id;\n\t */\n\tconstructor(\n\t\tpublic readonly runtime: IFluidDataStoreRuntime,\n\t\tpublic readonly channel: IFluidDataStoreChannel,\n\t\tpublic readonly context: IFluidDataStoreContext,\n\t\tprivate readonly factoryEntriesMap: Map<string, IChannelFactory>,\n\t) {\n\t\tthis.innerHandle = new FluidObjectHandle(this, \"\", runtime.objectsRoutingContext);\n\t}\n\n\t/**\n\t * Retrieves a shared object with the given id.\n\t * @param id - The id of the shared object to retrieve.\n\t */\n\tpublic async getSharedObject<T = any>(id: string): Promise<T> {\n\t\tif (this.factoryEntriesMap === undefined) {\n\t\t\tthrow new Error(\"Shared objects were not provided during creation.\");\n\t\t}\n\n\t\tfor (const key of this.factoryEntriesMap.keys()) {\n\t\t\tif (key === id) {\n\t\t\t\tconst handle = this.root.get<IFluidHandle>(id);\n\t\t\t\treturn handle?.get() as Promise<T>;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`Shared object with id ${id} not found.`);\n\t}\n\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\treturn request.url === \"\" || request.url === \"/\" || request.url.startsWith(\"/?\")\n\t\t\t? { mimeType: \"fluid/object\", status: 200, value: this }\n\t\t\t: create404Response(request);\n\t}\n\n\tpublic async initialize(existing: boolean) {\n\t\tconst doInitialization = async () => {\n\t\t\tif (!existing) {\n\t\t\t\tthis.root = SharedMap.create(this.runtime, \"root\");\n\n\t\t\t\tthis.factoryEntriesMap.forEach((sharedObjectFactory: IChannelFactory, key: string) => {\n\t\t\t\t\tconst sharedObject = this.runtime.createChannel(key, sharedObjectFactory.type);\n\t\t\t\t\tthis.root.set(key, sharedObject.handle);\n\t\t\t\t});\n\n\t\t\t\tthis.root.bindToContext();\n\t\t\t}\n\n\t\t\tthis.root = (await this.runtime.getChannel(\"root\")) as ISharedMap;\n\t\t};\n\n\t\tthis.initializationPromise ??= doInitialization();\n\t\treturn this.initializationPromise;\n\t}\n}\n\n/**\n * @internal\n */\nexport type ChannelFactoryRegistry = Iterable<[string | undefined, IChannelFactory]>;\n\n/**\n * Creates a factory for a TestFluidObject with the given object factory entries. It creates a data store runtime\n * with the object factories in the entry list. All the entries with an id other than undefined are passed to the\n * Fluid object so that it can create a shared object for each.\n *\n * @example\n *\n * The following will create a Fluid object that creates and loads a SharedString and SharedDirectory.\n * It will add SparseMatrix to the data store's factory so that it can be created later.\n *\n * ```typescript\n * new TestFluidObjectFactory([\n * [ \"sharedString\", SharedString.getFactory() ],\n * [ \"sharedDirectory\", SharedDirectory.getFactory() ],\n * [ undefined, SparseMatrix.getFactory() ],\n * ]);\n * ```\n *\n * The SharedString and SharedDirectory can be retrieved via getSharedObject() on the TestFluidObject as follows:\n *\n * ```typescript\n * sharedString = testFluidObject.getSharedObject<SharedString>(\"sharedString\");\n * sharedDir = testFluidObject.getSharedObject<SharedDirectory>(\"sharedDirectory\");\n * ```\n *\n * @privateRemarks Beware that using this class generally forfeits some compatibility coverage\n * `describeCompat` aims to provide:\n * `SharedMap`s always reference the current version of SharedMap.\n * AB#4670 tracks improving this situation.\n * @internal\n */\nexport class TestFluidObjectFactory implements IFluidDataStoreFactory {\n\tpublic get IFluidDataStoreFactory() {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Creates a new TestFluidObjectFactory.\n\t * @param factoryEntries - A list of id to IChannelFactory mapping. It creates a data store runtime with each\n\t * IChannelFactory. Entries with string ids are passed to the Fluid object so that it can create a shared object\n\t * for it.\n\t */\n\tconstructor(\n\t\tprivate readonly factoryEntries: ChannelFactoryRegistry,\n\t\tpublic readonly type = \"TestFluidObjectFactory\",\n\t) {}\n\n\tpublic async instantiateDataStore(\n\t\tcontext: IFluidDataStoreContext,\n\t\texisting: boolean,\n\t): Promise<FluidDataStoreRuntime> {\n\t\tconst dataTypes = new Map<string, IChannelFactory>();\n\n\t\t// Add SharedMap's factory which will be used to create the root map.\n\t\tconst sharedMapFactory = SharedMap.getFactory();\n\t\tdataTypes.set(sharedMapFactory.type, sharedMapFactory);\n\n\t\t// Add the object factories to the list to be sent to data store runtime.\n\t\tfor (const [, factory] of this.factoryEntries) {\n\t\t\tdataTypes.set(factory.type, factory);\n\t\t}\n\n\t\t// Create a map from the factory entries with entries that don't have the id as undefined. This will be\n\t\t// passed to the Fluid object.\n\t\tconst factoryEntriesMapForObject = new Map<string, IChannelFactory>();\n\t\tfor (const [id, factory] of this.factoryEntries) {\n\t\t\tif (id !== undefined) {\n\t\t\t\tfactoryEntriesMapForObject.set(id, factory);\n\t\t\t}\n\t\t}\n\n\t\tconst runtimeClass = mixinRequestHandler(\n\t\t\tasync (request: IRequest, rt: FluidDataStoreRuntime) => {\n\t\t\t\t// The provideEntryPoint callback below always returns TestFluidObject.\n\t\t\t\tconst dataObject = await rt.entryPoint.get();\n\t\t\t\tassert(\n\t\t\t\t\tdataObject instanceof TestFluidObject,\n\t\t\t\t\t\"entryPoint should have been initialized by now\",\n\t\t\t\t);\n\t\t\t\treturn dataObject.request(request);\n\t\t\t},\n\t\t);\n\n\t\tconst runtime = new runtimeClass(context, dataTypes, existing, async () => {\n\t\t\tawait instance.initialize(true);\n\t\t\treturn instance;\n\t\t});\n\n\t\tconst instance: TestFluidObject = new TestFluidObject(\n\t\t\truntime, // runtime\n\t\t\truntime, // channel\n\t\t\tcontext,\n\t\t\tfactoryEntriesMapForObject,\n\t\t);\n\n\t\tif (!existing) {\n\t\t\tawait instance.initialize(false);\n\t\t}\n\n\t\treturn runtime;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testFluidObject.js","sourceRoot":"","sources":["../src/testFluidObject.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 { IFluidHandle, IRequest, IResponse } from \"@fluidframework/core-interfaces\";\nimport { assert } from \"@fluidframework/core-utils/internal\";\nimport {\n\tFluidDataStoreRuntime,\n\tFluidObjectHandle,\n\tmixinRequestHandler,\n} from \"@fluidframework/datastore/internal\";\nimport {\n\tIChannelFactory,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions/internal\";\nimport { ISharedMap, SharedMap } from \"@fluidframework/map/internal\";\nimport {\n\tIFluidDataStoreChannel,\n\tIFluidDataStoreContext,\n\tIFluidDataStoreFactory,\n} from \"@fluidframework/runtime-definitions/internal\";\nimport { create404Response } from \"@fluidframework/runtime-utils/internal\";\n\nimport { ITestFluidObject } from \"./interfaces.js\";\n\n/**\n * A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.\n * The shared objects can be retrieved by passing the key of the entry to getSharedObject.\n * It exposes the IFluidDataStoreContext and IFluidDataStoreRuntime.\n * @internal\n */\nexport class TestFluidObject implements ITestFluidObject {\n\tpublic get ITestFluidObject() {\n\t\treturn this;\n\t}\n\n\tpublic get IFluidLoadable() {\n\t\treturn this;\n\t}\n\n\tpublic get handle(): IFluidHandle<this> {\n\t\treturn this.innerHandle;\n\t}\n\n\tpublic root!: ISharedMap;\n\tprivate readonly innerHandle: IFluidHandle<this>;\n\tprivate initializationPromise: Promise<void> | undefined;\n\n\t/**\n\t * Creates a new TestFluidObject.\n\t * @param runtime - The data store runtime.\n\t * @param context - The data store context.\n\t * @param factoryEntries - A list of id to IChannelFactory mapping. For each item in the list,\n\t * a shared object is created which can be retrieved by calling getSharedObject() with the id;\n\t */\n\tconstructor(\n\t\tpublic readonly runtime: IFluidDataStoreRuntime,\n\t\tpublic readonly channel: IFluidDataStoreChannel,\n\t\tpublic readonly context: IFluidDataStoreContext,\n\t\tprivate readonly factoryEntriesMap: Map<string, IChannelFactory>,\n\t) {\n\t\tthis.innerHandle = new FluidObjectHandle(this, \"\", runtime.objectsRoutingContext);\n\t}\n\n\t/**\n\t * Retrieves a shared object with the given id.\n\t * @param id - The id of the shared object to retrieve.\n\t */\n\tpublic async getSharedObject<T = any>(id: string): Promise<T> {\n\t\tif (this.factoryEntriesMap === undefined) {\n\t\t\tthrow new Error(\"Shared objects were not provided during creation.\");\n\t\t}\n\n\t\tfor (const key of this.factoryEntriesMap.keys()) {\n\t\t\tif (key === id) {\n\t\t\t\tconst handle = this.root.get<IFluidHandle>(id);\n\t\t\t\treturn handle?.get() as Promise<T>;\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(`Shared object with id ${id} not found.`);\n\t}\n\n\tpublic async request(request: IRequest): Promise<IResponse> {\n\t\treturn request.url === \"\" || request.url === \"/\" || request.url.startsWith(\"/?\")\n\t\t\t? { mimeType: \"fluid/object\", status: 200, value: this }\n\t\t\t: create404Response(request);\n\t}\n\n\tpublic async initialize(existing: boolean) {\n\t\tconst doInitialization = async () => {\n\t\t\tif (!existing) {\n\t\t\t\tthis.root = SharedMap.create(this.runtime, \"root\");\n\n\t\t\t\tthis.factoryEntriesMap.forEach((sharedObjectFactory: IChannelFactory, key: string) => {\n\t\t\t\t\tconst sharedObject = this.runtime.createChannel(key, sharedObjectFactory.type);\n\t\t\t\t\tthis.root.set(key, sharedObject.handle);\n\t\t\t\t});\n\n\t\t\t\tthis.root.bindToContext();\n\t\t\t}\n\n\t\t\tthis.root = (await this.runtime.getChannel(\"root\")) as ISharedMap;\n\t\t};\n\n\t\tthis.initializationPromise ??= doInitialization();\n\t\treturn this.initializationPromise;\n\t}\n}\n\n/**\n * @internal\n */\nexport type ChannelFactoryRegistry = Iterable<[string | undefined, IChannelFactory]>;\n\n/**\n * Creates a factory for a TestFluidObject with the given object factory entries. It creates a data store runtime\n * with the object factories in the entry list. All the entries with an id other than undefined are passed to the\n * Fluid object so that it can create a shared object for each.\n *\n * @example\n *\n * The following will create a Fluid object that creates and loads a SharedString and SharedDirectory.\n * It will add SparseMatrix to the data store's factory so that it can be created later.\n *\n * ```typescript\n * new TestFluidObjectFactory([\n * [ \"sharedString\", SharedString.getFactory() ],\n * [ \"sharedDirectory\", SharedDirectory.getFactory() ],\n * [ undefined, SparseMatrix.getFactory() ],\n * ]);\n * ```\n *\n * The SharedString and SharedDirectory can be retrieved via getSharedObject() on the TestFluidObject as follows:\n *\n * ```typescript\n * sharedString = testFluidObject.getSharedObject<SharedString>(\"sharedString\");\n * sharedDir = testFluidObject.getSharedObject<SharedDirectory>(\"sharedDirectory\");\n * ```\n *\n * @privateRemarks Beware that using this class generally forfeits some compatibility coverage\n * `describeCompat` aims to provide:\n * `SharedMap`s always reference the current version of SharedMap.\n * AB#4670 tracks improving this situation.\n * @internal\n */\nexport class TestFluidObjectFactory implements IFluidDataStoreFactory {\n\tpublic get IFluidDataStoreFactory() {\n\t\treturn this;\n\t}\n\n\t/**\n\t * Creates a new TestFluidObjectFactory.\n\t * @param factoryEntries - A list of id to IChannelFactory mapping. It creates a data store runtime with each\n\t * IChannelFactory. Entries with string ids are passed to the Fluid object so that it can create a shared object\n\t * for it.\n\t */\n\tconstructor(\n\t\tprivate readonly factoryEntries: ChannelFactoryRegistry,\n\t\tpublic readonly type = \"TestFluidObjectFactory\",\n\t) {}\n\n\tpublic async instantiateDataStore(\n\t\tcontext: IFluidDataStoreContext,\n\t\texisting: boolean,\n\t): Promise<FluidDataStoreRuntime> {\n\t\tconst dataTypes = new Map<string, IChannelFactory>();\n\n\t\t// Add SharedMap's factory which will be used to create the root map.\n\t\tconst sharedMapFactory = SharedMap.getFactory();\n\t\tdataTypes.set(sharedMapFactory.type, sharedMapFactory);\n\n\t\t// Add the object factories to the list to be sent to data store runtime.\n\t\tfor (const [, factory] of this.factoryEntries) {\n\t\t\tdataTypes.set(factory.type, factory);\n\t\t}\n\n\t\t// Create a map from the factory entries with entries that don't have the id as undefined. This will be\n\t\t// passed to the Fluid object.\n\t\tconst factoryEntriesMapForObject = new Map<string, IChannelFactory>();\n\t\tfor (const [id, factory] of this.factoryEntries) {\n\t\t\tif (id !== undefined) {\n\t\t\t\tfactoryEntriesMapForObject.set(id, factory);\n\t\t\t}\n\t\t}\n\n\t\tconst runtimeClass = mixinRequestHandler(\n\t\t\tasync (request: IRequest, rt: FluidDataStoreRuntime) => {\n\t\t\t\t// The provideEntryPoint callback below always returns TestFluidObject.\n\t\t\t\tconst dataObject = await rt.entryPoint.get();\n\t\t\t\tassert(\n\t\t\t\t\tdataObject instanceof TestFluidObject,\n\t\t\t\t\t\"entryPoint should have been initialized by now\",\n\t\t\t\t);\n\t\t\t\treturn dataObject.request(request);\n\t\t\t},\n\t\t);\n\n\t\tconst runtime = new runtimeClass(context, dataTypes, existing, async () => {\n\t\t\tawait instance.initialize(true);\n\t\t\treturn instance;\n\t\t});\n\n\t\tconst instance: TestFluidObject = new TestFluidObject(\n\t\t\truntime, // runtime\n\t\t\truntime, // channel\n\t\t\tcontext,\n\t\t\tfactoryEntriesMapForObject,\n\t\t);\n\n\t\tif (!existing) {\n\t\t\tawait instance.initialize(false);\n\t\t}\n\n\t\treturn runtime;\n\t}\n}\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,KAAK,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AACnG,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EAGpB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACN,uBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACN,KAAK,yBAAyB,EAG9B,KAAK,4BAA4B,EAGjC,MAAM,0CAA0C,CAAC;AAIlD,OAAO,EAAmB,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"testObjectProvider.d.ts","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import { v4 as uuid } from "uuid";
|
|
|
10
10
|
import { LoaderContainerTracker } from "./loaderContainerTracker.js";
|
|
11
11
|
import { LocalCodeLoader } from "./localCodeLoader.js";
|
|
12
12
|
import { createAndAttachContainer } from "./localLoader.js";
|
|
13
|
+
import { isNonEmptyArray } from "./nonEmptyArrayType.js";
|
|
13
14
|
const defaultCodeDetails = {
|
|
14
15
|
package: "defaultTestPackage",
|
|
15
16
|
config: {},
|
|
@@ -90,7 +91,7 @@ export class EventAndErrorTrackingLogger {
|
|
|
90
91
|
this.expectedEvents.push(...orderedExpectedEvents.map((event, index) => ({ index, event })));
|
|
91
92
|
}
|
|
92
93
|
send(event) {
|
|
93
|
-
if (this.expectedEvents
|
|
94
|
+
if (isNonEmptyArray(this.expectedEvents)) {
|
|
94
95
|
const ee = this.expectedEvents[0].event;
|
|
95
96
|
if (ee.eventName === event.eventName) {
|
|
96
97
|
let matches = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,EAGN,sBAAsB,IAAI,+BAA+B,GACzD,MAAM,2CAA2C,CAAC;AASnD,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAM7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAEN,iBAAiB,EACjB,qBAAqB,EAErB,gBAAgB,EAChB,OAAO,GACP,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAmB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,MAAM,kBAAkB,GAAsB;IAC7C,OAAO,EAAE,oBAAoB;IAC7B,MAAM,EAAE,EAAE;CACV,CAAC;AAwKF;;GAEG;AACH,MAAM,CAAN,IAAY,qBAGX;AAHD,WAAY,qBAAqB;IAChC,qEAAM,CAAA;IACN,iEAAI,CAAA;AACL,CAAC,EAHW,qBAAqB,KAArB,qBAAqB,QAGhC;AAyBD;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AAsBrD;;;GAGG;AACH,SAAS,qBAAqB,CAAC,IAAsB;IACpD,IAAI,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACpC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO;gBACN,GAAG,EAAE,GAAG,EAAE,CAAC,UAAU;gBACrB,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,mDAAmD;gBACrE,KAAK,EAAE,GAAG,EAAE;oBACX,UAAU,GAAG,gBAAgB,EAAE,CAAC;gBACjC,CAAC;aACD,CAAC;QACH;YACC,OAAO;gBACN,GAAG,EAAE,GAAG,EAAE,CAAC,UAAU;gBACrB,MAAM,EAAE,CAAC,WAA0B,EAAE,EAAE;oBACtC,sFAAsF;oBACtF,UAAU,GAAG,WAAW,EAAE,EAAE,IAAI,UAAU,CAAC;gBAC5C,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE;oBACX,UAAU,GAAG,gBAAgB,EAAE,CAAC;gBACjC,CAAC;aACD,CAAC;IACJ,CAAC;AACF,CAAC;AAWD;;;;;;GAMG;AACH,MAAM,OAAO,2BAA2B;IAiBvC,YAA6B,UAAiC;QAAjC,eAAU,GAAV,UAAU,CAAuB;QAd9D;;;WAGG;QACc,kBAAa,GAA8C;YAC3E,sGAAsG;YACtG;gBACC,SAAS,EAAE,4DAA4D;gBACvE,SAAS,EAAE,IAAI;aACf;YACD,mJAAmJ;YACnJ,EAAE,SAAS,EAAE,iCAAiC,EAAE;SAChD,CAAC;QAIe,mBAAc,GAA0D,EAAE,CAAC;QAC3E,qBAAgB,GAA0B,EAAE,CAAC;IAHG,CAAC;IAK3D,qBAAqB,CAAC,GAAG,qBAAkD;QACjF,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,+EAA+E;YAC/E,mFAAmF;YACnF,MAAM,IAAI,KAAK,CACd,uCAAuC;gBACtC,wEAAwE,CACzE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CACvB,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAClE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAA0B;QAC9B,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACxC,IAAI,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;gBACtC,IAAI,OAAO,GAAG,IAAI,CAAC;gBACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC5B,OAAO,GAAG,KAAK,CAAC;wBAChB,MAAM;oBACP,CAAC;gBACF,CAAC;gBACD,IAAI,OAAO,EAAE,CAAC;oBACb,6BAA6B;oBAC7B,gDAAgD;oBAChD,8CAA8C;oBAC9C,yCAAyC;oBACzC,mBAAmB;oBACnB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;oBAC5B,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;wBAChC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;oBAC5B,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,iFAAiF;YACjF,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAC3C,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAChD,CAAC;YAEF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;gBACnC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC5B,CAAC;QACF,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAEM,2BAA2B;QACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACnF,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACvF,OAAO;YACN,gBAAgB;YAChB,gBAAgB;SAChB,CAAC;IACH,CAAC;CACD;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAc9B;;;;OAIG;IACH,YACkB,iBAAgC;IACjD;;OAEG;IACa,MAAmB;IACnC;;OAEG;IACa,qBAEI;QAVH,sBAAiB,GAAjB,iBAAiB,CAAe;QAIjC,WAAM,GAAN,MAAM,CAAa;QAInB,0BAAqB,GAArB,qBAAqB,CAEjB;QA7BrB;;WAEG;QACa,SAAI,GAAG,oBAAoB,CAAC;QACpC,4BAAuB,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAM/D,0GAA0G;QAClG,qBAAgB,GAAG,KAAK,CAAC;QAoBhC,IAAI,CAAC,mBAAmB,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QAChB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,2BAA2B,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;gBAChC,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,UAAU,EAAE;oBACX,GAAG,EAAE;wBACJ,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;wBAC5B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;wBAC5C,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;wBACxC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;qBACtC;iBACD;aACD,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,IAAW,OAAO;QACjB,KAAK,IAAI,CAAC,MAAM,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,uBAAuB,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAW,sBAAsB;QAChC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QAC5B,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,sBAAsB;QAChC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,YAAY,CAClB,cAA8D,EAC9D,WAAmC;QAEnC,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACpC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,iBAAiB,CAAC;YACzC,GAAG,WAAW;YACd,MAAM;YACN,UAAU,EAAE,WAAW,EAAE,UAAU,IAAI,IAAI,eAAe,CAAC,cAAc,CAAC;YAC1E,WAAW,EAAE,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW;YACzD,sBAAsB,EACrB,WAAW,EAAE,sBAAsB,IAAI,IAAI,CAAC,sBAAsB;SACnE,CAAC,CAAC;QACH,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAC3B,UAA2B,EAC3B,WAAmC;QAEnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAC/C,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CACnD,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,4DAA4D;QAC5D,uEAAuE;QACvE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,uBAAuB,CACnC,UAA2B,EAC3B,WAA+C;QAE/C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,uBAAuB,CAAC,SAAqB;QACzD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa,CACzB,UAA2B,EAC3B,WAAmC,EACnC,aAA8B,EAC9B,YAAqB;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC7B,MAAe,EACf,OAAwB,EACxB,iBAA0B;QAE1B,OAAO,MAAM,CAAC,OAAO,CACpB;YACC,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1D,OAAO;SACP,EACD,iBAAiB,CACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,mBAA0C;QAC/D,OAAO,IAAI,CAAC,YAAY,CACvB,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EACvE,mBAAmB,EAAE,WAAW,CAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAC7B,mBAA0C;QAE1C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,kGAAkG,CAClG,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAC/C,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CACnD,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,4DAA4D;QAC5D,uEAAuE;QACvE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAC7B,mBAA0C,EAC1C,aAA8B,EAC9B,iBAA0B;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACxF,MAAM,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAE7C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,KAAK;QACX,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,kBAAkB,CAAC,GAAG,UAAwB;QAC1D,OAAO,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,CAAC;IACvE,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,SAAqB;QACzD,6FAA6F;QAC7F,yFAAyF;QACzF,2FAA2F;QAC3F,uFAAuF;QACvF,IAAK,SAAiB,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7C,SAAiB,CAAC,OAAO,GAAI,SAAiB,CAAC,MAAM,CAAC;QACxD,CAAC;QAED,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,WAAqC;QAC5D,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,mBAAmB;YAC9B,GAAG,oBAAoB,CAAC,WAAW,CAAC;SACpC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,2BAA2B,CAAC,wBAAiC,KAAK;QACxE,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,uBAAuB,GAAG,IAAI,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;IAClF,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,mCAAmC;IAsB/C,YACkB,4BAA2C,EAC3C,2BAA0C,EAC1C,iBAA8B,EAC9B,gBAA6B,EAC7B,gCAEG,EACH,+BAEG,EACH,cAA6C;QAV7C,iCAA4B,GAA5B,4BAA4B,CAAe;QAC3C,gCAA2B,GAA3B,2BAA2B,CAAe;QAC1C,sBAAiB,GAAjB,iBAAiB,CAAa;QAC9B,qBAAgB,GAAhB,gBAAgB,CAAa;QAC7B,qCAAgC,GAAhC,gCAAgC,CAE7B;QACH,oCAA+B,GAA/B,+BAA+B,CAE5B;QACH,mBAAc,GAAd,cAAc,CAA+B;QAhC/D;;WAEG;QACa,SAAI,GAAG,qCAAqC,CAAC;QACrD,4BAAuB,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAM/D,0GAA0G;QAClG,qBAAgB,GAAG,KAAK,CAAC;QAEjC;;;;;WAKG;QACK,iBAAY,GAAY,IAAI,CAAC;QAepC,IAAI,CAAC,mBAAmB,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QAChB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,2BAA2B,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;gBAChC,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,UAAU,EAAE,IAAI,CAAC,cAAc;aAC/B,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,IAAW,OAAO;QACjB,KAAK,IAAI,CAAC,MAAM,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,uBAAuB,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAW,sBAAsB;QAChC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACnC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,iBAAiB,CAAC,4BAA4B,EAAE,CAAC;QACtF,CAAC;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,WAAW;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAW,UAAU;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,IAAW,kBAAkB;QAC5B,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAW,sBAAsB;QAChC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,IAAW,qBAAqB;QAG/B,OAAO,IAAI,CAAC,YAAY;YACvB,CAAC,CAAC,IAAI,CAAC,gCAAgC;YACvC,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC;IACzC,CAAC;IAEO,uBAAuB,CAC9B,cAA8D,EAC9D,WAAmC;QAEnC,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACpC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,4BAA4B,CAAC;YACpD,GAAG,WAAW;YACd,MAAM;YACN,UAAU,EAAE,WAAW,EAAE,UAAU,IAAI,IAAI,eAAe,CAAC,cAAc,CAAC;YAC1E,WAAW,EAAE,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW;YACzD,sBAAsB,EACrB,WAAW,EAAE,sBAAsB,IAAI,IAAI,CAAC,sBAAsB;SACnE,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,sBAAsB,CAC7B,cAA8D,EAC9D,WAAmC;QAEnC,MAAM,MAAM,GAAG,qBAAqB,CAAC;YACpC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,2BAA2B,CAAC;YACnD,GAAG,WAAW;YACd,MAAM;YACN,UAAU,EAAE,WAAW,EAAE,UAAU,IAAI,IAAI,eAAe,CAAC,cAAc,CAAC;YAC1E,WAAW,EAAE,WAAW,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW;YACzD,sBAAsB,EACrB,WAAW,EAAE,sBAAsB,IAAI,IAAI,CAAC,sBAAsB;SACnE,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACI,YAAY,CAClB,cAA8D,EAC9D,WAAmC,EACnC,qBAAqB,GAAG,KAAK;QAE7B,MAAM,gBAAgB,GAAG,qBAAqB,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC;QAC7E,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,2EAA2E;YAC3E,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC3B,CAAC;QACD,IAAI,gBAAgB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAC3B,UAA2B,EAC3B,WAAmC;QAEnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAC/C,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAC9D,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,4DAA4D;QAC5D,uEAAuE;QACvE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,uBAAuB,CACnC,UAA2B,EAC3B,WAA+C;QAE/C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,uBAAuB,CAAC,SAAqB;QACzD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;QACH,CAAC;QACD,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa,CACzB,UAA2B,EAC3B,WAAmC,EACnC,aAA8B,EAC9B,YAAqB;QAErB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC7B,MAAe,EACf,OAAwB,EACxB,MAAoB,EACpB,iBAA0B;QAE1B,OAAO,MAAM,CAAC,OAAO,CACpB;YACC,oEAAoE;YACpE,GAAG,EAAE,MAAM,MAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;YACtD,OAAO;SACP,EACD,iBAAiB,CACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,mBAA0C;QAC/D,OAAO,IAAI,CAAC,YAAY,CACvB,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EACvE,mBAAmB,EAAE,WAAW,EAChC,mBAAmB,EAAE,qBAAqB,CAC1C,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAC7B,mBAA0C;QAE1C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACd,kGAAkG,CAClG,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAC/B,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC,CAAC,EACvE,mBAAmB,EAAE,WAAW,CAChC,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAC/C,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,CAC9D,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,4DAA4D;QAC5D,uEAAuE;QACvE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAC7B,mBAA0C,EAC1C,aAA8B,EAC9B,iBAA0B;QAE1B,2FAA2F;QAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAC5C,MAAM,EACN,aAAa,EACb,MAAM,EACN,iBAAiB,CACjB,CAAC;QACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAE7C,OAAO,SAAS,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,KAAK;QACX,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,QAAQ,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,kBAAkB,CAAC,GAAG,UAAwB;QAC1D,OAAO,IAAI,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,CAAC;IACvE,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,SAAqB;QACzD,6FAA6F;QAC7F,yFAAyF;QACzF,2FAA2F;QAC3F,uFAAuF;QACvF,IAAK,SAAiB,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7C,SAAiB,CAAC,OAAO,GAAI,SAAiB,CAAC,MAAM,CAAC;QACxD,CAAC;QAED,OAAO,+BAA+B,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,WAAqC;QAC5D,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAChB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,mBAAmB;YAC9B,GAAG,oBAAoB,CAAC,WAAW,CAAC;SACpC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,2BAA2B,CAAC,wBAAiC,KAAK;QACxE,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,uBAAuB,GAAG,IAAI,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;IAClF,CAAC;CACD;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAC5B,WAAqC;IAErC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAmD;QAC7D,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,EAAE,EAAE,WAAW,CAAC,EAAE;KAClB,CAAC;IAEF,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;YACpB,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,OAAO,EAAE,WAAW,CAAC,OAAO;YAC5B,MAAM,EAAE,WAAW,CAAC,MAAM;SAC1B,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,wGAAwG;AACxG,MAAM,iBAAiB,GAAG,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,KAAK,EACL,SAAS,GACY,EAAE,EAAE,CAAC,CAAC;IAC3B,QAAQ;IACR,SAAS;IACT,KAAK;IACL,SAAS;IACT,CAAC,KAAK,CAAC,EAAE,mEAAmE;CAC5E,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC7C,MAAgD,EAChD,MAAe;IAEf,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;IACR,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,2BAA2B,EAAE,CAAC;IACrD,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,KAAK,CACf,GAAG,MAAM,IAAI,EAAE,+BAA+B,IAAI,CAAC,SAAS,CAC3D,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAC/C,SAAS,EACT,CAAC,CACD,EAAE,CACH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,KAAK,CACf,GAAG,MAAM,IAAI,EAAE,+BAA+B,IAAI,CAAC,SAAS,CAC3D,OAAO,CAAC,gBAAgB,EACxB,SAAS,EACT,CAAC,CACD,EAAE,CACH,CAAC;IACH,CAAC;AACF,CAAC","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 { type IContainerRuntimeOptionsInternal } 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?: IContainerRuntimeOptionsInternal;\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"]}
|
|
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 { type IContainerRuntimeOptionsInternal } 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 { isNonEmptyArray } from \"./nonEmptyArrayType.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?: IContainerRuntimeOptionsInternal;\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 (isNonEmptyArray(this.expectedEvents)) {\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.
|
|
3
|
+
"version": "2.22.1",
|
|
4
4
|
"description": "Utilities for Fluid tests",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -67,26 +67,26 @@
|
|
|
67
67
|
"temp-directory": "nyc/.nyc_output"
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@fluid-internal/test-driver-definitions": "~2.
|
|
71
|
-
"@fluidframework/aqueduct": "~2.
|
|
72
|
-
"@fluidframework/container-definitions": "~2.
|
|
73
|
-
"@fluidframework/container-loader": "~2.
|
|
74
|
-
"@fluidframework/container-runtime": "~2.
|
|
75
|
-
"@fluidframework/container-runtime-definitions": "~2.
|
|
76
|
-
"@fluidframework/core-interfaces": "~2.
|
|
77
|
-
"@fluidframework/core-utils": "~2.
|
|
78
|
-
"@fluidframework/datastore": "~2.
|
|
79
|
-
"@fluidframework/datastore-definitions": "~2.
|
|
80
|
-
"@fluidframework/driver-definitions": "~2.
|
|
81
|
-
"@fluidframework/driver-utils": "~2.
|
|
82
|
-
"@fluidframework/local-driver": "~2.
|
|
83
|
-
"@fluidframework/map": "~2.
|
|
84
|
-
"@fluidframework/odsp-driver": "~2.
|
|
85
|
-
"@fluidframework/request-handler": "~2.
|
|
86
|
-
"@fluidframework/routerlicious-driver": "~2.
|
|
87
|
-
"@fluidframework/runtime-definitions": "~2.
|
|
88
|
-
"@fluidframework/runtime-utils": "~2.
|
|
89
|
-
"@fluidframework/telemetry-utils": "~2.
|
|
70
|
+
"@fluid-internal/test-driver-definitions": "~2.22.1",
|
|
71
|
+
"@fluidframework/aqueduct": "~2.22.1",
|
|
72
|
+
"@fluidframework/container-definitions": "~2.22.1",
|
|
73
|
+
"@fluidframework/container-loader": "~2.22.1",
|
|
74
|
+
"@fluidframework/container-runtime": "~2.22.1",
|
|
75
|
+
"@fluidframework/container-runtime-definitions": "~2.22.1",
|
|
76
|
+
"@fluidframework/core-interfaces": "~2.22.1",
|
|
77
|
+
"@fluidframework/core-utils": "~2.22.1",
|
|
78
|
+
"@fluidframework/datastore": "~2.22.1",
|
|
79
|
+
"@fluidframework/datastore-definitions": "~2.22.1",
|
|
80
|
+
"@fluidframework/driver-definitions": "~2.22.1",
|
|
81
|
+
"@fluidframework/driver-utils": "~2.22.1",
|
|
82
|
+
"@fluidframework/local-driver": "~2.22.1",
|
|
83
|
+
"@fluidframework/map": "~2.22.1",
|
|
84
|
+
"@fluidframework/odsp-driver": "~2.22.1",
|
|
85
|
+
"@fluidframework/request-handler": "~2.22.1",
|
|
86
|
+
"@fluidframework/routerlicious-driver": "~2.22.1",
|
|
87
|
+
"@fluidframework/runtime-definitions": "~2.22.1",
|
|
88
|
+
"@fluidframework/runtime-utils": "~2.22.1",
|
|
89
|
+
"@fluidframework/telemetry-utils": "~2.22.1",
|
|
90
90
|
"best-random": "^1.0.0",
|
|
91
91
|
"debug": "^4.3.4",
|
|
92
92
|
"mocha": "^10.2.0",
|
|
@@ -95,12 +95,12 @@
|
|
|
95
95
|
"devDependencies": {
|
|
96
96
|
"@arethetypeswrong/cli": "^0.17.1",
|
|
97
97
|
"@biomejs/biome": "~1.9.3",
|
|
98
|
-
"@fluid-internal/mocha-test-setup": "~2.
|
|
98
|
+
"@fluid-internal/mocha-test-setup": "~2.22.1",
|
|
99
99
|
"@fluid-tools/build-cli": "^0.51.0",
|
|
100
100
|
"@fluidframework/build-common": "^2.0.3",
|
|
101
101
|
"@fluidframework/build-tools": "^0.51.0",
|
|
102
102
|
"@fluidframework/eslint-config-fluid": "^5.7.3",
|
|
103
|
-
"@fluidframework/test-utils-previous": "npm:@fluidframework/test-utils@2.
|
|
103
|
+
"@fluidframework/test-utils-previous": "npm:@fluidframework/test-utils@2.22.0",
|
|
104
104
|
"@microsoft/api-extractor": "7.47.8",
|
|
105
105
|
"@types/debug": "^4.1.5",
|
|
106
106
|
"@types/diff": "^3.5.1",
|
|
@@ -163,8 +163,8 @@
|
|
|
163
163
|
"lint:fix": "fluid-build . --task eslint:fix --task format",
|
|
164
164
|
"test": "npm run test:mocha",
|
|
165
165
|
"test:mocha": "npm run test:mocha:esm && echo skipping cjs to avoid overhead - npm run test:mocha:cjs",
|
|
166
|
-
"test:mocha:cjs": "mocha --recursive \"dist/test/**/*.spec.*js\"
|
|
167
|
-
"test:mocha:esm": "mocha --recursive \"lib/test/**/*.spec.*js\"
|
|
166
|
+
"test:mocha:cjs": "mocha --recursive \"dist/test/**/*.spec.*js\"",
|
|
167
|
+
"test:mocha:esm": "mocha --recursive \"lib/test/**/*.spec.*js\"",
|
|
168
168
|
"test:mocha:verbose": "cross-env FLUID_TEST_VERBOSE=1 npm run test:mocha",
|
|
169
169
|
"tsc": "fluid-tsc commonjs --project ./tsconfig.cjs.json && copyfiles -f ../../../common/build/build-common/src/cjs/package.json ./dist",
|
|
170
170
|
"typetests:gen": "flub generate typetests --dir . -v",
|
|
@@ -24,6 +24,7 @@ import { canBeCoalescedByService } from "@fluidframework/driver-utils/internal";
|
|
|
24
24
|
|
|
25
25
|
import { toIDeltaManagerFull, waitForContainerConnection } from "./containerUtils.js";
|
|
26
26
|
import { debug } from "./debug.js";
|
|
27
|
+
import { isNonEmptyArray, type NonEmptyArray } from "./nonEmptyArrayType.js";
|
|
27
28
|
import { IOpProcessingController } from "./testObjectProvider.js";
|
|
28
29
|
import { timeoutAwait, timeoutPromise } from "./timeoutUtils.js";
|
|
29
30
|
|
|
@@ -233,7 +234,7 @@ export class LoaderContainerTracker implements IOpProcessingController {
|
|
|
233
234
|
});
|
|
234
235
|
|
|
235
236
|
const containersToApply = this.getContainers(containers);
|
|
236
|
-
if (containersToApply
|
|
237
|
+
if (!isNonEmptyArray(containersToApply)) {
|
|
237
238
|
break;
|
|
238
239
|
}
|
|
239
240
|
|
|
@@ -335,7 +336,7 @@ export class LoaderContainerTracker implements IOpProcessingController {
|
|
|
335
336
|
*
|
|
336
337
|
* @param containersToApply - the set of containers to check
|
|
337
338
|
*/
|
|
338
|
-
private needSequenceNumberSynchronize(containersToApply: IContainer
|
|
339
|
+
private needSequenceNumberSynchronize(containersToApply: NonEmptyArray<IContainer>) {
|
|
339
340
|
// If there is a pending proposal, wait for it to be accepted
|
|
340
341
|
const minSeqNum = containersToApply[0].deltaManager.minimumSequenceNumber;
|
|
341
342
|
if (minSeqNum < this.lastProposalSeqNum) {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type NonEmptyArray<T> = [T, ...T[]] | [...T[], T] | [T, ...T[], T];
|
|
7
|
+
|
|
8
|
+
export function isNonEmptyArray<T>(arr: T[]): arr is NonEmptyArray<T> {
|
|
9
|
+
return arr.length > 0;
|
|
10
|
+
}
|
package/src/packageVersion.ts
CHANGED
|
@@ -43,6 +43,7 @@ import { v4 as uuid } from "uuid";
|
|
|
43
43
|
import { LoaderContainerTracker } from "./loaderContainerTracker.js";
|
|
44
44
|
import { LocalCodeLoader, fluidEntryPoint } from "./localCodeLoader.js";
|
|
45
45
|
import { createAndAttachContainer } from "./localLoader.js";
|
|
46
|
+
import { isNonEmptyArray } from "./nonEmptyArrayType.js";
|
|
46
47
|
import { ChannelFactoryRegistry } from "./testFluidObject.js";
|
|
47
48
|
|
|
48
49
|
const defaultCodeDetails: IFluidCodeDetails = {
|
|
@@ -354,7 +355,7 @@ export class EventAndErrorTrackingLogger
|
|
|
354
355
|
}
|
|
355
356
|
|
|
356
357
|
send(event: ITelemetryBaseEvent): void {
|
|
357
|
-
if (this.expectedEvents
|
|
358
|
+
if (isNonEmptyArray(this.expectedEvents)) {
|
|
358
359
|
const ee = this.expectedEvents[0].event;
|
|
359
360
|
if (ee.eventName === event.eventName) {
|
|
360
361
|
let matches = true;
|