@fluidframework/azure-end-to-end-tests 2.50.0 → 2.51.0-347100

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.
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
- import { AzureClient, } from "@fluidframework/azure-client";
5
+ import { AzureClient, } from "@fluidframework/azure-client/internal";
6
6
  import { AzureClient as AzureClientLegacy, } from "@fluidframework/azure-client-legacy";
7
7
  import { ScopeType } from "@fluidframework/driver-definitions/internal";
8
8
  import { createChildLogger, createMultiSinkLogger, } from "@fluidframework/telemetry-utils/internal";
@@ -16,7 +16,7 @@ export { ScopeType };
16
16
  * This function will determine if local or remote mode is required (based on FLUID_CLIENT), and return a new
17
17
  * {@link AzureClient} instance based on the mode by setting the Connection config accordingly.
18
18
  */
19
- export function createAzureClient(id, name, logger, configProvider, scopes) {
19
+ export function createAzureClient(id, name, logger, configProvider, scopes, createContainerRuntimeFactory) {
20
20
  const args = process.argv.slice(2);
21
21
  const driverIndex = args.indexOf("--driver");
22
22
  const r11sEndpointNameIndex = args.indexOf("--r11sEndpointName");
@@ -69,11 +69,13 @@ export function createAzureClient(id, name, logger, configProvider, scopes) {
69
69
  },
70
70
  },
71
71
  });
72
- return new AzureClient({
72
+ const props = {
73
73
  connection: connectionProps,
74
74
  logger: createLogger,
75
75
  configProvider,
76
- });
76
+ createContainerRuntimeFactory,
77
+ };
78
+ return new AzureClient(props);
77
79
  }
