@fluidframework/azure-end-to-end-tests 2.0.0-dev.6.4.0.192049 → 2.0.0-dev.7.2.0.204906

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # @fluidframework/azure-end-to-end-tests
2
2
 
3
+ ## 2.0.0-internal.7.1.0
4
+
5
+ Dependency updates only.
6
+
7
+ ## 2.0.0-internal.7.0.0
8
+
9
+ ### Major Changes
10
+
11
+ - Server upgrade: dependencies on Fluid server packages updated to 2.0.1 [871b3493dd](https://github.com/microsoft/FluidFramework/commits/871b3493dd0d7ea3a89be64998ceb6cb9021a04e)
12
+
13
+ Dependencies on the following Fluid server package have been updated to version 2.0.1:
14
+
15
+ - @fluidframework/gitresources: 2.0.1
16
+ - @fluidframework/server-kafka-orderer: 2.0.1
17
+ - @fluidframework/server-lambdas: 2.0.1
18
+ - @fluidframework/server-lambdas-driver: 2.0.1
19
+ - @fluidframework/server-local-server: 2.0.1
20
+ - @fluidframework/server-memory-orderer: 2.0.1
21
+ - @fluidframework/protocol-base: 2.0.1
22
+ - @fluidframework/server-routerlicious: 2.0.1
23
+ - @fluidframework/server-routerlicious-base: 2.0.1
24
+ - @fluidframework/server-services: 2.0.1
25
+ - @fluidframework/server-services-client: 2.0.1
26
+ - @fluidframework/server-services-core: 2.0.1
27
+ - @fluidframework/server-services-ordering-kafkanode: 2.0.1
28
+ - @fluidframework/server-services-ordering-rdkafka: 2.0.1
29
+ - @fluidframework/server-services-ordering-zookeeper: 2.0.1
30
+ - @fluidframework/server-services-shared: 2.0.1
31
+ - @fluidframework/server-services-telemetry: 2.0.1
32
+ - @fluidframework/server-services-utils: 2.0.1
33
+ - @fluidframework/server-test-utils: 2.0.1
34
+ - tinylicious: 2.0.1
35
+
36
+ - Minimum TypeScript version now 5.1.6 [871b3493dd](https://github.com/microsoft/FluidFramework/commits/871b3493dd0d7ea3a89be64998ceb6cb9021a04e)
37
+
38
+ The minimum supported TypeScript version for Fluid 2.0 clients is now 5.1.6.
39
+
40
+ ## 2.0.0-internal.6.4.0
41
+
42
+ Dependency updates only.
43
+
3
44
  ## 2.0.0-internal.6.3.0
4
45
 
5
46
  Dependency updates only.
@@ -11,11 +11,9 @@ class TestDataObject extends aqueduct_1.DataObject {
11
11
  constructor(props) {
12
12
  super(props);
13
13
  }
14
- static get Name() {
15
- return "@fluid-example/test-data-object";
16
- }
17
14
  }
18
15
  exports.TestDataObject = TestDataObject;
16
+ TestDataObject.Name = "@fluid-example/test-data-object";
19
17
  TestDataObject.factory = new aqueduct_1.DataObjectFactory(TestDataObject.Name, TestDataObject, [], {});
20
18
  class CounterTestDataObject extends aqueduct_1.DataObject {
21
19
  /**
@@ -29,9 +27,6 @@ class CounterTestDataObject extends aqueduct_1.DataObject {
29
27
  const counterHandle = this.root.get("counter-key");
30
28
  this._counter = await counterHandle?.get();
31
29
  }
32
- static get Name() {
33
- return "@fluid-example/counter-test-data-object";
34
- }
35
30
  increment() {
36
31
  this.counter.increment(1);
37
32
  }
@@ -46,5 +41,6 @@ class CounterTestDataObject extends aqueduct_1.DataObject {
46
41
  }
47
42
  }
48
43
  exports.CounterTestDataObject = CounterTestDataObject;
44
+ CounterTestDataObject.Name = "@fluid-example/counter-test-data-object";
49
45
  CounterTestDataObject.factory = new aqueduct_1.DataObjectFactory(CounterTestDataObject.Name, CounterTestDataObject, [counter_1.SharedCounter.getFactory()], {});
50
46
  //# sourceMappingURL=TestDataObject.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestDataObject.js","sourceRoot":"","sources":["../../src/test/TestDataObject.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uDAA2F;AAE3F,qDAAwD;AAExD,MAAa,cAAe,SAAQ,qBAAU;IAY7C,YAAY,KAAuB;QAClC,KAAK,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;IAbM,MAAM,KAAK,IAAI;QACrB,OAAO,iCAAiC,CAAC;IAC1C,CAAC;;AAHF,wCAeC;AAVuB,sBAAO,GAAG,IAAI,4BAAiB,CACrD,cAAc,CAAC,IAAI,EACnB,cAAc,EACd,EAAE,EACF,EAAE,CACF,CAAC;AAOH,MAAa,qBAAsB,SAAQ,qBAAU;IAGpD;;OAEG;IACO,KAAK,CAAC,qBAAqB;QACpC,MAAM,OAAO,GAAG,uBAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAES,KAAK,CAAC,cAAc;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAA8B,aAAa,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,GAAG,MAAM,aAAa,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;IAEM,MAAM,KAAK,IAAI;QACrB,OAAO,yCAAyC,CAAC;IAClD,CAAC;IASM,SAAS;QACf,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAW,KAAK;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,IAAY,OAAO;QAClB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACjD;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;;AAxCF,sDAyCC;AArBuB,6BAAO,GAAG,IAAI,4BAAiB,CACrD,qBAAqB,CAAC,IAAI,EAC1B,qBAAqB,EACrB,CAAC,uBAAa,CAAC,UAAU,EAAE,CAAC,EAC5B,EAAE,CACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { DataObject, DataObjectFactory, IDataObjectProps } from \"@fluidframework/aqueduct\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { SharedCounter } from \"@fluidframework/counter\";\n\nexport class TestDataObject extends DataObject {\n\tpublic static get Name(): string {\n\t\treturn \"@fluid-example/test-data-object\";\n\t}\n\n\tpublic static readonly factory = new DataObjectFactory(\n\t\tTestDataObject.Name,\n\t\tTestDataObject,\n\t\t[],\n\t\t{},\n\t);\n\n\tconstructor(props: IDataObjectProps) {\n\t\tsuper(props);\n\t}\n}\n\nexport class CounterTestDataObject 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 get Name(): string {\n\t\treturn \"@fluid-example/counter-test-data-object\";\n\t}\n\n\tpublic static readonly factory = new DataObjectFactory(\n\t\tCounterTestDataObject.Name,\n\t\tCounterTestDataObject,\n\t\t[SharedCounter.getFactory()],\n\t\t{},\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"]}
1
+ {"version":3,"file":"TestDataObject.js","sourceRoot":"","sources":["../../src/test/TestDataObject.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,uDAA2F;AAE3F,qDAAwD;AAExD,MAAa,cAAe,SAAQ,qBAAU;IAU7C,YAAY,KAAuB;QAClC,KAAK,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;;AAZF,wCAaC;AAZuB,mBAAI,GAAG,iCAAiC,CAAC;AAEzC,sBAAO,GAAG,IAAI,4BAAiB,CACrD,cAAc,CAAC,IAAI,EACnB,cAAc,EACd,EAAE,EACF,EAAE,CACF,CAAC;AAOH,MAAa,qBAAsB,SAAQ,qBAAU;IAGpD;;OAEG;IACO,KAAK,CAAC,qBAAqB;QACpC,MAAM,OAAO,GAAG,uBAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAES,KAAK,CAAC,cAAc;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAA8B,aAAa,CAAC,CAAC;QAChF,IAAI,CAAC,QAAQ,GAAG,MAAM,aAAa,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;IAWM,SAAS;QACf,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAW,KAAK;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,IAAY,OAAO;QAClB,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SACjD;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;;AAtCF,sDAuCC;AAvBuB,0BAAI,GAAG,yCAAyC,CAAC;AAEjD,6BAAO,GAAG,IAAI,4BAAiB,CACrD,qBAAqB,CAAC,IAAI,EAC1B,qBAAqB,EACrB,CAAC,uBAAa,CAAC,UAAU,EAAE,CAAC,EAC5B,EAAE,CACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { DataObject, DataObjectFactory, IDataObjectProps } from \"@fluidframework/aqueduct\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { SharedCounter } from \"@fluidframework/counter\";\n\nexport class TestDataObject extends DataObject {\n\tpublic static readonly Name = \"@fluid-example/test-data-object\";\n\n\tpublic static readonly factory = new DataObjectFactory(\n\t\tTestDataObject.Name,\n\t\tTestDataObject,\n\t\t[],\n\t\t{},\n\t);\n\n\tconstructor(props: IDataObjectProps) {\n\t\tsuper(props);\n\t}\n}\n\nexport class CounterTestDataObject 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\tCounterTestDataObject.Name,\n\t\tCounterTestDataObject,\n\t\t[SharedCounter.getFactory()],\n\t\t{},\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"]}
@@ -8,8 +8,12 @@ const node_assert_1 = require("node:assert");
8
8
  const container_definitions_1 = require("@fluidframework/container-definitions");
9
9
  const map_1 = require("@fluidframework/map");
10
10
  const test_utils_1 = require("@fluidframework/test-utils");
11
+ const container_loader_1 = require("@fluidframework/container-loader");
11
12
  const AzureClientFactory_1 = require("./AzureClientFactory");
12
13
  const utils_1 = require("./utils");
14
+ const configProvider = (settings) => ({
15
+ getRawConfig: (name) => settings[name],
16
+ });
13
17
  describe("Fluid audience", () => {
14
18
  const connectTimeoutMs = 10000;
15
19
  let client;
@@ -30,10 +34,12 @@ describe("Fluid audience", () => {
30
34
  it("can find original member", async () => {
31
35
  const { container, services } = await client.createContainer(schema);
32
36
  const containerId = await container.attach();
33
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
34
- durationMs: connectTimeoutMs,
35
- errorMsg: "container connect() timeout",
36
- });
37
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
38
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
39
+ durationMs: connectTimeoutMs,
40
+ errorMsg: "container connect() timeout",
41
+ });
42
+ }
37
43
  node_assert_1.strict.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
38
44
  node_assert_1.strict.strictEqual(container.attachState, container_definitions_1.AttachState.Attached, "Container is not attached after attach is called");
39
45
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
@@ -51,16 +57,20 @@ describe("Fluid audience", () => {
51
57
  it("can find partner member", async () => {
52
58
  const { container, services } = await client.createContainer(schema);
53
59
  const containerId = await container.attach();
54
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
55
- durationMs: connectTimeoutMs,
56
- errorMsg: "container connect() timeout",
57
- });
60
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
61
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
62
+ durationMs: connectTimeoutMs,
63
+ errorMsg: "container connect() timeout",
64
+ });
65
+ }
58
66
  node_assert_1.strict.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
59
67
  node_assert_1.strict.strictEqual(container.attachState, container_definitions_1.AttachState.Attached, "Container is not attached after attach is called");
60
68
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
61
69
  const originalSelf = await (0, utils_1.waitForMember)(services.audience, "test-user-id-1");
62
70
  node_assert_1.strict.notStrictEqual(originalSelf, undefined, "We should have myself at this point.");
63
- const client2 = (0, AzureClientFactory_1.createAzureClient)("test-user-id-2", "test-user-name-2");
71
+ const client2 = (0, AzureClientFactory_1.createAzureClient)("test-user-id-2", "test-user-name-2", undefined, configProvider({
72
+ "Fluid.Container.ForceWriteConnection": true,
73
+ }));
64
74
  const { services: servicesGet } = await client2.getContainer(containerId, schema);
65
75
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
66
76
  const partner = await (0, utils_1.waitForMember)(servicesGet.audience, "test-user-id-2");
@@ -78,11 +88,15 @@ describe("Fluid audience", () => {
78
88
  it("can observe member leaving", async () => {
79
89
  const { container } = await client.createContainer(schema);
80
90
  const containerId = await container.attach();
81
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
82
- durationMs: connectTimeoutMs,
83
- errorMsg: "container connect() timeout",
84
- });
85
- const client2 = (0, AzureClientFactory_1.createAzureClient)("test-user-id-2", "test-user-name-2");
91
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
92
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
93
+ durationMs: connectTimeoutMs,
94
+ errorMsg: "container connect() timeout",
95
+ });
96
+ }
97
+ const client2 = (0, AzureClientFactory_1.createAzureClient)("test-user-id-2", "test-user-name-2", undefined, configProvider({
98
+ "Fluid.Container.ForceWriteConnection": true,
99
+ }));
86
100
  const { services: servicesGet } = await client2.getContainer(containerId, schema);
87
101
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
88
102
  const partner = await (0, utils_1.waitForMember)(servicesGet.audience, "test-user-id-2");
@@ -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 */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { createAzureClient } from \"./AzureClientFactory\";\nimport { waitForMember } from \"./utils\";\n\ndescribe(\"Fluid audience\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient(\"test-user-id-1\", \"test-user-name-1\");\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: Find original member/self\n\t *\n\t * Expected behavior: container should have a single member upon creation.\n\t */\n\tit(\"can find original member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst myself = await waitForMember(services.audience, \"test-user-id-1\");\n\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\tconst members = services.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t});\n\n\t/**\n\t * Scenario: Find partner member\n\t *\n\t * Expected behavior: upon resolving container, the partner member should be able\n\t * to resolve original member.\n\t */\n\tit(\"can find partner member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\tconst client2 = createAzureClient(\"test-user-id-2\", \"test-user-name-2\");\n\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tconst members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tassert.notStrictEqual(\n\t\t\tpartner?.userId,\n\t\t\toriginalSelf?.userId,\n\t\t\t\"Self and partner should have different IDs\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Partner should be able to observe change in audience\n\t *\n\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t * memberRemoved event and have correct partner count.\n\t */\n\tit(\"can observe member leaving\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst client2 = createAzureClient(\"test-user-id-2\", \"test-user-name-2\");\n\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tlet members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tcontainer.disconnect();\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tmembers = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\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 */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { ConfigTypes, IConfigProviderBase } from \"@fluidframework/telemetry-utils\";\nimport { createAzureClient } from \"./AzureClientFactory\";\nimport { waitForMember } from \"./utils\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\ndescribe(\"Fluid audience\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient(\"test-user-id-1\", \"test-user-name-1\");\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: Find original member/self\n\t *\n\t * Expected behavior: container should have a single member upon creation.\n\t */\n\tit(\"can find original member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst myself = await waitForMember(services.audience, \"test-user-id-1\");\n\t\tassert.notStrictEqual(myself, undefined, \"We should have myself at this point.\");\n\n\t\tconst members = services.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have only one member at this point.\");\n\t});\n\n\t/**\n\t * Scenario: Find partner member\n\t *\n\t * Expected behavior: upon resolving container, the partner member should be able\n\t * to resolve original member.\n\t */\n\tit(\"can find partner member\", async () => {\n\t\tconst { container, services } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst originalSelf = await waitForMember(services.audience, \"test-user-id-1\");\n\t\tassert.notStrictEqual(originalSelf, undefined, \"We should have myself at this point.\");\n\n\t\tconst client2 = createAzureClient(\n\t\t\t\"test-user-id-2\",\n\t\t\t\"test-user-name-2\",\n\t\t\tundefined,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t}),\n\t\t);\n\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tconst members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tassert.notStrictEqual(\n\t\t\tpartner?.userId,\n\t\t\toriginalSelf?.userId,\n\t\t\t\"Self and partner should have different IDs\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Partner should be able to observe change in audience\n\t *\n\t * Expected behavior: upon 1 partner leaving, other parther should observe\n\t * memberRemoved event and have correct partner count.\n\t */\n\tit(\"can observe member leaving\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst client2 = createAzureClient(\n\t\t\t\"test-user-id-2\",\n\t\t\t\"test-user-name-2\",\n\t\t\tundefined,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.Container.ForceWriteConnection\": true,\n\t\t\t}),\n\t\t);\n\t\tconst { services: servicesGet } = await client2.getContainer(containerId, schema);\n\n\t\t/* This is a workaround for a known bug, we should have one member (self) upon container connection */\n\t\tconst partner = await waitForMember(servicesGet.audience, \"test-user-id-2\");\n\t\tassert.notStrictEqual(partner, undefined, \"We should have partner at this point.\");\n\n\t\tlet members = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 2, \"We should have two members at this point.\");\n\n\t\tcontainer.disconnect();\n\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tservicesGet.audience.on(\"memberRemoved\", () => {\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\n\t\tmembers = servicesGet.audience.getMembers();\n\t\tassert.strictEqual(members.size, 1, \"We should have one member left at this point.\");\n\t});\n});\n"]}
@@ -8,6 +8,7 @@ const node_assert_1 = require("node:assert");
8
8
  const container_definitions_1 = require("@fluidframework/container-definitions");
9
9
  const map_1 = require("@fluidframework/map");
10
10
  const test_utils_1 = require("@fluidframework/test-utils");
11
+ const container_loader_1 = require("@fluidframework/container-loader");
11
12
  const AzureClientFactory_1 = require("./AzureClientFactory");
12
13
  const utils_1 = require("./utils");
13
14
  describe("Container copy scenarios", () => {
@@ -36,10 +37,12 @@ describe("Container copy scenarios", () => {
36
37
  it("can get versions of current document", async () => {
37
38
  const { container } = await client.createContainer(schema);
38
39
  const containerId = await container.attach();
39
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
40
- durationMs: connectTimeoutMs,
41
- errorMsg: "container connect() timeout",
42
- });
40
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
41
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
42
+ durationMs: connectTimeoutMs,
43
+ errorMsg: "container connect() timeout",
44
+ });
45
+ }
43
46
  const resources = client.getContainerVersions(containerId);
44
47
  await node_assert_1.strict.doesNotReject(resources, () => true, "could not get versions of the container");
45
48
  const versions = await resources;
@@ -68,18 +71,22 @@ describe("Container copy scenarios", () => {
68
71
  it("can copy document successfully", async () => {
69
72
  const { container } = await client.createContainer(schema);
70
73
  const containerId = await container.attach();
71
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
72
- durationMs: connectTimeoutMs,
73
- errorMsg: "container connect() timeout",
74
- });
74
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
75
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
76
+ durationMs: connectTimeoutMs,
77
+ errorMsg: "container connect() timeout",
78
+ });
79
+ }
75
80
  const resources = client.copyContainer(containerId, schema);
76
81
  await node_assert_1.strict.doesNotReject(resources, () => true, "container could not be copied");
77
82
  const { container: containerCopy } = await resources;
78
83
  const newContainerId = await containerCopy.attach();
79
- await (0, test_utils_1.timeoutPromise)((resolve) => containerCopy.once("connected", () => resolve()), {
80
- durationMs: connectTimeoutMs,
81
- errorMsg: "container connect() timeout",
82
- });
84
+ if (containerCopy.connectionState !== container_loader_1.ConnectionState.Connected) {
85
+ await (0, test_utils_1.timeoutPromise)((resolve) => containerCopy.once("connected", () => resolve()), {
86
+ durationMs: connectTimeoutMs,
87
+ errorMsg: "container connect() timeout",
88
+ });
89
+ }
83
90
  node_assert_1.strict.strictEqual(typeof newContainerId, "string", "Attach did not return a string ID");
84
91
  node_assert_1.strict.strictEqual(containerCopy.attachState, container_definitions_1.AttachState.Attached, "Container is not attached after attach is called");
85
92
  });
