@fluidframework/test-utils 2.0.0-dev-rc.1.0.0.228517 → 2.0.0-dev-rc.2.0.0.245554

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.
Files changed (151) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +34 -0
  4. package/README.md +1 -1
  5. package/api-extractor-cjs.json +8 -0
  6. package/api-extractor-lint.json +1 -1
  7. package/api-extractor.json +1 -1
  8. package/api-report/test-utils.api.md +27 -9
  9. package/dist/DriverWrappers.d.ts +3 -0
  10. package/dist/DriverWrappers.d.ts.map +1 -1
  11. package/dist/DriverWrappers.js +3 -0
  12. package/dist/DriverWrappers.js.map +1 -1
  13. package/dist/TestConfigs.d.ts +14 -1
  14. package/dist/TestConfigs.d.ts.map +1 -1
  15. package/dist/TestConfigs.js +14 -3
  16. package/dist/TestConfigs.js.map +1 -1
  17. package/dist/TestSummaryUtils.d.ts +7 -2
  18. package/dist/TestSummaryUtils.d.ts.map +1 -1
  19. package/dist/TestSummaryUtils.js +39 -14
  20. package/dist/TestSummaryUtils.js.map +1 -1
  21. package/dist/containerUtils.d.ts +1 -1
  22. package/dist/containerUtils.d.ts.map +1 -1
  23. package/dist/containerUtils.js +2 -2
  24. package/dist/containerUtils.js.map +1 -1
  25. package/dist/debug.js +2 -2
  26. package/dist/debug.js.map +1 -1
  27. package/dist/index.d.ts +14 -14
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +44 -43
  30. package/dist/index.js.map +1 -1
  31. package/dist/loaderContainerTracker.d.ts +1 -1
  32. package/dist/loaderContainerTracker.d.ts.map +1 -1
  33. package/dist/loaderContainerTracker.js +11 -11
  34. package/dist/loaderContainerTracker.js.map +1 -1
  35. package/dist/localLoader.d.ts +1 -1
  36. package/dist/localLoader.d.ts.map +1 -1
  37. package/dist/localLoader.js +2 -2
  38. package/dist/localLoader.js.map +1 -1
  39. package/dist/package.json +3 -0
  40. package/dist/packageVersion.d.ts +1 -1
  41. package/dist/packageVersion.js +1 -1
  42. package/dist/packageVersion.js.map +1 -1
  43. package/dist/test-utils-alpha.d.ts +7 -3
  44. package/dist/test-utils-beta.d.ts +9 -3
  45. package/dist/test-utils-public.d.ts +9 -3
  46. package/dist/test-utils-untrimmed.d.ts +59 -14
  47. package/dist/testContainerRuntimeFactory.d.ts.map +1 -1
  48. package/dist/testContainerRuntimeFactory.js +9 -2
  49. package/dist/testContainerRuntimeFactory.js.map +1 -1
  50. package/dist/testFluidObject.d.ts +1 -1
  51. package/dist/testFluidObject.d.ts.map +1 -1
  52. package/dist/testFluidObject.js.map +1 -1
  53. package/dist/testObjectProvider.d.ts +34 -11
  54. package/dist/testObjectProvider.d.ts.map +1 -1
  55. package/dist/testObjectProvider.js +71 -38
  56. package/dist/testObjectProvider.js.map +1 -1
  57. package/dist/timeoutUtils.d.ts.map +1 -1
  58. package/dist/timeoutUtils.js.map +1 -1
  59. package/dist/tsdoc-metadata.json +1 -1
  60. package/lib/DriverWrappers.d.ts +35 -0
  61. package/lib/DriverWrappers.d.ts.map +1 -0
  62. package/lib/DriverWrappers.js +54 -0
  63. package/lib/DriverWrappers.js.map +1 -0
  64. package/lib/TestConfigs.d.ts +23 -0
  65. package/lib/TestConfigs.d.ts.map +1 -0
  66. package/lib/TestConfigs.js +24 -0
  67. package/lib/TestConfigs.js.map +1 -0
  68. package/lib/TestSummaryUtils.d.ts +66 -0
  69. package/lib/TestSummaryUtils.d.ts.map +1 -0
  70. package/lib/TestSummaryUtils.js +153 -0
  71. package/lib/TestSummaryUtils.js.map +1 -0
  72. package/lib/containerUtils.d.ts +46 -0
  73. package/lib/containerUtils.d.ts.map +1 -0
  74. package/lib/containerUtils.js +79 -0
  75. package/lib/containerUtils.js.map +1 -0
  76. package/lib/debug.d.ts +7 -0
  77. package/lib/debug.d.ts.map +1 -0
  78. package/lib/debug.js +9 -0
  79. package/lib/debug.js.map +1 -0
  80. package/lib/index.d.ts +19 -0
  81. package/lib/index.d.ts.map +1 -0
  82. package/lib/index.js +18 -0
  83. package/lib/index.js.map +1 -0
  84. package/lib/interfaces.d.ts +25 -0
  85. package/lib/interfaces.d.ts.map +1 -0
  86. package/lib/interfaces.js +6 -0
  87. package/lib/interfaces.js.map +1 -0
  88. package/lib/loaderContainerTracker.d.ts +144 -0
  89. package/lib/loaderContainerTracker.d.ts.map +1 -0
  90. package/lib/loaderContainerTracker.js +631 -0
  91. package/lib/loaderContainerTracker.js.map +1 -0
  92. package/lib/localCodeLoader.d.ts +31 -0
  93. package/lib/localCodeLoader.d.ts.map +1 -0
  94. package/lib/localCodeLoader.js +73 -0
  95. package/lib/localCodeLoader.js.map +1 -0
  96. package/lib/localLoader.d.ts +26 -0
  97. package/lib/localLoader.d.ts.map +1 -0
  98. package/lib/localLoader.js +37 -0
  99. package/lib/localLoader.js.map +1 -0
  100. package/lib/packageVersion.d.ts +9 -0
  101. package/lib/packageVersion.d.ts.map +1 -0
  102. package/lib/packageVersion.js +9 -0
  103. package/lib/packageVersion.js.map +1 -0
  104. package/lib/retry.d.ts +18 -0
  105. package/lib/retry.d.ts.map +1 -0
  106. package/lib/retry.js +37 -0
  107. package/lib/retry.js.map +1 -0
  108. package/lib/test/timeoutUtils.spec.js +165 -0
  109. package/lib/test/timeoutUtils.spec.js.map +1 -0
  110. package/lib/test/types/validateTestUtilsPrevious.generated.js +90 -0
  111. package/lib/test/types/validateTestUtilsPrevious.generated.js.map +1 -0
  112. package/lib/test-utils-alpha.d.ts +309 -0
  113. package/lib/test-utils-beta.d.ts +208 -0
  114. package/lib/test-utils-public.d.ts +208 -0
  115. package/lib/test-utils-untrimmed.d.ts +1046 -0
  116. package/lib/testContainerRuntimeFactory.d.ts +46 -0
  117. package/lib/testContainerRuntimeFactory.d.ts.map +1 -0
  118. package/lib/testContainerRuntimeFactory.js +113 -0
  119. package/lib/testContainerRuntimeFactory.js.map +1 -0
  120. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.d.ts +23 -0
  121. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.d.ts.map +1 -0
  122. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.js +28 -0
  123. package/lib/testContainerRuntimeFactoryWithDefaultDataStore.js.map +1 -0
  124. package/lib/testFluidObject.d.ts +92 -0
  125. package/lib/testFluidObject.d.ts.map +1 -0
  126. package/lib/testFluidObject.js +159 -0
  127. package/lib/testFluidObject.js.map +1 -0
  128. package/lib/testObjectProvider.d.ts +435 -0
  129. package/lib/testObjectProvider.d.ts.map +1 -0
  130. package/lib/testObjectProvider.js +636 -0
  131. package/lib/testObjectProvider.js.map +1 -0
  132. package/lib/timeoutUtils.d.ts +60 -0
  133. package/lib/timeoutUtils.d.ts.map +1 -0
  134. package/lib/timeoutUtils.js +164 -0
  135. package/lib/timeoutUtils.js.map +1 -0
  136. package/package.json +105 -38
  137. package/src/DriverWrappers.ts +3 -0
  138. package/src/TestConfigs.ts +25 -3
  139. package/src/TestSummaryUtils.ts +36 -12
  140. package/src/containerUtils.ts +1 -1
  141. package/src/debug.ts +1 -1
  142. package/src/index.ts +19 -14
  143. package/src/loaderContainerTracker.ts +5 -5
  144. package/src/localLoader.ts +1 -1
  145. package/src/packageVersion.ts +1 -1
  146. package/src/testContainerRuntimeFactory.ts +12 -2
  147. package/src/testFluidObject.ts +1 -1
  148. package/src/testObjectProvider.ts +99 -34
  149. package/src/timeoutUtils.ts +1 -0
  150. package/tsconfig.cjs.json +7 -0
  151. package/tsconfig.json +3 -4
