@fluidframework/azure-end-to-end-tests 2.101.1 → 2.103.0
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 +8 -0
- package/eslint.config.mts +4 -0
- package/lib/packageVersion.js +9 -0
- package/lib/packageVersion.js.map +1 -0
- package/lib/test/AzureClientFactory.js.map +1 -1
- package/lib/test/audience.spec.js +16 -16
- package/lib/test/audience.spec.js.map +1 -1
- package/lib/test/containerCreate.spec.js +27 -24
- package/lib/test/containerCreate.spec.js.map +1 -1
- package/lib/test/ddsTests.spec.js +17 -17
- package/lib/test/ddsTests.spec.js.map +1 -1
- package/lib/test/multiprocess/childClient.tool.js +3 -2
- package/lib/test/multiprocess/childClient.tool.js.map +1 -1
- package/lib/test/signals.spec.js +4 -4
- package/lib/test/signals.spec.js.map +1 -1
- package/lib/test/tree.spec.js +8 -8
- package/lib/test/tree.spec.js.map +1 -1
- package/lib/test/utils.js +3 -0
- package/lib/test/utils.js.map +1 -1
- package/lib/test/viewContainerVersion.spec.js +9 -9
- package/lib/test/viewContainerVersion.spec.js.map +1 -1
- package/package.json +29 -27
- package/src/packageVersion.ts +9 -0
- package/src/test/.mocharc.js +15 -0
- package/src/test/AzureClientFactory.ts +4 -3
- package/src/test/audience.spec.ts +36 -16
- package/src/test/containerCreate.spec.ts +31 -24
- package/src/test/ddsTests.spec.ts +29 -17
- package/src/test/multiprocess/childClient.tool.ts +7 -2
- package/src/test/signals.spec.ts +12 -4
- package/src/test/tree.spec.ts +8 -8
- package/src/test/tsconfig.json +6 -3
- package/src/test/utils.ts +4 -0
- package/src/test/viewContainerVersion.spec.ts +9 -9
- package/src/test/.mocharc.cjs +0 -11
package/CHANGELOG.md
CHANGED
package/eslint.config.mts
CHANGED
|
@@ -8,6 +8,10 @@ import { recommended } from "@fluidframework/eslint-config-fluid/flat.mts";
|
|
|
8
8
|
|
|
9
9
|
const config: Linter.Config[] = [
|
|
10
10
|
...recommended,
|
|
11
|
+
{
|
|
12
|
+
// eslint doesn't recognize renamed exports syntax (that is required for ESM config under v11 mocha)
|
|
13
|
+
ignores: ["src/test/.mocharc.js"],
|
|
14
|
+
},
|
|
11
15
|
{
|
|
12
16
|
rules: {
|
|
13
17
|
"prefer-arrow-callback": "off",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*
|
|
5
|
+
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
|
+
*/
|
|
7
|
+
export const pkgName = "@fluidframework/azure-end-to-end-tests";
|
|
8
|
+
export const pkgVersion = "2.103.0";
|
|
9
|
+
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,wCAAwC,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/azure-end-to-end-tests\";\nexport const pkgVersion = \"2.103.0\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureClientFactory.js","sourceRoot":"","sources":["../../src/test/AzureClientFactory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACN,WAAW,GAIX,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACN,WAAW,IAAI,iBAAiB,GAIhC,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAEtE,OAAO,EAEN,iBAAiB,EACjB,qBAAqB,GACrB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAYlC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,sDAAsD;AACtD,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAChC,EAAW,EACX,IAAa,EACb,MAAmB,EACnB,cAAoC,EACpC,MAAoB,EACpB,6BAMqB;IAErB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjE,uCAAuC;IACvC,MAAM,MAAM,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,gBAAgB,GACrB,qBAAqB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;IAE5E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,CAAC;IACtD,MAAM,QAAQ,GAAG,QAAQ;QACxB,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,sCAAiD;QAChE,CAAC,CAAC,mBAAmB,CAAC;IACvB,MAAM,IAAI,GAAG;QACZ,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE;QAChB,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;KACpB,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sCAAgD,CAAC;IAC9E,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IAED,uEAAuE;IACvE,mDAAmD;IACnD,iEAAiE;IACjE,MAAM,eAAe,GAA6D,QAAQ;QACzF,CAAC,CAAC;YACA,QAAQ;YACR,aAAa,EAAE,wBAAwB,CAAC,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,CAAC;YAC3E,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,QAAQ;SACd;QACF,CAAC,CAAC;YACA,aAAa,EAAE,IAAI,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC;YAChE,QAAQ,EAAE,uBAAuB,EAAE,iDAAiD;YACpF,IAAI,EAAE,OAAO;SACb,CAAC;IACJ,MAAM,SAAS,GAAG,GAAqC,EAAE;QACxD,MAAM,UAAU,GAAG,aAAa,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;YAC1B,OAAO,qBAAqB,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,MAAM,IAAI,UAAU,CAAC;IAC7B,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACtC,MAAM,EAAE,SAAS,EAAE;QACnB,UAAU,EAAE;YACX,GAAG,EAAE;gBACJ,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM;gBAChD,kBAAkB,EAAE,MAAM;aAC1B;SACD;KACD,CAAC,CAAC;IAEH,MAAM,KAAK,GAA6B;QACvC,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,YAAY;QACpB,cAAc;QACd,6BAA6B;KAC7B,CAAC;IACF,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACtC,MAAe,EACf,QAAiB,EACjB,MAAmB;IAEnB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,CAAC;IACtD,MAAM,QAAQ,GAAG,QAAQ;QACxB,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,sCAAiD;QAChE,CAAC,CAAC,mBAAmB,CAAC;IACvB,MAAM,IAAI,GAAG;QACZ,EAAE,EAAE,MAAM,IAAI,IAAI,EAAE;QACpB,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE;KACxB,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,sCAAgD,CAAC;IAC9E,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACxE,CAAC;IAED,uEAAuE;IACvE,mDAAmD;IACnD,iEAAiE;IACjE,MAAM,eAAe,GACpB,QAAQ;QACP,CAAC,CAAC;YACA,QAAQ;YACR,aAAa,EAAE,wBAAwB,CAAC,MAAM,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC;YAC3E,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,QAAQ;SACd;QACF,CAAC,CAAC;YACA,aAAa,EAAE,IAAI,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC;YACxD,QAAQ,EAAE,uBAAuB,EAAE,iDAAiD;YACpF,IAAI,EAAE,OAAO;SACb,CAAC;IACL,MAAM,SAAS,GAAG,GAA2C,EAAE;QAC9D,MAAM,UAAU,GAAG,aAAa,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;YAC1B,OAAO,qBAAqB,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,MAAM,IAAI,UAAU,CAAC;IAC7B,CAAC,CAAC;IACF,OAAO,IAAI,iBAAiB,CAAC;QAC5B,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,SAAS,EAAE;KACnB,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC/C,cAAsB,EACtB,MAAe,EACf,QAAiB;IAEjB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,CAAC;IACtD,MAAM,QAAQ,GAAG,QAAQ;QACxB,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,sCAAiD;QAChE,CAAC,CAAC,OAAO,CAAC;IACX,MAAM,IAAI,GAAG;QACZ,EAAE,EAAE,MAAM,IAAI,IAAI,EAAE;QACpB,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE;KACxB,CAAC;IACF,MAAM,QAAQ,GAAG,QAAQ;QACxB,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,sCAAiD;QAChE,CAAC,CAAC,uBAAuB,CAAC,CAAC,iDAAiD;IAC7E,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ;QAC7B,CAAC,CAAC,wBAAwB,CAAC,MAAM,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,CAAC;QAC9D,CAAC,CAAC,IAAI,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG;QACf,eAAe,EAAE,SAAS,YAAY,CAAC,GAAG,EAAE;QAC5C,cAAc,EAAE,kBAAkB;KAClC,CAAC;IAEF,MAAM,GAAG,GAAG,GAAG,QAAQ,cAAc,QAAQ,EAAE,CAAC;IAEhD,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;SACpC,CAAC,CAAC;QAEH,oFAAoF;QACpF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,IAAI,GAA6B,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;QAE3F,IACC,IAAI,KAAK,SAAS;YAClB,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,EAC9D,CAAC;YACF,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iCAAiC,CAAC,QAAuB;IACxE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,OAAO,CAAC;IACtD,IAAI,QAAQ,EAAE,CAAC;QACd,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YACzE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC,IAAI,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACtD,CAAC","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
|
+
{"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 { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport type { MinimumVersionForCollab } from \"@fluidframework/runtime-definitions\";\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\tminVersionForCollaboration,\n\t}: {\n\t\tschema: ContainerSchema;\n\t\tminVersionForCollaboration: MinimumVersionForCollab;\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"]}
|
|
@@ -9,7 +9,7 @@ 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";
|
|
12
|
-
import { configProvider, waitForMember, getTestMatrix } from "./utils.js";
|
|
12
|
+
import { configProvider, waitForMember, getTestMatrix, currentVersion } from "./utils.js";
|
|
13
13
|
const testMatrix = getTestMatrix();
|
|
14
14
|
for (const testOpts of testMatrix) {
|
|
15
15
|
describe(`Fluid audience (${testOpts.variant})`, () => {
|
|
@@ -37,10 +37,10 @@ for (const testOpts of testMatrix) {
|
|
|
37
37
|
if (isEphemeral) {
|
|
38
38
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.findOriginalMember, "test-user-id-1", "test-user-name-1");
|
|
39
39
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
40
|
-
({ container, services } = await client.getContainer(containerId, schema,
|
|
40
|
+
({ container, services } = await client.getContainer(containerId, schema, currentVersion));
|
|
41
41
|
}
|
|
42
42
|
else {
|
|
43
|
-
({ container, services } = await client.createContainer(schema,
|
|
43
|
+
({ container, services } = await client.createContainer(schema, currentVersion));
|
|
44
44
|
containerId = await container.attach();
|
|
45
45
|
}
|
|
46
46
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -70,10 +70,10 @@ for (const testOpts of testMatrix) {
|
|
|
70
70
|
if (isEphemeral) {
|
|
71
71
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.findPartnerMember, "test-user-id-1", "test-user-name-1");
|
|
72
72
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
73
|
-
({ container, services } = await client.getContainer(containerId, schema,
|
|
73
|
+
({ container, services } = await client.getContainer(containerId, schema, currentVersion));
|
|
74
74
|
}
|
|
75
75
|
else {
|
|
76
|
-
({ container, services } = await client.createContainer(schema,
|
|
76
|
+
({ container, services } = await client.createContainer(schema, currentVersion));
|
|
77
77
|
containerId = await container.attach();
|
|
78
78
|
}
|
|
79
79
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -90,7 +90,7 @@ for (const testOpts of testMatrix) {
|
|
|
90
90
|
const client2 = createAzureClient("test-user-id-2", "test-user-name-2", undefined, configProvider({
|
|
91
91
|
"Fluid.Container.ForceWriteConnection": true,
|
|
92
92
|
}));
|
|
93
|
-
const { services: servicesGet } = await client2.getContainer(containerId, schema,
|
|
93
|
+
const { services: servicesGet } = await client2.getContainer(containerId, schema, currentVersion);
|
|
94
94
|
/* This is a workaround for a known bug, we should have one member (self) upon container connection */
|
|
95
95
|
const partner = await waitForMember(servicesGet.audience, "test-user-id-2");
|
|
96
96
|
assert.notStrictEqual(partner, undefined, "We should have partner at this point.");
|
|
@@ -110,10 +110,10 @@ for (const testOpts of testMatrix) {
|
|
|
110
110
|
if (isEphemeral) {
|
|
111
111
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.observeMemberLeaving, "test-user-id-1", "test-user-name-1");
|
|
112
112
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
113
|
-
({ container } = await client.getContainer(containerId, schema,
|
|
113
|
+
({ container } = await client.getContainer(containerId, schema, currentVersion));
|
|
114
114
|
}
|
|
115
115
|
else {
|
|
116
|
-
({ container } = await client.createContainer(schema,
|
|
116
|
+
({ container } = await client.createContainer(schema, currentVersion));
|
|
117
117
|
containerId = await container.attach();
|
|
118
118
|
}
|
|
119
119
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -125,7 +125,7 @@ for (const testOpts of testMatrix) {
|
|
|
125
125
|
const client2 = createAzureClient("test-user-id-2", "test-user-name-2", undefined, configProvider({
|
|
126
126
|
"Fluid.Container.ForceWriteConnection": true,
|
|
127
127
|
}));
|
|
128
|
-
const { services: servicesGet } = await client2.getContainer(containerId, schema,
|
|
128
|
+
const { services: servicesGet } = await client2.getContainer(containerId, schema, currentVersion);
|
|
129
129
|
/* This is a workaround for a known bug, we should have one member (self) upon container connection */
|
|
130
130
|
const partner = await waitForMember(servicesGet.audience, "test-user-id-2");
|
|
131
131
|
assert.notStrictEqual(partner, undefined, "We should have partner at this point.");
|
|
@@ -153,10 +153,10 @@ for (const testOpts of testMatrix) {
|
|
|
153
153
|
if (isEphemeral) {
|
|
154
154
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.observeMemberLeaving, "test-user-id-1", "test-user-name-1");
|
|
155
155
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
156
|
-
({ container, services } = await client.getContainer(containerId, schema,
|
|
156
|
+
({ container, services } = await client.getContainer(containerId, schema, currentVersion));
|
|
157
157
|
}
|
|
158
158
|
else {
|
|
159
|
-
({ container, services } = await client.createContainer(schema,
|
|
159
|
+
({ container, services } = await client.createContainer(schema, currentVersion));
|
|
160
160
|
containerId = await container.attach();
|
|
161
161
|
}
|
|
162
162
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -171,7 +171,7 @@ for (const testOpts of testMatrix) {
|
|
|
171
171
|
const originalSelf = await waitForMember(services.audience, "test-user-id-1");
|
|
172
172
|
assert.notStrictEqual(originalSelf, undefined, "We should have myself at this point.");
|
|
173
173
|
const partnerClient = createAzureClient("test-user-id-2", "test-user-name-2", undefined, undefined, [ScopeType.DocRead]);
|
|
174
|
-
const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema,
|
|
174
|
+
const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema, currentVersion);
|
|
175
175
|
if (partnerContainer.connectionState !== ConnectionState.Connected) {
|
|
176
176
|
await timeoutPromise((resolve) => partnerContainer.once("connected", () => resolve()), {
|
|
177
177
|
durationMs: connectTimeoutMs,
|
|
@@ -205,10 +205,10 @@ for (const testOpts of testMatrix) {
|
|
|
205
205
|
if (isEphemeral) {
|
|
206
206
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.observeMemberLeaving, "test-user-id-1", "test-user-name-1");
|
|
207
207
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
208
|
-
({ container } = await client.getContainer(containerId, schema,
|
|
208
|
+
({ container } = await client.getContainer(containerId, schema, currentVersion));
|
|
209
209
|
}
|
|
210
210
|
else {
|
|
211
|
-
({ container } = await client.createContainer(schema,
|
|
211
|
+
({ container } = await client.createContainer(schema, currentVersion));
|
|
212
212
|
containerId = await container.attach();
|
|
213
213
|
}
|
|
214
214
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -218,7 +218,7 @@ for (const testOpts of testMatrix) {
|
|
|
218
218
|
});
|
|
219
219
|
}
|
|
220
220
|
const partnerClient = createAzureClient("test-user-id-2", "test-user-name-2", undefined, undefined, [ScopeType.DocRead]);
|
|
221
|
-
const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema,
|
|
221
|
+
const { container: partnerContainer, services: partnerServices } = await partnerClient.getContainer(containerId, schema, currentVersion);
|
|
222
222
|
if (partnerContainer.connectionState !== ConnectionState.Connected) {
|
|
223
223
|
await timeoutPromise((resolve) => partnerContainer.once("connected", () => resolve()), {
|
|
224
224
|
durationMs: connectTimeoutMs,
|
|
@@ -246,7 +246,7 @@ for (const testOpts of testMatrix) {
|
|
|
246
246
|
});
|
|
247
247
|
});
|
|
248
248
|
const partnerClient2 = createAzureClient("test-user-id-3", "test-user-name-3", undefined, undefined, [ScopeType.DocRead]);
|
|
249
|
-
const { container: partnerContainer2, services: partnerServices2 } = await partnerClient2.getContainer(containerId, schema,
|
|
249
|
+
const { container: partnerContainer2, services: partnerServices2 } = await partnerClient2.getContainer(containerId, schema, currentVersion);
|
|
250
250
|
if (partnerContainer2.connectionState !== ConnectionState.Connected) {
|
|
251
251
|
await timeoutPromise((resolve) => partnerContainer2.once("connected", () => resolve()), {
|
|
252
252
|
durationMs: connectTimeoutMs,
|
|
@@ -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\";\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
|
+
{"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, currentVersion } 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(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschema,\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, currentVersion));\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(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschema,\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, currentVersion));\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(\n\t\t\t\tcontainerId,\n\t\t\t\tschema,\n\t\t\t\tcurrentVersion,\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 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, currentVersion));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, currentVersion));\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(\n\t\t\t\tcontainerId,\n\t\t\t\tschema,\n\t\t\t\tcurrentVersion,\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 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(\n\t\t\t\t\tcontainerId,\n\t\t\t\t\tschema,\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t));\n\t\t\t} else {\n\t\t\t\t({ container, services } = await client.createContainer(schema, currentVersion));\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, currentVersion);\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, currentVersion));\n\t\t\t} else {\n\t\t\t\t({ container } = await client.createContainer(schema, currentVersion));\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, currentVersion);\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, currentVersion);\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"]}
|
|
@@ -17,7 +17,7 @@ import { SharedTree } from "@fluidframework/tree/legacy";
|
|
|
17
17
|
import { createSandbox } from "sinon";
|
|
18
18
|
import { createAzureClient, createAzureClientLegacy, createContainerFromPayload, getContainerIdFromPayloadResponse, } from "./AzureClientFactory.js";
|
|
19
19
|
import * as ephemeralSummaryTrees from "./ephemeralSummaryTrees.js";
|
|
20
|
-
import { getTestMatrix, mapWait } from "./utils.js";
|
|
20
|
+
import { getTestMatrix, mapWait, currentVersion } from "./utils.js";
|
|
21
21
|
const configProvider = (settings) => ({
|
|
22
22
|
getRawConfig: (name) => settings[name],
|
|
23
23
|
});
|
|
@@ -50,7 +50,7 @@ for (const testOpts of testMatrix) {
|
|
|
50
50
|
if (isEphemeral) {
|
|
51
51
|
this.skip();
|
|
52
52
|
}
|
|
53
|
-
const { container } = await client.createContainer(schema,
|
|
53
|
+
const { container } = await client.createContainer(schema, currentVersion);
|
|
54
54
|
assert.strictEqual(container.attachState, AttachState.Detached, "Container should be detached");
|
|
55
55
|
// Make sure we can attach.
|
|
56
56
|
const containerId = await container.attach();
|
|
@@ -68,10 +68,10 @@ for (const testOpts of testMatrix) {
|
|
|
68
68
|
if (isEphemeral) {
|
|
69
69
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.canAttachContainer, "test-user-id-1", "test-user-name-1");
|
|
70
70
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
71
|
-
({ container } = await client.getContainer(containerId, schema,
|
|
71
|
+
({ container } = await client.getContainer(containerId, schema, currentVersion));
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
|
-
({ container } = await client.createContainer(schema,
|
|
74
|
+
({ container } = await client.createContainer(schema, currentVersion));
|
|
75
75
|
containerId = await container.attach();
|
|
76
76
|
}
|
|
77
77
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -95,10 +95,10 @@ for (const testOpts of testMatrix) {
|
|
|
95
95
|
if (isEphemeral) {
|
|
96
96
|
const containerResponse = await createContainerFromPayload(ephemeralSummaryTrees.cannotAttachContainerTwice, "test-user-id-1", "test-user-name-1");
|
|
97
97
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
98
|
-
({ container } = await client.getContainer(containerId, schema,
|
|
98
|
+
({ container } = await client.getContainer(containerId, schema, currentVersion));
|
|
99
99
|
}
|
|
100
100
|
else {
|
|
101
|
-
({ container } = await client.createContainer(schema,
|
|
101
|
+
({ container } = await client.createContainer(schema, currentVersion));
|
|
102
102
|
containerId = await container.attach();
|
|
103
103
|
}
|
|
104
104
|
if (container.connectionState !== ConnectionState.Connected) {
|
|
@@ -125,7 +125,7 @@ for (const testOpts of testMatrix) {
|
|
|
125
125
|
containerId = getContainerIdFromPayloadResponse(containerResponse);
|
|
126
126
|
}
|
|
127
127
|
else {
|
|
128
|
-
({ container: newContainer } = await client.createContainer(schema,
|
|
128
|
+
({ container: newContainer } = await client.createContainer(schema, currentVersion));
|
|
129
129
|
containerId = await newContainer.attach();
|
|
130
130
|
if (newContainer.connectionState !== ConnectionState.Connected) {
|
|
131
131
|
await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
|
|
@@ -134,7 +134,7 @@ for (const testOpts of testMatrix) {
|
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
const resources = client.getContainer(containerId, schema,
|
|
137
|
+
const resources = client.getContainer(containerId, schema, currentVersion);
|
|
138
138
|
await assert.doesNotReject(resources, () => true, "container cannot be retrieved from Azure Fluid Relay");
|
|
139
139
|
});
|
|
140
140
|
/**
|
|
@@ -147,7 +147,7 @@ for (const testOpts of testMatrix) {
|
|
|
147
147
|
it("cannot load improperly created container (cannot load a non-existent container)", async () => {
|
|
148
148
|
const consoleErrorFn = console.error;
|
|
149
149
|
console.error = () => { };
|
|
150
|
-
const containerAndServicesP = client.getContainer("containerConfig", schema,
|
|
150
|
+
const containerAndServicesP = client.getContainer("containerConfig", schema, currentVersion);
|
|
151
151
|
const errorFn = (error) => {
|
|
152
152
|
assert.notStrictEqual(error.message, undefined, "Azure Client error is undefined");
|
|
153
153
|
// AFR gives R11s fetch error, T9s gives 0x8e4
|
|
@@ -192,7 +192,7 @@ for (const testOpts of testMatrix) {
|
|
|
192
192
|
if (isEphemeral) {
|
|
193
193
|
this.skip();
|
|
194
194
|
}
|
|
195
|
-
await client.createContainer(schema,
|
|
195
|
+
await client.createContainer(schema, currentVersion);
|
|
196
196
|
const event = mockLogger.events.find((e) => e.eventName.endsWith("ContainerLoadStats"));
|
|
197
197
|
assert(event !== undefined, "ContainerLoadStats event should exist");
|
|
198
198
|
const featureGates = event.featureGates;
|
|
@@ -232,7 +232,7 @@ for (const testOpts of testMatrix) {
|
|
|
232
232
|
* Expected behavior: an error should not be thrown nor should a rejected promise
|
|
233
233
|
* be returned.
|
|
234
234
|
*/
|
|
235
|
-
for (const compatibilityMode of ["1", "2"]) {
|
|
235
|
+
for (const compatibilityMode of ["1.0.0", "2.0.0"]) {
|
|
236
236
|
it(`Current AzureClient (mode: "${compatibilityMode}") can get container made by legacy AzureClient`, async () => {
|
|
237
237
|
const { container: containerLegacy } = await clientLegacy.createContainer(schemaLegacy);
|
|
238
238
|
const containerId = await containerLegacy.attach();
|
|
@@ -257,7 +257,7 @@ for (const testOpts of testMatrix) {
|
|
|
257
257
|
containerLegacy.initialObjects.map1.set("key", "value");
|
|
258
258
|
// Await the value being saved, especially important if we dispose the legacy container.
|
|
259
259
|
await valueSetP;
|
|
260
|
-
if (compatibilityMode === "2") {
|
|
260
|
+
if (compatibilityMode === "2.0.0") {
|
|
261
261
|
// We don't support interop between legacy containers and "2" mode, dispose the legacy
|
|
262
262
|
// container to avoid this case.
|
|
263
263
|
containerLegacy.dispose();
|
|
@@ -319,7 +319,7 @@ for (const testOpts of testMatrix) {
|
|
|
319
319
|
it(`Legacy AzureClient can get container made by current AzureClient (mode: "1")`, async () => {
|
|
320
320
|
const { container: containerCurrent } = await clientCurrent1.createContainer(schemaCurrent,
|
|
321
321
|
// Note: Only containers created in compatibility mode "1" may be loaded by legacy client.
|
|
322
|
-
"1");
|
|
322
|
+
"1.0.0");
|
|
323
323
|
const containerId = await containerCurrent.attach();
|
|
324
324
|
if (containerCurrent.connectionState !== ConnectionState.Connected) {
|
|
325
325
|
await timeoutPromise((resolve) => containerCurrent.once("connected", () => resolve()), {
|
|
@@ -346,7 +346,7 @@ for (const testOpts of testMatrix) {
|
|
|
346
346
|
* Expected behavior: an error should not be thrown nor should a rejected promise be returned.
|
|
347
347
|
*/
|
|
348
348
|
it(`Current AzureClient (mode: "2") can get container made by current AzureClient (mode: "1")`, async () => {
|
|
349
|
-
const { container: containerCurrent1 } = await clientCurrent1.createContainer(schemaCurrent, "1");
|
|
349
|
+
const { container: containerCurrent1 } = await clientCurrent1.createContainer(schemaCurrent, "1.0.0");
|
|
350
350
|
const containerId = await containerCurrent1.attach();
|
|
351
351
|
if (containerCurrent1.connectionState !== ConnectionState.Connected) {
|
|
352
352
|
await timeoutPromise((resolve) => containerCurrent1.once("connected", () => resolve()), {
|
|
@@ -355,7 +355,7 @@ for (const testOpts of testMatrix) {
|
|
|
355
355
|
});
|
|
356
356
|
}
|
|
357
357
|
containerCurrent1.initialObjects.map1.set("key", "value");
|
|
358
|
-
const resources = clientCurrent2.getContainer(containerId, schemaCurrent, "2");
|
|
358
|
+
const resources = clientCurrent2.getContainer(containerId, schemaCurrent, "2.0.0");
|
|
359
359
|
await assert.doesNotReject(resources, () => true, "container could not be loaded");
|
|
360
360
|
const { container: containerCurrent2 } = await resources;
|
|
361
361
|
if (containerCurrent2.connectionState !== ConnectionState.Connected) {
|
|
@@ -373,7 +373,7 @@ for (const testOpts of testMatrix) {
|
|
|
373
373
|
* Expected behavior: an error should not be thrown nor should a rejected promise be returned.
|
|
374
374
|
*/
|
|
375
375
|
it(`Current AzureClient (mode: "1") can get container made by current AzureClient (mode: "2")`, async () => {
|
|
376
|
-
const { container: containerCurrent2 } = await clientCurrent2.createContainer(schemaCurrent, "2");
|
|
376
|
+
const { container: containerCurrent2 } = await clientCurrent2.createContainer(schemaCurrent, "2.0.0");
|
|
377
377
|
const containerId = await containerCurrent2.attach();
|
|
378
378
|
if (containerCurrent2.connectionState !== ConnectionState.Connected) {
|
|
379
379
|
await timeoutPromise((resolve) => containerCurrent2.once("connected", () => resolve()), {
|
|
@@ -382,7 +382,7 @@ for (const testOpts of testMatrix) {
|
|
|
382
382
|
});
|
|
383
383
|
}
|
|
384
384
|
containerCurrent2.initialObjects.map1.set("key", "value");
|
|
385
|
-
const resources = clientCurrent1.getContainer(containerId, schemaCurrent, "1");
|
|
385
|
+
const resources = clientCurrent1.getContainer(containerId, schemaCurrent, "1.0.0");
|
|
386
386
|
await assert.doesNotReject(resources, () => true, "container could not be loaded");
|
|
387
387
|
const { container: containerCurrent1 } = await resources;
|
|
388
388
|
if (containerCurrent1.connectionState !== ConnectionState.Connected) {
|
|
@@ -395,7 +395,7 @@ for (const testOpts of testMatrix) {
|
|
|
395
395
|
assert.strictEqual(result, "value", "Value not found in copied container");
|
|
396
396
|
});
|
|
397
397
|
it("op grouping disabled as expected for 1.x clients", async () => {
|
|
398
|
-
const { container: container1 } = await clientCurrent1.createContainer(schemaCurrent, "1");
|
|
398
|
+
const { container: container1 } = await clientCurrent1.createContainer(schemaCurrent, "1.0.0");
|
|
399
399
|
const containerId = await container1.attach();
|
|
400
400
|
if (container1.connectionState !== ConnectionState.Connected) {
|
|
401
401
|
await timeoutPromise((resolve) => container1.once("connected", () => resolve()), {
|
|
@@ -435,7 +435,7 @@ for (const testOpts of testMatrix) {
|
|
|
435
435
|
}
|
|
436
436
|
}
|
|
437
437
|
});
|
|
438
|
-
for (const compatibilityMode of ["1", "2"]) {
|
|
438
|
+
for (const compatibilityMode of ["1.0.0", "2.0.0"]) {
|
|
439
439
|
it(`op grouping works as expected (compatibilityMode: ${compatibilityMode})`, async () => {
|
|
440
440
|
const { container: container1 } = await clientCurrent1.createContainer(schemaCurrent, compatibilityMode);
|
|
441
441
|
const containerId = await container1.attach();
|
|
@@ -472,7 +472,7 @@ for (const testOpts of testMatrix) {
|
|
|
472
472
|
groupedBatchCount++;
|
|
473
473
|
}
|
|
474
474
|
}
|
|
475
|
-
if (compatibilityMode === "1") {
|
|
475
|
+
if (compatibilityMode === "1.0.0") {
|
|
476
476
|
assert.strictEqual(groupedBatchCount, 0, "expect no op grouping in compatibilityMode 1");
|
|
477
477
|
}
|
|
478
478
|
else {
|
|
@@ -488,11 +488,14 @@ for (const testOpts of testMatrix) {
|
|
|
488
488
|
describe("Container create in tree-only mode", () => {
|
|
489
489
|
const invalidSchemaErrorMessage = "Tree-only mode requires exactly 1 SharedTree in initialObjects.";
|
|
490
490
|
function createClient() {
|
|
491
|
-
return createAzureClient(undefined, undefined, undefined, undefined, undefined, ({ schema,
|
|
491
|
+
return createAzureClient(undefined, undefined, undefined, undefined, undefined, ({ schema, minVersionForCollaboration }) => {
|
|
492
492
|
if (!isTreeContainerSchema(schema)) {
|
|
493
493
|
throw new UsageError(invalidSchemaErrorMessage);
|
|
494
494
|
}
|
|
495
|
-
return createTreeContainerRuntimeFactory({
|
|
495
|
+
return createTreeContainerRuntimeFactory({
|
|
496
|
+
schema,
|
|
497
|
+
minVersionForCollaboration,
|
|
498
|
+
});
|
|
496
499
|
});
|
|
497
500
|
}
|
|
498
501
|
it("can create tree-based container", async function () {
|
|
@@ -502,7 +505,7 @@ describe("Container create in tree-only mode", () => {
|
|
|
502
505
|
tree: SharedTree,
|
|
503
506
|
},
|
|
504
507
|
};
|
|
505
|
-
const { container } = await client.createContainer(schema,
|
|
508
|
+
const { container } = await client.createContainer(schema, currentVersion);
|
|
506
509
|
assert(SharedTree.is(container.initialObjects.tree));
|
|
507
510
|
});
|
|
508
511
|
it("throws if invalid schema is encountered", async function () {
|
|
@@ -513,7 +516,7 @@ describe("Container create in tree-only mode", () => {
|
|
|
513
516
|
map: SharedMap,
|
|
514
517
|
},
|
|
515
518
|
};
|
|
516
|
-
await assert.rejects(client.createContainer(schema,
|
|
519
|
+
await assert.rejects(client.createContainer(schema, currentVersion), (error) => {
|
|
517
520
|
assert(error instanceof UsageError);
|
|
518
521
|
assert.strictEqual(error.message, invalidSchemaErrorMessage);
|
|
519
522
|
return true;
|