@@ -92,20 +99,24 @@ describe("Container copy scenarios", () => {
92
99
  it("can successfully copy an existing container at a specific version", async () => {
93
100
  const { container } = await client.createContainer(schema);
94
101
  const containerId = await container.attach();
95
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
96
- durationMs: connectTimeoutMs,
97
- errorMsg: "container connect() timeout",
98
- });
102
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
103
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
104
+ durationMs: connectTimeoutMs,
105
+ errorMsg: "container connect() timeout",
106
+ });
107
+ }
99
108
  const versions = await client.getContainerVersions(containerId);
100
109
  node_assert_1.strict.strictEqual(versions.length, 1, "Container should have exactly one version.");
101
110
  const resources = client.copyContainer(containerId, schema, versions[0]);
102
111
  await node_assert_1.strict.doesNotReject(resources, () => true, "container could not be copied");
103
112
  const { container: containerCopy } = await resources;
104
113
  const newContainerId = await containerCopy.attach();
105
- await (0, test_utils_1.timeoutPromise)((resolve) => containerCopy.once("connected", () => resolve()), {
106
- durationMs: connectTimeoutMs,
107
- errorMsg: "container connect() timeout",
108
- });
114
+ if (containerCopy.connectionState !== container_loader_1.ConnectionState.Connected) {
115
+ await (0, test_utils_1.timeoutPromise)((resolve) => containerCopy.once("connected", () => resolve()), {
116
+ durationMs: connectTimeoutMs,
117
+ errorMsg: "container connect() timeout",
118
+ });
119
+ }
109
120
  node_assert_1.strict.strictEqual(typeof newContainerId, "string", "Attach did not return a string ID");
