@fluidframework/azure-end-to-end-tests 2.74.0 → 2.81.0-374083

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # @fluidframework/azure-end-to-end-tests
2
2
 
3
+ ## 2.80.0
4
+
5
+ Dependency updates only.
6
+
3
7
  ## 2.74.0
4
8
 
5
9
  Dependency updates only.
package/eslint.config.mts CHANGED
@@ -1,8 +1,8 @@
1
- /* eslint-disable */
2
- /**
3
- * GENERATED FILE - DO NOT EDIT DIRECTLY.
4
- * To regenerate: pnpm tsx scripts/generate-flat-eslint-configs.ts --typescript
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
5
4
  */
5
+
6
6
  import type { Linter } from "eslint";
7
7
  import { recommended } from "../../../../common/build/eslint-config-fluid/flat.mts";
8
8
 
@@ -7,7 +7,6 @@ import { AzureClient as AzureClientLegacy, } from "@fluidframework/azure-client-
7
7
  import { ScopeType } from "@fluidframework/driver-definitions/legacy";
8
8
  import { createChildLogger, createMultiSinkLogger, } from "@fluidframework/telemetry-utils/internal";
9
9
  import { InsecureTokenProvider } from "@fluidframework/test-runtime-utils/internal";
10
- import { default as Axios } from "axios";
11
10
  import { v4 as uuid } from "uuid";
12
11
  import { createAzureTokenProvider } from "./AzureTokenFactory.js";
13
12
  // eslint-disable-next-line unicorn/prefer-export-from
@@ -47,7 +46,7 @@ export function createAzureClient(id, name, logger, configProvider, scopes, crea
47
46
  }
48
47
  : {
49
48
  tokenProvider: new InsecureTokenProvider("fooBar", user, scopes),
50
- endpoint: "http://localhost:7071",
49
+ endpoint: "http://localhost:7071", // Port for local Azure Fluid Relay (AFR) service
51
50
  type: "local",
52
51
  };