78
80
  /**
79
81
  * Copy of {@link createAzureClient} with legacy (LTS) AzureClient APIs.
@@ -1 +1 @@
1
- {"version":3,"file":"AzureClientFactory.js","sourceRoot":"","sources":["../../src/test/AzureClientFactory.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 {\n\tAzureClient,\n\tAzureLocalConnectionConfig,\n\tAzureRemoteConnectionConfig,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/azure-client\";\nimport {\n\tAzureClient as AzureClientLegacy,\n\tAzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,\n\tAzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,\n\tITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,\n} from \"@fluidframework/azure-client-legacy\";\nimport { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tMockLogger,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\nimport { default as Axios, AxiosResponse, type AxiosRequestConfig } from \"axios\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { createAzureTokenProvider } from \"./AzureTokenFactory.js\";\n\n// eslint-disable-next-line unicorn/prefer-export-from\nexport { ScopeType };\n\n/**\n * This function will determine if local or remote mode is required (based on FLUID_CLIENT), and return a new\n * {@link AzureClient} instance based on the mode by setting the Connection config accordingly.\n */\nexport function createAzureClient(\n\tid?: string,\n\tname?: string,\n\tlogger?: MockLogger,\n\tconfigProvider?: IConfigProviderBase,\n\tscopes?: ScopeType[],\n): AzureClient {\n\tconst args = process.argv.slice(2);\n\n\tconst driverIndex = args.indexOf(\"--driver\");\n\tconst r11sEndpointNameIndex = args.indexOf(\"--r11sEndpointName\");\n\n\t// Get values associated with the flags\n\tconst driver = driverIndex === -1 ? undefined : args[driverIndex + 1];\n\tconst r11sEndpointName =\n\t\tr11sEndpointNameIndex === -1 ? undefined : args[r11sEndpointNameIndex + 1];\n\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: id ?? uuid(),\n\t\tname: name ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfig | AzureLocalConnectionConfig = useAzure\n\t\t? {\n\t\t\t\ttenantId,\n\t\t\t\ttokenProvider: createAzureTokenProvider(id ?? \"foo\", name ?? \"bar\", scopes),\n\t\t\t\tendpoint: endPoint,\n\t\t\t\ttype: \"remote\",\n\t\t\t}\n\t\t: {\n\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user, scopes),\n\t\t\t\tendpoint: \"http://localhost:7071\",\n\t\t\t\ttype: \"local\",\n\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLogger | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\n\tconst createLogger = createChildLogger({\n\t\tlogger: getLogger(),\n\t\tproperties: {\n\t\t\tall: {\n\t\t\t\tdriverType: useAzure ? r11sEndpointName : driver,\n\t\t\t\tdriverEndpointName: driver,\n\t\t\t},\n\t\t},\n\t});\n\treturn new AzureClient({\n\t\tconnection: connectionProps,\n\t\tlogger: createLogger,\n\t\tconfigProvider,\n\t});\n}\n\n/**\n * Copy of {@link createAzureClient} with legacy (LTS) AzureClient APIs.\n */\nexport function createAzureClientLegacy(\n\tuserID?: string,\n\tuserName?: string,\n\tlogger?: MockLogger,\n): AzureClientLegacy {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfigLegacy | AzureLocalConnectionConfigLegacy =\n\t\tuseAzure\n\t\t\t? {\n\t\t\t\t\ttenantId,\n\t\t\t\t\ttokenProvider: createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\"),\n\t\t\t\t\tendpoint: endPoint,\n\t\t\t\t\ttype: \"remote\",\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user),\n\t\t\t\t\tendpoint: \"http://localhost:7071\",\n\t\t\t\t\ttype: \"local\",\n\t\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLoggerLegacy | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\treturn new AzureClientLegacy({\n\t\tconnection: connectionProps,\n\t\tlogger: getLogger(),\n\t});\n}\n\n/**\n * This function is used to create a container using any summary payload.\n * It is primary intended as a workaround to using the AzureClient, and\n * is only being used at the moment for ephemeral container E2E tests\n * since AzureClient does not currently support ephemeral containers.\n *\n * Usage of this function for anything other than ephemeral E2E tests is\n * not recommended.\n *\n * @param requestPayload - The summary payload used to create the container,\n * currently these are mainly fetched from ephemeralSummaryTrees.ts\n * @param userID - ID for the user creating the container\n * @param userName - Name for the user creating the container\n * @returns - An AxiosResponse containing the container ID(response.data.id)\n */\nexport async function createContainerFromPayload(\n\trequestPayload: object,\n\tuserID?: string,\n\tuserName?: string,\n): Promise<AxiosResponse> {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"local\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = useAzure\n\t\t? (process.env.azure__fluid__relay__service__endpoint as string)\n\t\t: \"http://localhost:7071\";\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\tconst tokenProvider = useAzure\n\t\t? createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\")\n\t\t: new InsecureTokenProvider(\"fooBar\", user);\n\tconst ordererToken = await tokenProvider.fetchOrdererToken(tenantId, undefined, false);\n\n\tconst headers = {\n\t\t\"Authorization\": `Basic ${ordererToken.jwt}`,\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\n\tconst url = `/documents/${tenantId}`;\n\n\tconst options: AxiosRequestConfig = {\n\t\tbaseURL: endPoint,\n\t\tdata: requestPayload,\n\t\theaders,\n\t\tmaxBodyLength: 1048576000,\n\t\tmaxContentLength: 1048576000,\n\t\tmethod: \"POST\",\n\t\turl,\n\t};\n\n\ttry {\n\t\tconst response: AxiosResponse = await Axios(options);\n\n\t\tif (response.status === 201) {\n\t\t\tconsole.log(\"Container created successfully\");\n\t\t} else {\n\t\t\tthrow new Error(`Error creating container. Status code: ${response.status}`);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\tif (response?.data === undefined || (useAzure && response?.data?.id === undefined)) {\n\t\t\tthrow new Error(`ID of the created container is undefined`);\n\t\t}\n\n\t\treturn response;\n\t} catch (error) {\n\t\tthrow new Error(`An error occurred: ${error}`);\n\t}\n}\n\n/**\n * This function takes an AxiosResponse returned by the createContainerFromPayload and returns the containerId.\n * A separate function is used for this, since the data path to the containerID is not always the same.\n * (Tinylicious has the ID stored at a different path than other services)\n *\n * @param response - A container creation response returned by createContainerFromPayload\n * @returns - The ID of the container that was created by createContainerFromPayload\n */\nexport function getContainerIdFromPayloadResponse(response: AxiosResponse): string {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\treturn (useAzure ? response.data.id : response.data) as string;\n}\n"]}
1
+ {"version":3,"file":"AzureClientFactory.js","sourceRoot":"","sources":["../../src/test/AzureClientFactory.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 {\n\tAzureClient,\n\tAzureClientPropsInternal,\n\tAzureLocalConnectionConfig,\n\tAzureRemoteConnectionConfig,\n\tITelemetryBaseLogger,\n} from \"@fluidframework/azure-client/internal\";\nimport {\n\tAzureClient as AzureClientLegacy,\n\tAzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,\n\tAzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,\n\tITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,\n} from \"@fluidframework/azure-client-legacy\";\nimport type { IRuntimeFactory } from \"@fluidframework/container-definitions/internal\";\nimport { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tCompatibilityMode,\n\tContainerSchema,\n} from \"@fluidframework/fluid-static/internal\";\nimport {\n\tMockLogger,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\nimport { default as Axios, AxiosResponse, type AxiosRequestConfig } from \"axios\";\nimport { v4 as uuid } from \"uuid\";\n\nimport { createAzureTokenProvider } from \"./AzureTokenFactory.js\";\n\n// eslint-disable-next-line unicorn/prefer-export-from\nexport { ScopeType };\n\n/**\n * This function will determine if local or remote mode is required (based on FLUID_CLIENT), and return a new\n * {@link AzureClient} instance based on the mode by setting the Connection config accordingly.\n */\nexport function createAzureClient(\n\tid?: string,\n\tname?: string,\n\tlogger?: MockLogger,\n\tconfigProvider?: IConfigProviderBase,\n\tscopes?: ScopeType[],\n\tcreateContainerRuntimeFactory?: ({\n\t\tschema,\n\t\tcompatibilityMode,\n\t}: {\n\t\tschema: ContainerSchema;\n\t\tcompatibilityMode: CompatibilityMode;\n\t}) => IRuntimeFactory,\n): AzureClient {\n\tconst args = process.argv.slice(2);\n\n\tconst driverIndex = args.indexOf(\"--driver\");\n\tconst r11sEndpointNameIndex = args.indexOf(\"--r11sEndpointName\");\n\n\t// Get values associated with the flags\n\tconst driver = driverIndex === -1 ? undefined : args[driverIndex + 1];\n\tconst r11sEndpointName =\n\t\tr11sEndpointNameIndex === -1 ? undefined : args[r11sEndpointNameIndex + 1];\n\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: id ?? uuid(),\n\t\tname: name ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfig | AzureLocalConnectionConfig = useAzure\n\t\t? {\n\t\t\t\ttenantId,\n\t\t\t\ttokenProvider: createAzureTokenProvider(id ?? \"foo\", name ?? \"bar\", scopes),\n\t\t\t\tendpoint: endPoint,\n\t\t\t\ttype: \"remote\",\n\t\t\t}\n\t\t: {\n\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user, scopes),\n\t\t\t\tendpoint: \"http://localhost:7071\",\n\t\t\t\ttype: \"local\",\n\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLogger | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\n\tconst createLogger = createChildLogger({\n\t\tlogger: getLogger(),\n\t\tproperties: {\n\t\t\tall: {\n\t\t\t\tdriverType: useAzure ? r11sEndpointName : driver,\n\t\t\t\tdriverEndpointName: driver,\n\t\t\t},\n\t\t},\n\t});\n\n\tconst props: AzureClientPropsInternal = {\n\t\tconnection: connectionProps,\n\t\tlogger: createLogger,\n\t\tconfigProvider,\n\t\tcreateContainerRuntimeFactory,\n\t};\n\treturn new AzureClient(props);\n}\n\n/**\n * Copy of {@link createAzureClient} with legacy (LTS) AzureClient APIs.\n */\nexport function createAzureClientLegacy(\n\tuserID?: string,\n\tuserName?: string,\n\tlogger?: MockLogger,\n): AzureClientLegacy {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"frs-client-tenant\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = process.env.azure__fluid__relay__service__endpoint as string;\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\t// use AzureClient remote mode will run against live Azure Fluid Relay.\n\t// Default to running Tinylicious for PR validation\n\t// and local testing so it's not hindered by service availability\n\tconst connectionProps: AzureRemoteConnectionConfigLegacy | AzureLocalConnectionConfigLegacy =\n\t\tuseAzure\n\t\t\t? {\n\t\t\t\t\ttenantId,\n\t\t\t\t\ttokenProvider: createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\"),\n\t\t\t\t\tendpoint: endPoint,\n\t\t\t\t\ttype: \"remote\",\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\ttokenProvider: new InsecureTokenProvider(\"fooBar\", user),\n\t\t\t\t\tendpoint: \"http://localhost:7071\",\n\t\t\t\t\ttype: \"local\",\n\t\t\t\t};\n\tconst getLogger = (): ITelemetryBaseLoggerLegacy | undefined => {\n\t\tconst testLogger = getTestLogger?.();\n\t\tif (!logger && !testLogger) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (logger && testLogger) {\n\t\t\treturn createMultiSinkLogger({ loggers: [logger, testLogger] });\n\t\t}\n\t\treturn logger ?? testLogger;\n\t};\n\treturn new AzureClientLegacy({\n\t\tconnection: connectionProps,\n\t\tlogger: getLogger(),\n\t});\n}\n\n/**\n * This function is used to create a container using any summary payload.\n * It is primary intended as a workaround to using the AzureClient, and\n * is only being used at the moment for ephemeral container E2E tests\n * since AzureClient does not currently support ephemeral containers.\n *\n * Usage of this function for anything other than ephemeral E2E tests is\n * not recommended.\n *\n * @param requestPayload - The summary payload used to create the container,\n * currently these are mainly fetched from ephemeralSummaryTrees.ts\n * @param userID - ID for the user creating the container\n * @param userName - Name for the user creating the container\n * @returns - An AxiosResponse containing the container ID(response.data.id)\n */\nexport async function createContainerFromPayload(\n\trequestPayload: object,\n\tuserID?: string,\n\tuserName?: string,\n): Promise<AxiosResponse> {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tconst tenantId = useAzure\n\t\t? (process.env.azure__fluid__relay__service__tenantId as string)\n\t\t: \"local\";\n\tconst user = {\n\t\tid: userID ?? uuid(),\n\t\tname: userName ?? uuid(),\n\t};\n\tconst endPoint = useAzure\n\t\t? (process.env.azure__fluid__relay__service__endpoint as string)\n\t\t: \"http://localhost:7071\";\n\tif (useAzure && endPoint === undefined) {\n\t\tthrow new Error(\"Azure Fluid Relay service endpoint is missing\");\n\t}\n\n\tconst tokenProvider = useAzure\n\t\t? createAzureTokenProvider(userID ?? \"foo\", userName ?? \"bar\")\n\t\t: new InsecureTokenProvider(\"fooBar\", user);\n\tconst ordererToken = await tokenProvider.fetchOrdererToken(tenantId, undefined, false);\n\n\tconst headers = {\n\t\t\"Authorization\": `Basic ${ordererToken.jwt}`,\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\n\tconst url = `/documents/${tenantId}`;\n\n\tconst options: AxiosRequestConfig = {\n\t\tbaseURL: endPoint,\n\t\tdata: requestPayload,\n\t\theaders,\n\t\tmaxBodyLength: 1048576000,\n\t\tmaxContentLength: 1048576000,\n\t\tmethod: \"POST\",\n\t\turl,\n\t};\n\n\ttry {\n\t\tconst response: AxiosResponse = await Axios(options);\n\n\t\tif (response.status === 201) {\n\t\t\tconsole.log(\"Container created successfully\");\n\t\t} else {\n\t\t\tthrow new Error(`Error creating container. Status code: ${response.status}`);\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t\tif (response?.data === undefined || (useAzure && response?.data?.id === undefined)) {\n\t\t\tthrow new Error(`ID of the created container is undefined`);\n\t\t}\n\n\t\treturn response;\n\t} catch (error) {\n\t\tthrow new Error(`An error occurred: ${error}`);\n\t}\n}\n\n/**\n * This function takes an AxiosResponse returned by the createContainerFromPayload and returns the containerId.\n * A separate function is used for this, since the data path to the containerID is not always the same.\n * (Tinylicious has the ID stored at a different path than other services)\n *\n * @param response - A container creation response returned by createContainerFromPayload\n * @returns - The ID of the container that was created by createContainerFromPayload\n */\nexport function getContainerIdFromPayloadResponse(response: AxiosResponse): string {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\treturn (useAzure ? response.data.id : response.data) as string;\n}\n"]}
@@ -6,10 +6,12 @@ import { strict as assert } from "node:assert";
6
6
  import { AttachState } from "@fluidframework/container-definitions";
7
7
  import { ConnectionState } from "@fluidframework/container-loader";
8
8
  import { MessageType, } from "@fluidframework/driver-definitions/internal";
9
+ import { createTreeContainerRuntimeFactory, isTreeContainerSchema, } from "@fluidframework/fluid-static/internal";
9
10
  import { SharedMap } from "@fluidframework/map/internal";
10
11
  import { SharedMap as SharedMapLegacy } from "@fluidframework/map-legacy";
11
- import { MockLogger } from "@fluidframework/telemetry-utils/internal";
12
+ import { MockLogger, UsageError } from "@fluidframework/telemetry-utils/internal";
12
13
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
14
+ import { SharedTree } from "@fluidframework/tree/internal";
13
15
  import { createSandbox } from "sinon";
14
16
  import { createAzureClient, createAzureClientLegacy, createContainerFromPayload, getContainerIdFromPayloadResponse, } from "./AzureClientFactory.js";
15
17
  import * as ephemeralSummaryTrees from "./ephemeralSummaryTrees.js";
@@ -478,4 +480,27 @@ for (const testOpts of testMatrix) {
478
480
  }
479
481
  });