110
121
  node_assert_1.strict.strictEqual(containerCopy.attachState, container_definitions_1.AttachState.Attached, "Container is not attached after attach is called");
111
122
  });
@@ -123,10 +134,12 @@ describe("Container copy scenarios", () => {
123
134
  map1Create.set("new-key", "new-value");
124
135
  const valueCreate = map1Create.get("new-key");
125
136
  const containerId = await container.attach();
126
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
127
- durationMs: connectTimeoutMs,
128
- errorMsg: "container connect() timeout",
129
- });
137
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
138
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
139
+ durationMs: connectTimeoutMs,
140
+ errorMsg: "container connect() timeout",
141
+ });
142
+ }
130
143
  const resources = client.copyContainer(containerId, schema);
131
144
  await node_assert_1.strict.doesNotReject(resources, () => true, "container could not be copied");
132
145
  const { container: containerCopy } = await resources;
@@ -1 +1 @@
1
- {"version":3,"file":"containerCopy.spec.js","sourceRoot":"","sources":["../../src/test/containerCopy.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 */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { createAzureClient } from \"./AzureClientFactory\";\nimport { mapWait } from \"./utils\";\n\ndescribe(\"Container copy scenarios\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient();\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\tbeforeEach(async function () {\n\t\tif (process.env.FLUID_CLIENT !== \"azure\") {\n\t\t\tthis.skip();\n\t\t}\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can provide versions of the container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned. Upon creation, we should recieve back 1 version of the container.\n\t */\n\tit(\"can get versions of current document\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\t\tconst resources = client.getContainerVersions(containerId);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"could not get versions of the container\",\n\t\t);\n\n\t\tconst versions = await resources;\n\t\tassert.strictEqual(versions.length, 1, \"Container should have exactly one version.\");\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can handle bad document ID when versions are requested.\n\t *\n\t * Expected behavior: Client should throw an error.\n\t */\n\tit(\"can handle bad document id when requesting versions\", async () => {\n\t\tconst resources = client.getContainerVersions(\"badid\");\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\tassert.strictEqual(\n\t\t\t\terror.message,\n\t\t\t\t\"R11s fetch error: Document is deleted and cannot be accessed.\",\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\t\tawait assert.rejects(\n\t\t\tresources,\n\t\t\terrorFn,\n\t\t\t\"We should not be able to get container versions.\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can copy existing container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can copy document successfully\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\t\tconst resources = client.copyContainer(containerId, schema);\n\t\tawait assert.doesNotReject(resources, () => true, \"container could not be copied\");\n\n\t\tconst { container: containerCopy } = await resources;\n\n\t\tconst newContainerId = await containerCopy.attach();\n\t\tawait timeoutPromise((resolve) => containerCopy.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tassert.strictEqual(typeof newContainerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainerCopy.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can copy existing container at a specific version.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can successfully copy an existing container at a specific version\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst versions = await client.getContainerVersions(containerId);\n\t\tassert.strictEqual(versions.length, 1, \"Container should have exactly one version.\");\n\n\t\tconst resources = client.copyContainer(containerId, schema, versions[0]);\n\t\tawait assert.doesNotReject(resources, () => true, \"container could not be copied\");\n\n\t\tconst { container: containerCopy } = await resources;\n\n\t\tconst newContainerId = await containerCopy.attach();\n\t\tawait timeoutPromise((resolve) => containerCopy.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tassert.strictEqual(typeof newContainerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainerCopy.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client properly handles DDS objects when\n\t * copying existing container.\n\t *\n\t * Expected behavior: DDS values should match across original and copied\n\t * container.\n\t */\n\tit(\"correctly copies DDS values when copying container\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tconst map1Create = initialObjectsCreate.map1 as SharedMap;\n\t\tmap1Create.set(\"new-key\", \"new-value\");\n\t\tconst valueCreate: string | undefined = map1Create.get(\"new-key\");\n\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst resources = client.copyContainer(containerId, schema);\n\t\tawait assert.doesNotReject(resources, () => true, \"container could not be copied\");\n\n\t\tconst { container: containerCopy } = await resources;\n\n\t\tconst map1Get = containerCopy.initialObjects.map1 as SharedMap;\n\t\tconst valueGet: string | undefined = await mapWait(map1Get, \"new-key\");\n\t\tassert.strictEqual(valueGet, valueCreate, \"DDS value was not correctly copied.\");\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can handle non-existing container when trying to copy\n\t *\n\t * Expected behavior: client should throw an error.\n\t */\n\tit(\"can handle non-existing container\", async () => {\n\t\tconst resources = client.copyContainer(\"badidoncopy\", schema);\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\tassert.strictEqual(\n\t\t\t\terror.message,\n\t\t\t\t\"R11s fetch error: Document is deleted and cannot be accessed.\",\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\t\tawait assert.rejects(resources, errorFn, \"We should not be able to copy container.\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"containerCopy.spec.js","sourceRoot":"","sources":["../../src/test/containerCopy.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 */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { createAzureClient } from \"./AzureClientFactory\";\nimport { mapWait } from \"./utils\";\n\ndescribe(\"Container copy scenarios\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient();\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\tbeforeEach(async function () {\n\t\tif (process.env.FLUID_CLIENT !== \"azure\") {\n\t\t\tthis.skip();\n\t\t}\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can provide versions of the container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned. Upon creation, we should recieve back 1 version of the container.\n\t */\n\tit(\"can get versions of current document\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\t\tconst resources = client.getContainerVersions(containerId);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"could not get versions of the container\",\n\t\t);\n\n\t\tconst versions = await resources;\n\t\tassert.strictEqual(versions.length, 1, \"Container should have exactly one version.\");\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can handle bad document ID when versions are requested.\n\t *\n\t * Expected behavior: Client should throw an error.\n\t */\n\tit(\"can handle bad document id when requesting versions\", async () => {\n\t\tconst resources = client.getContainerVersions(\"badid\");\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\tassert.strictEqual(\n\t\t\t\terror.message,\n\t\t\t\t\"R11s fetch error: Document is deleted and cannot be accessed.\",\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\t\tawait assert.rejects(\n\t\t\tresources,\n\t\t\terrorFn,\n\t\t\t\"We should not be able to get container versions.\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can copy existing container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can copy document successfully\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\t\tconst resources = client.copyContainer(containerId, schema);\n\t\tawait assert.doesNotReject(resources, () => true, \"container could not be copied\");\n\n\t\tconst { container: containerCopy } = await resources;\n\n\t\tconst newContainerId = await containerCopy.attach();\n\t\tif (containerCopy.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => containerCopy.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof newContainerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainerCopy.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can copy existing container at a specific version.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can successfully copy an existing container at a specific version\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst versions = await client.getContainerVersions(containerId);\n\t\tassert.strictEqual(versions.length, 1, \"Container should have exactly one version.\");\n\n\t\tconst resources = client.copyContainer(containerId, schema, versions[0]);\n\t\tawait assert.doesNotReject(resources, () => true, \"container could not be copied\");\n\n\t\tconst { container: containerCopy } = await resources;\n\n\t\tconst newContainerId = await containerCopy.attach();\n\t\tif (containerCopy.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => containerCopy.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof newContainerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainerCopy.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client properly handles DDS objects when\n\t * copying existing container.\n\t *\n\t * Expected behavior: DDS values should match across original and copied\n\t * container.\n\t */\n\tit(\"correctly copies DDS values when copying container\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tconst map1Create = initialObjectsCreate.map1 as SharedMap;\n\t\tmap1Create.set(\"new-key\", \"new-value\");\n\t\tconst valueCreate: string | undefined = map1Create.get(\"new-key\");\n\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\t\tconst resources = client.copyContainer(containerId, schema);\n\t\tawait assert.doesNotReject(resources, () => true, \"container could not be copied\");\n\n\t\tconst { container: containerCopy } = await resources;\n\n\t\tconst map1Get = containerCopy.initialObjects.map1 as SharedMap;\n\t\tconst valueGet: string | undefined = await mapWait(map1Get, \"new-key\");\n\t\tassert.strictEqual(valueGet, valueCreate, \"DDS value was not correctly copied.\");\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can handle non-existing container when trying to copy\n\t *\n\t * Expected behavior: client should throw an error.\n\t */\n\tit(\"can handle non-existing container\", async () => {\n\t\tconst resources = client.copyContainer(\"badidoncopy\", schema);\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\tassert.strictEqual(\n\t\t\t\terror.message,\n\t\t\t\t\"R11s fetch error: Document is deleted and cannot be accessed.\",\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\t\tawait assert.rejects(resources, errorFn, \"We should not be able to copy container.\");\n\t});\n});\n"]}
@@ -9,6 +9,7 @@ const container_definitions_1 = require("@fluidframework/container-definitions")
9
9
  const map_1 = require("@fluidframework/map");
