@fluidframework/test-utils 2.0.0-internal.7.3.0 → 2.0.0-internal.7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/api-extractor-lint.json +13 -0
- package/api-extractor.json +3 -3
- package/api-report/test-utils.api.md +83 -74
- package/dist/DriverWrappers.d.ts +3 -0
- package/dist/DriverWrappers.d.ts.map +1 -1
- package/dist/DriverWrappers.js +3 -0
- package/dist/DriverWrappers.js.map +1 -1
- package/dist/TestConfigs.d.ts +4 -1
- package/dist/TestConfigs.d.ts.map +1 -1
- package/dist/TestConfigs.js +3 -0
- package/dist/TestConfigs.js.map +1 -1
- package/dist/TestSummaryUtils.d.ts +4 -2
- package/dist/TestSummaryUtils.d.ts.map +1 -1
- package/dist/TestSummaryUtils.js +3 -0
- package/dist/TestSummaryUtils.js.map +1 -1
- package/dist/containerUtils.d.ts +17 -0
- package/dist/containerUtils.d.ts.map +1 -1
- package/dist/containerUtils.js +41 -1
- package/dist/containerUtils.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +6 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/loaderContainerTracker.d.ts +3 -0
- package/dist/loaderContainerTracker.d.ts.map +1 -1
- package/dist/loaderContainerTracker.js +3 -0
- package/dist/loaderContainerTracker.js.map +1 -1
- package/dist/localCodeLoader.d.ts +7 -0
- package/dist/localCodeLoader.d.ts.map +1 -1
- package/dist/localCodeLoader.js +1 -0
- package/dist/localCodeLoader.js.map +1 -1
- package/dist/localLoader.d.ts +2 -0
- package/dist/localLoader.d.ts.map +1 -1
- package/dist/localLoader.js +2 -0
- package/dist/localLoader.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/retry.d.ts +1 -0
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +1 -0
- package/dist/retry.js.map +1 -1
- package/dist/test-utils-alpha.d.ts +140 -0
- package/dist/test-utils-beta.d.ts +228 -0
- package/dist/test-utils-public.d.ts +228 -0
- package/dist/test-utils-untrimmed.d.ts +993 -0
- package/dist/testContainerRuntimeFactory.d.ts +2 -0
- package/dist/testContainerRuntimeFactory.d.ts.map +1 -1
- package/dist/testContainerRuntimeFactory.js +26 -12
- package/dist/testContainerRuntimeFactory.js.map +1 -1
- package/dist/testContainerRuntimeFactoryWithDefaultDataStore.d.ts +1 -0
- package/dist/testContainerRuntimeFactoryWithDefaultDataStore.d.ts.map +1 -1
- package/dist/testContainerRuntimeFactoryWithDefaultDataStore.js +10 -2
- package/dist/testContainerRuntimeFactoryWithDefaultDataStore.js.map +1 -1
- package/dist/testFluidObject.d.ts +5 -0
- package/dist/testFluidObject.d.ts.map +1 -1
- package/dist/testFluidObject.js +6 -3
- package/dist/testFluidObject.js.map +1 -1
- package/dist/testObjectProvider.d.ts +287 -37
- package/dist/testObjectProvider.d.ts.map +1 -1
- package/dist/testObjectProvider.js +310 -25
- package/dist/testObjectProvider.js.map +1 -1
- package/dist/timeoutUtils.d.ts +11 -0
- package/dist/timeoutUtils.d.ts.map +1 -1
- package/dist/timeoutUtils.js +5 -0
- package/dist/timeoutUtils.js.map +1 -1
- package/lib/test-utils-alpha.d.ts +140 -0
- package/lib/test-utils-beta.d.ts +228 -0
- package/lib/test-utils-public.d.ts +228 -0
- package/lib/test-utils-untrimmed.d.ts +993 -0
- package/package.json +56 -28
- package/src/DriverWrappers.ts +3 -0
- package/src/TestConfigs.ts +4 -1
- package/src/TestSummaryUtils.ts +9 -2
- package/src/containerUtils.ts +42 -0
- package/src/index.ts +7 -1
- package/src/interfaces.ts +6 -0
- package/src/loaderContainerTracker.ts +3 -0
- package/src/localCodeLoader.ts +7 -0
- package/src/localLoader.ts +2 -0
- package/src/packageVersion.ts +1 -1
- package/src/retry.ts +1 -0
- package/src/testContainerRuntimeFactory.ts +36 -12
- package/src/testContainerRuntimeFactoryWithDefaultDataStore.ts +11 -0
- package/src/testFluidObject.ts +10 -10
- package/src/testObjectProvider.ts +524 -47
- package/src/timeoutUtils.ts +11 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.getUnexpectedLogErrorException = exports.TestObjectProvider = exports.EventAndErrorTrackingLogger = exports.createDocumentId = exports.DataObjectFactoryType = void 0;
|
|
7
|
+
exports.getUnexpectedLogErrorException = exports.TestObjectProviderWithVersionedLoad = exports.TestObjectProvider = exports.EventAndErrorTrackingLogger = exports.createDocumentId = exports.DataObjectFactoryType = void 0;
|
|
8
8
|
const container_loader_1 = require("@fluidframework/container-loader");
|
|
9
9
|
const uuid_1 = require("uuid");
|
|
10
10
|
const telemetry_utils_1 = require("@fluidframework/telemetry-utils");
|
|
@@ -15,11 +15,17 @@ const defaultCodeDetails = {
|
|
|
15
15
|
package: "defaultTestPackage",
|
|
16
16
|
config: {},
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
18
21
|
var DataObjectFactoryType;
|
|
19
22
|
(function (DataObjectFactoryType) {
|
|
20
23
|
DataObjectFactoryType[DataObjectFactoryType["Primed"] = 0] = "Primed";
|
|
21
24
|
DataObjectFactoryType[DataObjectFactoryType["Test"] = 1] = "Test";
|
|
22
25
|
})(DataObjectFactoryType || (exports.DataObjectFactoryType = DataObjectFactoryType = {}));
|
|
26
|
+
/**
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
23
29
|
const createDocumentId = () => (0, uuid_1.v4)();
|
|
24
30
|
exports.createDocumentId = createDocumentId;
|
|
25
31
|
/**
|
|
@@ -55,6 +61,7 @@ function getDocumentIdStrategy(type) {
|
|
|
55
61
|
* It also tracks all unexpected errors.
|
|
56
62
|
* At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and
|
|
57
63
|
* any expected events that have not occurred.
|
|
64
|
+
* @internal
|
|
58
65
|
*/
|
|
59
66
|
class EventAndErrorTrackingLogger {
|
|
60
67
|
constructor(baseLogger) {
|
|
@@ -130,6 +137,7 @@ class EventAndErrorTrackingLogger {
|
|
|
130
137
|
exports.EventAndErrorTrackingLogger = EventAndErrorTrackingLogger;
|
|
131
138
|
/**
|
|
132
139
|
* Shared base class for test object provider. Contain code for loader and container creation and loading
|
|
140
|
+
* @internal
|
|
133
141
|
*/
|
|
134
142
|
class TestObjectProvider {
|
|
135
143
|
/**
|
|
@@ -137,15 +145,30 @@ class TestObjectProvider {
|
|
|
137
145
|
* @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name
|
|
138
146
|
* and factory for TestFluidObject
|
|
139
147
|
*/
|
|
140
|
-
constructor(LoaderConstructor,
|
|
148
|
+
constructor(LoaderConstructor,
|
|
149
|
+
/**
|
|
150
|
+
* {@inheritDoc ITestObjectProvider.driver}
|
|
151
|
+
*/
|
|
152
|
+
driver,
|
|
153
|
+
/**
|
|
154
|
+
* {@inheritDoc ITestObjectProvider.createFluidEntryPoint}
|
|
155
|
+
*/
|
|
156
|
+
createFluidEntryPoint) {
|
|
141
157
|
this.LoaderConstructor = LoaderConstructor;
|
|
142
158
|
this.driver = driver;
|
|
143
159
|
this.createFluidEntryPoint = createFluidEntryPoint;
|
|
160
|
+
/**
|
|
161
|
+
* {@inheritDoc ITestObjectProvider."type"}
|
|
162
|
+
*/
|
|
163
|
+
this.type = "TestObjectProvider";
|
|
144
164
|
this._loaderContainerTracker = new loaderContainerTracker_1.LoaderContainerTracker();
|
|
145
165
|
// Since documentId doesn't change we can only create/make one container. Call the load functions instead.
|
|
146
166
|
this._documentCreated = false;
|
|
147
167
|
this._documentIdStrategy = getDocumentIdStrategy(driver.type);
|
|
148
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* {@inheritDoc ITestObjectProvider.logger}
|
|
171
|
+
*/
|
|
149
172
|
get logger() {
|
|
150
173
|
if (this._logger === undefined) {
|
|
151
174
|
this._logger = new EventAndErrorTrackingLogger((0, telemetry_utils_1.createChildLogger)({
|
|
@@ -165,34 +188,44 @@ class TestObjectProvider {
|
|
|
165
188
|
set logger(logger) {
|
|
166
189
|
this._logger = logger;
|
|
167
190
|
}
|
|
191
|
+
/**
|
|
192
|
+
* {@inheritDoc ITestObjectProvider.documentServiceFactory}
|
|
193
|
+
*/
|
|
168
194
|
get documentServiceFactory() {
|
|
169
195
|
if (!this._documentServiceFactory) {
|
|
170
196
|
this._documentServiceFactory = this.driver.createDocumentServiceFactory();
|
|
171
197
|
}
|
|
172
198
|
return this._documentServiceFactory;
|
|
173
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* {@inheritDoc ITestObjectProvider.urlResolver}
|
|
202
|
+
*/
|
|
174
203
|
get urlResolver() {
|
|
175
204
|
if (!this._urlResolver) {
|
|
176
205
|
this._urlResolver = this.driver.createUrlResolver();
|
|
177
206
|
}
|
|
178
207
|
return this._urlResolver;
|
|
179
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* {@inheritDoc ITestObjectProvider.documentId}
|
|
211
|
+
*/
|
|
180
212
|
get documentId() {
|
|
181
213
|
return this._documentIdStrategy.get();
|
|
182
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* {@inheritDoc ITestObjectProvider.defaultCodeDetails}
|
|
217
|
+
*/
|
|
183
218
|
get defaultCodeDetails() {
|
|
184
219
|
return defaultCodeDetails;
|
|
185
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* {@inheritDoc ITestObjectProvider.opProcessingController}
|
|
223
|
+
*/
|
|
186
224
|
get opProcessingController() {
|
|
187
225
|
return this._loaderContainerTracker;
|
|
188
226
|
}
|
|
189
227
|
/**
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* Only the version of the loader will vary based on compat config. The version of
|
|
193
|
-
* containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.
|
|
194
|
-
*
|
|
195
|
-
* @param packageEntries - list of code details and fluidEntryPoint pairs.
|
|
228
|
+
* {@inheritDoc ITestObjectProvider.createLoader}
|
|
196
229
|
*/
|
|
197
230
|
createLoader(packageEntries, loaderProps) {
|
|
198
231
|
const logger = (0, telemetry_utils_1.createMultiSinkLogger)({
|
|
@@ -209,13 +242,7 @@ class TestObjectProvider {
|
|
|
209
242
|
return loader;
|
|
210
243
|
}
|
|
211
244
|
/**
|
|
212
|
-
*
|
|
213
|
-
* Container created is automatically added to the OpProcessingController to manage op flow
|
|
214
|
-
*
|
|
215
|
-
* Only the version of the loader will vary based on compat config. The version of
|
|
216
|
-
* containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.
|
|
217
|
-
*
|
|
218
|
-
* @param packageEntries - list of code details and fluidEntryPoint pairs.
|
|
245
|
+
* {@inheritDoc ITestObjectProvider.createContainer}
|
|
219
246
|
*/
|
|
220
247
|
async createContainer(entryPoint, loaderProps) {
|
|
221
248
|
if (this._documentCreated) {
|
|
@@ -229,6 +256,9 @@ class TestObjectProvider {
|
|
|
229
256
|
this._documentIdStrategy.update(container.resolvedUrl);
|
|
230
257
|
return container;
|
|
231
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* {@inheritDoc ITestObjectProvider.loadContainer}
|
|
261
|
+
*/
|
|
232
262
|
async loadContainer(entryPoint, loaderProps, requestHeader) {
|
|
233
263
|
const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
|
|
234
264
|
return this.resolveContainer(loader, requestHeader);
|
|
@@ -240,17 +270,13 @@ class TestObjectProvider {
|
|
|
240
270
|
});
|
|
241
271
|
}
|
|
242
272
|
/**
|
|
243
|
-
*
|
|
244
|
-
* The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run
|
|
245
|
-
* @param testContainerConfig - optional configuring the test Container
|
|
273
|
+
* {@inheritDoc ITestObjectProvider.makeTestLoader}
|
|
246
274
|
*/
|
|
247
275
|
makeTestLoader(testContainerConfig) {
|
|
248
276
|
return this.createLoader([[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]], testContainerConfig?.loaderProps);
|
|
249
277
|
}
|
|
250
278
|
/**
|
|
251
|
-
*
|
|
252
|
-
* Container loaded is automatically added to the OpProcessingController to manage op flow
|
|
253
|
-
* @param testContainerConfig - optional configuring the test Container
|
|
279
|
+
* {@inheritDoc ITestObjectProvider.makeTestContainer}
|
|
254
280
|
*/
|
|
255
281
|
async makeTestContainer(testContainerConfig) {
|
|
256
282
|
if (this._documentCreated) {
|
|
@@ -265,10 +291,7 @@ class TestObjectProvider {
|
|
|
265
291
|
return container;
|
|
266
292
|
}
|
|
267
293
|
/**
|
|
268
|
-
*
|
|
269
|
-
* IContainer loaded is automatically added to the OpProcessingController to manage op flow
|
|
270
|
-
* @param testContainerConfig - optional configuring the test Container
|
|
271
|
-
* @param requestHeader - optional headers to be supplied to the loader
|
|
294
|
+
* {@inheritDoc ITestObjectProvider.loadTestContainer}
|
|
272
295
|
*/
|
|
273
296
|
async loadTestContainer(testContainerConfig, requestHeader) {
|
|
274
297
|
const loader = this.makeTestLoader(testContainerConfig);
|
|
@@ -276,6 +299,9 @@ class TestObjectProvider {
|
|
|
276
299
|
await this.waitContainerToCatchUp(container);
|
|
277
300
|
return container;
|
|
278
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* {@inheritDoc ITestObjectProvider.reset}
|
|
304
|
+
*/
|
|
279
305
|
reset() {
|
|
280
306
|
this._loaderContainerTracker.reset();
|
|
281
307
|
this._documentServiceFactory = undefined;
|
|
@@ -288,6 +314,9 @@ class TestObjectProvider {
|
|
|
288
314
|
this._logger = undefined;
|
|
289
315
|
this._documentCreated = false;
|
|
290
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* {@inheritDoc ITestObjectProvider.ensureSynchronized}
|
|
319
|
+
*/
|
|
291
320
|
async ensureSynchronized() {
|
|
292
321
|
return this._loaderContainerTracker.ensureSynchronized();
|
|
293
322
|
}
|
|
@@ -301,15 +330,271 @@ class TestObjectProvider {
|
|
|
301
330
|
}
|
|
302
331
|
return (0, container_loader_1.waitContainerToCatchUp)(container);
|
|
303
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* {@inheritDoc ITestObjectProvider.updateDocumentId}
|
|
335
|
+
*/
|
|
304
336
|
updateDocumentId(resolvedUrl) {
|
|
305
337
|
this._documentIdStrategy.update(resolvedUrl);
|
|
306
338
|
}
|
|
339
|
+
/**
|
|
340
|
+
* {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}
|
|
341
|
+
*/
|
|
307
342
|
resetLoaderContainerTracker(syncSummarizerClients = false) {
|
|
308
343
|
this._loaderContainerTracker.reset();
|
|
309
344
|
this._loaderContainerTracker = new loaderContainerTracker_1.LoaderContainerTracker(syncSummarizerClients);
|
|
310
345
|
}
|
|
311
346
|
}
|
|
312
347
|
exports.TestObjectProvider = TestObjectProvider;
|
|
348
|
+
/**
|
|
349
|
+
* Implements {@link ITestObjectProvider}, but uses different versions to create and load containers.
|
|
350
|
+
*
|
|
351
|
+
* @internal
|
|
352
|
+
*/
|
|
353
|
+
class TestObjectProviderWithVersionedLoad {
|
|
354
|
+
constructor(LoaderConstructorForCreating, LoaderConstructorForLoading, driverForCreating, driverForLoading, createFluidEntryPointForCreating, createFluidEntryPointForLoading) {
|
|
355
|
+
this.LoaderConstructorForCreating = LoaderConstructorForCreating;
|
|
356
|
+
this.LoaderConstructorForLoading = LoaderConstructorForLoading;
|
|
357
|
+
this.driverForCreating = driverForCreating;
|
|
358
|
+
this.driverForLoading = driverForLoading;
|
|
359
|
+
this.createFluidEntryPointForCreating = createFluidEntryPointForCreating;
|
|
360
|
+
this.createFluidEntryPointForLoading = createFluidEntryPointForLoading;
|
|
361
|
+
/**
|
|
362
|
+
* {@inheritDoc ITestObjectProvider."type"}
|
|
363
|
+
*/
|
|
364
|
+
this.type = "TestObjectProviderWithVersionedLoad";
|
|
365
|
+
this._loaderContainerTracker = new loaderContainerTracker_1.LoaderContainerTracker();
|
|
366
|
+
// Since documentId doesn't change we can only create/make one container. Call the load functions instead.
|
|
367
|
+
this._documentCreated = false;
|
|
368
|
+
/**
|
|
369
|
+
* `_loadCount` is used to alternate which version we load the next container with.
|
|
370
|
+
* loadCount is even then we will load with the "create" version, and if odd we load with the "load" version.
|
|
371
|
+
* After each test we will reset loadCount to 0 to ensure we always create the first container with the create version.
|
|
372
|
+
*
|
|
373
|
+
* Note: This will only affect tests that load a container more than two times.
|
|
374
|
+
*/
|
|
375
|
+
this._loadCount = 0;
|
|
376
|
+
this._documentIdStrategy = getDocumentIdStrategy(driverForCreating.type);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* {@inheritDoc ITestObjectProvider.logger}
|
|
380
|
+
*/
|
|
381
|
+
get logger() {
|
|
382
|
+
if (this._logger === undefined) {
|
|
383
|
+
this._logger = new EventAndErrorTrackingLogger((0, telemetry_utils_1.createChildLogger)({
|
|
384
|
+
logger: getTestLogger?.(),
|
|
385
|
+
}));
|
|
386
|
+
}
|
|
387
|
+
return this._logger;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* {@inheritDoc ITestObjectProvider.documentServiceFactory}
|
|
391
|
+
*/
|
|
392
|
+
get documentServiceFactory() {
|
|
393
|
+
if (!this._documentServiceFactory) {
|
|
394
|
+
this._documentServiceFactory = this.driverForCreating.createDocumentServiceFactory();
|
|
395
|
+
}
|
|
396
|
+
return this._documentServiceFactory;
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* {@inheritDoc ITestObjectProvider.urlResolver}
|
|
400
|
+
*/
|
|
401
|
+
get urlResolver() {
|
|
402
|
+
if (!this._urlResolver) {
|
|
403
|
+
this._urlResolver = this.driverForCreating.createUrlResolver();
|
|
404
|
+
}
|
|
405
|
+
return this._urlResolver;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* {@inheritDoc ITestObjectProvider.documentId}
|
|
409
|
+
*/
|
|
410
|
+
get documentId() {
|
|
411
|
+
return this._documentIdStrategy.get();
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* {@inheritDoc ITestObjectProvider.defaultCodeDetails}
|
|
415
|
+
*/
|
|
416
|
+
get defaultCodeDetails() {
|
|
417
|
+
return defaultCodeDetails;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* {@inheritDoc ITestObjectProvider.opProcessingController}
|
|
421
|
+
*/
|
|
422
|
+
get opProcessingController() {
|
|
423
|
+
return this._loaderContainerTracker;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* {@inheritDoc ITestObjectProvider.driver}
|
|
427
|
+
*/
|
|
428
|
+
get driver() {
|
|
429
|
+
return this.nextLoaderShouldCreate() ? this.driverForCreating : this.driverForLoading;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* {@inheritDoc ITestObjectProvider.createFluidEntryPoint}
|
|
433
|
+
*/
|
|
434
|
+
get createFluidEntryPoint() {
|
|
435
|
+
return this.nextLoaderShouldCreate()
|
|
436
|
+
? this.createFluidEntryPointForCreating
|
|
437
|
+
: this.createFluidEntryPointForLoading;
|
|
438
|
+
}
|
|
439
|
+
createLoaderForCreating(packageEntries, loaderProps) {
|
|
440
|
+
const logger = (0, telemetry_utils_1.createMultiSinkLogger)({
|
|
441
|
+
loggers: [this.logger, loaderProps?.logger],
|
|
442
|
+
});
|
|
443
|
+
const loader = new this.LoaderConstructorForCreating({
|
|
444
|
+
...loaderProps,
|
|
445
|
+
logger,
|
|
446
|
+
codeLoader: loaderProps?.codeLoader ?? new localCodeLoader_1.LocalCodeLoader(packageEntries),
|
|
447
|
+
urlResolver: loaderProps?.urlResolver ?? this.urlResolver,
|
|
448
|
+
documentServiceFactory: loaderProps?.documentServiceFactory ?? this.documentServiceFactory,
|
|
449
|
+
});
|
|
450
|
+
this._loaderContainerTracker.add(loader);
|
|
451
|
+
return loader;
|
|
452
|
+
}
|
|
453
|
+
createLoaderForLoading(packageEntries, loaderProps) {
|
|
454
|
+
const logger = (0, telemetry_utils_1.createMultiSinkLogger)({
|
|
455
|
+
loggers: [this.logger, loaderProps?.logger],
|
|
456
|
+
});
|
|
457
|
+
const loader = new this.LoaderConstructorForLoading({
|
|
458
|
+
...loaderProps,
|
|
459
|
+
logger,
|
|
460
|
+
codeLoader: loaderProps?.codeLoader ?? new localCodeLoader_1.LocalCodeLoader(packageEntries),
|
|
461
|
+
urlResolver: loaderProps?.urlResolver ?? this.urlResolver,
|
|
462
|
+
documentServiceFactory: loaderProps?.documentServiceFactory ?? this.documentServiceFactory,
|
|
463
|
+
});
|
|
464
|
+
this._loaderContainerTracker.add(loader);
|
|
465
|
+
return loader;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* {@inheritDoc ITestObjectProvider.createLoader}
|
|
469
|
+
*/
|
|
470
|
+
createLoader(packageEntries, loaderProps) {
|
|
471
|
+
return this.nextLoaderShouldCreate(/** increment */ true)
|
|
472
|
+
? this.createLoaderForCreating(packageEntries, loaderProps)
|
|
473
|
+
: this.createLoaderForLoading(packageEntries, loaderProps);
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* {@inheritDoc ITestObjectProvider.createContainer}
|
|
477
|
+
*/
|
|
478
|
+
async createContainer(entryPoint, loaderProps) {
|
|
479
|
+
if (this._documentCreated) {
|
|
480
|
+
throw new Error("Only one container/document can be created. To load the container/document use loadContainer");
|
|
481
|
+
}
|
|
482
|
+
const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
|
|
483
|
+
const container = await (0, localLoader_1.createAndAttachContainer)(defaultCodeDetails, loader, this.driverForCreating.createCreateNewRequest(this.documentId));
|
|
484
|
+
this._documentCreated = true;
|
|
485
|
+
// r11s driver will generate a new ID for the new container.
|
|
486
|
+
// update the document ID with the actual ID of the attached container.
|
|
487
|
+
this._documentIdStrategy.update(container.resolvedUrl);
|
|
488
|
+
return container;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* {@inheritDoc ITestObjectProvider.loadContainer}
|
|
492
|
+
*/
|
|
493
|
+
async loadContainer(entryPoint, loaderProps, requestHeader) {
|
|
494
|
+
const driver = this.nextLoaderShouldCreate()
|
|
495
|
+
? this.driverForCreating
|
|
496
|
+
: this.driverForLoading;
|
|
497
|
+
const loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);
|
|
498
|
+
return this.resolveContainer(loader, requestHeader, driver);
|
|
499
|
+
}
|
|
500
|
+
async resolveContainer(loader, headers, driver) {
|
|
501
|
+
return loader.resolve({
|
|
502
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
503
|
+
url: await driver.createContainerUrl(this.documentId),
|
|
504
|
+
headers,
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* {@inheritDoc ITestObjectProvider.makeTestLoader}
|
|
509
|
+
*/
|
|
510
|
+
makeTestLoader(testContainerConfig) {
|
|
511
|
+
return this.createLoader([[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]], testContainerConfig?.loaderProps);
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* {@inheritDoc ITestObjectProvider.makeTestContainer}
|
|
515
|
+
*/
|
|
516
|
+
async makeTestContainer(testContainerConfig) {
|
|
517
|
+
if (this._documentCreated) {
|
|
518
|
+
throw new Error("Only one container/document can be created. To load the container/document use loadTestContainer");
|
|
519
|
+
}
|
|
520
|
+
const loader = this.createLoader([[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]], testContainerConfig?.loaderProps);
|
|
521
|
+
const container = await (0, localLoader_1.createAndAttachContainer)(defaultCodeDetails, loader, this.driverForCreating.createCreateNewRequest(this.documentId));
|
|
522
|
+
this._documentCreated = true;
|
|
523
|
+
// r11s driver will generate a new ID for the new container.
|
|
524
|
+
// update the document ID with the actual ID of the attached container.
|
|
525
|
+
this._documentIdStrategy.update(container.resolvedUrl);
|
|
526
|
+
return container;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* {@inheritDoc ITestObjectProvider.loadTestContainer}
|
|
530
|
+
*/
|
|
531
|
+
async loadTestContainer(testContainerConfig, requestHeader) {
|
|
532
|
+
// Keep track of which Loader we are about to use so we can pass the correct driver through
|
|
533
|
+
const driver = this.nextLoaderShouldCreate()
|
|
534
|
+
? this.driverForCreating
|
|
535
|
+
: this.driverForLoading;
|
|
536
|
+
const loader = this.makeTestLoader(testContainerConfig);
|
|
537
|
+
const container = await this.resolveContainer(loader, requestHeader, driver);
|
|
538
|
+
await this.waitContainerToCatchUp(container);
|
|
539
|
+
return container;
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* {@inheritDoc ITestObjectProvider.reset}
|
|
543
|
+
*/
|
|
544
|
+
reset() {
|
|
545
|
+
this._loadCount = 0;
|
|
546
|
+
this._loaderContainerTracker.reset();
|
|
547
|
+
this._logger = undefined;
|
|
548
|
+
this._documentServiceFactory = undefined;
|
|
549
|
+
this._urlResolver = undefined;
|
|
550
|
+
this._documentIdStrategy.reset();
|
|
551
|
+
const logError = getUnexpectedLogErrorException(this._logger);
|
|
552
|
+
if (logError) {
|
|
553
|
+
throw logError;
|
|
554
|
+
}
|
|
555
|
+
this._documentCreated = false;
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* {@inheritDoc ITestObjectProvider.ensureSynchronized}
|
|
559
|
+
*/
|
|
560
|
+
async ensureSynchronized() {
|
|
561
|
+
return this._loaderContainerTracker.ensureSynchronized();
|
|
562
|
+
}
|
|
563
|
+
async waitContainerToCatchUp(container) {
|
|
564
|
+
// The original waitContainerToCatchUp() from container loader uses either Container.resume()
|
|
565
|
+
// or Container.connect() as part of its implementation. However, resume() was deprecated
|
|
566
|
+
// and eventually replaced with connect(). To avoid issues during LTS compatibility testing
|
|
567
|
+
// with older container versions issues, we use resume() when connect() is unavailable.
|
|
568
|
+
if (container.connect === undefined) {
|
|
569
|
+
container.connect = container.resume;
|
|
570
|
+
}
|
|
571
|
+
return (0, container_loader_1.waitContainerToCatchUp)(container);
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* {@inheritDoc ITestObjectProvider.updateDocumentId}
|
|
575
|
+
*/
|
|
576
|
+
updateDocumentId(resolvedUrl) {
|
|
577
|
+
this._documentIdStrategy.update(resolvedUrl);
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}
|
|
581
|
+
*/
|
|
582
|
+
resetLoaderContainerTracker(syncSummarizerClients = false) {
|
|
583
|
+
this._loaderContainerTracker.reset();
|
|
584
|
+
this._loaderContainerTracker = new loaderContainerTracker_1.LoaderContainerTracker(syncSummarizerClients);
|
|
585
|
+
}
|
|
586
|
+
nextLoaderShouldCreate(increment = false) {
|
|
587
|
+
const shouldCreate = this._loadCount % 2 === 0;
|
|
588
|
+
if (increment) {
|
|
589
|
+
this._loadCount++;
|
|
590
|
+
}
|
|
591
|
+
return shouldCreate;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
exports.TestObjectProviderWithVersionedLoad = TestObjectProviderWithVersionedLoad;
|
|
595
|
+
/**
|
|
596
|
+
* @internal
|
|
597
|
+
*/
|
|
313
598
|
function getUnexpectedLogErrorException(logger, prefix) {
|
|
314
599
|
if (logger === undefined) {
|
|
315
600
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIContainer,\n\tIHostLoader,\n\tIFluidCodeDetails,\n\tILoader,\n} from \"@fluidframework/container-definitions\";\nimport {\n\tILoaderProps,\n\tLoader,\n\twaitContainerToCatchUp as waitContainerToCatchUp_original,\n} from \"@fluidframework/container-loader\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime\";\nimport {\n\tITelemetryGenericEvent,\n\tITelemetryBaseLogger,\n\tITelemetryBaseEvent,\n\tIRequestHeader,\n} from \"@fluidframework/core-interfaces\";\nimport {\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport { ITestDriver, TestDriverTypes } from \"@fluidframework/test-driver-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { createChildLogger, createMultiSinkLogger } from \"@fluidframework/telemetry-utils\";\nimport { LoaderContainerTracker } from \"./loaderContainerTracker\";\nimport { fluidEntryPoint, LocalCodeLoader } from \"./localCodeLoader\";\nimport { createAndAttachContainer } from \"./localLoader\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n\tpackage: \"defaultTestPackage\",\n\tconfig: {},\n};\n\nexport interface IOpProcessingController {\n\tprocessIncoming(...containers: IContainer[]): Promise<void>;\n\tprocessOutgoing(...containers: IContainer[]): Promise<void>;\n\tpauseProcessing(...containers: IContainer[]): Promise<void>;\n\tresumeProcessing(...containers: IContainer[]): void;\n}\n\nexport interface ITestObjectProvider {\n\tcreateFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint;\n\tcreateLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): IHostLoader;\n\tcreateContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\tloadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Used to create a test Container. The Loader/ContainerRuntime/DataRuntime might be different versioned.\n\t * In generateLocalCompatTest(), this Container and its runtime will be arbitrarily-versioned.\n\t */\n\tmakeTestLoader(testContainerConfig?: ITestContainerConfig): IHostLoader;\n\tmakeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>;\n\tloadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer>;\n\t/**\n\t *\n\t * @param url - Resolved container URL\n\t */\n\tupdateDocumentId(url: IResolvedUrl | undefined): void;\n\n\tlogger: ITelemetryBaseLogger;\n\tdocumentServiceFactory: IDocumentServiceFactory;\n\turlResolver: IUrlResolver;\n\tdefaultCodeDetails: IFluidCodeDetails;\n\topProcessingController: IOpProcessingController;\n\n\tensureSynchronized(timeoutDuration?: number): Promise<void>;\n\treset(): void;\n\n\tdocumentId: string;\n\tdriver: ITestDriver;\n}\n\nexport enum DataObjectFactoryType {\n\tPrimed, // default\n\tTest,\n}\n\nexport interface ITestContainerConfig {\n\t/** TestFluidDataObject instead of PrimedDataStore */\n\tfluidDataObjectType?: DataObjectFactoryType;\n\n\t/** An array of channel name and DDS factory pair to create on container creation time */\n\tregistry?: ChannelFactoryRegistry;\n\n\t/** Container runtime options for the container instance */\n\truntimeOptions?: IContainerRuntimeOptions;\n\n\t/** Whether this runtime should be instantiated using a mixed-in attributor class */\n\tenableAttribution?: boolean;\n\n\t/** Loader options for the loader used to create containers */\n\tloaderProps?: Partial<ILoaderProps>;\n}\n\nexport const createDocumentId = (): string => uuid();\n\ninterface IDocumentIdStrategy {\n\tget(): string;\n\tupdate(resolvedUrl?: IResolvedUrl): void;\n\treset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n\tlet documentId = createDocumentId();\n\tswitch (type) {\n\t\tcase \"odsp\":\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: () => {}, // do not update the document ID in odsp test cases\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: (resolvedUrl?: IResolvedUrl) => {\n\t\t\t\t\t// Extract the document ID from the resolved container's URL and reset the ID property\n\t\t\t\t\tdocumentId = resolvedUrl?.id ?? documentId;\n\t\t\t\t},\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/**\n * This class tracks events. It allows specifying expected events, which will be looked for in order.\n * It also tracks all unexpected errors.\n * At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and\n * any expected events that have not occurred.\n */\nexport class EventAndErrorTrackingLogger implements ITelemetryBaseLogger {\n\t/**\n\t * Even if these error events are logged, tests should still be allowed to pass\n\t * Additionally, if downgrade is true, then log as generic (e.g. to avoid polluting the e2e test logs)\n\t */\n\tprivate readonly allowedErrors: { eventName: string; downgrade?: true }[] = [\n\t\t// This log was removed in current version as unnecessary, but it's still present in previous versions\n\t\t{\n\t\t\teventName: \"fluid:telemetry:Container:NoRealStorageInDetachedContainer\",\n\t\t\tdowngrade: true,\n\t\t},\n\t\t// This log's category changes depending on the op latency. test results shouldn't be affected but if we see lots we'd like an alert from the logs.\n\t\t{ eventName: \"fluid:telemetry:OpPerf:OpRoundtripTime\" },\n\t];\n\n\tconstructor(private readonly baseLogger: ITelemetryBaseLogger) {}\n\n\tprivate readonly expectedEvents: (\n\t\t| { index: number; event: ITelemetryGenericEvent | undefined }\n\t\t| undefined\n\t)[] = [];\n\tprivate readonly unexpectedErrors: ITelemetryBaseEvent[] = [];\n\n\tpublic registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEvent[]) {\n\t\tif (this.expectedEvents.length !== 0) {\n\t\t\t// we don't have to error here. just no reason not to. given the events must be\n\t\t\t// ordered it could be tricky to figure out problems around multiple registrations.\n\t\t\tthrow new Error(\n\t\t\t\t\"Expected events already registered.\\n\" +\n\t\t\t\t\t\"Call reportAndClearTrackedEvents to clear them before registering more\",\n\t\t\t);\n\t\t}\n\t\tthis.expectedEvents.push(\n\t\t\t...orderedExpectedEvents.map((event, index) => ({ index, event })),\n\t\t);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tconst ee = this.expectedEvents[0]?.event;\n\t\tif (ee?.eventName === event.eventName) {\n\t\t\tlet matches = true;\n\t\t\tfor (const key of Object.keys(ee)) {\n\t\t\t\tif (ee[key] !== event[key]) {\n\t\t\t\t\tmatches = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matches) {\n\t\t\t\t// we found an expected event\n\t\t\t\t// so remove it from the list of expected events\n\t\t\t\t// and if it is an error, change it to generic\n\t\t\t\t// this helps keep our telemetry clear of\n\t\t\t\t// expected errors.\n\t\t\t\tthis.expectedEvents.shift();\n\t\t\t\tif (event.category === \"error\") {\n\t\t\t\t\tevent.category = \"generic\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.category === \"error\") {\n\t\t\t// Check to see if this error is allowed and if its category should be downgraded\n\t\t\tconst allowedError = this.allowedErrors.find(\n\t\t\t\t({ eventName }) => eventName === event.eventName,\n\t\t\t);\n\n\t\t\tif (allowedError === undefined) {\n\t\t\t\tthis.unexpectedErrors.push(event);\n\t\t\t} else if (allowedError.downgrade) {\n\t\t\t\tevent.category = \"generic\";\n\t\t\t}\n\t\t}\n\n\t\tthis.baseLogger.send(event);\n\t}\n\n\tpublic reportAndClearTrackedEvents() {\n\t\tconst expectedNotFound = this.expectedEvents.splice(0, this.expectedEvents.length);\n\t\tconst unexpectedErrors = this.unexpectedErrors.splice(0, this.unexpectedErrors.length);\n\t\treturn {\n\t\t\texpectedNotFound,\n\t\t\tunexpectedErrors,\n\t\t};\n\t}\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n */\nexport class TestObjectProvider implements ITestObjectProvider {\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\tprivate _logger: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n\t * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n\t * and factory for TestFluidObject\n\t */\n\tconstructor(\n\t\tpublic readonly LoaderConstructor: typeof Loader,\n\t\tpublic readonly driver: ITestDriver,\n\t\tpublic readonly createFluidEntryPoint: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driver.type);\n\t}\n\n\tget logger(): EventAndErrorTrackingLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._logger = new EventAndErrorTrackingLogger(\n\t\t\t\tcreateChildLogger({\n\t\t\t\t\tlogger: getTestLogger?.(),\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tall: {\n\t\t\t\t\t\t\tdriverType: this.driver.type,\n\t\t\t\t\t\t\tdriverEndpointName: this.driver.endpointName,\n\t\t\t\t\t\t\tdriverTenantName: this.driver.tenantName,\n\t\t\t\t\t\t\tdriverUserIndex: this.driver.userIndex,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tset logger(logger: EventAndErrorTrackingLogger) {\n\t\tthis._logger = logger;\n\t}\n\n\tget documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driver.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\tget urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driver.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\tget documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\tget defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\tget opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructor({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * Create a container using a default document id and code details.\n\t * Container created is automatically added to the OpProcessingController to manage op flow\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\tpublic async createContainer(entryPoint: fluidEntryPoint, loaderProps?: Partial<ILoaderProps>) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer> {\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader);\n\t}\n\n\tprivate async resolveContainer(loader: ILoader, headers?: IRequestHeader) {\n\t\treturn loader.resolve({\n\t\t\turl: await this.driver.createContainerUrl(this.documentId),\n\t\t\theaders,\n\t\t});\n\t}\n\n\t/**\n\t * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * Make a container using a default document id and code details\n\t * Container loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * Load a container using a default document id and code details.\n\t * IContainer loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t * @param requestHeader - optional headers to be supplied to the loader\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer> {\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\n\t\tconst container = await this.resolveContainer(loader, requestHeader);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\tpublic reset() {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._logger);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._logger = undefined;\n\t\tthis._documentCreated = false;\n\t}\n\n\tpublic async ensureSynchronized(): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized();\n\t}\n\n\tpublic async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\tupdateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\nexport function getUnexpectedLogErrorException(\n\tlogger: EventAndErrorTrackingLogger | undefined,\n\tprefix?: string,\n) {\n\tif (logger === undefined) {\n\t\treturn;\n\t}\n\tconst results = logger.reportAndClearTrackedEvents();\n\tif (results.unexpectedErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Unexpected Errors in Logs:\\n${JSON.stringify(\n\t\t\t\tresults.unexpectedErrors,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n\tif (results.expectedNotFound.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Expected Events not found:\\n${JSON.stringify(\n\t\t\t\tresults.expectedNotFound,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testObjectProvider.js","sourceRoot":"","sources":["../src/testObjectProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tIContainer,\n\tIHostLoader,\n\tIFluidCodeDetails,\n\tILoader,\n} from \"@fluidframework/container-definitions\";\nimport {\n\tILoaderProps,\n\tLoader,\n\twaitContainerToCatchUp as waitContainerToCatchUp_original,\n} from \"@fluidframework/container-loader\";\nimport { IContainerRuntimeOptions } from \"@fluidframework/container-runtime\";\nimport {\n\tITelemetryGenericEvent,\n\tITelemetryBaseLogger,\n\tITelemetryBaseEvent,\n\tIRequestHeader,\n} from \"@fluidframework/core-interfaces\";\nimport {\n\tIDocumentServiceFactory,\n\tIResolvedUrl,\n\tIUrlResolver,\n} from \"@fluidframework/driver-definitions\";\nimport { ITestDriver, TestDriverTypes } from \"@fluidframework/test-driver-definitions\";\nimport { v4 as uuid } from \"uuid\";\nimport { createChildLogger, createMultiSinkLogger } from \"@fluidframework/telemetry-utils\";\nimport { LoaderContainerTracker } from \"./loaderContainerTracker\";\nimport { fluidEntryPoint, LocalCodeLoader } from \"./localCodeLoader\";\nimport { createAndAttachContainer } from \"./localLoader\";\nimport { ChannelFactoryRegistry } from \"./testFluidObject\";\n\nconst defaultCodeDetails: IFluidCodeDetails = {\n\tpackage: \"defaultTestPackage\",\n\tconfig: {},\n};\n\n/**\n * @internal\n */\nexport interface IOpProcessingController {\n\tprocessIncoming(...containers: IContainer[]): Promise<void>;\n\tprocessOutgoing(...containers: IContainer[]): Promise<void>;\n\tpauseProcessing(...containers: IContainer[]): Promise<void>;\n\tresumeProcessing(...containers: IContainer[]): void;\n}\n\n/**\n * @internal\n */\nexport interface ITestObjectProvider {\n\t/**\n\t * Indicates which type of test object provider is being used.\n\t */\n\ttype: \"TestObjectProvider\" | \"TestObjectProviderWithVersionedLoad\";\n\n\t/**\n\t * The document id to retrieve or create containers\n\t */\n\tdocumentId: string;\n\n\t/**\n\t * Creates the document service after extracting different endpoints URLs from a resolved URL.\n\t */\n\tdocumentServiceFactory: IDocumentServiceFactory;\n\n\t/**\n\t * Test driver used to create the IDocumentServiceFactory. Varies depending on the test type.\n\t */\n\tdriver: ITestDriver;\n\n\t/**\n\t * Logger used to track expected and unexpected events.\n\t */\n\tlogger: EventAndErrorTrackingLogger | undefined;\n\n\t/**\n\t * Used to create a url for the created container with any data store path given in the relative url.\n\t */\n\turlResolver: IUrlResolver;\n\n\t/**\n\t * Default IFluidCodeDetails used to create containers.\n\t */\n\tdefaultCodeDetails: IFluidCodeDetails;\n\n\t/**\n\t * Contains functions to pause/resume op processing.\n\t */\n\topProcessingController: IOpProcessingController;\n\n\t/**\n\t * Represents the entry point for a Fluid container.\n\t */\n\tcreateFluidEntryPoint: (testContainerConfig?: ITestContainerConfig) => fluidEntryPoint;\n\n\t/**\n\t * Create a loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\tcreateLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): IHostLoader;\n\n\t/**\n\t * Create a container using a default document id and code details.\n\t * Container created is automatically added to the OpProcessingController to manage op flow\n\t *\n\t * Only the version of the loader will vary based on compat config. The version of\n\t * containerRuntime/dataRuntime used in fluidEntryPoint will be used as is from what is passed in.\n\t *\n\t * @param packageEntries - list of code details and fluidEntryPoint pairs.\n\t */\n\n\tcreateContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Loads a container using the default document id\n\t */\n\tloadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Make a test loader. Containers created/loaded through this loader will be added to the OpProcessingController.\n\t * The version of the loader/containerRuntime/dataRuntime may vary based on compat config of the current run\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestLoader(testContainerConfig?: ITestContainerConfig): IHostLoader;\n\n\t/**\n\t * Make a container using a default document id and code details\n\t * Container loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t */\n\tmakeTestContainer(testContainerConfig?: ITestContainerConfig): Promise<IContainer>;\n\n\t/**\n\t * Load a container using a default document id and code details.\n\t * IContainer loaded is automatically added to the OpProcessingController to manage op flow\n\t * @param testContainerConfig - optional configuring the test Container\n\t * @param requestHeader - optional headers to be supplied to the loader\n\t */\n\tloadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer>;\n\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdateDocumentId(url: IResolvedUrl | undefined): void;\n\n\t/**\n\t * Make sure all the tracked containers are synchronized.\n\t */\n\tensureSynchronized(timeoutDuration?: number): Promise<void>;\n\n\t/**\n\t * Reset the tracker, closing all containers and stop tracking them.\n\t */\n\tresetLoaderContainerTracker(syncSummarizerClients?: boolean);\n\n\t/**\n\t * Resets and closes all tracked containers and class states.\n\t */\n\treset(): void;\n}\n\n/**\n * @internal\n */\nexport enum DataObjectFactoryType {\n\tPrimed, // default\n\tTest,\n}\n\n/**\n * @internal\n */\nexport interface ITestContainerConfig {\n\t/** TestFluidDataObject instead of PrimedDataStore */\n\tfluidDataObjectType?: DataObjectFactoryType;\n\n\t/** An array of channel name and DDS factory pair to create on container creation time */\n\tregistry?: ChannelFactoryRegistry;\n\n\t/** Container runtime options for the container instance */\n\truntimeOptions?: IContainerRuntimeOptions;\n\n\t/** Whether this runtime should be instantiated using a mixed-in attributor class */\n\tenableAttribution?: boolean;\n\n\t/** Loader options for the loader used to create containers */\n\tloaderProps?: Partial<ILoaderProps>;\n}\n\n/**\n * @internal\n */\nexport const createDocumentId = (): string => uuid();\n\n/**\n * Used to retrieve, update, and reset document id based on the type of driver being used.\n *\n * @internal\n */\nexport interface IDocumentIdStrategy {\n\t/**\n\t * Get document id\n\t */\n\tget(): string;\n\t/**\n\t * Update the document ID from the resolved container's URL and reset the ID property\n\t */\n\tupdate(resolvedUrl?: IResolvedUrl): void;\n\t/**\n\t * Reset document id to a new document id\n\t */\n\treset(): void;\n}\n\n/**\n * Document ID is treated differently by test drivers. The key difference is in generating\n * a new container ID and accessing the container in multi-instance test cases.\n */\nfunction getDocumentIdStrategy(type?: TestDriverTypes): IDocumentIdStrategy {\n\tlet documentId = createDocumentId();\n\tswitch (type) {\n\t\tcase \"odsp\":\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: () => {}, // do not update the document ID in odsp test cases\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tget: () => documentId,\n\t\t\t\tupdate: (resolvedUrl?: IResolvedUrl) => {\n\t\t\t\t\t// Extract the document ID from the resolved container's URL and reset the ID property\n\t\t\t\t\tdocumentId = resolvedUrl?.id ?? documentId;\n\t\t\t\t},\n\t\t\t\treset: () => {\n\t\t\t\t\tdocumentId = createDocumentId();\n\t\t\t\t},\n\t\t\t};\n\t}\n}\n\n/**\n * This class tracks events. It allows specifying expected events, which will be looked for in order.\n * It also tracks all unexpected errors.\n * At any point you call reportAndClearTrackedEvents which will provide all unexpected errors, and\n * any expected events that have not occurred.\n * @internal\n */\nexport class EventAndErrorTrackingLogger implements ITelemetryBaseLogger {\n\t/**\n\t * Even if these error events are logged, tests should still be allowed to pass\n\t * Additionally, if downgrade is true, then log as generic (e.g. to avoid polluting the e2e test logs)\n\t */\n\tprivate readonly allowedErrors: { eventName: string; downgrade?: true }[] = [\n\t\t// This log was removed in current version as unnecessary, but it's still present in previous versions\n\t\t{\n\t\t\teventName: \"fluid:telemetry:Container:NoRealStorageInDetachedContainer\",\n\t\t\tdowngrade: true,\n\t\t},\n\t\t// This log's category changes depending on the op latency. test results shouldn't be affected but if we see lots we'd like an alert from the logs.\n\t\t{ eventName: \"fluid:telemetry:OpPerf:OpRoundtripTime\" },\n\t];\n\n\tconstructor(private readonly baseLogger: ITelemetryBaseLogger) {}\n\n\tprivate readonly expectedEvents: (\n\t\t| { index: number; event: ITelemetryGenericEvent | undefined }\n\t\t| undefined\n\t)[] = [];\n\tprivate readonly unexpectedErrors: ITelemetryBaseEvent[] = [];\n\n\tpublic registerExpectedEvent(...orderedExpectedEvents: ITelemetryGenericEvent[]) {\n\t\tif (this.expectedEvents.length !== 0) {\n\t\t\t// we don't have to error here. just no reason not to. given the events must be\n\t\t\t// ordered it could be tricky to figure out problems around multiple registrations.\n\t\t\tthrow new Error(\n\t\t\t\t\"Expected events already registered.\\n\" +\n\t\t\t\t\t\"Call reportAndClearTrackedEvents to clear them before registering more\",\n\t\t\t);\n\t\t}\n\t\tthis.expectedEvents.push(\n\t\t\t...orderedExpectedEvents.map((event, index) => ({ index, event })),\n\t\t);\n\t}\n\n\tsend(event: ITelemetryBaseEvent): void {\n\t\tconst ee = this.expectedEvents[0]?.event;\n\t\tif (ee?.eventName === event.eventName) {\n\t\t\tlet matches = true;\n\t\t\tfor (const key of Object.keys(ee)) {\n\t\t\t\tif (ee[key] !== event[key]) {\n\t\t\t\t\tmatches = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (matches) {\n\t\t\t\t// we found an expected event\n\t\t\t\t// so remove it from the list of expected events\n\t\t\t\t// and if it is an error, change it to generic\n\t\t\t\t// this helps keep our telemetry clear of\n\t\t\t\t// expected errors.\n\t\t\t\tthis.expectedEvents.shift();\n\t\t\t\tif (event.category === \"error\") {\n\t\t\t\t\tevent.category = \"generic\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (event.category === \"error\") {\n\t\t\t// Check to see if this error is allowed and if its category should be downgraded\n\t\t\tconst allowedError = this.allowedErrors.find(\n\t\t\t\t({ eventName }) => eventName === event.eventName,\n\t\t\t);\n\n\t\t\tif (allowedError === undefined) {\n\t\t\t\tthis.unexpectedErrors.push(event);\n\t\t\t} else if (allowedError.downgrade) {\n\t\t\t\tevent.category = \"generic\";\n\t\t\t}\n\t\t}\n\n\t\tthis.baseLogger.send(event);\n\t}\n\n\tpublic reportAndClearTrackedEvents() {\n\t\tconst expectedNotFound = this.expectedEvents.splice(0, this.expectedEvents.length);\n\t\tconst unexpectedErrors = this.unexpectedErrors.splice(0, this.unexpectedErrors.length);\n\t\treturn {\n\t\t\texpectedNotFound,\n\t\t\tunexpectedErrors,\n\t\t};\n\t}\n}\n\n/**\n * Shared base class for test object provider. Contain code for loader and container creation and loading\n * @internal\n */\nexport class TestObjectProvider implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProvider\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\tprivate _logger: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * Manage objects for loading and creating container, including the driver, loader, and OpProcessingController\n\t * @param createFluidEntryPoint - callback to create a fluidEntryPoint, with an optional set of channel name\n\t * and factory for TestFluidObject\n\t */\n\tconstructor(\n\t\tprivate readonly LoaderConstructor: typeof Loader,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.driver}\n\t\t */\n\t\tpublic readonly driver: ITestDriver,\n\t\t/**\n\t\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t\t */\n\t\tpublic readonly createFluidEntryPoint: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driver.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger(): EventAndErrorTrackingLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._logger = new EventAndErrorTrackingLogger(\n\t\t\t\tcreateChildLogger({\n\t\t\t\t\tlogger: getTestLogger?.(),\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tall: {\n\t\t\t\t\t\t\tdriverType: this.driver.type,\n\t\t\t\t\t\t\tdriverEndpointName: this.driver.endpointName,\n\t\t\t\t\t\t\tdriverTenantName: this.driver.tenantName,\n\t\t\t\t\t\t\tdriverUserIndex: this.driver.userIndex,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\tprivate set logger(logger: EventAndErrorTrackingLogger) {\n\t\tthis._logger = logger;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driver.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driver.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructor({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(entryPoint: fluidEntryPoint, loaderProps?: Partial<ILoaderProps>) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer> {\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader);\n\t}\n\n\tprivate async resolveContainer(loader: ILoader, headers?: IRequestHeader) {\n\t\treturn loader.resolve({\n\t\t\turl: await this.driver.createContainerUrl(this.documentId),\n\t\t\theaders,\n\t\t});\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driver.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer> {\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\n\t\tconst container = await this.resolveContainer(loader, requestHeader);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._logger);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._logger = undefined;\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized();\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n}\n\n/**\n * Implements {@link ITestObjectProvider}, but uses different versions to create and load containers.\n *\n * @internal\n */\nexport class TestObjectProviderWithVersionedLoad implements ITestObjectProvider {\n\t/**\n\t * {@inheritDoc ITestObjectProvider.\"type\"}\n\t */\n\tpublic readonly type = \"TestObjectProviderWithVersionedLoad\";\n\tprivate _loaderContainerTracker = new LoaderContainerTracker();\n\tprivate _logger: EventAndErrorTrackingLogger | undefined;\n\tprivate readonly _documentIdStrategy: IDocumentIdStrategy;\n\tprivate _documentServiceFactory: IDocumentServiceFactory | undefined;\n\tprivate _urlResolver: IUrlResolver | undefined;\n\t// Since documentId doesn't change we can only create/make one container. Call the load functions instead.\n\tprivate _documentCreated = false;\n\n\t/**\n\t * `_loadCount` is used to alternate which version we load the next container with.\n\t * loadCount is even then we will load with the \"create\" version, and if odd we load with the \"load\" version.\n\t * After each test we will reset loadCount to 0 to ensure we always create the first container with the create version.\n\t *\n\t * Note: This will only affect tests that load a container more than two times.\n\t */\n\n\tprivate _loadCount: number = 0;\n\n\tconstructor(\n\t\tprivate readonly LoaderConstructorForCreating: typeof Loader,\n\t\tprivate readonly LoaderConstructorForLoading: typeof Loader,\n\t\tprivate readonly driverForCreating: ITestDriver,\n\t\tprivate readonly driverForLoading: ITestDriver,\n\t\tprivate readonly createFluidEntryPointForCreating: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t\tprivate readonly createFluidEntryPointForLoading: (\n\t\t\ttestContainerConfig?: ITestContainerConfig,\n\t\t) => fluidEntryPoint,\n\t) {\n\t\tthis._documentIdStrategy = getDocumentIdStrategy(driverForCreating.type);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.logger}\n\t */\n\tpublic get logger(): EventAndErrorTrackingLogger {\n\t\tif (this._logger === undefined) {\n\t\t\tthis._logger = new EventAndErrorTrackingLogger(\n\t\t\t\tcreateChildLogger({\n\t\t\t\t\tlogger: getTestLogger?.(),\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn this._logger;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentServiceFactory}\n\t */\n\tpublic get documentServiceFactory() {\n\t\tif (!this._documentServiceFactory) {\n\t\t\tthis._documentServiceFactory = this.driverForCreating.createDocumentServiceFactory();\n\t\t}\n\t\treturn this._documentServiceFactory;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.urlResolver}\n\t */\n\tpublic get urlResolver() {\n\t\tif (!this._urlResolver) {\n\t\t\tthis._urlResolver = this.driverForCreating.createUrlResolver();\n\t\t}\n\t\treturn this._urlResolver;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.documentId}\n\t */\n\tpublic get documentId() {\n\t\treturn this._documentIdStrategy.get();\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.defaultCodeDetails}\n\t */\n\tpublic get defaultCodeDetails() {\n\t\treturn defaultCodeDetails;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.opProcessingController}\n\t */\n\tpublic get opProcessingController(): IOpProcessingController {\n\t\treturn this._loaderContainerTracker;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.driver}\n\t */\n\tpublic get driver(): ITestDriver {\n\t\treturn this.nextLoaderShouldCreate() ? this.driverForCreating : this.driverForLoading;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createFluidEntryPoint}\n\t */\n\tpublic get createFluidEntryPoint(): (\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t) => fluidEntryPoint {\n\t\treturn this.nextLoaderShouldCreate()\n\t\t\t? this.createFluidEntryPointForCreating\n\t\t\t: this.createFluidEntryPointForLoading;\n\t}\n\n\tprivate createLoaderForCreating(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForCreating({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\tprivate createLoaderForLoading(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\tconst logger = createMultiSinkLogger({\n\t\t\tloggers: [this.logger, loaderProps?.logger],\n\t\t});\n\n\t\tconst loader = new this.LoaderConstructorForLoading({\n\t\t\t...loaderProps,\n\t\t\tlogger,\n\t\t\tcodeLoader: loaderProps?.codeLoader ?? new LocalCodeLoader(packageEntries),\n\t\t\turlResolver: loaderProps?.urlResolver ?? this.urlResolver,\n\t\t\tdocumentServiceFactory:\n\t\t\t\tloaderProps?.documentServiceFactory ?? this.documentServiceFactory,\n\t\t});\n\n\t\tthis._loaderContainerTracker.add(loader);\n\t\treturn loader;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createLoader}\n\t */\n\tpublic createLoader(\n\t\tpackageEntries: Iterable<[IFluidCodeDetails, fluidEntryPoint]>,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t) {\n\t\treturn this.nextLoaderShouldCreate(/** increment */ true)\n\t\t\t? this.createLoaderForCreating(packageEntries, loaderProps)\n\t\t\t: this.createLoaderForLoading(packageEntries, loaderProps);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.createContainer}\n\t */\n\tpublic async createContainer(entryPoint: fluidEntryPoint, loaderProps?: Partial<ILoaderProps>) {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadContainer}\n\t */\n\tpublic async loadContainer(\n\t\tentryPoint: fluidEntryPoint,\n\t\tloaderProps?: Partial<ILoaderProps>,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer> {\n\t\tconst driver = this.nextLoaderShouldCreate()\n\t\t\t? this.driverForCreating\n\t\t\t: this.driverForLoading;\n\t\tconst loader = this.createLoader([[defaultCodeDetails, entryPoint]], loaderProps);\n\t\treturn this.resolveContainer(loader, requestHeader, driver);\n\t}\n\n\tprivate async resolveContainer(\n\t\tloader: ILoader,\n\t\theaders?: IRequestHeader,\n\t\tdriver?: ITestDriver,\n\t) {\n\t\treturn loader.resolve({\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\turl: await driver!.createContainerUrl(this.documentId),\n\t\t\theaders,\n\t\t});\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestLoader}\n\t */\n\tpublic makeTestLoader(testContainerConfig?: ITestContainerConfig) {\n\t\treturn this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.makeTestContainer}\n\t */\n\tpublic async makeTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t): Promise<IContainer> {\n\t\tif (this._documentCreated) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Only one container/document can be created. To load the container/document use loadTestContainer\",\n\t\t\t);\n\t\t}\n\t\tconst loader = this.createLoader(\n\t\t\t[[defaultCodeDetails, this.createFluidEntryPoint(testContainerConfig)]],\n\t\t\ttestContainerConfig?.loaderProps,\n\t\t);\n\t\tconst container = await createAndAttachContainer(\n\t\t\tdefaultCodeDetails,\n\t\t\tloader,\n\t\t\tthis.driverForCreating.createCreateNewRequest(this.documentId),\n\t\t);\n\t\tthis._documentCreated = true;\n\t\t// r11s driver will generate a new ID for the new container.\n\t\t// update the document ID with the actual ID of the attached container.\n\t\tthis._documentIdStrategy.update(container.resolvedUrl);\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.loadTestContainer}\n\t */\n\tpublic async loadTestContainer(\n\t\ttestContainerConfig?: ITestContainerConfig,\n\t\trequestHeader?: IRequestHeader,\n\t): Promise<IContainer> {\n\t\t// Keep track of which Loader we are about to use so we can pass the correct driver through\n\t\tconst driver = this.nextLoaderShouldCreate()\n\t\t\t? this.driverForCreating\n\t\t\t: this.driverForLoading;\n\t\tconst loader = this.makeTestLoader(testContainerConfig);\n\t\tconst container = await this.resolveContainer(loader, requestHeader, driver);\n\t\tawait this.waitContainerToCatchUp(container);\n\n\t\treturn container;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.reset}\n\t */\n\tpublic reset() {\n\t\tthis._loadCount = 0;\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._logger = undefined;\n\t\tthis._documentServiceFactory = undefined;\n\t\tthis._urlResolver = undefined;\n\t\tthis._documentIdStrategy.reset();\n\t\tconst logError = getUnexpectedLogErrorException(this._logger);\n\t\tif (logError) {\n\t\t\tthrow logError;\n\t\t}\n\t\tthis._documentCreated = false;\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.ensureSynchronized}\n\t */\n\tpublic async ensureSynchronized(): Promise<void> {\n\t\treturn this._loaderContainerTracker.ensureSynchronized();\n\t}\n\n\tprivate async waitContainerToCatchUp(container: IContainer) {\n\t\t// The original waitContainerToCatchUp() from container loader uses either Container.resume()\n\t\t// or Container.connect() as part of its implementation. However, resume() was deprecated\n\t\t// and eventually replaced with connect(). To avoid issues during LTS compatibility testing\n\t\t// with older container versions issues, we use resume() when connect() is unavailable.\n\t\tif ((container as any).connect === undefined) {\n\t\t\t(container as any).connect = (container as any).resume;\n\t\t}\n\n\t\treturn waitContainerToCatchUp_original(container);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.updateDocumentId}\n\t */\n\tpublic updateDocumentId(resolvedUrl: IResolvedUrl | undefined) {\n\t\tthis._documentIdStrategy.update(resolvedUrl);\n\t}\n\n\t/**\n\t * {@inheritDoc ITestObjectProvider.resetLoaderContainerTracker}\n\t */\n\tpublic resetLoaderContainerTracker(syncSummarizerClients: boolean = false) {\n\t\tthis._loaderContainerTracker.reset();\n\t\tthis._loaderContainerTracker = new LoaderContainerTracker(syncSummarizerClients);\n\t}\n\n\tprivate nextLoaderShouldCreate(increment: boolean = false): boolean {\n\t\tconst shouldCreate = this._loadCount % 2 === 0;\n\t\tif (increment) {\n\t\t\tthis._loadCount++;\n\t\t}\n\t\treturn shouldCreate;\n\t}\n}\n\n/**\n * @internal\n */\nexport function getUnexpectedLogErrorException(\n\tlogger: EventAndErrorTrackingLogger | undefined,\n\tprefix?: string,\n) {\n\tif (logger === undefined) {\n\t\treturn;\n\t}\n\tconst results = logger.reportAndClearTrackedEvents();\n\tif (results.unexpectedErrors.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Unexpected Errors in Logs:\\n${JSON.stringify(\n\t\t\t\tresults.unexpectedErrors,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n\tif (results.expectedNotFound.length > 0) {\n\t\treturn new Error(\n\t\t\t`${prefix ?? \"\"}Expected Events not found:\\n${JSON.stringify(\n\t\t\t\tresults.expectedNotFound,\n\t\t\t\tundefined,\n\t\t\t\t2,\n\t\t\t)}`,\n\t\t);\n\t}\n}\n"]}
|