480
482
  }
483
+ /**
484
+ * Testing creating/loading containers with a tree-based root data object.
485
+ */
486
+ describe("Container create in tree-only mode", () => {
487
+ function createClient() {
488
+ return createAzureClient(undefined, undefined, undefined, undefined, undefined, ({ schema, compatibilityMode }) => {
489
+ if (!isTreeContainerSchema(schema)) {
490
+ throw new UsageError("Tree-only mode requires exactly 1 SharedTree in initialObjects.");
491
+ }
492
+ return createTreeContainerRuntimeFactory({ schema, compatibilityMode });
493
+ });
494
+ }
495
+ it("can create tree-based container", async function () {
496
+ const client = createClient();
497
+ const schema = {
498
+ initialObjects: {
499
+ tree: SharedTree,
500
+ },
501
+ };
502
+ const { container } = await client.createContainer(schema, "2");
503
+ assert(SharedTree.is(container.initialObjects.tree));
504
+ });
505
+ });
481
506
  //# sourceMappingURL=containerCreate.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EACN,WAAW,GAEX,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,OAAO,EACN,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,iCAAiC,GACjC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,cAAc,GAAG,CAAC,QAAqC,EAAuB,EAAE,CAAC,CAAC;IACvF,YAAY,EAAE,CAAC,IAAY,EAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AACnC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;IACnC,QAAQ,CAAC,+BAA+B,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QACjE,MAAM,gBAAgB,GAAG,MAAM,CAAC;QAChC,IAAI,MAAmB,CAAC;QACxB,IAAI,MAAuB,CAAC;QAC5B,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAE1D,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACpC,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAC7B,MAAM,GAAG;gBACR,cAAc,EAAE;oBACf,IAAI,EAAE,SAAS;iBACf;aACD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;;WAMG;QACH,EAAE,CAAC,+BAA+B,EAAE,KAAK;YACxC,gFAAgF;YAChF,yGAAyG;YACzG,yGAAyG;YACzG,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;YACD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,8BAA8B,CAC9B,CAAC;YAEF,2BAA2B;YAC3B,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACvC,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,kBAAkB,EACxC,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,kDAAkD,CAClD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAChD,IAAI,WAAmB,CAAC;YACxB,IAAI,SAA0B,CAAC;YAC/B,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,0BAA0B,EAChD,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;gBACnE,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5D,WAAW,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACxC,CAAC;YAED,IAAI,SAAS,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC7D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAC/E,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,EAAE,QAAQ,EAAE,mCAAmC,CAAC,CAAC;YACtF,MAAM,CAAC,WAAW,CACjB,SAAS,CAAC,WAAW,EACrB,WAAW,CAAC,QAAQ,EACpB,8CAA8C,CAC9C,CAAC;YACF,MAAM,MAAM,CAAC,OAAO,CACnB,SAAS,CAAC,MAAM,EAAE,EAClB,GAAG,EAAE,CAAC,IAAI,EACV,mCAAmC,CACnC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC/E,IAAI,WAAmB,CAAC;YACxB,IAAI,YAA6B,CAAC;YAClC,IAAI,WAAW,EAAE,CAAC;gBACjB,MAAM,iBAAiB,GAA8B,MAAM,0BAA0B,CACpF,qBAAqB,CAAC,4BAA4B,EAClD,gBAAgB,EAChB,kBAAkB,CAClB,CAAC;gBACF,WAAW,GAAG,iCAAiC,CAAC,iBAAiB,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACP,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC1E,WAAW,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,CAAC;gBAE1C,IAAI,YAAY,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBAChE,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;wBAClF,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,6BAA6B;qBACvC,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,aAAa,CACzB,SAAS,EACT,GAAG,EAAE,CAAC,IAAI,EACV,sDAAsD,CACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;;;WAMG;QACH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;YAChG,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;YACrC,OAAO,CAAC,KAAK,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;YAC/B,MAAM,qBAAqB,GAAG,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAElF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAW,EAAE;gBACzC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,iCAAiC,CAAC,CAAC;gBACnF,8CAA8C;gBAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;oBAC1C,MAAM,CAAC,MAAM,CACZ,WAAW,IAAI,KAAK;wBACnB,KAAK,CAAC,SAAS,KAAK,iCAAiC;wBACrD,YAAY,IAAI,KAAK;wBACrB,KAAK,CAAC,UAAU,KAAK,GAAG,EACzB,qBAAqB,KAAK,CAAC,OAAO,EAAE,CACpC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,qBAAqB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChF,CAAC;gBACD,OAAO,IAAI,CAAC;YACb,CAAC,CAAC;YAEF,MAAM,MAAM,CAAC,OAAO,CACnB,qBAAqB,EACrB,OAAO,EACP,gDAAgD,CAChD,CAAC;YACF,kDAAkD;YAClD,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC;QAChC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wCAAwC,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QAC1E,IAAI,MAAmB,CAAC;QACxB,IAAI,MAAuB,CAAC;QAC5B,IAAI,UAAsB,CAAC;QAC3B,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAE1D,UAAU,CAAC,mBAAmB,EAAE,GAAG,EAAE;YACpC,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,MAAM,GAAG;gBACR,cAAc,EAAE;oBACf,IAAI,EAAE,SAAS;iBACf;aACD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,0CAA0C,EAAE,KAAK;YACnD,4FAA4F;YAC5F,6DAA6D;YAC7D,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;YACD,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,uCAAuC,CAAC,CAAC;YACrE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAsB,CAAC;YAClD,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,QAAQ,CAAC,yCAAyC,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QAC3E,MAAM,gBAAgB,GAAG,MAAM,CAAC;QAChC,MAAM,gBAAgB,GAAG,MAAM,CAAC;QAChC,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1D,IAAI,aAA0B,CAAC;QAC/B,IAAI,YAA+B,CAAC;QACpC,MAAM,aAAa,GAAG;YACrB,cAAc,EAAE;gBACf,IAAI,EAAE,SAAS;aACf;SACyB,CAAC;QAE5B,MAAM,YAAY,GAAG;YACpB,cAAc,EAAE;gBACf,IAAI,EAAE,eAAe;aACrB;SACD,CAAC;QAEF,UAAU,CAAC,oBAAoB,EAAE;YAChC,aAAa,GAAG,iBAAiB,EAAE,CAAC;YACpC,YAAY,GAAG,uBAAuB,EAAE,CAAC;YACzC,IAAI,WAAW,EAAE,CAAC;gBACjB,2DAA2D;gBAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;QACF,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,KAAK,MAAM,iBAAiB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAU,EAAE,CAAC;YACrD,EAAE,CAAC,+BAA+B,iBAAiB,iDAAiD,EAAE,KAAK,IAAI,EAAE;gBAChH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GACnC,MAAM,YAAY,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAClD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC;gBAEnD,IAAI,eAAe,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBACnE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAC/D;wBACC,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,mCAAmC;qBAC7C,CACD,CAAC;gBACH,CAAC;gBAED,MAAM,SAAS,GAAG,cAAc,CAC/B,CAAC,OAAO,EAAE,EAAE;oBACX,MAAM,eAAe,GAAG,GAAS,EAAE;wBAClC,IACE,eAAe,CAAC,cAAc,CAAC,IAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,EAC9E,CAAC;4BACF,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;4BAC9C,OAAO,EAAE,CAAC;wBACX,CAAC;oBACF,CAAC,CAAC;oBACF,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;gBAC9C,CAAC,EACD;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,kBAAkB;iBAC5B,CACD,CAAC;gBACD,eAAe,CAAC,cAAc,CAAC,IAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAE7E,wFAAwF;gBACxF,MAAM,SAAS,CAAC;gBAEhB,IAAI,iBAAiB,KAAK,GAAG,EAAE,CAAC;oBAC/B,sFAAsF;oBACtF,gCAAgC;oBAChC,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;gBAED,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAC3C,WAAW,EACX,aAAa,EACb,iBAAiB,CACjB,CAAC;gBACF,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;gBAEnF,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,SAAS,CAAC;gBAExD,IAAI,gBAAgB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBACpE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAChE;wBACC,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,oCAAoC;qBAC9C,CACD,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;gBACvE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,QAAQ,CAAC,0CAA0C,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE;QAC5E,MAAM,gBAAgB,GAAG,MAAM,CAAC;QAChC,MAAM,WAAW,GAAY,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1D,IAAI,cAA2B,CAAC;QAChC,IAAI,cAA2B,CAAC;QAChC,IAAI,YAA+B,CAAC;QACpC,IAAI,OAAqB,CAAC;QAE1B,MAAM,aAAa,GAAG;YACrB,cAAc,EAAE;gBACf,IAAI,EAAE,SAAS;aACf;SACyB,CAAC;QAE5B,MAAM,YAAY,GAAG;YACpB,cAAc,EAAE;gBACf,IAAI,EAAE,eAAe;aACrB;SACD,CAAC;QAEF,MAAM,CAAC;YACN,OAAO,GAAG,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,oBAAoB,EAAE;YAChC,cAAc,GAAG,iBAAiB,EAAE,CAAC;YACrC,cAAc,GAAG,iBAAiB,EAAE,CAAC;YACrC,YAAY,GAAG,uBAAuB,EAAE,CAAC;YACzC,IAAI,WAAW,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC;YACT,OAAO,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH;;;;;WAKG;QACH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC7F,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAC3E,aAAa;YACb,0FAA0F;YAC1F,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,CAAC;YAEpD,IAAI,gBAAgB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACpE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAChE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,oCAAoC;iBAC9C,CACD,CAAC;YACH,CAAC;YAED,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAEzD,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YACvE,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAEnF,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,SAAS,CAAC;YACvD,IAAI,eAAe,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACnE,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBACrF,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,mCAAmC;iBAC7C,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAI,eAAe,CAAC,cAAc,CAAC,IAAwB,CAAC,GAAG,CAC1E,KAAK,CACL,CAAC;YACF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;YAC1G,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAC5E,aAAa,EACb,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAErD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC/E,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAEnF,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,SAAS,CAAC;YACzD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH;;;;WAIG;QACH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;YAC1G,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CAC5E,aAAa,EACb,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;YAErD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE1D,MAAM,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC/E,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;YAEnF,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,SAAS,CAAC;YACzD,IAAI,iBAAiB,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrE,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EACjE;oBACC,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,qCAAqC;iBAC/C,CACD,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAS,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,qCAAqC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CACrE,aAAa,EACb,GAAG,CACH,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;YAE9C,IAAI,UAAU,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC9D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBAChF,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG;YACtC,0GAA0G;YACzG,UAAkB,CAAC,SAAS,EAC7B,sBAAsB,CACtB,CAAC;YAEF,oDAAoD;YACpD,6IAA6I;YAC5I,UAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;gBAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,MAAM,YAAY,CAAC,YAAY,CACrE,WAAW,EACX,YAAY,CACZ,CAAC;YACF,IAAI,eAAe,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACnE,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;oBACrF,UAAU,EAAE,gBAAgB;oBAC5B,QAAQ,EAAE,mCAAmC;iBAC7C,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,eAAe,CAAC,cAAc,CAAC,IAAuB,CAAC;YAEzE,iDAAiD;YACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1C,2BAA2B;YAC3B,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAqC,CAAC;gBAC3D,IACC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS;oBACrC,OAAO,CAAC,QAA6B,CAAC,IAAI,KAAK,cAAc,EAC7D,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC9C,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,iBAAiB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAU,EAAE,CAAC;YACrD,EAAE,CAAC,qDAAqD,iBAAiB,GAAG,EAAE,KAAK,IAAI,EAAE;gBACxF,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,eAAe,CACrE,aAAa,EACb,iBAAiB,CACjB,CAAC;gBACF,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;gBAE9C,IAAI,UAAU,CAAC,eAAe,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBAC9D,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE;wBAChF,UAAU,EAAE,gBAAgB;wBAC5B,QAAQ,EAAE,6BAA6B;qBACvC,CAAC,CAAC;gBACJ,CAAC;gBAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG;gBACtC,0GAA0G;gBACzG,UAAkB,CAAC,SAAS,EAC7B,sBAAsB,CACtB,CAAC;gBAEF,oDAAoD;gBACpD,6IAA6I;gBAC5I,UAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;oBAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;oBAC5C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;gBAEH,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,cAAc,CAAC,YAAY,CAClE,WAAW,EACX,aAAa,EACb,iBAAiB,CACjB,CAAC;gBACF,MAAM,IAAI,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBAE5C,kCAAkC;gBAClC,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChD,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEhD,2BAA2B;gBAC3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;gBAC1B,KAAK,MAAM,IAAI,IAAI,mBAAmB,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACnD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAqC,CAAC;oBAC3D,IACC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,SAAS;wBACtC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;wBACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAwB,CAAC,IAAI,KAAK,cAAc,EAC3E,CAAC;wBACF,iBAAiB,EAAE,CAAC;oBACrB,CAAC;gBACF,CAAC;gBAED,IAAI,iBAAiB,KAAK,GAAG,EAAE,CAAC;oBAC/B,MAAM,CAAC,WAAW,CACjB,iBAAiB,EACjB,CAAC,EACD,8CAA8C,CAC9C,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,WAAW,CACjB,iBAAiB,EACjB,CAAC,EACD,2CAA2C,CAC3C,CAAC;gBACH,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AzureClient as AzureClientLegacy } from \"@fluidframework/azure-client-legacy\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport { ContainerSchema, type IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport { SharedMap as SharedMapLegacy } from \"@fluidframework/map-legacy\";\nimport { MockLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { AxiosResponse } from \"axios\";\nimport type { SinonSandbox } from \"sinon\";\nimport { createSandbox } from \"sinon\";\n\nimport {\n\tcreateAzureClient,\n\tcreateAzureClientLegacy,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { getTestMatrix, mapWait } from \"./utils.js\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Container create scenarios (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tclient = createAzureClient();\n\t\t\tschema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test when an Azure Client container is created,\n\t\t * it is initially detached.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"Created container is detached\", async function () {\n\t\t\t// We currently don't have API surface to create a detached ephemeral container.\n\t\t\t// Instead, ephemeral containers are created indirectly using the test util createContainerFromPayload().\n\t\t\t// Once we add ephemeral container API surface to AzureClient, we can enable this test for ephemeral too.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tconst { container } = await client.createContainer(schema, \"2\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Detached,\n\t\t\t\t\"Container should be detached\",\n\t\t\t);\n\n\t\t\t// Make sure we can attach.\n\t\t\tconst containerId = await container.attach();\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test attaching a container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can attach a container\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.canAttachContainer,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test if attaching a container twice fails.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"cannot attach a container twice\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.cannotAttachContainerTwice,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is attached after attach is called\",\n\t\t\t);\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainer.attach(),\n\t\t\t\t() => true,\n\t\t\t\t\"Container should not attach twice\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get an existing container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can retrieve existing Azure Fluid Relay container successfully\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet newContainer: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.retrieveExistingAFRContainer,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t} else {\n\t\t\t\t({ container: newContainer } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await newContainer.attach();\n\n\t\t\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst resources = client.getContainer(containerId, schema, \"2\");\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tresources,\n\t\t\t\t() => true,\n\t\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get a non-exiting container.\n\t\t *\n\t\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t\t *\n\t\t * Note: This test is currently skipped because it is failing when ran against tinylicious (azure-local-service).\n\t\t */\n\t\tit(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\t\tconst consoleErrorFn = console.error;\n\t\t\tconsole.error = (): void => {};\n\t\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema, \"2\");\n\n\t\t\tconst errorFn = (error: Error): boolean => {\n\t\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\t\t// AFR gives R11s fetch error, T9s gives 0x8e4\n\t\t\t\tif (process.env.FLUID_CLIENT === \"azure\") {\n\t\t\t\t\tassert.strict(\n\t\t\t\t\t\t\"errorType\" in error &&\n\t\t\t\t\t\t\terror.errorType === \"fileNotFoundOrAccessDeniedError\" &&\n\t\t\t\t\t\t\t\"statusCode\" in error &&\n\t\t\t\t\t\t\terror.statusCode === 404,\n\t\t\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strict(error.message === \"0x8e4\", `Unexpected error: ${error.message}`);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainerAndServicesP,\n\t\t\t\terrorFn,\n\t\t\t\t\"Azure Client can load a non-existent container\",\n\t\t\t);\n\t\t\t// eslint-disable-next-line require-atomic-updates\n\t\t\tconsole.error = consoleErrorFn;\n\t\t});\n\t});\n\n\tdescribe(`Container create with feature flags (${testOpts.variant})`, () => {\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tlet mockLogger: MockLogger;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tclient = createAzureClient(undefined, undefined, mockLogger, configProvider({}));\n\t\t\tschema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test if AzureClient can create a container with feature gates.\n\t\t *\n\t\t * Expected behavior: An error should not be thrown and the logger should have logged the enabled feature gates.\n\t\t */\n\t\tit(\"can create containers with feature gates\", async function () {\n\t\t\t// Ephemeral containers are currently not created with the AzureClient, and therefore do not\n\t\t\t// have an attached mockLogger which is needed for this test.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tawait client.createContainer(schema, \"2\");\n\t\t\tconst event = mockLogger.events.find((e) => e.eventName.endsWith(\"ContainerLoadStats\"));\n\t\t\tassert(event !== undefined, \"ContainerLoadStats event should exist\");\n\t\t\tconst featureGates = event.featureGates as string;\n\t\t\tassert(featureGates.length > 0);\n\t\t});\n\t});\n\n\t/**\n\t * Testing scenarios for creating/loading containers with the legacy (LTS) version of AzureClient.\n\t */\n\tdescribe(`Container create with legacy version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst valueSetTimoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\t// TODO: Should we skip ephemeral tests for legacy clients?\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient can get a container made by a legacy AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`Current AzureClient (mode: \"${compatibilityMode}\") can get container made by legacy AzureClient`, async () => {\n\t\t\t\tconst { container: containerLegacy } =\n\t\t\t\t\tawait clientLegacy.createContainer(schemaLegacy);\n\t\t\t\tconst containerId = await containerLegacy.attach();\n\n\t\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerLegacy.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst valueSetP = timeoutPromise(\n\t\t\t\t\t(resolve) => {\n\t\t\t\t\t\tconst confirmValueSet = (): void => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).get(\"key\") === \"value\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcontainerLegacy.off(\"saved\", confirmValueSet);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcontainerLegacy.on(\"saved\", confirmValueSet);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: valueSetTimoutMs,\n\t\t\t\t\t\terrorMsg: \"valueSet timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).set(\"key\", \"value\");\n\n\t\t\t\t// Await the value being saved, especially important if we dispose the legacy container.\n\t\t\t\tawait valueSetP;\n\n\t\t\t\tif (compatibilityMode === \"2\") {\n\t\t\t\t\t// We don't support interop between legacy containers and \"2\" mode, dispose the legacy\n\t\t\t\t\t// container to avoid this case.\n\t\t\t\t\tcontainerLegacy.dispose();\n\t\t\t\t}\n\n\t\t\t\tconst resources = clientCurrent.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\t\tconst { container: containerCurrent } = await resources;\n\n\t\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = containerCurrent.initialObjects.map1.get<string>(\"key\");\n\t\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * Testing creating/loading containers between the compatibility modes.\n\t */\n\tdescribe(`Container create with current version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent1: AzureClient;\n\t\tlet clientCurrent2: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tlet sandbox: SinonSandbox;\n\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbefore(function () {\n\t\t\tsandbox = createSandbox();\n\t\t});\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent1 = createAzureClient();\n\t\t\tclientCurrent2 = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tsandbox.restore();\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a legacy AzureClient can get a container made by the current AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(`Legacy AzureClient can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t// Note: Only containers created in compatibility mode \"1\" may be loaded by legacy client.\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent.attach();\n\n\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientLegacy.getContainer(containerId, schemaLegacy);\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerLegacy } = await resources;\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = (containerLegacy.initialObjects.map1 as SharedMapLegacy).get<string>(\n\t\t\t\t\"key\",\n\t\t\t);\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"2\" can get a container made by the current AzureClient in mode \"1\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"2\") can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent1.attach();\n\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent1.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent2.getContainer(containerId, schemaCurrent, \"2\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent2 } = await resources;\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent2.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"1\" can get a container made by the current AzureClient in mode \"2\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"1\") can get container made by current AzureClient (mode: \"2\")`, async () => {\n\t\t\tconst { container: containerCurrent2 } = await clientCurrent2.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent2.attach();\n\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent2.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent1.getContainer(containerId, schemaCurrent, \"1\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent1 } = await resources;\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent1.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\tit(\"op grouping disabled as expected for 1.x clients\", async () => {\n\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await container1.attach();\n\n\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container1.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst containerProcessSpy = sandbox.spy(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(container1 as any).container,\n\t\t\t\t\"processRemoteMessage\",\n\t\t\t);\n\n\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t});\n\n\t\t\tconst { container: containerLegacy } = await clientLegacy.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tschemaLegacy,\n\t\t\t);\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst legacyMap = containerLegacy.initialObjects.map1 as SharedMapLegacy;\n\n\t\t\t// Verify ops are processed by legacy AzureClient\n\t\t\tassert.strictEqual(legacyMap.get(\"1\"), 1);\n\t\t\tassert.strictEqual(legacyMap.get(\"2\"), 2);\n\t\t\tassert.strictEqual(legacyMap.get(\"3\"), 3);\n\n\t\t\t// Inspect the incoming ops\n\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\tif (\n\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t(message.contents as { type: string }).type === \"groupedBatch\"\n\t\t\t\t) {\n\t\t\t\t\tassert.fail(\"unexpected groupedBatch found\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`op grouping works as expected (compatibilityMode: ${compatibilityMode})`, async () => {\n\t\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst containerId = await container1.attach();\n\n\t\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => container1.once(\"connected\", () => resolve()), {\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst containerProcessSpy = sandbox.spy(\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(container1 as any).container,\n\t\t\t\t\t\"processRemoteMessage\",\n\t\t\t\t);\n\n\t\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t\t});\n\n\t\t\t\tconst { container: container2 } = await clientCurrent1.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst map2 = container2.initialObjects.map1;\n\n\t\t\t\t// Process ops coming from service\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"1\"), 1);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"2\"), 2);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"3\"), 3);\n\n\t\t\t\t// Inspect the incoming ops\n\t\t\t\tlet groupedBatchCount = 0;\n\t\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\t\tif (\n\t\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t\ttypeof message.contents === \"string\" &&\n\t\t\t\t\t\t(JSON.parse(message.contents) as { type?: unknown }).type === \"groupedBatch\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tgroupedBatchCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (compatibilityMode === \"1\") {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"expect no op grouping in compatibilityMode 1\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"expect op grouping in compatibilityMode 2\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AzureClient as AzureClientLegacy } from \"@fluidframework/azure-client-legacy\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tMessageType,\n\tISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/internal\";\nimport {\n\tContainerSchema,\n\tcreateTreeContainerRuntimeFactory,\n\tisTreeContainerSchema,\n\ttype IFluidContainer,\n} from \"@fluidframework/fluid-static/internal\";\nimport { SharedMap } from \"@fluidframework/map/internal\";\nimport { SharedMap as SharedMapLegacy } from \"@fluidframework/map-legacy\";\nimport { MockLogger, UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport { SharedTree } from \"@fluidframework/tree/internal\";\nimport { AxiosResponse } from \"axios\";\nimport type { SinonSandbox } from \"sinon\";\nimport { createSandbox } from \"sinon\";\n\nimport {\n\tcreateAzureClient,\n\tcreateAzureClientLegacy,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { getTestMatrix, mapWait } from \"./utils.js\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Container create scenarios (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tclient = createAzureClient();\n\t\t\tschema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test when an Azure Client container is created,\n\t\t * it is initially detached.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"Created container is detached\", async function () {\n\t\t\t// We currently don't have API surface to create a detached ephemeral container.\n\t\t\t// Instead, ephemeral containers are created indirectly using the test util createContainerFromPayload().\n\t\t\t// Once we add ephemeral container API surface to AzureClient, we can enable this test for ephemeral too.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tconst { container } = await client.createContainer(schema, \"2\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Detached,\n\t\t\t\t\"Container should be detached\",\n\t\t\t);\n\n\t\t\t// Make sure we can attach.\n\t\t\tconst containerId = await container.attach();\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test attaching a container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can attach a container\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.canAttachContainer,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is not attached after attach is called\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test if attaching a container twice fails.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"cannot attach a container twice\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.cannotAttachContainerTwice,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t\t({ container } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await container.attach();\n\t\t\t}\n\n\t\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\t\tassert.strictEqual(\n\t\t\t\tcontainer.attachState,\n\t\t\t\tAttachState.Attached,\n\t\t\t\t\"Container is attached after attach is called\",\n\t\t\t);\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainer.attach(),\n\t\t\t\t() => true,\n\t\t\t\t\"Container should not attach twice\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get an existing container.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(\"can retrieve existing Azure Fluid Relay container successfully\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet newContainer: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.retrieveExistingAFRContainer,\n\t\t\t\t\t\"test-user-id-1\",\n\t\t\t\t\t\"test-user-name-1\",\n\t\t\t\t);\n\t\t\t\tcontainerId = getContainerIdFromPayloadResponse(containerResponse);\n\t\t\t} else {\n\t\t\t\t({ container: newContainer } = await client.createContainer(schema, \"2\"));\n\t\t\t\tcontainerId = await newContainer.attach();\n\n\t\t\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst resources = client.getContainer(containerId, schema, \"2\");\n\t\t\tawait assert.doesNotReject(\n\t\t\t\tresources,\n\t\t\t\t() => true,\n\t\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if Azure Client can get a non-exiting container.\n\t\t *\n\t\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t\t *\n\t\t * Note: This test is currently skipped because it is failing when ran against tinylicious (azure-local-service).\n\t\t */\n\t\tit(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\t\tconst consoleErrorFn = console.error;\n\t\t\tconsole.error = (): void => {};\n\t\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema, \"2\");\n\n\t\t\tconst errorFn = (error: Error): boolean => {\n\t\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\t\t// AFR gives R11s fetch error, T9s gives 0x8e4\n\t\t\t\tif (process.env.FLUID_CLIENT === \"azure\") {\n\t\t\t\t\tassert.strict(\n\t\t\t\t\t\t\"errorType\" in error &&\n\t\t\t\t\t\t\terror.errorType === \"fileNotFoundOrAccessDeniedError\" &&\n\t\t\t\t\t\t\t\"statusCode\" in error &&\n\t\t\t\t\t\t\terror.statusCode === 404,\n\t\t\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strict(error.message === \"0x8e4\", `Unexpected error: ${error.message}`);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tawait assert.rejects(\n\t\t\t\tcontainerAndServicesP,\n\t\t\t\terrorFn,\n\t\t\t\t\"Azure Client can load a non-existent container\",\n\t\t\t);\n\t\t\t// eslint-disable-next-line require-atomic-updates\n\t\t\tconsole.error = consoleErrorFn;\n\t\t});\n\t});\n\n\tdescribe(`Container create with feature flags (${testOpts.variant})`, () => {\n\t\tlet client: AzureClient;\n\t\tlet schema: ContainerSchema;\n\t\tlet mockLogger: MockLogger;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\n\t\tbeforeEach(\"createAzureClient\", () => {\n\t\t\tmockLogger = new MockLogger();\n\t\t\tclient = createAzureClient(undefined, undefined, mockLogger, configProvider({}));\n\t\t\tschema = {\n\t\t\t\tinitialObjects: {\n\t\t\t\t\tmap1: SharedMap,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Test if AzureClient can create a container with feature gates.\n\t\t *\n\t\t * Expected behavior: An error should not be thrown and the logger should have logged the enabled feature gates.\n\t\t */\n\t\tit(\"can create containers with feature gates\", async function () {\n\t\t\t// Ephemeral containers are currently not created with the AzureClient, and therefore do not\n\t\t\t// have an attached mockLogger which is needed for this test.\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t\tawait client.createContainer(schema, \"2\");\n\t\t\tconst event = mockLogger.events.find((e) => e.eventName.endsWith(\"ContainerLoadStats\"));\n\t\t\tassert(event !== undefined, \"ContainerLoadStats event should exist\");\n\t\t\tconst featureGates = event.featureGates as string;\n\t\t\tassert(featureGates.length > 0);\n\t\t});\n\t});\n\n\t/**\n\t * Testing scenarios for creating/loading containers with the legacy (LTS) version of AzureClient.\n\t */\n\tdescribe(`Container create with legacy version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst valueSetTimoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\t// TODO: Should we skip ephemeral tests for legacy clients?\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient can get a container made by a legacy AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`Current AzureClient (mode: \"${compatibilityMode}\") can get container made by legacy AzureClient`, async () => {\n\t\t\t\tconst { container: containerLegacy } =\n\t\t\t\t\tawait clientLegacy.createContainer(schemaLegacy);\n\t\t\t\tconst containerId = await containerLegacy.attach();\n\n\t\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerLegacy.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst valueSetP = timeoutPromise(\n\t\t\t\t\t(resolve) => {\n\t\t\t\t\t\tconst confirmValueSet = (): void => {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).get(\"key\") === \"value\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tcontainerLegacy.off(\"saved\", confirmValueSet);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcontainerLegacy.on(\"saved\", confirmValueSet);\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: valueSetTimoutMs,\n\t\t\t\t\t\terrorMsg: \"valueSet timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\t(containerLegacy.initialObjects.map1 as SharedMapLegacy).set(\"key\", \"value\");\n\n\t\t\t\t// Await the value being saved, especially important if we dispose the legacy container.\n\t\t\t\tawait valueSetP;\n\n\t\t\t\tif (compatibilityMode === \"2\") {\n\t\t\t\t\t// We don't support interop between legacy containers and \"2\" mode, dispose the legacy\n\t\t\t\t\t// container to avoid this case.\n\t\t\t\t\tcontainerLegacy.dispose();\n\t\t\t\t}\n\n\t\t\t\tconst resources = clientCurrent.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\t\tconst { container: containerCurrent } = await resources;\n\n\t\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst result = containerCurrent.initialObjects.map1.get<string>(\"key\");\n\t\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t\t});\n\t\t}\n\t});\n\n\t/**\n\t * Testing creating/loading containers between the compatibility modes.\n\t */\n\tdescribe(`Container create with current version (${testOpts.variant})`, () => {\n\t\tconst connectTimeoutMs = 10_000;\n\t\tconst isEphemeral: boolean = testOpts.options.isEphemeral;\n\t\tlet clientCurrent1: AzureClient;\n\t\tlet clientCurrent2: AzureClient;\n\t\tlet clientLegacy: AzureClientLegacy;\n\t\tlet sandbox: SinonSandbox;\n\n\t\tconst schemaCurrent = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t} satisfies ContainerSchema;\n\n\t\tconst schemaLegacy = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMapLegacy,\n\t\t\t},\n\t\t};\n\n\t\tbefore(function () {\n\t\t\tsandbox = createSandbox();\n\t\t});\n\n\t\tbeforeEach(\"createAzureClients\", function () {\n\t\t\tclientCurrent1 = createAzureClient();\n\t\t\tclientCurrent2 = createAzureClient();\n\t\t\tclientLegacy = createAzureClientLegacy();\n\t\t\tif (isEphemeral) {\n\t\t\t\tthis.skip();\n\t\t\t}\n\t\t});\n\n\t\tafterEach(function () {\n\t\t\tsandbox.restore();\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a legacy AzureClient can get a container made by the current AzureClient.\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t\t * be returned.\n\t\t */\n\t\tit(`Legacy AzureClient can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t// Note: Only containers created in compatibility mode \"1\" may be loaded by legacy client.\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent.attach();\n\n\t\t\tif (containerCurrent.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientLegacy.getContainer(containerId, schemaLegacy);\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerLegacy } = await resources;\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result = (containerLegacy.initialObjects.map1 as SharedMapLegacy).get<string>(\n\t\t\t\t\"key\",\n\t\t\t);\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"2\" can get a container made by the current AzureClient in mode \"1\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"2\") can get container made by current AzureClient (mode: \"1\")`, async () => {\n\t\t\tconst { container: containerCurrent1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent1.attach();\n\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent1.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent2.getContainer(containerId, schemaCurrent, \"2\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent2 } = await resources;\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent2.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: test if a current AzureClient in compatibility mode \"1\" can get a container made by the current AzureClient in mode \"2\".\n\t\t *\n\t\t * Expected behavior: an error should not be thrown nor should a rejected promise be returned.\n\t\t */\n\t\tit(`Current AzureClient (mode: \"1\") can get container made by current AzureClient (mode: \"2\")`, async () => {\n\t\t\tconst { container: containerCurrent2 } = await clientCurrent2.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"2\",\n\t\t\t);\n\t\t\tconst containerId = await containerCurrent2.attach();\n\n\t\t\tif (containerCurrent2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent2 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcontainerCurrent2.initialObjects.map1.set(\"key\", \"value\");\n\n\t\t\tconst resources = clientCurrent1.getContainer(containerId, schemaCurrent, \"1\");\n\t\t\tawait assert.doesNotReject(resources, () => true, \"container could not be loaded\");\n\n\t\t\tconst { container: containerCurrent1 } = await resources;\n\t\t\tif (containerCurrent1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => containerCurrent1.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"containerCurrent1 connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst result = containerCurrent1.initialObjects.map1.get<string>(\"key\");\n\t\t\tassert.strictEqual(result, \"value\", \"Value not found in copied container\");\n\t\t});\n\n\t\tit(\"op grouping disabled as expected for 1.x clients\", async () => {\n\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\tschemaCurrent,\n\t\t\t\t\"1\",\n\t\t\t);\n\t\t\tconst containerId = await container1.attach();\n\n\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => container1.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst containerProcessSpy = sandbox.spy(\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t(container1 as any).container,\n\t\t\t\t\"processRemoteMessage\",\n\t\t\t);\n\n\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t});\n\n\t\t\tconst { container: containerLegacy } = await clientLegacy.getContainer(\n\t\t\t\tcontainerId,\n\t\t\t\tschemaLegacy,\n\t\t\t);\n\t\t\tif (containerLegacy.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise((resolve) => containerLegacy.once(\"connected\", () => resolve()), {\n\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\terrorMsg: \"containerLegacy connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst legacyMap = containerLegacy.initialObjects.map1 as SharedMapLegacy;\n\n\t\t\t// Verify ops are processed by legacy AzureClient\n\t\t\tassert.strictEqual(legacyMap.get(\"1\"), 1);\n\t\t\tassert.strictEqual(legacyMap.get(\"2\"), 2);\n\t\t\tassert.strictEqual(legacyMap.get(\"3\"), 3);\n\n\t\t\t// Inspect the incoming ops\n\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\tif (\n\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t(message.contents as { type: string }).type === \"groupedBatch\"\n\t\t\t\t) {\n\t\t\t\t\tassert.fail(\"unexpected groupedBatch found\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tfor (const compatibilityMode of [\"1\", \"2\"] as const) {\n\t\t\tit(`op grouping works as expected (compatibilityMode: ${compatibilityMode})`, async () => {\n\t\t\t\tconst { container: container1 } = await clientCurrent1.createContainer(\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst containerId = await container1.attach();\n\n\t\t\t\tif (container1.connectionState !== ConnectionState.Connected) {\n\t\t\t\t\tawait timeoutPromise((resolve) => container1.once(\"connected\", () => resolve()), {\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst containerProcessSpy = sandbox.spy(\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\t\t\t\t\t(container1 as any).container,\n\t\t\t\t\t\"processRemoteMessage\",\n\t\t\t\t);\n\n\t\t\t\t// Explicitly force ops sent to be in the same batch\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n\t\t\t\t(container1 as any).container._runtime.orderSequentially(() => {\n\t\t\t\t\tconst map1 = container1.initialObjects.map1;\n\t\t\t\t\tmap1.set(\"1\", 1);\n\t\t\t\t\tmap1.set(\"2\", 2);\n\t\t\t\t\tmap1.set(\"3\", 3);\n\t\t\t\t});\n\n\t\t\t\tconst { container: container2 } = await clientCurrent1.getContainer(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschemaCurrent,\n\t\t\t\t\tcompatibilityMode,\n\t\t\t\t);\n\t\t\t\tconst map2 = container2.initialObjects.map1;\n\n\t\t\t\t// Process ops coming from service\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"1\"), 1);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"2\"), 2);\n\t\t\t\tassert.strictEqual(await mapWait(map2, \"3\"), 3);\n\n\t\t\t\t// Inspect the incoming ops\n\t\t\t\tlet groupedBatchCount = 0;\n\t\t\t\tfor (const call of containerProcessSpy.getCalls()) {\n\t\t\t\t\tconst message = call.firstArg as ISequencedDocumentMessage;\n\t\t\t\t\tif (\n\t\t\t\t\t\tmessage.type === MessageType.Operation &&\n\t\t\t\t\t\ttypeof message.contents === \"string\" &&\n\t\t\t\t\t\t(JSON.parse(message.contents) as { type?: unknown }).type === \"groupedBatch\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tgroupedBatchCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (compatibilityMode === \"1\") {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t\"expect no op grouping in compatibilityMode 1\",\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tassert.strictEqual(\n\t\t\t\t\t\tgroupedBatchCount,\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t\"expect op grouping in compatibilityMode 2\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n\n/**\n * Testing creating/loading containers with a tree-based root data object.\n */\ndescribe(\"Container create in tree-only mode\", () => {\n\tfunction createClient(): AzureClient {\n\t\treturn createAzureClient(\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t({ schema, compatibilityMode }) => {\n\t\t\t\tif (!isTreeContainerSchema(schema)) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"Tree-only mode requires exactly 1 SharedTree in initialObjects.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn createTreeContainerRuntimeFactory({ schema, compatibilityMode });\n\t\t\t},\n\t\t);\n\t}\n\tit(\"can create tree-based container\", async function () {\n\t\tconst client = createClient();\n\t\tconst schema = {\n\t\t\tinitialObjects: {\n\t\t\t\ttree: SharedTree,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(schema, \"2\");\n\n\t\tassert(SharedTree.is(container.initialObjects.tree));\n\t});\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/azure-end-to-end-tests",