@@ -6,12 +6,34 @@
6
6
  import { ConfigTypes, IConfigProviderBase } from "@fluidframework/core-interfaces";
7
7
 
8
8
  /**
9
+ * Extension of IConfigProviderBase that supports setting a config value and clearing all
10
+ * config values for testing.
11
+ *
9
12
  * @internal
10
13
  */
11
- export const mockConfigProvider = (
12
- settings: Record<string, ConfigTypes> = {},
13
- ): IConfigProviderBase => {
14
+ export interface ITestConfigProvider extends IConfigProviderBase {
15
+ /** Set a config value */
16
+ set: (key: string, value: ConfigTypes) => void;
17
+ /** Clear all config values */
18
+ clear: () => void;
19
+ }
20
+
21
+ /**
22
+ * Creates a test config provider with the ability to set configs values and clear all config values.
23
+ * @internal
24
+ */
25
+ export const createTestConfigProvider = (): ITestConfigProvider => {
26
+ const settings: Record<string, ConfigTypes> = {};
14
27
  return {
15
28
  getRawConfig: (name: string): ConfigTypes => settings[name],
29
+ set: (key: string, value: ConfigTypes) => {
30
+ settings[key] = value;
31
+ },
32
+ clear: () => {
33
+ Object.keys(settings).forEach((key) => {
34
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
35
+ delete settings[key];
36
+ });
37
+ },
16
38
  };
17
39
  };
@@ -13,9 +13,9 @@ import {
13
13
  } from "@fluidframework/container-runtime";
14
14
  import {
15
15
  ITelemetryBaseLogger,
16
- FluidObject,
17
16
  IRequest,
18
17
  IConfigProviderBase,
18
+ IResponse,
19
19
  } from "@fluidframework/core-interfaces";
20
20
  import { DriverHeader } from "@fluidframework/driver-definitions";
21
21
  import {
@@ -23,15 +23,38 @@ import {
23
23
  NamedFluidDataStoreRegistryEntries,
24
24
  } from "@fluidframework/runtime-definitions";
25
25
  import { ISummaryTree } from "@fluidframework/protocol-definitions";
26
- import { ITestContainerConfig, ITestObjectProvider } from "./testObjectProvider";
27
- import { mockConfigProvider } from "./TestConfigs";
28
- import { waitForContainerConnection } from "./containerUtils";
29
- import { timeoutAwait } from "./timeoutUtils";
30
- import { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore";
26
+ import { ITestContainerConfig, ITestObjectProvider } from "./testObjectProvider.js";
27
+ import { createTestConfigProvider } from "./TestConfigs.js";
28
+ import { waitForContainerConnection } from "./containerUtils.js";
29
+ import { timeoutAwait } from "./timeoutUtils.js";
30
+ import { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore.js";
31
31
 
32
32
  const summarizerClientType = "summarizer";
33
33
 
34
- async function createSummarizerCore(
34
+ /**
35
+ * This function should ONLY be used for back compat purposes
36
+ * LTS versions of the Loader/Container will not have the "getEntryPoint" method, so we need to fallback to "request"
37
+ * This function can be removed once LTS version of Loader moves to 2.0.0-internal.7.0.0
38
+ * @internal
39
+ */
40
+ async function getSummarizerBackCompat(container: IContainer): Promise<ISummarizer> {
41
+ if (container.getEntryPoint !== undefined) {
42
+ const entryPoint = await container.getEntryPoint();
43
+ // Note: We need to also check if the result of `getEntryPoint()` is defined. This is because when running
44
+ // cross version compat testing scenarios, if we create with 1.X container and load with 2.X then the
45
+ // function container.getEntryPoint will be defined for the 2.X container. However, it will not return undefined
46
+ // since the container's runtime will be on version 1.X, which does not have an entry point defined.
47
+ if (entryPoint !== undefined) {
48
+ return entryPoint as ISummarizer;
49
+ }
50
+ }
51
+ const response: IResponse = await (container as any).request({ url: "_summarizer" });
52
+ assert(response.status === 200, "requesting '/' should return default data object");
53
+ return response.value as ISummarizer;
54
+ }
55
+
56
+ /** @internal */
57
+ export async function createSummarizerCore(
35
58
  container: IContainer,
36
59
  loader: IHostLoader,
37
60
  summaryVersion?: string,
@@ -56,9 +79,10 @@ async function createSummarizerCore(
56
79
  const summarizerContainer = await loader.resolve(request);
57
80
  await waitForContainerConnection(summarizerContainer);
58
81
 
59
- const fluidObject: FluidObject<ISummarizer> | undefined =
60
- await summarizerContainer.getEntryPoint();
61
- if (fluidObject?.ISummarizer === undefined) {
82
+ // Old loaders will not have getEntryPoint API on the container. So, use getSummarizerBackCompat which
83
+ // will use request pattern to get the summarizer in these old loaders.
84
+ const fluidObject = await getSummarizerBackCompat(summarizerContainer);
85
+ if (fluidObject.ISummarizer === undefined) {
62
86
  throw new Error("Fluid object does not implement ISummarizer");
63
87
  }
64
88
 
@@ -91,7 +115,7 @@ export async function createSummarizerFromFactory(
91
115
  containerRuntimeFactoryType = ContainerRuntimeFactoryWithDefaultDataStore,
92
116
  registryEntries?: NamedFluidDataStoreRegistryEntries,
93
117
  logger?: ITelemetryBaseLogger,
94
- configProvider: IConfigProviderBase = mockConfigProvider(),
118
+ configProvider: IConfigProviderBase = createTestConfigProvider(),
95
119
  ): Promise<{ container: IContainer; summarizer: ISummarizer }> {
96
120
  const runtimeFactory = createContainerRuntimeFactoryWithDefaultDataStore(
97
121
  containerRuntimeFactoryType,
@@ -133,7 +157,7 @@ export async function createSummarizer(
133
157
  },
134
158
  loaderProps: {
135
159
  ...config?.loaderProps,
136
- configProvider: config?.loaderProps?.configProvider ?? mockConfigProvider(),
160
+ configProvider: config?.loaderProps?.configProvider ?? createTestConfigProvider(),
137
161
  logger,
138
162
  },
139
163
  };
@@ -8,7 +8,7 @@ import { ConnectionState } from "@fluidframework/container-loader";
8
8
  import { IResponse } from "@fluidframework/core-interfaces";
9
9
  import { assert } from "@fluidframework/core-utils";
10
10
  import { IDataStore } from "@fluidframework/runtime-definitions";
11
- import { PromiseExecutor, timeoutPromise, TimeoutWithError } from "./timeoutUtils";
11
+ import { PromiseExecutor, timeoutPromise, TimeoutWithError } from "./timeoutUtils.js";
12
12
 
13
13
  /**
14
14
  * Utility function to wait for the specified Container to be in Connected state.
package/src/debug.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import registerDebug from "debug";
7
- import { pkgName, pkgVersion } from "./packageVersion";
7
+ import { pkgName, pkgVersion } from "./packageVersion.js";
8
8
 
9
9
  export const debug = registerDebug("fluid:test-utils");
10
10
  debug(`Package: ${pkgName} - Version: ${pkgVersion}`);
package/src/index.ts CHANGED
@@ -7,18 +7,22 @@ export {
7
7
  wrapDocumentService,
8
8
  wrapDocumentServiceFactory,
9
9
  wrapDocumentStorageService,
10
- } from "./DriverWrappers";
11
- export { IProvideTestFluidObject, ITestFluidObject } from "./interfaces";
12
- export { LoaderContainerTracker } from "./loaderContainerTracker";
13
- export { fluidEntryPoint, LocalCodeLoader, SupportedExportInterfaces } from "./localCodeLoader";
14
- export { createAndAttachContainer, createLoader } from "./localLoader";
15
- export { retryWithEventualValue } from "./retry";
16
- export { mockConfigProvider } from "./TestConfigs";
10
+ } from "./DriverWrappers.js";
11
+ export { IProvideTestFluidObject, ITestFluidObject } from "./interfaces.js";
12
+ export { LoaderContainerTracker } from "./loaderContainerTracker.js";
13
+ export { fluidEntryPoint, LocalCodeLoader, SupportedExportInterfaces } from "./localCodeLoader.js";
14
+ export { createAndAttachContainer, createLoader } from "./localLoader.js";
15
+ export { retryWithEventualValue } from "./retry.js";
16
+ export { createTestConfigProvider, ITestConfigProvider } from "./TestConfigs.js";
17
17
  export {
18
18
  createTestContainerRuntimeFactory,
19
19
  TestContainerRuntimeFactory,
20
- } from "./testContainerRuntimeFactory";
21
- export { ChannelFactoryRegistry, TestFluidObject, TestFluidObjectFactory } from "./testFluidObject";
20
+ } from "./testContainerRuntimeFactory.js";
21
+ export {
22
+ ChannelFactoryRegistry,
23
+ TestFluidObject,
24
+ TestFluidObjectFactory,
25
+ } from "./testFluidObject.js";
22
26
  export {
23
27
  createDocumentId,
24
28
  DataObjectFactoryType,
@@ -30,23 +34,24 @@ export {
30
34
  ITestObjectProvider,
31
35
  TestObjectProvider,
32
36
  TestObjectProviderWithVersionedLoad,
33
- } from "./testObjectProvider";
37
+ } from "./testObjectProvider.js";
34
38
  export {
35
39
  createSummarizer,
40
+ createSummarizerCore,
36
41
  createSummarizerFromFactory,
37
42
  summarizeNow,
38
43
  SummaryInfo,
39
- } from "./TestSummaryUtils";
44
+ } from "./TestSummaryUtils.js";
40
45
  export {
41
46
  defaultTimeoutDurationMs,
42
47
  timeoutAwait,
43
48
  timeoutPromise,
44
49
  TimeoutWithError,
45
50
  TimeoutWithValue,
46
- } from "./timeoutUtils";
51
+ } from "./timeoutUtils.js";
47
52
  export {
48
53
  waitForContainerConnection,
49
54
  getContainerEntryPointBackCompat,
50
55
  getDataStoreEntryPointBackCompat,
51
- } from "./containerUtils";
52
- export { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore";
56
+ } from "./containerUtils.js";
57
+ export { createContainerRuntimeFactoryWithDefaultDataStore } from "./testContainerRuntimeFactoryWithDefaultDataStore.js";
@@ -15,11 +15,11 @@ import {
15
15
  IContainerCreateProps,
16
16
  IContainerLoadProps,
17
17
  // eslint-disable-next-line import/no-internal-modules
18
- } from "@fluidframework/container-loader/dist/container";
19
- import { waitForContainerConnection } from "./containerUtils";
20
- import { debug } from "./debug";
21
- import { IOpProcessingController } from "./testObjectProvider";
22
- import { timeoutAwait, timeoutPromise } from "./timeoutUtils";
18
+ } from "@fluidframework/container-loader/test/container";
19
+ import { waitForContainerConnection } from "./containerUtils.js";
20
+ import { debug } from "./debug.js";
21
+ import { IOpProcessingController } from "./testObjectProvider.js";
22
+ import { timeoutAwait, timeoutPromise } from "./timeoutUtils.js";
23
23
 
24
24
  const debugOp = debug.extend("ops");
25
25
  const debugWait = debug.extend("wait");
@@ -13,7 +13,7 @@ import {
13
13
  import { Loader } from "@fluidframework/container-loader";
14
14
  import { ITelemetryBaseLogger, IRequest } from "@fluidframework/core-interfaces";
15
15
  import { IDocumentServiceFactory, IUrlResolver } from "@fluidframework/driver-definitions";
16
- import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader";
16
+ import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader.js";
17
17
 
18
18
  /**
19
19
  * Creates a loader with the given package entries and driver.
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/test-utils";
9
- export const pkgVersion = "2.0.0-dev-rc.1.0.0.228517";
9
+ export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
@@ -3,6 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
+ import { assert } from "@fluidframework/core-utils";
6
7
  import { IContainerContext, IRuntime } from "@fluidframework/container-definitions";
7
8
  import {
8
9
  ContainerRuntime,
@@ -83,12 +84,21 @@ export const createTestContainerRuntimeFactory = (
83
84
  }
84
85
 
85
86
  public async instantiateFirstTime(runtime: ContainerRuntime): Promise<void> {
86
- const rootContext = runtime.createDetachedRootDataStore([this.type], "default");
87
+ // Back-compat - old code does not return IDataStore for rootContext.attachRuntime() call!
88
+ // Thus need to leverage old API createDetachedRootDataStore() that is gone in latest releases.
89
+ const rootContext =
90
+ "createDetachedRootDataStore" in runtime
91
+ ? (runtime as any).createDetachedRootDataStore([this.type], "default")
92
+ : runtime.createDetachedDataStore([this.type], "default");
93
+
87
94
  const rootRuntime = await this.dataStoreFactory.instantiateDataStore(
88
95
  rootContext,
89
96
  /* existing */ false,
90
97
  );
91
- await rootContext.attachRuntime(this.dataStoreFactory, rootRuntime);
98
+ const dataStore = await rootContext.attachRuntime(this.dataStoreFactory, rootRuntime);
99
+
100
+ const result = await dataStore?.trySetAlias("default");
101
+ assert(result === "Success" || result === undefined, "success");
92
102
  }
93
103
 
94
104
  public async instantiateFromExisting(runtime: ContainerRuntime): Promise<void> {
@@ -18,7 +18,7 @@ import {
18
18
  import { IFluidDataStoreRuntime, IChannelFactory } from "@fluidframework/datastore-definitions";
19
19
  import { assert } from "@fluidframework/core-utils";
20
20
  import { create404Response } from "@fluidframework/runtime-utils";
21
- import { ITestFluidObject } from "./interfaces";
21
+ import { ITestFluidObject } from "./interfaces.js";
22
22
 
23
23
  /**
24
24
  * A test Fluid object that will create a shared object for each key-value pair in the factoryEntries passed to load.
@@ -16,7 +16,6 @@ import {
16
16
  } from "@fluidframework/container-loader";
17
17
  import { IContainerRuntimeOptions } from "@fluidframework/container-runtime";
18
18
  import {
19
- ITelemetryGenericEvent,
20
19
  ITelemetryBaseLogger,
21
20
  ITelemetryBaseEvent,
22
21
  IRequestHeader,
@@ -28,11 +27,15 @@ import {
28
27
  } from "@fluidframework/driver-definitions";
29
28
  import { ITestDriver, TestDriverTypes } from "@fluidframework/test-driver-definitions";
30
29
  import { v4 as uuid } from "uuid";
31
- import { createChildLogger, createMultiSinkLogger } from "@fluidframework/telemetry-utils";
32
- import { LoaderContainerTracker } from "./loaderContainerTracker";
33
- import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader";
34
- import { createAndAttachContainer } from "./localLoader";
35
- import { ChannelFactoryRegistry } from "./testFluidObject";
30
+ import {
31
+ createChildLogger,
32
+ createMultiSinkLogger,
33
+ type ITelemetryGenericEventExt,
34
+ } from "@fluidframework/telemetry-utils";
35
+ import { LoaderContainerTracker } from "./loaderContainerTracker.js";
36
+ import { fluidEntryPoint, LocalCodeLoader } from "./localCodeLoader.js";
37
+ import { createAndAttachContainer } from "./localLoader.js";
38
+ import { ChannelFactoryRegistry } from "./testFluidObject.js";
36
39
 
37
40
  const defaultCodeDetails: IFluidCodeDetails = {
38
41
  package: "defaultTestPackage",
@@ -126,6 +129,19 @@ export interface ITestObjectProvider {
126
129
  loaderProps?: Partial<ILoaderProps>,
127
130
  ): Promise<IContainer>;
128
131
 
132
+ /**
133
+ * Create a detached container much like createContainer, but without attaching it to the document service.
134
+ */
135
+ createDetachedContainer(
136
+ entryPoint: fluidEntryPoint,
137
+ loaderProps?: Partial<ILoaderProps>,
138
+ ): Promise<IContainer>;
139
+
140
+ /**
141
+ * Attaches a detached container to the document service.
142
+ */
143
+ attachDetachedContainer(container: IContainer): Promise<void>;
144
+
129
145
  /**
130
146
  * Loads a container using the default document id
131
147
  */
@@ -288,12 +304,12 @@ export class EventAndErrorTrackingLogger implements ITelemetryBaseLogger {
288
304
  constructor(private readonly baseLogger: ITelemetryBaseLogger) {}
289
305
 
290
306
  private readonly expectedEvents: (
291
- | { index: number; event: ITelemetryGenericEvent | undefined }
307
+ | { index: number; event: ITelemetryGenericEventExt | undefined }
292
308
  | undefined
293
309
  )[] = [];
294
310
  private readonly unexpectedErrors: ITelemetryBaseEvent[] = [];
295
311
 
296
- public registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEvent[]) {
312
+ public registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEventExt[]) {
297
313
  if (this.expectedEvents.length !== 0) {
298
314
  // we don't have to error here. just no reason not to. given the events must be
299
315
  // ordered it could be tricky to figure out problems around multiple registrations.
@@ -505,6 +521,36 @@ export class TestObjectProvider implements ITestObjectProvider {
505
521
  return container;
506
522
  }
507
523
 
524
+ /**
525
+ * {@inheritdoc ITestObjectProvider.createDetachedContainer}
526
+ */
527
+ public async createDetachedContainer(
528
+ entryPoint: fluidEntryPoint,
529
+ loaderProps?: Partial<ILoaderProps> | undefined,
530
+ ): Promise<IContainer> {
531
+ if (this._documentCreated) {
532
+ throw new Error(
533
+ "Only one container/document can be created. To load the container/document use loadContainer",
534
+ );
535
+ }
536
+ const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
537
+ return loader.createDetachedContainer(defaultCodeDetails);
538
+ }
539
+
540
+ /**
541
+ * {@inheritdoc ITestObjectProvider.attachDetachedContainer}
542
+ */
543
+ public async attachDetachedContainer(container: IContainer): Promise<void> {
544
+ if (this._documentCreated) {
545
+ throw new Error(
546
+ "Only one container/document can be created. To load the container/document use loadContainer",
547
+ );
548
+ }
549
+ await container.attach(this.driver.createCreateNewRequest(this.documentId));
550
+ this._documentCreated = true;
551
+ this._documentIdStrategy.update(container.resolvedUrl);
552
+ }
553
+
508
554
  /**
509
555
  * {@inheritDoc ITestObjectProvider.loadContainer}
510
556
  */
@@ -643,14 +689,12 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
643
689
  private _documentCreated = false;
644
690
 
645
691
  /**
646
- * `_loadCount` is used to alternate which version we load the next container with.
647
- * loadCount is even then we will load with the "create" version, and if odd we load with the "load" version.
648
- * After each test we will reset loadCount to 0 to ensure we always create the first container with the create version.
692
+ * Used to determine which APIs to use when creating a loader.
649
693
  *
650
- * Note: This will only affect tests that load a container more than two times.
694
+ * The first load will always use the create APIs, and then useCreateApi will be set to false to ensure all
695
+ * subsequent loads use the load APIs.
651
696
  */
652
-
653
- private _loadCount: number = 0;
697
+ private useCreateApi: boolean = true;
654
698
 
655
699
  constructor(
656
700
  private readonly LoaderConstructorForCreating: typeof Loader,
@@ -726,7 +770,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
726
770
  * {@inheritDoc ITestObjectProvider.driver}
727
771
  */
728
772
  public get driver(): ITestDriver {
729
- return this.nextLoaderShouldCreate() ? this.driverForCreating : this.driverForLoading;
773
+ return this.useCreateApi ? this.driverForCreating : this.driverForLoading;
730
774
  }
731
775
 
732
776
  /**
@@ -735,7 +779,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
735
779
  public get createFluidEntryPoint(): (
736
780
  testContainerConfig?: ITestContainerConfig,
737
781
  ) => fluidEntryPoint {
738
- return this.nextLoaderShouldCreate()
782
+ return this.useCreateApi
739
783
  ? this.createFluidEntryPointForCreating
740
784
  : this.createFluidEntryPointForLoading;
741
785
  }
@@ -789,9 +833,12 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
789
833
  packageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,
790
834
  loaderProps?: Partial<ILoaderProps>,
791
835
  ) {
792
- return this.nextLoaderShouldCreate(/** increment */ true)
793
- ? this.createLoaderForCreating(packageEntries, loaderProps)
794
- : this.createLoaderForLoading(packageEntries, loaderProps);
836
+ if (this.useCreateApi) {
837
+ // After we create the first loader, we can set this.useCreateApi to false.
838
+ this.useCreateApi = false;
839
+ return this.createLoaderForCreating(packageEntries, loaderProps);
840
+ }
841
+ return this.createLoaderForLoading(packageEntries, loaderProps);
795
842
  }
796
843
 
797
844
  /**
@@ -816,6 +863,36 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
816
863
  return container;
817
864
  }
818
865
 
866
+ /**
867
+ * {@inheritdoc ITestObjectProvider.createDetachedContainer}
868
+ */
869
+ public async createDetachedContainer(
870
+ entryPoint: fluidEntryPoint,
871
+ loaderProps?: Partial<ILoaderProps> | undefined,
872
+ ): Promise<IContainer> {
873
+ if (this._documentCreated) {
874
+ throw new Error(
875
+ "Only one container/document can be created. To load the container/document use loadContainer",
876
+ );
877
+ }
878
+ const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
879
+ return loader.createDetachedContainer(defaultCodeDetails);
880
+ }
881
+
882
+ /**
883
+ * {@inheritdoc ITestObjectProvider.attachDetachedContainer}
884
+ */
885
+ public async attachDetachedContainer(container: IContainer): Promise<void> {
886
+ if (this._documentCreated) {
887
+ throw new Error(
888
+ "Only one container/document can be created. To load the container/document use loadContainer",
889
+ );
890
+ }
891
+ await container.attach(this.driver.createCreateNewRequest(this.documentId));
892
+ this._documentCreated = true;
893
+ this._documentIdStrategy.update(container.resolvedUrl);
894
+ }
895
+
819
896
  /**
820
897
  * {@inheritDoc ITestObjectProvider.loadContainer}
821
898
  */
@@ -824,9 +901,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
824
901
  loaderProps?: Partial<ILoaderProps>,
825
902
  requestHeader?: IRequestHeader,
826
903
  ): Promise<IContainer> {
827
- const driver = this.nextLoaderShouldCreate()
828
- ? this.driverForCreating
829
- : this.driverForLoading;
904
+ const driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;
830
905
  const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
831
906
  return this.resolveContainer(loader, requestHeader, driver);
832
907
  }
@@ -888,9 +963,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
888
963
  requestHeader?: IRequestHeader,
889
964
  ): Promise<IContainer> {
890
965
  // Keep track of which Loader we are about to use so we can pass the correct driver through
891
- const driver = this.nextLoaderShouldCreate()
892
- ? this.driverForCreating
893
- : this.driverForLoading;
966
+ const driver = this.useCreateApi ? this.driverForCreating : this.driverForLoading;
894
967
  const loader = this.makeTestLoader(testContainerConfig);
895
968
  const container = await this.resolveContainer(loader, requestHeader, driver);
896
969
  await this.waitContainerToCatchUp(container);
@@ -902,7 +975,7 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
902
975
  * {@inheritDoc ITestObjectProvider.reset}
903
976
  */
904
977
  public reset() {
905
- this._loadCount = 0;
978
+ this.useCreateApi = true;
906
979
  this._loaderContainerTracker.reset();
907
980
  this._logger = undefined;
908
981
  this._documentServiceFactory = undefined;
@@ -948,14 +1021,6 @@ export class TestObjectProviderWithVersionedLoad implements ITestObjectProvider
948
1021
  this._loaderContainerTracker.reset();
949
1022
  this._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);
950
1023
  }
951
-
952
- private nextLoaderShouldCreate(increment: boolean = false): boolean {
953
- const shouldCreate = this._loadCount % 2 === 0;
954
- if (increment) {
955
- this._loadCount++;
956
- }
957
- return shouldCreate;
958
- }
959
1024
  }
960
1025
 
961
1026
  /**
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  import { assert, Deferred } from "@fluidframework/core-utils";
7
+ import type * as Mocha from "mocha";
7
8
 
8
9
  // @deprecated this value is no longer used
9
10
  /**
@@ -0,0 +1,7 @@
1
+ {
2
+ // This config must be used in a "type": "commonjs" environment. (Use fluid-tsc commonjs.)
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "./dist",
6
+ },
7
+ }
package/tsconfig.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
- "extends": "@fluidframework/build-common/ts-common-config.json",
2
+ "extends": "../../../common/build/build-common/tsconfig.node16.json",
3
3
  "exclude": ["src/test/**/*"],
4
4
  "compilerOptions": {
5
5
  "rootDir": "./src",
6
- "outDir": "./dist",
7
- "composite": true,
8
- "types": ["mocha", "node"],
6
+ "outDir": "./lib",
7
+ "types": ["node"],
9
8
  },
10
9
  "include": ["src/**/*"],
11
10
  }