10
10
  const test_utils_1 = require("@fluidframework/test-utils");
11
11
  const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
12
+ const container_loader_1 = require("@fluidframework/container-loader");
12
13
  const AzureClientFactory_1 = require("./AzureClientFactory");
13
14
  const configProvider = (settings) => ({
14
15
  getRawConfig: (name) => settings[name],
@@ -48,10 +49,12 @@ describe("Container create scenarios", () => {
48
49
  it("can attach a container", async () => {
49
50
  const { container } = await client.createContainer(schema);
50
51
  const containerId = await container.attach();
51
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
52
- durationMs: connectTimeoutMs,
53
- errorMsg: "container connect() timeout",
54
- });
52
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
53
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
54
+ durationMs: connectTimeoutMs,
55
+ errorMsg: "container connect() timeout",
56
+ });
57
+ }
55
58
  node_assert_1.strict.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
56
59
  node_assert_1.strict.strictEqual(container.attachState, container_definitions_1.AttachState.Attached, "Container is not attached after attach is called");
57
60
  });
@@ -64,10 +67,12 @@ describe("Container create scenarios", () => {
64
67
  it("cannot attach a container twice", async () => {
65
68
  const { container } = await client.createContainer(schema);
66
69
  const containerId = await container.attach();
67
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
68
- durationMs: connectTimeoutMs,
69
- errorMsg: "container connect() timeout",
70
- });
70
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
71
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
72
+ durationMs: connectTimeoutMs,
73
+ errorMsg: "container connect() timeout",
74
+ });
75
+ }
71
76
  node_assert_1.strict.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
72
77
  node_assert_1.strict.strictEqual(container.attachState, container_definitions_1.AttachState.Attached, "Container is attached after attach is called");
73
78
  await node_assert_1.strict.rejects(container.attach(), () => true, "Container should not attach twice");
@@ -81,10 +86,12 @@ describe("Container create scenarios", () => {
81
86
  it("can retrieve existing Azure Fluid Relay container successfully", async () => {
82
87
  const { container: newContainer } = await client.createContainer(schema);
83
88
  const containerId = await newContainer.attach();
84
- await (0, test_utils_1.timeoutPromise)((resolve) => newContainer.once("connected", () => resolve()), {
85
- durationMs: connectTimeoutMs,
86
- errorMsg: "container connect() timeout",
87
- });
89
+ if (newContainer.connectionState !== container_loader_1.ConnectionState.Connected) {
90
+ await (0, test_utils_1.timeoutPromise)((resolve) => newContainer.once("connected", () => resolve()), {
91
+ durationMs: connectTimeoutMs,
92
+ errorMsg: "container connect() timeout",
93
+ });
94
+ }
88
95
  const resources = client.getContainer(containerId, schema);
89
96
  await node_assert_1.strict.doesNotReject(resources, () => true, "container cannot be retrieved from Azure Fluid Relay");
90
97
  });
@@ -1 +1 @@
1
- {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { ConfigTypes, IConfigProviderBase, MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { createAzureClient } from \"./AzureClientFactory\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\ndescribe(\"Container create scenarios\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient();\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: test when an Azure Client container is created,\n\t * it is initially detached.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"Created container is detached\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Detached,\n\t\t\t\"Container should be detached\",\n\t\t);\n\n\t\t// Make sure we can attach.\n\t\tconst containerId = await container.attach();\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t});\n\n\t/**\n\t * Scenario: Test attaching a container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can attach a container\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Test if attaching a container twice fails.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"cannot attach a container twice\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is attached after attach is called\",\n\t\t);\n\t\tawait assert.rejects(container.attach(), () => true, \"Container should not attach twice\");\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can get an existing container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can retrieve existing Azure Fluid Relay container successfully\", async () => {\n\t\tconst { container: newContainer } = await client.createContainer(schema);\n\t\tconst containerId = await newContainer.attach();\n\n\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst resources = client.getContainer(containerId, schema);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can get a non-exiting container.\n\t *\n\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t *\n\t * Note: This test is currently skipped because it is failing when ran against tinylicious (azure-local-service).\n\t */\n\tit.skip(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\tconst consoleErrorFn = console.error;\n\t\tconsole.error = (): void => {};\n\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema);\n\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\tassert.strict(\n\t\t\t\terror.message.startsWith(\"R11s fetch error\"),\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\t\tawait assert.rejects(\n\t\t\tcontainerAndServicesP,\n\t\t\terrorFn,\n\t\t\t\"Azure Client can load a non-existent container\",\n\t\t);\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\tconsole.error = consoleErrorFn;\n\t});\n});\n\ndescribe(\"Container create with feature flags\", () => {\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\tlet mockLogger: MockLogger;\n\n\tbeforeEach(() => {\n\t\tmockLogger = new MockLogger();\n\t\tclient = createAzureClient(\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tmockLogger,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.ContainerRuntime.DisableOpReentryCheck\": true,\n\t\t\t}),\n\t\t);\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: Test if AzureClient can create a container with feature gates.\n\t *\n\t * Expected behavior: An error should not be thrown and the logger should have logged the enabled feature gates.\n\t */\n\tit(\"can create containers with feature gates\", async () => {\n\t\tawait client.createContainer(schema);\n\t\tconst event = mockLogger.events.find((e) => e.eventName.endsWith(\"ContainerLoadStats\"));\n\t\tassert(event !== undefined, \"ContainerLoadStats event should exist\");\n\t\tconst featureGates = event.featureGates as string;\n\t\tassert(featureGates.includes('\"disableOpReentryCheck\":true'));\n\t});\n});\n"]}
1
+ {"version":3,"file":"containerCreate.spec.js","sourceRoot":"","sources":["../../src/test/containerCreate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { ConfigTypes, IConfigProviderBase, MockLogger } from \"@fluidframework/telemetry-utils\";\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { createAzureClient } from \"./AzureClientFactory\";\n\nconst configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({\n\tgetRawConfig: (name: string): ConfigTypes => settings[name],\n});\n\ndescribe(\"Container create scenarios\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient();\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: test when an Azure Client container is created,\n\t * it is initially detached.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"Created container is detached\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Detached,\n\t\t\t\"Container should be detached\",\n\t\t);\n\n\t\t// Make sure we can attach.\n\t\tconst containerId = await container.attach();\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t});\n\n\t/**\n\t * Scenario: Test attaching a container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can attach a container\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is not attached after attach is called\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: Test if attaching a container twice fails.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"cannot attach a container twice\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tassert.strictEqual(typeof containerId, \"string\", \"Attach did not return a string ID\");\n\t\tassert.strictEqual(\n\t\t\tcontainer.attachState,\n\t\t\tAttachState.Attached,\n\t\t\t\"Container is attached after attach is called\",\n\t\t);\n\t\tawait assert.rejects(container.attach(), () => true, \"Container should not attach twice\");\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can get an existing container.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can retrieve existing Azure Fluid Relay container successfully\", async () => {\n\t\tconst { container: newContainer } = await client.createContainer(schema);\n\t\tconst containerId = await newContainer.attach();\n\n\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst resources = client.getContainer(containerId, schema);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if Azure Client can get a non-exiting container.\n\t *\n\t * Expected behavior: an error should be thrown when trying to get a non-existent container.\n\t *\n\t * Note: This test is currently skipped because it is failing when ran against tinylicious (azure-local-service).\n\t */\n\tit.skip(\"cannot load improperly created container (cannot load a non-existent container)\", async () => {\n\t\tconst consoleErrorFn = console.error;\n\t\tconsole.error = (): void => {};\n\t\tconst containerAndServicesP = client.getContainer(\"containerConfig\", schema);\n\n\t\tconst errorFn = (error: Error): boolean => {\n\t\t\tassert.notStrictEqual(error.message, undefined, \"Azure Client error is undefined\");\n\t\t\tassert.strict(\n\t\t\t\terror.message.startsWith(\"R11s fetch error\"),\n\t\t\t\t`Unexpected error: ${error.message}`,\n\t\t\t);\n\t\t\treturn true;\n\t\t};\n\n\t\tawait assert.rejects(\n\t\t\tcontainerAndServicesP,\n\t\t\terrorFn,\n\t\t\t\"Azure Client can load a non-existent container\",\n\t\t);\n\t\t// eslint-disable-next-line require-atomic-updates\n\t\tconsole.error = consoleErrorFn;\n\t});\n});\n\ndescribe(\"Container create with feature flags\", () => {\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\tlet mockLogger: MockLogger;\n\n\tbeforeEach(() => {\n\t\tmockLogger = new MockLogger();\n\t\tclient = createAzureClient(\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tmockLogger,\n\t\t\tconfigProvider({\n\t\t\t\t\"Fluid.ContainerRuntime.DisableOpReentryCheck\": true,\n\t\t\t}),\n\t\t);\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: Test if AzureClient can create a container with feature gates.\n\t *\n\t * Expected behavior: An error should not be thrown and the logger should have logged the enabled feature gates.\n\t */\n\tit(\"can create containers with feature gates\", async () => {\n\t\tawait client.createContainer(schema);\n\t\tconst event = mockLogger.events.find((e) => e.eventName.endsWith(\"ContainerLoadStats\"));\n\t\tassert(event !== undefined, \"ContainerLoadStats event should exist\");\n\t\tconst featureGates = event.featureGates as string;\n\t\tassert(featureGates.includes('\"disableOpReentryCheck\":true'));\n\t});\n});\n"]}
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const node_assert_1 = require("node:assert");
8
8
  const map_1 = require("@fluidframework/map");
9
9
  const test_utils_1 = require("@fluidframework/test-utils");
10
+ const container_loader_1 = require("@fluidframework/container-loader");
10
11
  const AzureClientFactory_1 = require("./AzureClientFactory");
11
12
  const TestDataObject_1 = require("./TestDataObject");
12
13
  const utils_1 = require("./utils");
@@ -32,10 +33,12 @@ describe("Fluid data updates", () => {
32
33
  it("can set DDSes as initial objects for a container", async () => {
33
34
  const { container: newContainer } = await client.createContainer(schema);
34
35
  const containerId = await newContainer.attach();
35
- await (0, test_utils_1.timeoutPromise)((resolve) => newContainer.once("connected", () => resolve()), {
36
- durationMs: connectTimeoutMs,
37
- errorMsg: "container connect() timeout",
38
- });
36
+ if (newContainer.connectionState !== container_loader_1.ConnectionState.Connected) {
37
+ await (0, test_utils_1.timeoutPromise)((resolve) => newContainer.once("connected", () => resolve()), {
38
+ durationMs: connectTimeoutMs,
39
+ errorMsg: "container connect() timeout",
40
+ });
41
+ }
39
42
  const resources = client.getContainer(containerId, schema);
40
43
  await node_assert_1.strict.doesNotReject(resources, () => true, "container cannot be retrieved from Azure Fluid Relay");
41
44
  const { container } = await resources;
@@ -50,10 +53,12 @@ describe("Fluid data updates", () => {
50
53
  it("can change DDSes within initialObjects value", async () => {
51
54
  const { container } = await client.createContainer(schema);
52
55
  const containerId = await container.attach();
53
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
54
- durationMs: connectTimeoutMs,
55
- errorMsg: "container connect() timeout",
56
- });
56
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
57
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
58
+ durationMs: connectTimeoutMs,
59
+ errorMsg: "container connect() timeout",
60
+ });
61
+ }
57
62
  const initialObjectsCreate = container.initialObjects;
58
63
  const map1Create = initialObjectsCreate.map1;
59
64
  map1Create.set("new-key", "new-value");
@@ -77,10 +82,12 @@ describe("Fluid data updates", () => {
77
82
  };
78
83
  const { container } = await client.createContainer(doSchema);
79
84
  const containerId = await container.attach();
80
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
81
- durationMs: connectTimeoutMs,
82
- errorMsg: "container connect() timeout",
83
- });
85
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
86
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
87
+ durationMs: connectTimeoutMs,
88
+ errorMsg: "container connect() timeout",
89
+ });
90
+ }
84
91
  const initialObjectsCreate = container.initialObjects;
85
92
  (0, node_assert_1.strict)(initialObjectsCreate.mdo1 instanceof TestDataObject_1.TestDataObject, "container returns the wrong type for mdo1");
86
93
  (0, node_assert_1.strict)(initialObjectsCreate.mdo2 instanceof TestDataObject_1.CounterTestDataObject, "container returns the wrong type for mdo2");
@@ -106,10 +113,12 @@ describe("Fluid data updates", () => {
106
113
  };
107
114
  const { container } = await client.createContainer(doSchema);
108
115
  const containerId = await container.attach();
109
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
110
- durationMs: connectTimeoutMs,
111
- errorMsg: "container connect() timeout",
112
- });
116
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
117
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
118
+ durationMs: connectTimeoutMs,
119
+ errorMsg: "container connect() timeout",
120
+ });
121
+ }
113
122
  const initialObjectsCreate = container.initialObjects;