3
- "version": "2.50.0",
3
+ "version": "2.51.0-347100",
4
4
  "description": "Azure client end to end tests",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -33,49 +33,48 @@
33
33
  "temp-directory": "nyc/.nyc_output"
34
34
  },
35
35
  "dependencies": {
36
- "@fluid-experimental/data-objects": "~2.50.0",
37
- "@fluid-internal/client-utils": "~2.50.0",
38
- "@fluid-internal/mocha-test-setup": "~2.50.0",
39
- "@fluid-private/test-version-utils": "~2.50.0",
40
- "@fluidframework/aqueduct": "~2.50.0",
41
- "@fluidframework/azure-client": "~2.50.0",
36
+ "@fluid-experimental/data-objects": "2.51.0-347100",
37
+ "@fluid-internal/client-utils": "2.51.0-347100",
38
+ "@fluid-internal/mocha-test-setup": "2.51.0-347100",
39
+ "@fluid-private/test-version-utils": "2.51.0-347100",
40
+ "@fluidframework/aqueduct": "2.51.0-347100",
41
+ "@fluidframework/azure-client": "2.51.0-347100",
42
42
  "@fluidframework/azure-client-legacy": "npm:@fluidframework/azure-client@^1.2.0",
43
- "@fluidframework/container-definitions": "~2.50.0",
44
- "@fluidframework/container-loader": "~2.50.0",
45
- "@fluidframework/core-interfaces": "~2.50.0",
46
- "@fluidframework/counter": "~2.50.0",
47
- "@fluidframework/datastore-definitions": "~2.50.0",
48
- "@fluidframework/fluid-static": "~2.50.0",
49
- "@fluidframework/map": "~2.50.0",
43
+ "@fluidframework/container-definitions": "2.51.0-347100",
44
+ "@fluidframework/container-loader": "2.51.0-347100",
45
+ "@fluidframework/core-interfaces": "2.51.0-347100",
46
+ "@fluidframework/counter": "2.51.0-347100",
47
+ "@fluidframework/datastore-definitions": "2.51.0-347100",
48
+ "@fluidframework/fluid-static": "2.51.0-347100",
49
+ "@fluidframework/map": "2.51.0-347100",
50
50
  "@fluidframework/map-legacy": "npm:@fluidframework/map@^1.4.0",
51
- "@fluidframework/matrix": "~2.50.0",
52
- "@fluidframework/presence": "~2.50.0",
53
- "@fluidframework/runtime-definitions": "~2.50.0",
54
- "@fluidframework/sequence": "~2.50.0",
55
- "@fluidframework/telemetry-utils": "~2.50.0",
56
- "@fluidframework/test-runtime-utils": "~2.50.0",
57
- "@fluidframework/test-utils": "~2.50.0",
58
- "@fluidframework/tree": "~2.50.0",
51
+ "@fluidframework/matrix": "2.51.0-347100",
52
+ "@fluidframework/presence": "2.51.0-347100",
53
+ "@fluidframework/runtime-definitions": "2.51.0-347100",
54
+ "@fluidframework/sequence": "2.51.0-347100",
55
+ "@fluidframework/telemetry-utils": "2.51.0-347100",
56
+ "@fluidframework/test-runtime-utils": "2.51.0-347100",
57
+ "@fluidframework/test-utils": "2.51.0-347100",
58
+ "@fluidframework/tree": "2.51.0-347100",
59
59
  "axios": "^1.8.4",
60
60
  "cross-env": "^7.0.3",
61
61
  "mocha": "^10.8.2",
62
62
  "mocha-multi-reporters": "^1.5.1",
63
63
  "sinon": "^18.0.1",
64
64
  "start-server-and-test": "^2.0.3",
65
- "tinylicious": "^5.0.0",
66
- "uuid": "^9.0.0"
65
+ "tinylicious": "^7.0.0",
66
+ "uuid": "^11.1.0"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@biomejs/biome": "~1.9.3",
70
70
  "@fluidframework/build-common": "^2.0.3",
71
71
  "@fluidframework/build-tools": "^0.56.0",
72
- "@fluidframework/driver-definitions": "~2.50.0",
72
+ "@fluidframework/driver-definitions": "2.51.0-347100",
73
73
  "@fluidframework/eslint-config-fluid": "^5.7.4",
74
74
  "@types/mocha": "^10.0.10",
75
75
  "@types/nock": "^9.3.0",
76
76
  "@types/node": "^18.19.0",
77
77
  "@types/sinon": "^17.0.3",
78
- "@types/uuid": "^9.0.2",
79
78
  "c8": "^8.0.1",
80
79
  "eslint": "~8.55.0",
81
80
  "nock": "^13.3.3",
@@ -5,18 +5,24 @@
5
5
 
6
6
  import {
7
7
  AzureClient,
8
+ AzureClientPropsInternal,
8
9
  AzureLocalConnectionConfig,
9
10
  AzureRemoteConnectionConfig,
10
11
  ITelemetryBaseLogger,
11
- } from "@fluidframework/azure-client";
12
+ } from "@fluidframework/azure-client/internal";
12
13
  import {
13
14
  AzureClient as AzureClientLegacy,
14
15
  AzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,
15
16
  AzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,
16
17
  ITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,
17
18
  } from "@fluidframework/azure-client-legacy";
