@fluidframework/azure-end-to-end-tests 2.53.1 → 2.61.0-355054
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +27 -0
- package/CHANGELOG.md +4 -0
- package/lib/test/AzureClientFactory.js +2 -2
- package/lib/test/AzureClientFactory.js.map +1 -1
- package/lib/test/AzureTokenFactory.js +2 -2
- package/lib/test/AzureTokenFactory.js.map +1 -1
- package/lib/test/TestDataObject.js +4 -2
- package/lib/test/TestDataObject.js.map +1 -1
- package/lib/test/audience.spec.js +1 -1
- package/lib/test/audience.spec.js.map +1 -1
- package/lib/test/containerCreate.spec.js +6 -4
- package/lib/test/containerCreate.spec.js.map +1 -1
- package/lib/test/ddsTests.spec.js +1 -1
- package/lib/test/ddsTests.spec.js.map +1 -1
- package/lib/test/multiprocess/childClient.tool.js +454 -0
- package/lib/test/multiprocess/childClient.tool.js.map +1 -0
- package/lib/test/multiprocess/messageTypes.js.map +1 -1
- package/lib/test/multiprocess/orchestratorUtils.js +381 -0
- package/lib/test/multiprocess/orchestratorUtils.js.map +1 -0
- package/lib/test/multiprocess/presenceTest.spec.js +306 -191
- package/lib/test/multiprocess/presenceTest.spec.js.map +1 -1
- package/lib/test/tree.spec.js +3 -2
- package/lib/test/tree.spec.js.map +1 -1
- package/lib/test/utils.js.map +1 -1
- package/lib/test/viewContainerVersion.spec.js +1 -1
- package/lib/test/viewContainerVersion.spec.js.map +1 -1
- package/package.json +29 -29
- package/src/test/.mocharc.cjs +0 -1
- package/src/test/AzureClientFactory.ts +6 -8
- package/src/test/AzureTokenFactory.ts +3 -2
- package/src/test/TestDataObject.ts +6 -5
- package/src/test/audience.spec.ts +1 -1
- package/src/test/containerCreate.spec.ts +6 -5
- package/src/test/ddsTests.spec.ts +1 -1
- package/src/test/multiprocess/childClient.tool.ts +575 -0
- package/src/test/multiprocess/messageTypes.ts +138 -4
- package/src/test/multiprocess/orchestratorUtils.ts +573 -0
- package/src/test/multiprocess/presenceTest.spec.ts +454 -270
- package/src/test/tree.spec.ts +4 -10
- package/src/test/utils.ts +1 -1
- package/src/test/viewContainerVersion.spec.ts +1 -1
- package/lib/test/multiprocess/childClient.js +0 -169
- package/lib/test/multiprocess/childClient.js.map +0 -1
- package/src/test/multiprocess/childClient.ts +0 -227
package/.eslintrc.cjs
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
const importInternalModulesAllowedForTest = [
|
|
7
|
+
// Allow import of Fluid Framework external API exports.
|
|
8
|
+
"@fluidframework/*/{beta,alpha,legacy}",
|
|
9
|
+
"fluid-framework/{beta,alpha,legacy}",
|
|
10
|
+
|
|
11
|
+
// Allow import of Fluid Framework non-production test-utils APIs.
|
|
12
|
+
"@fluidframework/*/test-utils",
|
|
13
|
+
|
|
14
|
+
// Allow imports from sibling and ancestral sibling directories,
|
|
15
|
+
// but not from cousin directories. Parent is allowed but only
|
|
16
|
+
// because there isn't a known way to deny it.
|
|
17
|
+
"*/index.js",
|
|
18
|
+
|
|
19
|
+
// Should `telemetry-utils` provide support through `/test-utils` instead of `/internal`?
|
|
20
|
+
"@fluidframework/telemetry-utils/internal",
|
|
21
|
+
|
|
22
|
+
// Should `test-*utils` provide support through `/test-utils` instead of `/internal`?
|
|
23
|
+
"@fluidframework/test-utils/internal",
|
|
24
|
+
"@fluidframework/test-runtime-utils/internal",
|
|
25
|
+
];
|
|
26
|
+
|
|
6
27
|
module.exports = {
|
|
7
28
|
extends: [require.resolve("@fluidframework/eslint-config-fluid"), "prettier"],
|
|
8
29
|
rules: {
|
|
@@ -28,6 +49,12 @@ module.exports = {
|
|
|
28
49
|
rules: {
|
|
29
50
|
// Some deprecated APIs are permissible in tests; use `warn` to keep them visible
|
|
30
51
|
"import/no-deprecated": "warn",
|
|
52
|
+
"import/no-internal-modules": [
|
|
53
|
+
"error",
|
|
54
|
+
{
|
|
55
|
+
allow: importInternalModulesAllowedForTest,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
31
58
|
},
|
|
32
59
|
},
|
|
33
60
|
],
|
package/CHANGELOG.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
import { AzureClient, } from "@fluidframework/azure-client
|
|
5
|
+
import { AzureClient, } from "@fluidframework/azure-client";
|
|
6
6
|
import { AzureClient as AzureClientLegacy, } from "@fluidframework/azure-client-legacy";
|
|
7
|
-
import { ScopeType } from "@fluidframework/driver-definitions/
|
|
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
10
|
import { default as Axios } from "axios";
|
|
@@ -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 AzureClientPropsInternal,\n\ttype AzureLocalConnectionConfig,\n\ttype AzureRemoteConnectionConfig,\n\ttype ITelemetryBaseLogger,\n} 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/internal\";\nimport type { IConfigProviderBase } from \"@fluidframework/core-interfaces\";\nimport { ScopeType } from \"@fluidframework/driver-definitions/internal\";\nimport type {\n\tCompatibilityMode,\n\tContainerSchema,\n} from \"@fluidframework/fluid-static/internal\";\nimport {\n\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/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"]}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { InsecureTokenProvider } from "@fluidframework/test-runtime-utils/internal";
|
|
6
|
-
export function createAzureTokenProvider(id, name, scopes) {
|
|
6
|
+
export function createAzureTokenProvider(id, name, scopes, attachScopes) {
|
|
7
7
|
const key = process.env.azure__fluid__relay__service__key;
|
|
8
8
|
if (key) {
|
|
9
9
|
const userConfig = {
|
|
10
10
|
id,
|
|
11
11
|
name,
|
|
12
12
|
};
|
|
13
|
-
return new InsecureTokenProvider(key, userConfig, scopes);
|
|
13
|
+
return new InsecureTokenProvider(key, userConfig, scopes, attachScopes);
|
|
14
14
|
}
|
|
15
15
|
else {
|
|
16
16
|
throw new Error("Cannot create token provider.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureTokenFactory.js","sourceRoot":"","sources":["../../src/test/AzureTokenFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,MAAM,UAAU,wBAAwB,CACvC,EAAU,EACV,IAAY,EACZ,MAAoB;
|
|
1
|
+
{"version":3,"file":"AzureTokenFactory.js","sourceRoot":"","sources":["../../src/test/AzureTokenFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,MAAM,UAAU,wBAAwB,CACvC,EAAU,EACV,IAAY,EACZ,MAAoB,EACpB,YAA0B;IAE1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,iCAA2C,CAAC;IACpE,IAAI,GAAG,EAAE,CAAC;QACT,MAAM,UAAU,GAAG;YAClB,EAAE;YACF,IAAI;SACJ,CAAC;QACF,OAAO,IAAI,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ITokenProvider } from \"@fluidframework/azure-client\";\nimport type { ScopeType } from \"@fluidframework/driver-definitions/legacy\";\nimport { InsecureTokenProvider } from \"@fluidframework/test-runtime-utils/internal\";\n\nexport function createAzureTokenProvider(\n\tid: string,\n\tname: string,\n\tscopes?: ScopeType[],\n\tattachScopes?: ScopeType[],\n): ITokenProvider {\n\tconst key = process.env.azure__fluid__relay__service__key as string;\n\tif (key) {\n\t\tconst userConfig = {\n\t\t\tid,\n\t\t\tname,\n\t\t};\n\t\treturn new InsecureTokenProvider(key, userConfig, scopes, attachScopes);\n\t} else {\n\t\tthrow new Error(\"Cannot create token provider.\");\n\t}\n}\n"]}
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { EventEmitter } from "@fluid-internal/client-utils";
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
6
|
+
// eslint-disable-next-line import/no-internal-modules -- TODO consider a test exposure to avoid /internal
|
|
7
|
+
import { createDataObjectKind } from "@fluidframework/aqueduct/internal";
|
|
8
|
+
import { DataObject, DataObjectFactory, } from "@fluidframework/aqueduct/legacy";
|
|
9
|
+
import { SharedCounter } from "@fluidframework/counter/legacy";
|
|
8
10
|
class TestDataObjectClass extends DataObject {
|
|
9
11
|
constructor(props) {
|
|
10
12
|
super(props);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestDataObject.js","sourceRoot":"","sources":["../../src/test/TestDataObject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EACN,UAAU,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"TestDataObject.js","sourceRoot":"","sources":["../../src/test/TestDataObject.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 type { SignalListener } from \"@fluid-experimental/data-objects\";\nimport { EventEmitter } from \"@fluid-internal/client-utils\";\n// eslint-disable-next-line import/no-internal-modules -- TODO consider a test exposure to avoid /internal\nimport { createDataObjectKind } from \"@fluidframework/aqueduct/internal\";\nimport {\n\tDataObject,\n\tDataObjectFactory,\n\ttype IDataObjectProps,\n} from \"@fluidframework/aqueduct/legacy\";\nimport type { IErrorEvent, IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { SharedCounter } from \"@fluidframework/counter/legacy\";\nimport type { Jsonable } from \"@fluidframework/datastore-definitions/legacy\";\nimport type { IInboundSignalMessage } from \"@fluidframework/runtime-definitions/legacy\";\n\nclass TestDataObjectClass extends DataObject {\n\tpublic static readonly Name = \"@fluid-example/test-data-object\";\n\n\tpublic static readonly factory = new DataObjectFactory({\n\t\ttype: TestDataObjectClass.Name,\n\t\tctor: TestDataObjectClass,\n\t});\n\n\tconstructor(props: IDataObjectProps) {\n\t\tsuper(props);\n\t}\n}\n\nexport const TestDataObject = createDataObjectKind(TestDataObjectClass);\nexport type TestDataObject = TestDataObjectClass;\n\nclass CounterTestDataObjectClass extends DataObject {\n\tprivate _counter: SharedCounter | undefined;\n\n\t/**\n\t * Do setup work here\n\t */\n\tprotected async initializingFirstTime(): Promise<void> {\n\t\tconst counter = SharedCounter.create(this.runtime);\n\t\tthis.root.set(\"counter-key\", counter.handle);\n\t}\n\n\tprotected async hasInitialized(): Promise<void> {\n\t\tconst counterHandle = this.root.get<IFluidHandle<SharedCounter>>(\"counter-key\");\n\t\tthis._counter = await counterHandle?.get();\n\t}\n\n\tpublic static readonly Name = \"@fluid-example/counter-test-data-object\";\n\n\tpublic static readonly factory = new DataObjectFactory({\n\t\ttype: CounterTestDataObjectClass.Name,\n\t\tctor: CounterTestDataObjectClass,\n\t\tsharedObjects: [SharedCounter.getFactory()],\n\t});\n\n\tpublic increment(): void {\n\t\tthis.counter.increment(1);\n\t}\n\n\tpublic get value(): number {\n\t\treturn this.counter.value;\n\t}\n\n\tprivate get counter(): SharedCounter {\n\t\tif (this._counter === undefined) {\n\t\t\tthrow new Error(\"SharedCounter not initialized\");\n\t\t}\n\t\treturn this._counter;\n\t}\n}\n\nexport const CounterTestDataObject = createDataObjectKind(CounterTestDataObjectClass);\nexport type CounterTestDataObject = CounterTestDataObjectClass;\n\n/**\n * Test implementation of experimental Signaler for testing scenarios working with signals.\n */\nexport class SignalerTestDataObjectClass extends DataObject<{ Events: IErrorEvent }> {\n\tprivate readonly emitter = new EventEmitter();\n\tpublic static readonly Name = \"@fluid-example/signaler-test-data-object\";\n\n\tpublic static readonly factory = new DataObjectFactory({\n\t\ttype: SignalerTestDataObjectClass.Name,\n\t\tctor: SignalerTestDataObjectClass,\n\t});\n\n\tprotected async hasInitialized(): Promise<void> {\n\t\tthis.runtime.on(\"signal\", (message: IInboundSignalMessage, local: boolean) => {\n\t\t\tconst clientId = message.clientId;\n\t\t\t/**\n\t\t\t * {@link Signaler} checks `runtime.connected` before allowing a signal to be sent/received.\n\t\t\t * However, that is never `true` for \"read\" clients, so we don't want to check it here.\n\t\t\t */\n\t\t\tif (clientId !== null) {\n\t\t\t\tthis.emitter.emit(message.type, clientId, local, message.content);\n\t\t\t}\n\t\t});\n\t}\n\n\t// ISignaler methods Note these are all passthroughs\n\n\tpublic onSignal<T>(signalName: string, listener: SignalListener<T>): SignalerTestDataObject {\n\t\tthis.emitter.on(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic offSignal<T>(\n\t\tsignalName: string,\n\t\tlistener: SignalListener<T>,\n\t): SignalerTestDataObject {\n\t\tthis.emitter.off(signalName, listener);\n\t\treturn this;\n\t}\n\n\tpublic submitSignal<T>(signalName: string, payload?: Jsonable<T>): void {\n\t\tthis.runtime.submitSignal(signalName, payload);\n\t}\n}\n\nexport const SignalerTestDataObject = createDataObjectKind(SignalerTestDataObjectClass);\nexport type SignalerTestDataObject = SignalerTestDataObjectClass;\n"]}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { strict as assert } from "node:assert";
|
|
6
6
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
7
7
|
import { ConnectionState } from "@fluidframework/container-loader";
|
|
8
|
-
import { SharedMap } from "@fluidframework/map/
|
|
8
|
+
import { SharedMap } from "@fluidframework/map/legacy";
|
|
9
9
|
import { timeoutPromise } from "@fluidframework/test-utils/internal";
|
|
10
10
|
import { createAzureClient, createContainerFromPayload, getContainerIdFromPayloadResponse, ScopeType, } from "./AzureClientFactory.js";
|
|
11
11
|
import * as ephemeralSummaryTrees from "./ephemeralSummaryTrees.js";
|
|
@@ -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/internal\";\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\";\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"]}
|
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
import { strict as assert } from "node:assert";
|
|
6
6
|
import { AttachState } from "@fluidframework/container-definitions";
|
|
7
7
|
import { ConnectionState } from "@fluidframework/container-loader";
|
|
8
|
-
import { MessageType, } from "@fluidframework/driver-definitions/
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
8
|
+
import { MessageType, } from "@fluidframework/driver-definitions/legacy";
|
|
9
|
+
// eslint-disable-next-line import/no-internal-modules -- TODO consider a test exposure to avoid /internal
|
|
10
|
+
import { isTreeContainerSchema } from "@fluidframework/fluid-static/internal";
|
|
11
|
+
import { createTreeContainerRuntimeFactory, } from "@fluidframework/fluid-static/legacy";
|
|
12
|
+
import { SharedMap } from "@fluidframework/map/legacy";
|
|
11
13
|
import { SharedMap as SharedMapLegacy } from "@fluidframework/map-legacy";
|
|
12
14
|
import { MockLogger, UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
13
15
|
import { timeoutPromise } from "@fluidframework/test-utils/internal";
|
|
14
|
-
import { SharedTree } from "@fluidframework/tree/
|
|
16
|
+
import { SharedTree } from "@fluidframework/tree/legacy";
|
|
15
17
|
import { createSandbox } from "sinon";
|
|
16
18
|
import { createAzureClient, createAzureClientLegacy, createContainerFromPayload, getContainerIdFromPayloadResponse, } from "./AzureClientFactory.js";
|
|
17
19
|
import * as ephemeralSummaryTrees from "./ephemeralSummaryTrees.js";
|