114
123
  (0, node_assert_1.strict)(initialObjectsCreate.mdo1 instanceof TestDataObject_1.TestDataObject, "container returns the wrong type for mdo1");
115
124
  (0, node_assert_1.strict)(initialObjectsCreate.mdo2 instanceof TestDataObject_1.CounterTestDataObject, "container returns the wrong type for mdo2");
@@ -140,10 +149,12 @@ describe("Fluid data updates", () => {
140
149
  mdo2.increment();
141
150
  node_assert_1.strict.strictEqual(mdo2.value, 3);
142
151
  const containerId = await container.attach();
143
- await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
144
- durationMs: connectTimeoutMs,
145
- errorMsg: "container connect() timeout",
146
- });
152
+ if (container.connectionState !== container_loader_1.ConnectionState.Connected) {
153
+ await (0, test_utils_1.timeoutPromise)((resolve) => container.once("connected", () => resolve()), {
154
+ durationMs: connectTimeoutMs,
155
+ errorMsg: "container connect() timeout",
156
+ });
157
+ }
147
158
  const { container: containerGet } = await client.getContainer(containerId, doSchema);
148
159
  const initialObjectsGet = containerGet.initialObjects;
149
160
  const mdo2get = initialObjectsGet.mdo2;
@@ -1 +1 @@
1
- {"version":3,"file":"ddsTests.spec.js","sourceRoot":"","sources":["../../src/test/ddsTests.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 */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { createAzureClient } from \"./AzureClientFactory\";\nimport { CounterTestDataObject, TestDataObject } from \"./TestDataObject\";\nimport { mapWait } from \"./utils\";\n\ndescribe(\"Fluid data updates\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient();\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: test when an Azure Client container is created,\n\t * it can set the initial objects.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can set DDSes as initial objects for a container\", async () => {\n\t\tconst { container: newContainer } = await client.createContainer(schema);\n\t\tconst containerId = await newContainer.attach();\n\n\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst resources = client.getContainer(containerId, schema);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t);\n\n\t\tconst { container } = await resources;\n\t\tassert.deepStrictEqual(\n\t\t\tObject.keys(container.initialObjects),\n\t\t\tObject.keys(schema.initialObjects),\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if initialObjects passed into the container functions correctly.\n\t *\n\t * Expected behavior: initialObjects value loaded in two different containers should mirror\n\t * each other after value is changed.\n\t */\n\tit(\"can change DDSes within initialObjects value\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tconst map1Create = initialObjectsCreate.map1 as SharedMap;\n\t\tmap1Create.set(\"new-key\", \"new-value\");\n\t\tconst valueCreate: string | undefined = map1Create.get(\"new-key\");\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, schema);\n\t\tconst map1Get = containerGet.initialObjects.map1 as SharedMap;\n\t\tconst valueGet: string | undefined = await mapWait(map1Get, \"new-key\");\n\t\tassert.strictEqual(valueGet, valueCreate, \"container can't change initial objects\");\n\t});\n\n\t/**\n\t * Scenario: test if we can create DataObjects through initialObjects schema.\n\t *\n\t * Expected behavior: DataObjects can be retrieved from the original and loaded container.\n\t */\n\tit(\"can set DataObjects as initial objects for a container\", async () => {\n\t\tconst doSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmdo1: TestDataObject,\n\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(doSchema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, doSchema);\n\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if we can create multiple DataObjects of the same type\n\t *\n\t * Expected behavior: DataObjects of the same type can be retrieved from the\n\t * original and loaded container.\n\t * TODO: Known bug that needs to be re-tested once fixed.\n\t */\n\tit(\"can use multiple DataObjects of the same type\", async () => {\n\t\tconst doSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmdo1: TestDataObject,\n\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\tmdo3: CounterTestDataObject,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(doSchema);\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo3\",\n\t\t);\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, doSchema);\n\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo3\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if we can change DataObject value contained within initialObjects\n\t *\n\t * Expected behavior: DataObject changes are correctly reflected on original and loaded containers\n\t */\n\tit(\"can change DataObjects within initialObjects value\", async () => {\n\t\tconst doSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmdo1: TestDataObject,\n\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(doSchema);\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tconst mdo2 = initialObjectsCreate.mdo2 as CounterTestDataObject;\n\t\tmdo2.increment();\n\t\tmdo2.increment();\n\t\tmdo2.increment();\n\n\t\tassert.strictEqual(mdo2.value, 3);\n\n\t\tconst containerId = await container.attach();\n\n\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\tdurationMs: connectTimeoutMs,\n\t\t\terrorMsg: \"container connect() timeout\",\n\t\t});\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, doSchema);\n\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\tconst mdo2get = initialObjectsGet.mdo2 as CounterTestDataObject;\n\n\t\tassert.strictEqual(mdo2get.value, 3);\n\n\t\tmdo2get.increment();\n\t\tmdo2get.increment();\n\t\tassert.strictEqual(mdo2get.value, 5);\n\t});\n\n\t/**\n\t * Scenario: test if the optional schema parameter, dynamicObjectTypes (custom data objects),\n\t * can be added during runtime and be returned by the container.\n\t *\n\t * Expected behavior: added loadable object can be retrieved from the container. Loadable\n\t * object's id and container config ID should be identical since it's now attached to\n\t * the container.\n\t */\n\tit(\"can create/add loadable objects (custom data object) dynamically during runtime\", async () => {\n\t\tconst dynamicSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t\tdynamicObjectTypes: [TestDataObject],\n\t\t};\n\n\t\tconst { container } = await client.createContainer(dynamicSchema);\n\t\tawait container.attach();\n\n\t\tconst newDo = await container.create(TestDataObject);\n\t\tassert.ok(newDo?.handle);\n\n\t\tconst map1 = container.initialObjects.map1 as SharedMap;\n\t\tmap1.set(\"new-pair-id\", newDo.handle);\n\t\tconst handle: IFluidHandle | undefined = await map1.get(\"new-pair-id\");\n\t\tconst obj: unknown = await handle?.get();\n\t\tassert.ok(obj, \"container added dynamic objects incorrectly\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"ddsTests.spec.js","sourceRoot":"","sources":["../../src/test/ddsTests.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 */\nimport { strict as assert } from \"node:assert\";\n\nimport { AzureClient } from \"@fluidframework/azure-client\";\nimport { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport { ContainerSchema } from \"@fluidframework/fluid-static\";\nimport { SharedMap } from \"@fluidframework/map\";\nimport { timeoutPromise } from \"@fluidframework/test-utils\";\n\nimport { ConnectionState } from \"@fluidframework/container-loader\";\nimport { createAzureClient } from \"./AzureClientFactory\";\nimport { CounterTestDataObject, TestDataObject } from \"./TestDataObject\";\nimport { mapWait } from \"./utils\";\n\ndescribe(\"Fluid data updates\", () => {\n\tconst connectTimeoutMs = 10_000;\n\tlet client: AzureClient;\n\tlet schema: ContainerSchema;\n\n\tbeforeEach(() => {\n\t\tclient = createAzureClient();\n\t\tschema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t};\n\t});\n\n\t/**\n\t * Scenario: test when an Azure Client container is created,\n\t * it can set the initial objects.\n\t *\n\t * Expected behavior: an error should not be thrown nor should a rejected promise\n\t * be returned.\n\t */\n\tit(\"can set DDSes as initial objects for a container\", async () => {\n\t\tconst { container: newContainer } = await client.createContainer(schema);\n\t\tconst containerId = await newContainer.attach();\n\n\t\tif (newContainer.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => newContainer.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst resources = client.getContainer(containerId, schema);\n\t\tawait assert.doesNotReject(\n\t\t\tresources,\n\t\t\t() => true,\n\t\t\t\"container cannot be retrieved from Azure Fluid Relay\",\n\t\t);\n\n\t\tconst { container } = await resources;\n\t\tassert.deepStrictEqual(\n\t\t\tObject.keys(container.initialObjects),\n\t\t\tObject.keys(schema.initialObjects),\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if initialObjects passed into the container functions correctly.\n\t *\n\t * Expected behavior: initialObjects value loaded in two different containers should mirror\n\t * each other after value is changed.\n\t */\n\tit(\"can change DDSes within initialObjects value\", async () => {\n\t\tconst { container } = await client.createContainer(schema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tconst map1Create = initialObjectsCreate.map1 as SharedMap;\n\t\tmap1Create.set(\"new-key\", \"new-value\");\n\t\tconst valueCreate: string | undefined = map1Create.get(\"new-key\");\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, schema);\n\t\tconst map1Get = containerGet.initialObjects.map1 as SharedMap;\n\t\tconst valueGet: string | undefined = await mapWait(map1Get, \"new-key\");\n\t\tassert.strictEqual(valueGet, valueCreate, \"container can't change initial objects\");\n\t});\n\n\t/**\n\t * Scenario: test if we can create DataObjects through initialObjects schema.\n\t *\n\t * Expected behavior: DataObjects can be retrieved from the original and loaded container.\n\t */\n\tit(\"can set DataObjects as initial objects for a container\", async () => {\n\t\tconst doSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmdo1: TestDataObject,\n\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(doSchema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, doSchema);\n\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if we can create multiple DataObjects of the same type\n\t *\n\t * Expected behavior: DataObjects of the same type can be retrieved from the\n\t * original and loaded container.\n\t * TODO: Known bug that needs to be re-tested once fixed.\n\t */\n\tit(\"can use multiple DataObjects of the same type\", async () => {\n\t\tconst doSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmdo1: TestDataObject,\n\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t\tmdo3: CounterTestDataObject,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(doSchema);\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo3\",\n\t\t);\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, doSchema);\n\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\tassert(\n\t\t\tinitialObjectsGet.mdo1 instanceof TestDataObject,\n\t\t\t\"container returns the wrong type for mdo1\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo2 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo2\",\n\t\t);\n\t\tassert(\n\t\t\tinitialObjectsCreate.mdo3 instanceof CounterTestDataObject,\n\t\t\t\"container returns the wrong type for mdo3\",\n\t\t);\n\t});\n\n\t/**\n\t * Scenario: test if we can change DataObject value contained within initialObjects\n\t *\n\t * Expected behavior: DataObject changes are correctly reflected on original and loaded containers\n\t */\n\tit(\"can change DataObjects within initialObjects value\", async () => {\n\t\tconst doSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmdo1: TestDataObject,\n\t\t\t\tmdo2: CounterTestDataObject,\n\t\t\t},\n\t\t};\n\t\tconst { container } = await client.createContainer(doSchema);\n\t\tconst initialObjectsCreate = container.initialObjects;\n\t\tconst mdo2 = initialObjectsCreate.mdo2 as CounterTestDataObject;\n\t\tmdo2.increment();\n\t\tmdo2.increment();\n\t\tmdo2.increment();\n\n\t\tassert.strictEqual(mdo2.value, 3);\n\n\t\tconst containerId = await container.attach();\n\n\t\tif (container.connectionState !== ConnectionState.Connected) {\n\t\t\tawait timeoutPromise((resolve) => container.once(\"connected\", () => resolve()), {\n\t\t\t\tdurationMs: connectTimeoutMs,\n\t\t\t\terrorMsg: \"container connect() timeout\",\n\t\t\t});\n\t\t}\n\n\t\tconst { container: containerGet } = await client.getContainer(containerId, doSchema);\n\t\tconst initialObjectsGet = containerGet.initialObjects;\n\t\tconst mdo2get = initialObjectsGet.mdo2 as CounterTestDataObject;\n\n\t\tassert.strictEqual(mdo2get.value, 3);\n\n\t\tmdo2get.increment();\n\t\tmdo2get.increment();\n\t\tassert.strictEqual(mdo2get.value, 5);\n\t});\n\n\t/**\n\t * Scenario: test if the optional schema parameter, dynamicObjectTypes (custom data objects),\n\t * can be added during runtime and be returned by the container.\n\t *\n\t * Expected behavior: added loadable object can be retrieved from the container. Loadable\n\t * object's id and container config ID should be identical since it's now attached to\n\t * the container.\n\t */\n\tit(\"can create/add loadable objects (custom data object) dynamically during runtime\", async () => {\n\t\tconst dynamicSchema: ContainerSchema = {\n\t\t\tinitialObjects: {\n\t\t\t\tmap1: SharedMap,\n\t\t\t},\n\t\t\tdynamicObjectTypes: [TestDataObject],\n\t\t};\n\n\t\tconst { container } = await client.createContainer(dynamicSchema);\n\t\tawait container.attach();\n\n\t\tconst newDo = await container.create(TestDataObject);\n\t\tassert.ok(newDo?.handle);\n\n\t\tconst map1 = container.initialObjects.map1 as SharedMap;\n\t\tmap1.set(\"new-pair-id\", newDo.handle);\n\t\tconst handle: IFluidHandle | undefined = await map1.get(\"new-pair-id\");\n\t\tconst obj: unknown = await handle?.get();\n\t\tassert.ok(obj, \"container added dynamic objects incorrectly\");\n\t});\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluidframework/azure-end-to-end-tests",
3
- "version": "2.0.0-dev.6.4.0.192049",
3
+ "version": "2.0.0-dev.7.2.0.204906",
4
4
  "description": "Azure client end to end tests",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -32,44 +32,44 @@
32
32
  "temp-directory": "nyc/.nyc_output"
33
33
  },
34
34
  "dependencies": {
35
- "@fluidframework/aqueduct": "2.0.0-dev.6.4.0.192049",
36
- "@fluidframework/azure-client": "2.0.0-dev.6.4.0.192049",
37
- "@fluidframework/container-definitions": "2.0.0-dev.6.4.0.192049",
38
- "@fluidframework/core-interfaces": "2.0.0-dev.6.4.0.192049",
39
- "@fluidframework/counter": "2.0.0-dev.6.4.0.192049",
40
- "@fluidframework/fluid-static": "2.0.0-dev.6.4.0.192049",
41
- "@fluidframework/map": "2.0.0-dev.6.4.0.192049",
42
- "@fluidframework/matrix": "2.0.0-dev.6.4.0.192049",
43
- "@fluidframework/mocha-test-setup": "2.0.0-dev.6.4.0.192049",
44
- "@fluidframework/sequence": "2.0.0-dev.6.4.0.192049",
45
- "@fluidframework/telemetry-utils": "2.0.0-dev.6.4.0.192049",
46
- "@fluidframework/test-runtime-utils": "2.0.0-dev.6.4.0.192049",
47
- "@fluidframework/test-utils": "2.0.0-dev.6.4.0.192049",
35
+ "@fluidframework/aqueduct": "2.0.0-dev.7.2.0.204906",
36
+ "@fluidframework/azure-client": "2.0.0-dev.7.2.0.204906",
37
+ "@fluidframework/container-definitions": "2.0.0-dev.7.2.0.204906",
38
+ "@fluidframework/container-loader": "2.0.0-dev.7.2.0.204906",
39
+ "@fluidframework/core-interfaces": "2.0.0-dev.7.2.0.204906",
40
+ "@fluidframework/counter": "2.0.0-dev.7.2.0.204906",
41
+ "@fluidframework/fluid-static": "2.0.0-dev.7.2.0.204906",
42
+ "@fluidframework/map": "2.0.0-dev.7.2.0.204906",
43
+ "@fluidframework/matrix": "2.0.0-dev.7.2.0.204906",
44
+ "@fluidframework/mocha-test-setup": "2.0.0-dev.7.2.0.204906",
45
+ "@fluidframework/sequence": "2.0.0-dev.7.2.0.204906",
46
+ "@fluidframework/telemetry-utils": "2.0.0-dev.7.2.0.204906",
47
+ "@fluidframework/test-runtime-utils": "2.0.0-dev.7.2.0.204906",
48
+ "@fluidframework/test-utils": "2.0.0-dev.7.2.0.204906",
48
49
  "cross-env": "^7.0.3",
49
50
  "mocha": "^10.2.0",
50
51
  "mocha-json-output-reporter": "^2.0.1",
51
52
  "mocha-multi-reporters": "^1.5.1",
52
53
  "moment": "^2.21.0",
53
- "prettier": "~2.6.2",
54
+ "prettier": "~3.0.3",
54
55
  "sinon": "^7.4.2",
55
56
  "start-server-and-test": "^1.11.7",
56
- "tinylicious": "^1.0.0",
57
+ "tinylicious": "^2.0.1",
57
58
  "uuid": "^9.0.0"
58
59
  },
59
60
  "devDependencies": {
60
- "@fluidframework/azure-local-service": "2.0.0-dev.6.4.0.192049",
61
- "@fluidframework/build-common": "^2.0.0",
62
- "@fluidframework/build-tools": "^0.22.0",
63
- "@fluidframework/eslint-config-fluid": "^2.1.0",
61
+ "@fluidframework/build-common": "^2.0.2",
62
+ "@fluidframework/build-tools": "0.26.0-203096",
63
+ "@fluidframework/eslint-config-fluid": "^3.0.0",
64
64
  "@types/mocha": "^9.1.1",
65
65
  "@types/nock": "^9.3.0",
66
66
  "@types/node": "^16.18.38",
67
67
  "@types/uuid": "^9.0.2",
68
68
  "c8": "^7.7.1",
69
- "eslint": "~8.6.0",
69
+ "eslint": "~8.50.0",
70
70
  "nock": "^13.3.3",
71
71
  "rimraf": "^4.4.0",
72
- "typescript": "~4.5.5"
72
+ "typescript": "~5.1.6"
73
73
  },
74
74
  "typeValidation": {
75
75
  "disabled": true,
@@ -87,7 +87,7 @@
87
87
  "lint:fix": "npm run prettier:fix && npm run eslint:fix",
88
88
  "prettier": "prettier --check . --ignore-path ../../../../.prettierignore",
89
89
  "prettier:fix": "prettier --write . --ignore-path ../../../../.prettierignore",
90
- "start:tinylicious:test": "PORT=7071 npx @fluidframework/azure-local-service > tinylicious.log 2>&1",
90
+ "start:tinylicious:test": "PORT=7071 tinylicious > tinylicious.log 2>&1",
91
91
  "test": "npm run test:realsvc",
92
92
  "test:coverage": "c8 npm test",
93
93
  "test:realsvc": "npm run test:realsvc:tinylicious",
@@ -7,9 +7,7 @@ import { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
  import { SharedCounter } from "@fluidframework/counter";
8
8
 
9
9
  export class TestDataObject extends DataObject {
10
- public static get Name(): string {
11
- return "@fluid-example/test-data-object";
12
- }
10
+ public static readonly Name = "@fluid-example/test-data-object";
13
11
 
14
12
  public static readonly factory = new DataObjectFactory(
15
13
  TestDataObject.Name,
@@ -39,9 +37,7 @@ export class CounterTestDataObject extends DataObject {
39
37
  this._counter = await counterHandle?.get();
40
38
  }
41
39
 
42
- public static get Name(): string {
43
- return "@fluid-example/counter-test-data-object";
44
- }
40
+ public static readonly Name = "@fluid-example/counter-test-data-object";
45
41
 
46
42
  public static readonly factory = new DataObjectFactory(
47
43
  CounterTestDataObject.Name,
@@ -10,9 +10,15 @@ import { ContainerSchema } from "@fluidframework/fluid-static";
10
10
  import { SharedMap } from "@fluidframework/map";
11
11
  import { timeoutPromise } from "@fluidframework/test-utils";
12
12
 
13
+ import { ConnectionState } from "@fluidframework/container-loader";
14
+ import { ConfigTypes, IConfigProviderBase } from "@fluidframework/telemetry-utils";
13
15
  import { createAzureClient } from "./AzureClientFactory";
14
16
  import { waitForMember } from "./utils";
15
17
 
18
+ const configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({
19
+ getRawConfig: (name: string): ConfigTypes => settings[name],
20
+ });
21
+
16
22
  describe("Fluid audience", () => {
17
23
  const connectTimeoutMs = 10_000;
18
24
  let client: AzureClient;
@@ -36,10 +42,12 @@ describe("Fluid audience", () => {
36
42
  const { container, services } = await client.createContainer(schema);
37
43
  const containerId = await container.attach();
38
44
 
39
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
40
- durationMs: connectTimeoutMs,
41
- errorMsg: "container connect() timeout",
42
- });
45
+ if (container.connectionState !== ConnectionState.Connected) {
46
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
47
+ durationMs: connectTimeoutMs,
48
+ errorMsg: "container connect() timeout",
49
+ });
50
+ }
43
51
 
44
52
  assert.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
45
53
  assert.strictEqual(
@@ -66,10 +74,12 @@ describe("Fluid audience", () => {
66
74
  const { container, services } = await client.createContainer(schema);
67
75
  const containerId = await container.attach();
68
76
 
69
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
70
- durationMs: connectTimeoutMs,
71
- errorMsg: "container connect() timeout",
72
- });
77
+ if (container.connectionState !== ConnectionState.Connected) {
78
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
79
+ durationMs: connectTimeoutMs,
80
+ errorMsg: "container connect() timeout",
81
+ });
82
+ }
73
83
 
74
84
  assert.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
75
85
  assert.strictEqual(
@@ -82,7 +92,14 @@ describe("Fluid audience", () => {
82
92
  const originalSelf = await waitForMember(services.audience, "test-user-id-1");
83
93
  assert.notStrictEqual(originalSelf, undefined, "We should have myself at this point.");
84
94
 
85
- const client2 = createAzureClient("test-user-id-2", "test-user-name-2");
95
+ const client2 = createAzureClient(
96
+ "test-user-id-2",
97
+ "test-user-name-2",
98
+ undefined,
99
+ configProvider({
100
+ "Fluid.Container.ForceWriteConnection": true,
101
+ }),
102
+ );
86
103
  const { services: servicesGet } = await client2.getContainer(containerId, schema);
87
104
 
88
105
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
@@ -109,12 +126,21 @@ describe("Fluid audience", () => {
109
126
  const { container } = await client.createContainer(schema);
110
127
  const containerId = await container.attach();
111
128
 
112
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
113
- durationMs: connectTimeoutMs,
114
- errorMsg: "container connect() timeout",
115
- });
116
-
117
- const client2 = createAzureClient("test-user-id-2", "test-user-name-2");
129
+ if (container.connectionState !== ConnectionState.Connected) {
130
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
131
+ durationMs: connectTimeoutMs,
132
+ errorMsg: "container connect() timeout",
133
+ });
134
+ }
135
+
136
+ const client2 = createAzureClient(
137
+ "test-user-id-2",
138
+ "test-user-name-2",
139
+ undefined,
140
+ configProvider({
141
+ "Fluid.Container.ForceWriteConnection": true,
142
+ }),
143
+ );
118
144
  const { services: servicesGet } = await client2.getContainer(containerId, schema);
119
145
 
120
146
  /* This is a workaround for a known bug, we should have one member (self) upon container connection */
@@ -10,6 +10,7 @@ import { ContainerSchema } from "@fluidframework/fluid-static";
10
10
  import { SharedMap } from "@fluidframework/map";
11
11
  import { timeoutPromise } from "@fluidframework/test-utils";
12
12
 
13
+ import { ConnectionState } from "@fluidframework/container-loader";
13
14
  import { createAzureClient } from "./AzureClientFactory";
14
15
  import { mapWait } from "./utils";
15
16
 
@@ -43,10 +44,12 @@ describe("Container copy scenarios", () => {
43
44
  const { container } = await client.createContainer(schema);
44
45
  const containerId = await container.attach();
45
46
 
46
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
47
- durationMs: connectTimeoutMs,
48
- errorMsg: "container connect() timeout",
49
- });
47
+ if (container.connectionState !== ConnectionState.Connected) {
48
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
49
+ durationMs: connectTimeoutMs,
50
+ errorMsg: "container connect() timeout",
51
+ });
52
+ }
50
53
  const resources = client.getContainerVersions(containerId);
51
54
  await assert.doesNotReject(
52
55
  resources,
@@ -91,20 +94,24 @@ describe("Container copy scenarios", () => {
91
94
  const { container } = await client.createContainer(schema);
92
95
  const containerId = await container.attach();
93
96
 
94
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
95
- durationMs: connectTimeoutMs,
96
- errorMsg: "container connect() timeout",
97
- });
97
+ if (container.connectionState !== ConnectionState.Connected) {
98
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
99
+ durationMs: connectTimeoutMs,
100
+ errorMsg: "container connect() timeout",
101
+ });
102
+ }
98
103
  const resources = client.copyContainer(containerId, schema);
99
104
  await assert.doesNotReject(resources, () => true, "container could not be copied");
100
105
 
101
106
  const { container: containerCopy } = await resources;
102
107
 
103
108
  const newContainerId = await containerCopy.attach();
104
- await timeoutPromise((resolve) => containerCopy.once("connected", () => resolve()), {
105
- durationMs: connectTimeoutMs,
106
- errorMsg: "container connect() timeout",
107
- });
109
+ if (containerCopy.connectionState !== ConnectionState.Connected) {
110
+ await timeoutPromise((resolve) => containerCopy.once("connected", () => resolve()), {
111
+ durationMs: connectTimeoutMs,
112
+ errorMsg: "container connect() timeout",
113
+ });
114
+ }
108
115
 
109
116
  assert.strictEqual(typeof newContainerId, "string", "Attach did not return a string ID");
110
117
  assert.strictEqual(
@@ -124,10 +131,12 @@ describe("Container copy scenarios", () => {
124
131
  const { container } = await client.createContainer(schema);
125
132
  const containerId = await container.attach();
126
133
 
127
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
128
- durationMs: connectTimeoutMs,
129
- errorMsg: "container connect() timeout",
130
- });
134
+ if (container.connectionState !== ConnectionState.Connected) {
135
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
136
+ durationMs: connectTimeoutMs,
137
+ errorMsg: "container connect() timeout",
138
+ });
139
+ }
131
140
 
132
141
  const versions = await client.getContainerVersions(containerId);
133
142
  assert.strictEqual(versions.length, 1, "Container should have exactly one version.");
@@ -138,10 +147,12 @@ describe("Container copy scenarios", () => {
138
147
  const { container: containerCopy } = await resources;
139
148
 
140
149
  const newContainerId = await containerCopy.attach();
141
- await timeoutPromise((resolve) => containerCopy.once("connected", () => resolve()), {
142
- durationMs: connectTimeoutMs,
143
- errorMsg: "container connect() timeout",
144
- });
150
+ if (containerCopy.connectionState !== ConnectionState.Connected) {
151
+ await timeoutPromise((resolve) => containerCopy.once("connected", () => resolve()), {
152
+ durationMs: connectTimeoutMs,
153
+ errorMsg: "container connect() timeout",
154
+ });
155
+ }
145
156
 
146
157
  assert.strictEqual(typeof newContainerId, "string", "Attach did not return a string ID");
147
158
  assert.strictEqual(
@@ -168,11 +179,12 @@ describe("Container copy scenarios", () => {
168
179
 
169
180
  const containerId = await container.attach();
170
181
 
171
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
172
- durationMs: connectTimeoutMs,
173
- errorMsg: "container connect() timeout",
174
- });
175
-
182
+ if (container.connectionState !== ConnectionState.Connected) {
183
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
184
+ durationMs: connectTimeoutMs,
185
+ errorMsg: "container connect() timeout",
186
+ });
187
+ }
176
188
  const resources = client.copyContainer(containerId, schema);
177
189
  await assert.doesNotReject(resources, () => true, "container could not be copied");
178
190
 
@@ -11,6 +11,7 @@ import { SharedMap } from "@fluidframework/map";
11
11
  import { timeoutPromise } from "@fluidframework/test-utils";
12
12
 
13
13
  import { ConfigTypes, IConfigProviderBase, MockLogger } from "@fluidframework/telemetry-utils";
14
+ import { ConnectionState } from "@fluidframework/container-loader";
14
15
  import { createAzureClient } from "./AzureClientFactory";
15
16
 
16
17
  const configProvider = (settings: Record<string, ConfigTypes>): IConfigProviderBase => ({
@@ -61,10 +62,12 @@ describe("Container create scenarios", () => {
61
62
  const { container } = await client.createContainer(schema);
62
63
  const containerId = await container.attach();
63
64
 
64
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
65
- durationMs: connectTimeoutMs,
66
- errorMsg: "container connect() timeout",
67
- });
65
+ if (container.connectionState !== ConnectionState.Connected) {
66
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
67
+ durationMs: connectTimeoutMs,
68
+ errorMsg: "container connect() timeout",
69
+ });
70
+ }
68
71
 
69
72
  assert.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
70
73
  assert.strictEqual(
@@ -84,10 +87,12 @@ describe("Container create scenarios", () => {
84
87
  const { container } = await client.createContainer(schema);
85
88
  const containerId = await container.attach();
86
89
 
87
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
88
- durationMs: connectTimeoutMs,
89
- errorMsg: "container connect() timeout",
90
- });
90
+ if (container.connectionState !== ConnectionState.Connected) {
91
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
92
+ durationMs: connectTimeoutMs,
93
+ errorMsg: "container connect() timeout",
94
+ });
95
+ }
91
96
 
92
97
  assert.strictEqual(typeof containerId, "string", "Attach did not return a string ID");
93
98
  assert.strictEqual(
@@ -108,10 +113,12 @@ describe("Container create scenarios", () => {
108
113
  const { container: newContainer } = await client.createContainer(schema);
109
114
  const containerId = await newContainer.attach();
110
115
 
111
- await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
112
- durationMs: connectTimeoutMs,
113
- errorMsg: "container connect() timeout",
114
- });
116
+ if (newContainer.connectionState !== ConnectionState.Connected) {
117
+ await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
118
+ durationMs: connectTimeoutMs,
119
+ errorMsg: "container connect() timeout",
120
+ });
121
+ }
115
122
 
116
123
  const resources = client.getContainer(containerId, schema);
117
124
  await assert.doesNotReject(
@@ -10,6 +10,7 @@ import { ContainerSchema } from "@fluidframework/fluid-static";
10
10
  import { SharedMap } from "@fluidframework/map";
11
11
  import { timeoutPromise } from "@fluidframework/test-utils";
12
12
 
13
+ import { ConnectionState } from "@fluidframework/container-loader";
13
14
  import { createAzureClient } from "./AzureClientFactory";
14
15
  import { CounterTestDataObject, TestDataObject } from "./TestDataObject";
15
16
  import { mapWait } from "./utils";
@@ -39,10 +40,12 @@ describe("Fluid data updates", () => {
39
40
  const { container: newContainer } = await client.createContainer(schema);
40
41
  const containerId = await newContainer.attach();
41
42
 
42
- await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
43
- durationMs: connectTimeoutMs,
44
- errorMsg: "container connect() timeout",
45
- });
43
+ if (newContainer.connectionState !== ConnectionState.Connected) {
44
+ await timeoutPromise((resolve) => newContainer.once("connected", () => resolve()), {
45
+ durationMs: connectTimeoutMs,
46
+ errorMsg: "container connect() timeout",
47
+ });
48
+ }
46
49
 
47
50
  const resources = client.getContainer(containerId, schema);
48
51
  await assert.doesNotReject(
@@ -68,10 +71,12 @@ describe("Fluid data updates", () => {
68
71
  const { container } = await client.createContainer(schema);
69
72
  const containerId = await container.attach();
70
73
 
71
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
72
- durationMs: connectTimeoutMs,
73
- errorMsg: "container connect() timeout",
74
- });
74
+ if (container.connectionState !== ConnectionState.Connected) {
75
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
76
+ durationMs: connectTimeoutMs,
77
+ errorMsg: "container connect() timeout",
78
+ });
79
+ }
75
80
 
76
81
  const initialObjectsCreate = container.initialObjects;
77
82
  const map1Create = initialObjectsCreate.map1 as SharedMap;
@@ -99,10 +104,12 @@ describe("Fluid data updates", () => {
99
104
  const { container } = await client.createContainer(doSchema);
100
105
  const containerId = await container.attach();
101
106
 
102
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
103
- durationMs: connectTimeoutMs,
104
- errorMsg: "container connect() timeout",
105
- });
107
+ if (container.connectionState !== ConnectionState.Connected) {
108
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
109
+ durationMs: connectTimeoutMs,
110
+ errorMsg: "container connect() timeout",
111
+ });
112
+ }
106
113
 