19
+ import type { IRuntimeFactory } from "@fluidframework/container-definitions/internal";
18
20
  import { IConfigProviderBase } from "@fluidframework/core-interfaces";
19
21
  import { ScopeType } from "@fluidframework/driver-definitions/internal";
22
+ import type {
23
+ CompatibilityMode,
24
+ ContainerSchema,
25
+ } from "@fluidframework/fluid-static/internal";
20
26
  import {
21
27
  MockLogger,
22
28
  createChildLogger,
@@ -41,6 +47,13 @@ export function createAzureClient(
41
47
  logger?: MockLogger,
42
48
  configProvider?: IConfigProviderBase,
43
49
  scopes?: ScopeType[],
50
+ createContainerRuntimeFactory?: ({
51
+ schema,
52
+ compatibilityMode,
53
+ }: {
54
+ schema: ContainerSchema;
55
+ compatibilityMode: CompatibilityMode;
56
+ }) => IRuntimeFactory,
44
57
  ): AzureClient {
45
58
  const args = process.argv.slice(2);
46
59
 
@@ -100,11 +113,14 @@ export function createAzureClient(
100
113
  },
101
114
  },
102
115
  });
103
- return new AzureClient({
116
+
117
+ const props: AzureClientPropsInternal = {
104
118
  connection: connectionProps,
105
119
  logger: createLogger,
106
120
  configProvider,
107
- });
121
+ createContainerRuntimeFactory,
122
+ };
123
+ return new AzureClient(props);
108
124
  }