53
52
  const getLogger = () => {
@@ -105,7 +104,7 @@ export function createAzureClientLegacy(userID, userName, logger) {
105
104
  }
106
105
  : {
107
106
  tokenProvider: new InsecureTokenProvider("fooBar", user),
108
- endpoint: "http://localhost:7071",
107
+ endpoint: "http://localhost:7071", // Port for local Azure Fluid Relay (AFR) service
109
108
  type: "local",
110
109
  };
111
110
  const getLogger = () => {
@@ -136,7 +135,7 @@ export function createAzureClientLegacy(userID, userName, logger) {
136
135
  * currently these are mainly fetched from ephemeralSummaryTrees.ts
137
136
  * @param userID - ID for the user creating the container
138
137
  * @param userName - Name for the user creating the container
139
- * @returns An AxiosResponse containing the container ID(response.data.id)
138
+ * @returns A FetchResponse containing the container ID(response.data.id)
140
139
  */
141
140
  export async function createContainerFromPayload(requestPayload, userID, userName) {
142
141
  const useAzure = process.env.FLUID_CLIENT === "azure";
@@ -149,7 +148,7 @@ export async function createContainerFromPayload(requestPayload, userID, userNam
149
148
  };
150
149
  const endPoint = useAzure
151
150
  ? process.env.azure__fluid__relay__service__endpoint
152
- : "http://localhost:7071";
151
+ : "http://localhost:7071"; // Port for local Azure Fluid Relay (AFR) service
153
152
  if (useAzure && endPoint === undefined) {
154
153
  throw new Error("Azure Fluid Relay service endpoint is missing");
155
154
  }
@@ -161,36 +160,33 @@ export async function createContainerFromPayload(requestPayload, userID, userNam
161
160
  "Authorization": `Basic ${ordererToken.jwt}`,
162
161
  "Content-Type": "application/json",
163
162
  };
164
- const url = `/documents/${tenantId}`;
165
- const options = {
166
- baseURL: endPoint,
167
- data: requestPayload,
168
- headers,
169
- maxBodyLength: 1048576000,
170
- maxContentLength: 1048576000,
171
- method: "POST",
172
- url,
173
- };
163
+ const url = `${endPoint}/documents/${tenantId}`;
174
164
  try {
175
- const response = await Axios(options);
165
+ const response = await fetch(url, {
166
+ method: "POST",
167
+ headers,
168
+ body: JSON.stringify(requestPayload),
169
+ });
170
+ // Fetch doesn't auto-throw on non-2xx responses like axios did, so check explicitly
171
+ if (!response.ok) {
172
+ throw new Error(`Error creating container. Status code: ${response.status}`);
173
+ }
176
174
  if (response.status === 201) {
177
175
  console.log("Container created successfully");
178
176
  }
179
- else {
180
- throw new Error(`Error creating container. Status code: ${response.status}`);
181
- }
182
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
183
- if (response?.data === undefined || (useAzure && response?.data?.id === undefined)) {
177
+ const data = (await response.json());
178
+ if (data === undefined ||
179
+ (useAzure && typeof data === "object" && data.id === undefined)) {
184
180
  throw new Error(`ID of the created container is undefined`);
185
181
  }
186
- return response;
182
+ return { status: response.status, data };
187
183
  }
188
184
  catch (error) {
189
185
  throw new Error(`An error occurred: ${error}`);
190
186
  }
191
187
  }
192
188
  /**
193
- * This function takes an AxiosResponse returned by the createContainerFromPayload and returns the containerId.
189
+ * This function takes a FetchResponse returned by the createContainerFromPayload and returns the containerId.
194
190
  * A separate function is used for this, since the data path to the containerID is not always the same.
195
191
  * (Tinylicious has the ID stored at a different path than other services)
196
192
  *
@@ -199,7 +195,15 @@ export async function createContainerFromPayload(requestPayload, userID, userNam
199
195
  */
200
196
  export function getContainerIdFromPayloadResponse(response) {
201
197
  const useAzure = process.env.FLUID_CLIENT === "azure";
202
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
203
- return (useAzure ? response.data.id : response.data);
198
+ if (useAzure) {
199
+ if (typeof response.data === "object" && response.data.id !== undefined) {
200
+ return response.data.id;
201
+ }
202
+ throw new Error("Invalid response format for Azure");
203
+ }
204
+ if (typeof response.data === "string") {
205
+ return response.data;
206
+ }
207
+ throw new Error("Invalid response format for local");
204
208
  }
205
209
  //# sourceMappingURL=AzureClientFactory.js.map
@@ -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\ttype AzureLocalConnectionConfig,\n\ttype AzureRemoteConnectionConfig,\n\ttype ITelemetryBaseLogger,\n} from \"@fluidframework/azure-client\";\n// eslint-disable-next-line import-x/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport type { AzureClientPropsInternal } from \"@fluidframework/azure-client/internal\";\nimport {\n\tAzureClient as AzureClientLegacy,\n\ttype AzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,\n\ttype AzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,\n\ttype ITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,\n} from \"@fluidframework/azure-client-legacy\";\nimport type { IRuntimeFactory } from \"@fluidframework/container-definitions/legacy\";\nimport type { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/legacy\";\nimport type { CompatibilityMode, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\ttype MockLogger,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\nimport { default as Axios, type 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"]}
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\ttype AzureLocalConnectionConfig,\n\ttype AzureRemoteConnectionConfig,\n\ttype ITelemetryBaseLogger,\n} from \"@fluidframework/azure-client\";\n// eslint-disable-next-line import-x/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport type { AzureClientPropsInternal } from \"@fluidframework/azure-client/internal\";\nimport {\n\tAzureClient as AzureClientLegacy,\n\ttype AzureLocalConnectionConfig as AzureLocalConnectionConfigLegacy,\n\ttype AzureRemoteConnectionConfig as AzureRemoteConnectionConfigLegacy,\n\ttype ITelemetryBaseLogger as ITelemetryBaseLoggerLegacy,\n} from \"@fluidframework/azure-client-legacy\";\nimport type { IRuntimeFactory } from \"@fluidframework/container-definitions/legacy\";\nimport type { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/legacy\";\nimport type { CompatibilityMode, ContainerSchema } from \"@fluidframework/fluid-static\";\nimport {\n\ttype MockLogger,\n\tcreateChildLogger,\n\tcreateMultiSinkLogger,\n} from \"@fluidframework/telemetry-utils/internal\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\nimport { v4 as uuid } from \"uuid\";\n\n/**\n * Response type for container creation requests.\n * - Azure Fluid Relay (AFR) returns `{ id: string }` object\n * - Local Tinylicious returns the container ID as a plain string\n */\ninterface FetchResponse {\n\tstatus: number;\n\tdata: { id?: string } | string;\n}\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\", // Port for local Azure Fluid Relay (AFR) service\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\", // Port for local Azure Fluid Relay (AFR) service\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 A FetchResponse containing the container ID(response.data.id)\n */\nexport async function createContainerFromPayload(\n\trequestPayload: object,\n\tuserID?: string,\n\tuserName?: string,\n): Promise<FetchResponse> {\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\"; // Port for local Azure Fluid Relay (AFR) service\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 = `${endPoint}/documents/${tenantId}`;\n\n\ttry {\n\t\tconst response = await fetch(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(requestPayload),\n\t\t});\n\n\t\t// Fetch doesn't auto-throw on non-2xx responses like axios did, so check explicitly\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Error creating container. Status code: ${response.status}`);\n\t\t}\n\n\t\tif (response.status === 201) {\n\t\t\tconsole.log(\"Container created successfully\");\n\t\t}\n\n\t\tconst data: { id?: string } | string = (await response.json()) as { id?: string } | string;\n\n\t\tif (\n\t\t\tdata === undefined ||\n\t\t\t(useAzure && typeof data === \"object\" && data.id === undefined)\n\t\t) {\n\t\t\tthrow new Error(`ID of the created container is undefined`);\n\t\t}\n\n\t\treturn { status: response.status, data };\n\t} catch (error) {\n\t\tthrow new Error(`An error occurred: ${error}`);\n\t}\n}\n\n/**\n * This function takes a FetchResponse 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: FetchResponse): string {\n\tconst useAzure = process.env.FLUID_CLIENT === \"azure\";\n\tif (useAzure) {\n\t\tif (typeof response.data === \"object\" && response.data.id !== undefined) {\n\t\t\treturn response.data.id;\n\t\t}\n\t\tthrow new Error(\"Invalid response format for Azure\");\n\t}\n\tif (typeof response.data === \"string\") {\n\t\treturn response.data;\n\t}\n\tthrow new Error(\"Invalid response format for local\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.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 type { AzureClient, AzureContainerServices } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ContainerSchema, IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/legacy\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\nimport type { AxiosResponse } from \"axios\";\n\nimport {\n\tcreateAzureClient,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n\tScopeType,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { configProvider, waitForMember, getTestMatrix } from \"./utils.js\";\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Fluid audience (${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(\"test-user-id-1\", \"test-user-name-1\");\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: Find original member/self\n\t\t *\n\t\t * Expected behavior: container should have a single member upon creation.\n\t\t */\n\t\tit(\"can find original member\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findOriginalMember,\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, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = 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\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst myself = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst members = services.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the partner member should be able\n\t\t * to resolve original member.\n\t\t */\n\t\tit(\"can find partner member\", async () => {\n\t\t\tlet containerId: string = \"\";\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findPartnerMember,\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, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = 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\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema, \"2\");\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartner?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Partner should be able to observe change in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t\t * memberRemoved event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving\", 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.observeMemberLeaving,\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\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema, \"2\");\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tlet members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tmembers = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find read-only partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the read-only partner member should be able\n\t\t * to resolve original member, and the original member should be able to observe the read-only member.\n\t\t */\n\t\tit(\"can find read-only partner member\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse: AxiosResponse | undefined = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\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, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = 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\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\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\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst originalSelfSeenByPartner = await waitForMember(\n\t\t\t\tpartnerServices.audience,\n\t\t\t\t\"test-user-id-1\",\n\t\t\t);\n\t\t\tassert.notStrictEqual(\n\t\t\t\toriginalSelfSeenByPartner,\n\t\t\t\tundefined,\n\t\t\t\t\"Partner should see original at this point.\",\n\t\t\t);\n\t\t\tconst partnerMembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Partner should see two members at this point.\",\n\t\t\t);\n\n\t\t\tconst partnerSelfSeenByOriginal = await waitForMember(\n\t\t\t\tservices.audience,\n\t\t\t\t\"test-user-id-2\",\n\t\t\t);\n\t\t\tconst originalMembers = services.audience.getMembers();\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelfSeenByOriginal,\n\t\t\t\tundefined,\n\t\t\t\t\"Should see partner at this point.\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\toriginalMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Original should see two members at this point.\",\n\t\t\t);\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\tpartnerSelfSeenByOriginal?.id,\n\t\t\t\t\"Partner and partner-as-seen-by-original should have same IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Read-only Partner should be able to observe changes in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other read-only parther should observe\n\t\t * memberRemoved event and have correct partner count. Upon new read-only partner joining,\n\t\t * the original read-only partner should observe memberAdded event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving and joining in read-only mode\", async function () {\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.observeMemberLeaving,\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: \"client1 container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client2 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tawait waitForMember(partnerServices.audience, \"test-user-id-1\");\n\t\t\tlet members = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tconst partnerClientMemberRemoveP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait partnerClientMemberRemoveP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\n\t\t\tconst partnerClientMemberAddP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberAdded\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst partnerClient2 = createAzureClient(\n\t\t\t\t\"test-user-id-3\",\n\t\t\t\t\"test-user-name-3\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer2, services: partnerServices2 } =\n\t\t\t\tawait partnerClient2.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client3 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf2 = await waitForMember(partnerServices2.audience, \"test-user-id-3\");\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf2,\n\t\t\t\tundefined,\n\t\t\t\t\"We should have new read-only partner at this point.\",\n\t\t\t);\n\n\t\t\tawait partnerClientMemberAddP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members again at this point.\");\n\t\t\tassert.strict(\n\t\t\t\tmembers.has(\"test-user-id-3\"),\n\t\t\t\t\"Original read-only partner should see new read-only partner.\",\n\t\t\t);\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"audience.spec.js","sourceRoot":"","sources":["../../src/test/audience.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 type { AzureClient, AzureContainerServices } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ContainerSchema, IFluidContainer } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map/legacy\";\nimport { timeoutPromise } from \"@fluidframework/test-utils/internal\";\n\nimport {\n\tcreateAzureClient,\n\tcreateContainerFromPayload,\n\tgetContainerIdFromPayloadResponse,\n\tScopeType,\n} from \"./AzureClientFactory.js\";\nimport * as ephemeralSummaryTrees from \"./ephemeralSummaryTrees.js\";\nimport { configProvider, waitForMember, getTestMatrix } from \"./utils.js\";\n\nconst testMatrix = getTestMatrix();\nfor (const testOpts of testMatrix) {\n\tdescribe(`Fluid audience (${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(\"test-user-id-1\", \"test-user-name-1\");\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: Find original member/self\n\t\t *\n\t\t * Expected behavior: container should have a single member upon creation.\n\t\t */\n\t\tit(\"can find original member\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findOriginalMember,\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, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = 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\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst myself = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst members = services.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the partner member should be able\n\t\t * to resolve original member.\n\t\t */\n\t\tit(\"can find partner member\", async () => {\n\t\t\tlet containerId: string = \"\";\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.findPartnerMember,\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, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = 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\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema, \"2\");\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartner?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Partner should be able to observe change in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t\t * memberRemoved event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving\", async () => {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\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\tconst client2 = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tconfigProvider({\n\t\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema, \"2\");\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\t\tlet members = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tmembers = servicesGet.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Find read-only partner member\n\t\t *\n\t\t * Expected behavior: upon resolving container, the read-only partner member should be able\n\t\t * to resolve original member, and the original member should be able to observe the read-only member.\n\t\t */\n\t\tit(\"can find read-only partner member\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tlet services: AzureContainerServices;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\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, services } = await client.getContainer(containerId, schema, \"2\"));\n\t\t\t} else {\n\t\t\t\t({ container, services } = 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\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\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\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tconst originalSelfSeenByPartner = await waitForMember(\n\t\t\t\tpartnerServices.audience,\n\t\t\t\t\"test-user-id-1\",\n\t\t\t);\n\t\t\tassert.notStrictEqual(\n\t\t\t\toriginalSelfSeenByPartner,\n\t\t\t\tundefined,\n\t\t\t\t\"Partner should see original at this point.\",\n\t\t\t);\n\t\t\tconst partnerMembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Partner should see two members at this point.\",\n\t\t\t);\n\n\t\t\tconst partnerSelfSeenByOriginal = await waitForMember(\n\t\t\t\tservices.audience,\n\t\t\t\t\"test-user-id-2\",\n\t\t\t);\n\t\t\tconst originalMembers = services.audience.getMembers();\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelfSeenByOriginal,\n\t\t\t\tundefined,\n\t\t\t\t\"Should see partner at this point.\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\toriginalMembers.size,\n\t\t\t\t2,\n\t\t\t\t\"Original should see two members at this point.\",\n\t\t\t);\n\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\toriginalSelf?.id,\n\t\t\t\t\"Self and partner should have different IDs\",\n\t\t\t);\n\t\t\tassert.strictEqual(\n\t\t\t\tpartnerSelf?.id,\n\t\t\t\tpartnerSelfSeenByOriginal?.id,\n\t\t\t\t\"Partner and partner-as-seen-by-original should have same IDs\",\n\t\t\t);\n\t\t});\n\n\t\t/**\n\t\t * Scenario: Read-only Partner should be able to observe changes in audience\n\t\t *\n\t\t * Expected behavior: upon 1 partner leaving, other read-only parther should observe\n\t\t * memberRemoved event and have correct partner count. Upon new read-only partner joining,\n\t\t * the original read-only partner should observe memberAdded event and have correct partner count.\n\t\t */\n\t\tit(\"can observe member leaving and joining in read-only mode\", async function () {\n\t\t\tlet containerId: string;\n\t\t\tlet container: IFluidContainer;\n\t\t\tif (isEphemeral) {\n\t\t\t\tconst containerResponse = await createContainerFromPayload(\n\t\t\t\t\tephemeralSummaryTrees.observeMemberLeaving,\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: \"client1 container connect() timeout\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst partnerClient = createAzureClient(\n\t\t\t\t\"test-user-id-2\",\n\t\t\t\t\"test-user-name-2\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer, services: partnerServices } =\n\t\t\t\tawait partnerClient.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client2 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf = await waitForMember(partnerServices.audience, \"test-user-id-2\");\n\t\t\tassert.notStrictEqual(partnerSelf, undefined, \"We should have partner at this point.\");\n\n\t\t\tawait waitForMember(partnerServices.audience, \"test-user-id-1\");\n\t\t\tlet members = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\t\tconst partnerClientMemberRemoveP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberRemoved\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcontainer.disconnect();\n\n\t\t\tawait partnerClientMemberRemoveP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\n\t\t\tconst partnerClientMemberAddP = new Promise<void>((resolve) => {\n\t\t\t\tpartnerServices.audience.on(\"memberAdded\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst partnerClient2 = createAzureClient(\n\t\t\t\t\"test-user-id-3\",\n\t\t\t\t\"test-user-name-3\",\n\t\t\t\tundefined,\n\t\t\t\tundefined,\n\t\t\t\t[ScopeType.DocRead],\n\t\t\t);\n\t\t\tconst { container: partnerContainer2, services: partnerServices2 } =\n\t\t\t\tawait partnerClient2.getContainer(containerId, schema, \"2\");\n\n\t\t\tif (partnerContainer2.connectionState !== ConnectionState.Connected) {\n\t\t\t\tawait timeoutPromise(\n\t\t\t\t\t(resolve) => partnerContainer2.once(\"connected\", () => resolve()),\n\t\t\t\t\t{\n\t\t\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\t\t\terrorMsg: \"client3 container connect() timeout\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\t\tconst partnerSelf2 = await waitForMember(partnerServices2.audience, \"test-user-id-3\");\n\t\t\tassert.notStrictEqual(\n\t\t\t\tpartnerSelf2,\n\t\t\t\tundefined,\n\t\t\t\t\"We should have new read-only partner at this point.\",\n\t\t\t);\n\n\t\t\tawait partnerClientMemberAddP;\n\n\t\t\tmembers = partnerServices.audience.getMembers();\n\t\t\tassert.strictEqual(members.size, 2, \"We should have two members again at this point.\");\n\t\t\tassert.strict(\n\t\t\t\tmembers.has(\"test-user-id-3\"),\n\t\t\t\t\"Original read-only partner should see new read-only partner.\",\n\t\t\t);\n\t\t});\n\t});\n}\n"]}
@@ -1 +1 @@
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 type { AzureClient } from \"@fluidframework/azure-client\";\nimport type { AzureClient as AzureClientLegacy } from \"@fluidframework/azure-client-legacy\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tMessageType,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/legacy\";\n// eslint-disable-next-line import-x/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport { isTreeContainerSchema } from \"@fluidframework/fluid-static/internal\";\nimport {\n\ttype ContainerSchema,\n\tcreateTreeContainerRuntimeFactory,\n\ttype IFluidContainer,\n} from \"@fluidframework/fluid-static/legacy\";\nimport { SharedMap } from \"@fluidframework/map/legacy\";\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/legacy\";\nimport type { 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\tconst invalidSchemaErrorMessage =\n\t\t\"Tree-only mode requires exactly 1 SharedTree in initialObjects.\";\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(invalidSchemaErrorMessage);\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\tit(\"throws if invalid schema is encountered\", 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\tmap: SharedMap,\n\t\t\t},\n\t\t};\n\n\t\tawait assert.rejects(\n\t\t\tclient.createContainer(schema, \"2\"),\n\t\t\t(error: unknown) => {\n\t\t\t\tassert(error instanceof UsageError);\n\t\t\t\tassert.strictEqual(error.message, invalidSchemaErrorMessage);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\t\"Expected an error to be thrown for invalid schema\",\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 type { AzureClient } from \"@fluidframework/azure-client\";\nimport type { AzureClient as AzureClientLegacy } from \"@fluidframework/azure-client-legacy\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport type { ConfigTypes, IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport {\n\tMessageType,\n\ttype ISequencedDocumentMessage,\n} from \"@fluidframework/driver-definitions/legacy\";\n// eslint-disable-next-line import-x/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport { isTreeContainerSchema } from \"@fluidframework/fluid-static/internal\";\nimport {\n\ttype ContainerSchema,\n\tcreateTreeContainerRuntimeFactory,\n\ttype IFluidContainer,\n} from \"@fluidframework/fluid-static/legacy\";\nimport { SharedMap } from \"@fluidframework/map/legacy\";\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/legacy\";\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 = 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 = 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 = 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\tconst invalidSchemaErrorMessage =\n\t\t\"Tree-only mode requires exactly 1 SharedTree in initialObjects.\";\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(invalidSchemaErrorMessage);\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\tit(\"throws if invalid schema is encountered\", 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\tmap: SharedMap,\n\t\t\t},\n\t\t};\n\n\t\tawait assert.rejects(\n\t\t\tclient.createContainer(schema, \"2\"),\n\t\t\t(error: unknown) => {\n\t\t\t\tassert(error instanceof UsageError);\n\t\t\t\tassert.strictEqual(error.message, invalidSchemaErrorMessage);\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\t\"Expected an error to be thrown for invalid schema\",\n\t\t);\n\t});\n});\n"]}