107
114
  const initialObjectsCreate = container.initialObjects;
108
115
  assert(
@@ -144,10 +151,12 @@ describe("Fluid data updates", () => {
144
151
  const { container } = await client.createContainer(doSchema);
145
152
  const containerId = await container.attach();
146
153
 
147
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
148
- durationMs: connectTimeoutMs,
149
- errorMsg: "container connect() timeout",
150
- });
154
+ if (container.connectionState !== ConnectionState.Connected) {
155
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
156
+ durationMs: connectTimeoutMs,
157
+ errorMsg: "container connect() timeout",
158
+ });
159
+ }
151
160
 
152
161
  const initialObjectsCreate = container.initialObjects;
153
162
  assert(
@@ -202,10 +211,12 @@ describe("Fluid data updates", () => {
202
211
 
203
212
  const containerId = await container.attach();
204
213
 
205
- await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
206
- durationMs: connectTimeoutMs,
207
- errorMsg: "container connect() timeout",
208
- });
214
+ if (container.connectionState !== ConnectionState.Connected) {
215
+ await timeoutPromise((resolve) => container.once("connected", () => resolve()), {
216
+ durationMs: connectTimeoutMs,
217
+ errorMsg: "container connect() timeout",
218
+ });
219
+ }
209
220
 
210
221
  const { container: containerGet } = await client.getContainer(containerId, doSchema);
211
222
  const initialObjectsGet = containerGet.initialObjects;