109
125
 
110
126
  /**
@@ -14,11 +14,17 @@ import {
14
14
  MessageType,
15
15
  ISequencedDocumentMessage,
16
16
  } from "@fluidframework/driver-definitions/internal";
17
- import { ContainerSchema, type IFluidContainer } from "@fluidframework/fluid-static";
17
+ import {
18
+ ContainerSchema,
19
+ createTreeContainerRuntimeFactory,
20
+ isTreeContainerSchema,
21
+ type IFluidContainer,
22
+ } from "@fluidframework/fluid-static/internal";
18
23
  import { SharedMap } from "@fluidframework/map/internal";
19
24
  import { SharedMap as SharedMapLegacy } from "@fluidframework/map-legacy";
20
- import { MockLogger } from "@fluidframework/telemetry-utils/internal";
25
+ import { MockLogger, UsageError } from "@fluidframework/telemetry-utils/internal";
21
26
  import { timeoutPromise } from "@fluidframework/test-utils/internal";
27
+ import { SharedTree } from "@fluidframework/tree/internal";
22
28
  import { AxiosResponse } from "axios";
23
29
  import type { SinonSandbox } from "sinon";
24
30
  import { createSandbox } from "sinon";
@@ -671,3 +677,37 @@ for (const testOpts of testMatrix) {
671
677
  }
672
678
  });
673
679
  }
680
+
681
+ /**
682
+ * Testing creating/loading containers with a tree-based root data object.
683
+ */
684
+ describe("Container create in tree-only mode", () => {
685
+ function createClient(): AzureClient {
686
+ return createAzureClient(
687
+ undefined,
688
+ undefined,
689
+ undefined,
690
+ undefined,
691
+ undefined,
692
+ ({ schema, compatibilityMode }) => {
693
+ if (!isTreeContainerSchema(schema)) {
694
+ throw new UsageError(
695
+ "Tree-only mode requires exactly 1 SharedTree in initialObjects.",
696
+ );
697
+ }
698
+ return createTreeContainerRuntimeFactory({ schema, compatibilityMode });
699
+ },
700
+ );
701
+ }
702
+ it("can create tree-based container", async function () {
703
+ const client = createClient();
704
+ const schema = {
705
+ initialObjects: {
706
+ tree: SharedTree,
707
+ },
708
+ };
709
+ const { container } = await client.createContainer(schema, "2");
710
+
711
+ assert(SharedTree.is(container.initialObjects.tree));
712
+ });
713
+ });