@fluidframework/container-runtime 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.3.0.0.250606
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/api-report/container-runtime.api.md +81 -27
- package/dist/batchTracker.d.ts +1 -1
- package/dist/batchTracker.d.ts.map +1 -1
- package/dist/batchTracker.js +2 -2
- package/dist/batchTracker.js.map +1 -1
- package/dist/blobManager.d.ts +3 -3
- package/dist/blobManager.d.ts.map +1 -1
- package/dist/blobManager.js +3 -3
- package/dist/blobManager.js.map +1 -1
- package/dist/channelCollection.d.ts +6 -5
- package/dist/channelCollection.d.ts.map +1 -1
- package/dist/channelCollection.js +57 -19
- package/dist/channelCollection.js.map +1 -1
- package/dist/connectionTelemetry.d.ts +2 -2
- package/dist/connectionTelemetry.d.ts.map +1 -1
- package/dist/connectionTelemetry.js +3 -3
- package/dist/connectionTelemetry.js.map +1 -1
- package/dist/container-runtime-alpha.d.ts +205 -12
- package/dist/container-runtime-beta.d.ts +16 -3
- package/dist/container-runtime-public.d.ts +16 -3
- package/dist/container-runtime-untrimmed.d.ts +207 -26
- package/dist/containerHandleContext.d.ts.map +1 -1
- package/dist/containerHandleContext.js.map +1 -1
- package/dist/containerRuntime.d.ts +32 -26
- package/dist/containerRuntime.d.ts.map +1 -1
- package/dist/containerRuntime.js +235 -133
- package/dist/containerRuntime.js.map +1 -1
- package/dist/dataStore.d.ts +1 -1
- package/dist/dataStore.d.ts.map +1 -1
- package/dist/dataStore.js +2 -2
- package/dist/dataStore.js.map +1 -1
- package/dist/dataStoreContext.d.ts +4 -4
- package/dist/dataStoreContext.d.ts.map +1 -1
- package/dist/dataStoreContext.js +18 -18
- package/dist/dataStoreContext.js.map +1 -1
- package/dist/dataStoreContexts.d.ts.map +1 -1
- package/dist/dataStoreContexts.js.map +1 -1
- package/dist/dataStoreRegistry.d.ts +4 -0
- package/dist/dataStoreRegistry.d.ts.map +1 -1
- package/dist/dataStoreRegistry.js +2 -2
- package/dist/dataStoreRegistry.js.map +1 -1
- package/dist/deltaScheduler.d.ts +1 -1
- package/dist/deltaScheduler.d.ts.map +1 -1
- package/dist/deltaScheduler.js +1 -1
- package/dist/deltaScheduler.js.map +1 -1
- package/dist/gc/garbageCollection.d.ts +1 -1
- package/dist/gc/garbageCollection.d.ts.map +1 -1
- package/dist/gc/garbageCollection.js +1 -1
- package/dist/gc/garbageCollection.js.map +1 -1
- package/dist/gc/gcConfigs.d.ts +1 -1
- package/dist/gc/gcConfigs.d.ts.map +1 -1
- package/dist/gc/gcConfigs.js.map +1 -1
- package/dist/gc/gcDefinitions.d.ts +1 -1
- package/dist/gc/gcDefinitions.d.ts.map +1 -1
- package/dist/gc/gcDefinitions.js.map +1 -1
- package/dist/gc/gcHelpers.d.ts.map +1 -1
- package/dist/gc/gcHelpers.js.map +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts +1 -1
- package/dist/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/dist/gc/gcSummaryStateTracker.js.map +1 -1
- package/dist/gc/gcTelemetry.d.ts +1 -1
- package/dist/gc/gcTelemetry.d.ts.map +1 -1
- package/dist/gc/gcTelemetry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/messageTypes.d.ts +11 -5
- package/dist/messageTypes.d.ts.map +1 -1
- package/dist/messageTypes.js +4 -0
- package/dist/messageTypes.js.map +1 -1
- package/dist/opLifecycle/definitions.d.ts +1 -19
- package/dist/opLifecycle/definitions.d.ts.map +1 -1
- package/dist/opLifecycle/definitions.js.map +1 -1
- package/dist/opLifecycle/index.d.ts +3 -3
- package/dist/opLifecycle/index.d.ts.map +1 -1
- package/dist/opLifecycle/index.js +3 -1
- package/dist/opLifecycle/index.js.map +1 -1
- package/dist/opLifecycle/opCompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opCompressor.js +2 -3
- package/dist/opLifecycle/opCompressor.js.map +1 -1
- package/dist/opLifecycle/opDecompressor.d.ts +15 -4
- package/dist/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/dist/opLifecycle/opDecompressor.js +60 -61
- package/dist/opLifecycle/opDecompressor.js.map +1 -1
- package/dist/opLifecycle/opGroupingManager.d.ts +2 -1
- package/dist/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/dist/opLifecycle/opGroupingManager.js +9 -11
- package/dist/opLifecycle/opGroupingManager.js.map +1 -1
- package/dist/opLifecycle/opSplitter.d.ts +11 -3
- package/dist/opLifecycle/opSplitter.d.ts.map +1 -1
- package/dist/opLifecycle/opSplitter.js +48 -38
- package/dist/opLifecycle/opSplitter.js.map +1 -1
- package/dist/opLifecycle/outbox.d.ts.map +1 -1
- package/dist/opLifecycle/outbox.js +18 -17
- package/dist/opLifecycle/outbox.js.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/dist/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/dist/opLifecycle/remoteMessageProcessor.js +36 -32
- package/dist/opLifecycle/remoteMessageProcessor.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/pendingStateManager.d.ts +1 -1
- package/dist/pendingStateManager.d.ts.map +1 -1
- package/dist/pendingStateManager.js.map +1 -1
- package/dist/scheduleManager.d.ts +1 -1
- package/dist/scheduleManager.d.ts.map +1 -1
- package/dist/scheduleManager.js +6 -2
- package/dist/scheduleManager.js.map +1 -1
- package/dist/summary/documentSchema.d.ts +178 -0
- package/dist/summary/documentSchema.d.ts.map +1 -0
- package/dist/summary/documentSchema.js +345 -0
- package/dist/summary/documentSchema.js.map +1 -0
- package/dist/summary/index.d.ts +2 -1
- package/dist/summary/index.d.ts.map +1 -1
- package/dist/summary/index.js +4 -1
- package/dist/summary/index.js.map +1 -1
- package/dist/summary/orderedClientElection.d.ts +2 -2
- package/dist/summary/orderedClientElection.d.ts.map +1 -1
- package/dist/summary/orderedClientElection.js +7 -2
- package/dist/summary/orderedClientElection.js.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/dist/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/dist/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/dist/summary/runningSummarizer.d.ts +2 -2
- package/dist/summary/runningSummarizer.d.ts.map +1 -1
- package/dist/summary/runningSummarizer.js +2 -2
- package/dist/summary/runningSummarizer.js.map +1 -1
- package/dist/summary/summarizer.d.ts +2 -2
- package/dist/summary/summarizer.d.ts.map +1 -1
- package/dist/summary/summarizer.js +2 -2
- package/dist/summary/summarizer.js.map +1 -1
- package/dist/summary/summarizerClientElection.d.ts +2 -2
- package/dist/summary/summarizerClientElection.d.ts.map +1 -1
- package/dist/summary/summarizerClientElection.js.map +1 -1
- package/dist/summary/summarizerHeuristics.d.ts +1 -1
- package/dist/summary/summarizerHeuristics.d.ts.map +1 -1
- package/dist/summary/summarizerHeuristics.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/dist/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNode.js +3 -3
- package/dist/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/dist/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/dist/summary/summarizerTypes.d.ts +3 -3
- package/dist/summary/summarizerTypes.d.ts.map +1 -1
- package/dist/summary/summarizerTypes.js.map +1 -1
- package/dist/summary/summaryCollection.d.ts +2 -2
- package/dist/summary/summaryCollection.d.ts.map +1 -1
- package/dist/summary/summaryCollection.js +1 -1
- package/dist/summary/summaryCollection.js.map +1 -1
- package/dist/summary/summaryFormat.d.ts +5 -16
- package/dist/summary/summaryFormat.d.ts.map +1 -1
- package/dist/summary/summaryFormat.js.map +1 -1
- package/dist/summary/summaryGenerator.d.ts +2 -2
- package/dist/summary/summaryGenerator.d.ts.map +1 -1
- package/dist/summary/summaryGenerator.js +2 -2
- package/dist/summary/summaryGenerator.js.map +1 -1
- package/dist/summary/summaryManager.d.ts +1 -1
- package/dist/summary/summaryManager.d.ts.map +1 -1
- package/dist/summary/summaryManager.js +2 -2
- package/dist/summary/summaryManager.js.map +1 -1
- package/lib/batchTracker.d.ts +1 -1
- package/lib/batchTracker.d.ts.map +1 -1
- package/lib/batchTracker.js +2 -2
- package/lib/batchTracker.js.map +1 -1
- package/lib/blobManager.d.ts +3 -3
- package/lib/blobManager.d.ts.map +1 -1
- package/lib/blobManager.js +5 -5
- package/lib/blobManager.js.map +1 -1
- package/lib/channelCollection.d.ts +6 -5
- package/lib/channelCollection.d.ts.map +1 -1
- package/lib/channelCollection.js +59 -21
- package/lib/channelCollection.js.map +1 -1
- package/lib/connectionTelemetry.d.ts +2 -2
- package/lib/connectionTelemetry.d.ts.map +1 -1
- package/lib/connectionTelemetry.js +3 -3
- package/lib/connectionTelemetry.js.map +1 -1
- package/lib/container-runtime-alpha.d.ts +205 -12
- package/lib/container-runtime-beta.d.ts +16 -3
- package/lib/container-runtime-public.d.ts +16 -3
- package/lib/container-runtime-untrimmed.d.ts +207 -26
- package/lib/containerHandleContext.d.ts.map +1 -1
- package/lib/containerHandleContext.js.map +1 -1
- package/lib/containerRuntime.d.ts +32 -26
- package/lib/containerRuntime.d.ts.map +1 -1
- package/lib/containerRuntime.js +197 -95
- package/lib/containerRuntime.js.map +1 -1
- package/lib/dataStore.d.ts +1 -1
- package/lib/dataStore.d.ts.map +1 -1
- package/lib/dataStore.js +2 -2
- package/lib/dataStore.js.map +1 -1
- package/lib/dataStoreContext.d.ts +4 -4
- package/lib/dataStoreContext.d.ts.map +1 -1
- package/lib/dataStoreContext.js +3 -3
- package/lib/dataStoreContext.js.map +1 -1
- package/lib/dataStoreContexts.d.ts.map +1 -1
- package/lib/dataStoreContexts.js.map +1 -1
- package/lib/dataStoreRegistry.d.ts +4 -0
- package/lib/dataStoreRegistry.d.ts.map +1 -1
- package/lib/dataStoreRegistry.js.map +1 -1
- package/lib/deltaScheduler.d.ts +1 -1
- package/lib/deltaScheduler.d.ts.map +1 -1
- package/lib/deltaScheduler.js +1 -1
- package/lib/deltaScheduler.js.map +1 -1
- package/lib/gc/garbageCollection.d.ts +1 -1
- package/lib/gc/garbageCollection.d.ts.map +1 -1
- package/lib/gc/garbageCollection.js +3 -3
- package/lib/gc/garbageCollection.js.map +1 -1
- package/lib/gc/gcConfigs.d.ts +1 -1
- package/lib/gc/gcConfigs.d.ts.map +1 -1
- package/lib/gc/gcConfigs.js +1 -1
- package/lib/gc/gcConfigs.js.map +1 -1
- package/lib/gc/gcDefinitions.d.ts +1 -1
- package/lib/gc/gcDefinitions.d.ts.map +1 -1
- package/lib/gc/gcDefinitions.js.map +1 -1
- package/lib/gc/gcHelpers.d.ts.map +1 -1
- package/lib/gc/gcHelpers.js.map +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts +1 -1
- package/lib/gc/gcSummaryStateTracker.d.ts.map +1 -1
- package/lib/gc/gcSummaryStateTracker.js +1 -1
- package/lib/gc/gcSummaryStateTracker.js.map +1 -1
- package/lib/gc/gcTelemetry.d.ts +1 -1
- package/lib/gc/gcTelemetry.d.ts.map +1 -1
- package/lib/gc/gcTelemetry.js +1 -1
- package/lib/gc/gcTelemetry.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/messageTypes.d.ts +11 -5
- package/lib/messageTypes.d.ts.map +1 -1
- package/lib/messageTypes.js +4 -0
- package/lib/messageTypes.js.map +1 -1
- package/lib/opLifecycle/definitions.d.ts +1 -19
- package/lib/opLifecycle/definitions.d.ts.map +1 -1
- package/lib/opLifecycle/definitions.js.map +1 -1
- package/lib/opLifecycle/index.d.ts +3 -3
- package/lib/opLifecycle/index.d.ts.map +1 -1
- package/lib/opLifecycle/index.js +2 -2
- package/lib/opLifecycle/index.js.map +1 -1
- package/lib/opLifecycle/opCompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opCompressor.js +2 -3
- package/lib/opLifecycle/opCompressor.js.map +1 -1
- package/lib/opLifecycle/opDecompressor.d.ts +15 -4
- package/lib/opLifecycle/opDecompressor.d.ts.map +1 -1
- package/lib/opLifecycle/opDecompressor.js +60 -61
- package/lib/opLifecycle/opDecompressor.js.map +1 -1
- package/lib/opLifecycle/opGroupingManager.d.ts +2 -1
- package/lib/opLifecycle/opGroupingManager.d.ts.map +1 -1
- package/lib/opLifecycle/opGroupingManager.js +7 -10
- package/lib/opLifecycle/opGroupingManager.js.map +1 -1
- package/lib/opLifecycle/opSplitter.d.ts +11 -3
- package/lib/opLifecycle/opSplitter.d.ts.map +1 -1
- package/lib/opLifecycle/opSplitter.js +46 -37
- package/lib/opLifecycle/opSplitter.js.map +1 -1
- package/lib/opLifecycle/outbox.d.ts.map +1 -1
- package/lib/opLifecycle/outbox.js +18 -17
- package/lib/opLifecycle/outbox.js.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.d.ts +8 -0
- package/lib/opLifecycle/remoteMessageProcessor.d.ts.map +1 -1
- package/lib/opLifecycle/remoteMessageProcessor.js +36 -32
- package/lib/opLifecycle/remoteMessageProcessor.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/pendingStateManager.d.ts +1 -1
- package/lib/pendingStateManager.d.ts.map +1 -1
- package/lib/pendingStateManager.js.map +1 -1
- package/lib/scheduleManager.d.ts +1 -1
- package/lib/scheduleManager.d.ts.map +1 -1
- package/lib/scheduleManager.js +6 -2
- package/lib/scheduleManager.js.map +1 -1
- package/lib/summary/documentSchema.d.ts +178 -0
- package/lib/summary/documentSchema.d.ts.map +1 -0
- package/lib/summary/documentSchema.js +341 -0
- package/lib/summary/documentSchema.js.map +1 -0
- package/lib/summary/index.d.ts +2 -1
- package/lib/summary/index.d.ts.map +1 -1
- package/lib/summary/index.js +1 -0
- package/lib/summary/index.js.map +1 -1
- package/lib/summary/orderedClientElection.d.ts +2 -2
- package/lib/summary/orderedClientElection.d.ts.map +1 -1
- package/lib/summary/orderedClientElection.js +7 -2
- package/lib/summary/orderedClientElection.js.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts +1 -1
- package/lib/summary/runWhileConnectedCoordinator.d.ts.map +1 -1
- package/lib/summary/runWhileConnectedCoordinator.js.map +1 -1
- package/lib/summary/runningSummarizer.d.ts +2 -2
- package/lib/summary/runningSummarizer.d.ts.map +1 -1
- package/lib/summary/runningSummarizer.js +3 -3
- package/lib/summary/runningSummarizer.js.map +1 -1
- package/lib/summary/summarizer.d.ts +2 -2
- package/lib/summary/summarizer.d.ts.map +1 -1
- package/lib/summary/summarizer.js +3 -3
- package/lib/summary/summarizer.js.map +1 -1
- package/lib/summary/summarizerClientElection.d.ts +2 -2
- package/lib/summary/summarizerClientElection.d.ts.map +1 -1
- package/lib/summary/summarizerClientElection.js.map +1 -1
- package/lib/summary/summarizerHeuristics.d.ts +1 -1
- package/lib/summary/summarizerHeuristics.d.ts.map +1 -1
- package/lib/summary/summarizerHeuristics.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.d.ts +2 -2
- package/lib/summary/summarizerNode/summarizerNode.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNode.js +4 -4
- package/lib/summary/summarizerNode/summarizerNode.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeUtils.js.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.d.ts.map +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js +1 -1
- package/lib/summary/summarizerNode/summarizerNodeWithGc.js.map +1 -1
- package/lib/summary/summarizerTypes.d.ts +3 -3
- package/lib/summary/summarizerTypes.d.ts.map +1 -1
- package/lib/summary/summarizerTypes.js.map +1 -1
- package/lib/summary/summaryCollection.d.ts +2 -2
- package/lib/summary/summaryCollection.d.ts.map +1 -1
- package/lib/summary/summaryCollection.js +1 -1
- package/lib/summary/summaryCollection.js.map +1 -1
- package/lib/summary/summaryFormat.d.ts +5 -16
- package/lib/summary/summaryFormat.d.ts.map +1 -1
- package/lib/summary/summaryFormat.js +1 -1
- package/lib/summary/summaryFormat.js.map +1 -1
- package/lib/summary/summaryGenerator.d.ts +2 -2
- package/lib/summary/summaryGenerator.d.ts.map +1 -1
- package/lib/summary/summaryGenerator.js +3 -3
- package/lib/summary/summaryGenerator.js.map +1 -1
- package/lib/summary/summaryManager.d.ts +1 -1
- package/lib/summary/summaryManager.d.ts.map +1 -1
- package/lib/summary/summaryManager.js +2 -2
- package/lib/summary/summaryManager.js.map +1 -1
- package/lib/test/blobManager.spec.js +3 -3
- package/lib/test/blobManager.spec.js.map +1 -1
- package/lib/test/containerRuntime.spec.js +6 -4
- package/lib/test/containerRuntime.spec.js.map +1 -1
- package/lib/test/dataStoreContext.spec.js +4 -4
- package/lib/test/dataStoreContext.spec.js.map +1 -1
- package/lib/test/dataStoreCreation.spec.js +1 -1
- package/lib/test/dataStoreCreation.spec.js.map +1 -1
- package/lib/test/dataStoreRegistry.spec.js.map +1 -1
- package/lib/test/documentSchema.spec.js +282 -0
- package/lib/test/documentSchema.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +11 -7
- package/lib/test/fuzz/fuzzUtils.js.map +1 -1
- package/lib/test/fuzz/summarizer.fuzz.spec.js +9 -7
- package/lib/test/fuzz/summarizer.fuzz.spec.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzMocks.js +43 -25
- package/lib/test/fuzz/summarizerFuzzMocks.js.map +1 -1
- package/lib/test/fuzz/summarizerFuzzSuite.js +7 -4
- package/lib/test/fuzz/summarizerFuzzSuite.js.map +1 -1
- package/lib/test/gc/garbageCollection.spec.js +5 -5
- package/lib/test/gc/garbageCollection.spec.js.map +1 -1
- package/lib/test/gc/gcConfigs.spec.js +2 -2
- package/lib/test/gc/gcConfigs.spec.js.map +1 -1
- package/lib/test/gc/gcHelpers.spec.js.map +1 -1
- package/lib/test/gc/gcStats.spec.js +2 -2
- package/lib/test/gc/gcStats.spec.js.map +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js +1 -1
- package/lib/test/gc/gcSummaryStateTracker.spec.js.map +1 -1
- package/lib/test/gc/gcTelemetry.spec.js +3 -3
- package/lib/test/gc/gcTelemetry.spec.js.map +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js +1 -1
- package/lib/test/gc/gcUnreferencedStateTracker.spec.js.map +1 -1
- package/lib/test/getPendingBlobs.spec.js +1 -1
- package/lib/test/getPendingBlobs.spec.js.map +1 -1
- package/lib/test/hardwareStats.spec.js +1 -1
- package/lib/test/hardwareStats.spec.js.map +1 -1
- package/lib/test/opLifecycle/OpGroupingManager.spec.js +95 -118
- package/lib/test/opLifecycle/OpGroupingManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js +1 -1
- package/lib/test/opLifecycle/batchManager.spec.js.map +1 -1
- package/lib/test/opLifecycle/opCompressor.spec.js +0 -1
- package/lib/test/opLifecycle/opCompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opDecompressor.spec.js +60 -55
- package/lib/test/opLifecycle/opDecompressor.spec.js.map +1 -1
- package/lib/test/opLifecycle/opSplitter.spec.js +56 -41
- package/lib/test/opLifecycle/opSplitter.spec.js.map +1 -1
- package/lib/test/opLifecycle/outbox.spec.js +118 -10
- package/lib/test/opLifecycle/outbox.spec.js.map +1 -1
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js +115 -91
- package/lib/test/opLifecycle/remoteMessageProcessor.spec.js.map +1 -1
- package/lib/test/pendingStateManager.spec.js +1 -1
- package/lib/test/pendingStateManager.spec.js.map +1 -1
- package/lib/test/scheduleManager.spec.js +1 -1
- package/lib/test/scheduleManager.spec.js.map +1 -1
- package/lib/test/summarizerNode.spec.js +1 -1
- package/lib/test/summarizerNode.spec.js.map +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js +1 -1
- package/lib/test/summarizerNodeWithGc.spec.js.map +1 -1
- package/lib/test/summary/runningSummarizer.spec.js +4 -4
- package/lib/test/summary/runningSummarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizer.spec.js.map +1 -1
- package/lib/test/summary/summarizerClientElection.spec.js +2 -2
- package/lib/test/summary/summarizerClientElection.spec.js.map +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js +1 -1
- package/lib/test/summary/summarizerHeuristics.spec.js.map +1 -1
- package/lib/test/summary/summaryCollection.spec.js +1 -1
- package/lib/test/summary/summaryCollection.spec.js.map +1 -1
- package/lib/test/summary/summaryManager.spec.js +3 -3
- package/lib/test/summary/summaryManager.spec.js.map +1 -1
- package/lib/test/throttler.spec.js +1 -1
- package/lib/test/throttler.spec.js.map +1 -1
- package/lib/test/types/validateContainerRuntimePrevious.generated.js +6 -4
- package/lib/test/types/validateContainerRuntimePrevious.generated.js.map +1 -1
- package/package.json +35 -21
- package/src/batchTracker.ts +3 -3
- package/src/blobManager.ts +15 -15
- package/src/channelCollection.ts +90 -44
- package/src/connectionTelemetry.ts +10 -10
- package/src/containerHandleContext.ts +1 -1
- package/src/containerRuntime.ts +375 -213
- package/src/dataStore.ts +2 -2
- package/src/dataStoreContext.ts +19 -19
- package/src/dataStoreContexts.ts +2 -2
- package/src/dataStoreRegistry.ts +2 -1
- package/src/deltaScheduler.ts +1 -1
- package/src/gc/garbageCollection.ts +12 -12
- package/src/gc/gcConfigs.ts +11 -11
- package/src/gc/gcDefinitions.ts +2 -2
- package/src/gc/gcHelpers.ts +2 -2
- package/src/gc/gcSummaryStateTracker.ts +4 -4
- package/src/gc/gcTelemetry.ts +6 -6
- package/src/index.ts +8 -1
- package/src/messageTypes.ts +18 -5
- package/src/opLifecycle/README.md +89 -0
- package/src/opLifecycle/definitions.ts +1 -20
- package/src/opLifecycle/index.ts +3 -9
- package/src/opLifecycle/opCompressor.ts +4 -5
- package/src/opLifecycle/opDecompressor.ts +83 -100
- package/src/opLifecycle/opGroupingManager.ts +9 -12
- package/src/opLifecycle/opSplitter.ts +73 -47
- package/src/opLifecycle/outbox.ts +26 -37
- package/src/opLifecycle/remoteMessageProcessor.ts +41 -55
- package/src/packageVersion.ts +1 -1
- package/src/pendingStateManager.ts +2 -2
- package/src/scheduleManager.ts +8 -7
- package/src/summary/documentSchema.ts +553 -0
- package/src/summary/index.ts +10 -1
- package/src/summary/orderedClientElection.ts +7 -5
- package/src/summary/runWhileConnectedCoordinator.ts +1 -1
- package/src/summary/runningSummarizer.ts +19 -19
- package/src/summary/summarizer.ts +14 -14
- package/src/summary/summarizerClientElection.ts +2 -2
- package/src/summary/summarizerHeuristics.ts +2 -2
- package/src/summary/summarizerNode/summarizerNode.ts +15 -15
- package/src/summary/summarizerNode/summarizerNodeUtils.ts +1 -1
- package/src/summary/summarizerNode/summarizerNodeWithGc.ts +4 -4
- package/src/summary/summarizerTypes.ts +3 -3
- package/src/summary/summaryCollection.ts +3 -3
- package/src/summary/summaryFormat.ts +8 -19
- package/src/summary/summaryGenerator.ts +10 -10
- package/src/summary/summaryManager.ts +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizerFuzzMocks.js","sourceRoot":"","sources":["../../../src/test/fuzz/summarizerFuzzMocks.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\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\ttype IMockContainerRuntimeOptions,\n\tMockFluidDataStoreRuntime,\n} from \"@fluidframework/test-runtime-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tcreateChildLogger,\n\traiseConnectedEvent,\n\ttype ITelemetryLoggerExt,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\tMessageType,\n\ttype ISequencedDocumentMessage,\n\ttype ISummaryContent,\n\tSummaryType,\n\ttype ISummaryNack,\n\ttype IDocumentMessage,\n} from \"@fluidframework/protocol-definitions\";\nimport { mergeStats } from \"@fluidframework/runtime-utils\";\nimport { type ISummaryConfiguration } from \"../../index.js\";\nimport {\n\tIConnectableRuntime,\n\tSummarizer,\n\tISummarizerClientElectionEvents,\n\tSummaryManager,\n\tISummarizerClientElection,\n\ttype IConnectedState,\n\ttype IConnectedEvents,\n\tSummaryCollection,\n\ttype ISummarizerRuntime,\n\ttype ISummarizerInternalsProvider,\n\ttype ISubmitSummaryOptions,\n\ttype SubmitSummaryResult,\n\ttype IRefreshSummaryAckOptions,\n\tRunWhileConnectedCoordinator,\n\ttype IGeneratedSummaryStats,\n} from \"../../summary/index.js\";\nimport type { IThrottler } from \"../../throttler.js\";\n\nexport class MockContainerRuntimeFactoryForSummarizer extends MockContainerRuntimeFactoryForReconnection {\n\toverride createContainerRuntime(\n\t\tdataStoreRuntime: MockFluidDataStoreRuntime,\n\t\toverrides?: { minimumSequenceNumber?: number },\n\t): MockContainerRuntimeForSummarizer {\n\t\tconst containerRuntime = new MockContainerRuntimeForSummarizer(\n\t\t\tdataStoreRuntime,\n\t\t\tthis,\n\t\t\tthis.runtimeOptions,\n\t\t\toverrides,\n\t\t);\n\t\tthis.runtimes.add(containerRuntime);\n\t\treturn containerRuntime;\n\t}\n}\n\nexport interface IMockContainerRuntimeForSummarizerOptions extends IMockContainerRuntimeOptions {\n\tsummaryConfiguration?: ISummaryConfiguration;\n}\n\nconst DefaultSummaryConfiguration: ISummaryConfiguration = {\n\tstate: \"disableHeuristics\",\n\tmaxAckWaitTime: 3 * 60 * 1000, // 3 mins.\n\tmaxOpsSinceLastSummary: 7000,\n\tinitialSummarizerDelayMs: 5 * 1000, // 5 secs.\n};\n\nexport class MockContainerRuntimeForSummarizer\n\textends MockContainerRuntimeForReconnection\n\timplements ISummarizerRuntime, ISummarizerInternalsProvider\n{\n\tpublic readonly logger = createChildLogger();\n\tpublic readonly summarizerClientId: string | undefined;\n\tpublic readonly summarizer: Summarizer;\n\n\tprivate readonly summaryManager: SummaryManager;\n\tprivate readonly connectedState: MockConnectedState;\n\tprivate readonly summaryCollection: SummaryCollection;\n\tprivate readonly summarizerClientElection: MockSummarizerClientElection;\n\n\tconstructor(\n\t\tdataStoreRuntime: MockFluidDataStoreRuntime,\n\t\tfactory: MockContainerRuntimeFactoryForSummarizer,\n\t\truntimeOptions: IMockContainerRuntimeForSummarizerOptions = {},\n\t\toverrides?: { minimumSequenceNumber?: number },\n\t) {\n\t\tsuper(dataStoreRuntime, factory, runtimeOptions, overrides);\n\n\t\tthis.deltaManager.on(\"op\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.emit(\"op\", message);\n\t\t});\n\n\t\tthis.summarizerClientElection = new MockSummarizerClientElection(this.clientId);\n\t\tthis.connectedState = new MockConnectedState(this.logger, this.clientId);\n\t\tthis.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);\n\n\t\tconst summaryConfiguration: ISummaryConfiguration = {\n\t\t\t...DefaultSummaryConfiguration,\n\t\t\t...runtimeOptions.summaryConfiguration,\n\t\t};\n\n\t\tthis.summarizer = new Summarizer(\n\t\t\tthis /* summarizerRuntime */,\n\t\t\t() => summaryConfiguration /* configurationGetter */,\n\t\t\tthis /* ISummarizerInternalsProvider */,\n\t\t\t{} as any /* handleContext */,\n\t\t\tthis.summaryCollection,\n\t\t\tasync (runtime: IConnectableRuntime) =>\n\t\t\t\tRunWhileConnectedCoordinator.create(runtime, () => this.deltaManager.active),\n\t\t);\n\n\t\tthis.summaryManager = new SummaryManager(\n\t\t\tthis.summarizerClientElection,\n\t\t\tthis.connectedState,\n\t\t\tthis.summaryCollection,\n\t\t\tthis.logger,\n\t\t\tasync () => this.summarizer,\n\t\t\tnew MockThrottler(),\n\t\t);\n\t\tthis.summaryManager.start();\n\t}\n\n\t/** Prepare a SummaryNack to be sent by the server */\n\tpublic prepareSummaryNack() {\n\t\tconst contents: ISummaryNack = {\n\t\t\tsummaryProposal: {\n\t\t\t\tsummarySequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t\t},\n\t\t};\n\t\tthis.deltaManager.prepareInboundResponse(MessageType.SummaryNack, contents);\n\t}\n\n\t/** Call on the Summarizer object to summarize */\n\tpublic async summarize() {\n\t\tconst result = this.summarizer.summarizeOnDemand({\n\t\t\treason: \"fuzzTest\",\n\t\t\tretryOnFailure: false,\n\t\t});\n\t\treturn Promise.all([\n\t\t\tresult.summarySubmitted,\n\t\t\tresult.summaryOpBroadcasted,\n\t\t\tresult.receivedSummaryAckOrNack,\n\t\t]);\n\t}\n\n\tpublic async submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult> {\n\t\tconst summaryMessage: ISummaryContent = {\n\t\t\thandle: \"\",\n\t\t\thead: \"\",\n\t\t\tmessage: \"\",\n\t\t\tparents: [],\n\t\t};\n\t\tconst referenceSequenceNumber = this.deltaManager.lastSequenceNumber;\n\n\t\tconst summarizeMessage: IDocumentMessage = {\n\t\t\ttype: MessageType.Summarize,\n\t\t\tclientSequenceNumber: 0,\n\t\t\treferenceSequenceNumber,\n\t\t\tcontents: summaryMessage,\n\t\t};\n\t\tthis.deltaManager.inbound.push({\n\t\t\t...summarizeMessage,\n\t\t\tclientId: this.clientId,\n\t\t\tsequenceNumber: 0,\n\t\t\tminimumSequenceNumber: 0,\n\t\t\ttimestamp: 0,\n\t\t});\n\t\tthis.deltaManager.outbound.push([summarizeMessage]);\n\n\t\tconst summaryStats: IGeneratedSummaryStats = {\n\t\t\t...mergeStats(),\n\t\t\tdataStoreCount: 1,\n\t\t\tsummarizedDataStoreCount: 1,\n\t\t\tsummaryNumber: 1,\n\t\t};\n\n\t\treturn {\n\t\t\tstage: \"submit\",\n\t\t\thandle: \"\",\n\t\t\tclientSequenceNumber: -1,\n\t\t\treferenceSequenceNumber,\n\t\t\tminimumSequenceNumber: -1,\n\t\t\tsubmitOpDuration: 0,\n\t\t\tuploadDuration: 0,\n\t\t\tgenerateDuration: 0,\n\t\t\tforcedFullTree: false,\n\t\t\tsummaryTree: {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {},\n\t\t\t},\n\t\t\tsummaryStats,\n\t\t};\n\t}\n\n\tpublic async refreshLatestSummaryAck(options: IRefreshSummaryAckOptions): Promise<void> {\n\t\t// Do nothing\n\t}\n\n\tpublic setConnectedState(value: boolean) {\n\t\tsuper.setConnectedState(value);\n\n\t\tthis.connectedState.setConnectedState(value, this.clientId);\n\t\tthis.summarizerClientElection.setClientId(this.clientId);\n\t}\n\n\tpublic closeFn() {\n\t\tthis.disposeFn();\n\t}\n\n\tpublic disposed: boolean = false;\n\tpublic disposeFn() {\n\t\tthis.connected = false;\n\t\tthis.disposed = true;\n\t\tthis.summaryManager.dispose();\n\t\tthis.summarizer.dispose();\n\t\tthis.deltaManager.dispose();\n\t}\n}\n\nclass MockSummarizerClientElection\n\textends TypedEventEmitter<ISummarizerClientElectionEvents>\n\timplements ISummarizerClientElection\n{\n\tpublic electedClientId: string | undefined;\n\tpublic electedParentId: string | undefined;\n\n\tconstructor(clientId: string) {\n\t\tsuper();\n\t\tthis.setClientId(clientId);\n\t}\n\n\tpublic setClientId(clientId: string) {\n\t\tthis.electedClientId = clientId;\n\t\tthis.electedParentId = clientId;\n\t}\n}\n\nclass MockConnectedState extends TypedEventEmitter<IConnectedEvents> implements IConnectedState {\n\tpublic connected: boolean = false;\n\n\tconstructor(\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tpublic clientId: string,\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic setConnectedState(connected: boolean, clientId: string): void {\n\t\tif (this.connected === connected) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clientId = clientId;\n\n\t\traiseConnectedEvent(this.logger, this, connected, clientId);\n\t}\n}\n\nclass MockThrottler implements IThrottler {\n\tpublic getDelay = () => 0;\n\tpublic numAttempts = 3;\n\tpublic delayWindowMs = 0;\n\tpublic maxDelayMs = 0;\n\tpublic delayFn = () => 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"summarizerFuzzMocks.js","sourceRoot":"","sources":["../../../src/test/fuzz/summarizerFuzzMocks.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 { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\ttype IDocumentMessage,\n\ttype ISequencedDocumentMessage,\n\ttype ISummaryAck,\n\ttype ISummaryContent,\n\ttype ISummaryNack,\n\tMessageType,\n\tSummaryType,\n} from \"@fluidframework/protocol-definitions\";\nimport { mergeStats } from \"@fluidframework/runtime-utils\";\nimport {\n\ttype ITelemetryLoggerExt,\n\tcreateChildLogger,\n\traiseConnectedEvent,\n} from \"@fluidframework/telemetry-utils\";\nimport {\n\ttype IMockContainerRuntimeOptions,\n\tMockContainerRuntimeFactoryForReconnection,\n\tMockContainerRuntimeForReconnection,\n\tMockFluidDataStoreRuntime,\n} from \"@fluidframework/test-runtime-utils\";\nimport { v4 as uuid } from \"uuid\";\nimport { type ISummaryConfiguration } from \"../../index.js\";\nimport {\n\tIConnectableRuntime,\n\ttype IConnectedEvents,\n\ttype IConnectedState,\n\ttype IGeneratedSummaryStats,\n\ttype IRefreshSummaryAckOptions,\n\ttype ISubmitSummaryOptions,\n\tISummarizerClientElection,\n\tISummarizerClientElectionEvents,\n\ttype ISummarizerInternalsProvider,\n\ttype ISummarizerRuntime,\n\tRunWhileConnectedCoordinator,\n\ttype SubmitSummaryResult,\n\tSummarizer,\n\tSummaryCollection,\n\tSummaryManager,\n} from \"../../summary/index.js\";\nimport type { IThrottler } from \"../../throttler.js\";\n\nexport class MockContainerRuntimeFactoryForSummarizer extends MockContainerRuntimeFactoryForReconnection {\n\toverride createContainerRuntime(\n\t\tdataStoreRuntime: MockFluidDataStoreRuntime,\n\t\t_?: { minimumSequenceNumber?: number },\n\t): MockContainerRuntimeForSummarizer {\n\t\tconst containerRuntime = new MockContainerRuntimeForSummarizer(\n\t\t\tdataStoreRuntime,\n\t\t\tthis,\n\t\t\tthis.runtimeOptions,\n\t\t);\n\t\tthis.runtimes.add(containerRuntime);\n\t\treturn containerRuntime;\n\t}\n}\n\nexport interface IMockContainerRuntimeForSummarizerOptions extends IMockContainerRuntimeOptions {\n\tsummaryConfiguration?: ISummaryConfiguration;\n}\n\nconst DefaultSummaryConfiguration: ISummaryConfiguration = {\n\tstate: \"disableHeuristics\",\n\tmaxAckWaitTime: 3 * 60 * 1000, // 3 mins.\n\tmaxOpsSinceLastSummary: 7000,\n\tinitialSummarizerDelayMs: 5 * 1000, // 5 secs.\n};\n\nexport class MockContainerRuntimeForSummarizer\n\textends MockContainerRuntimeForReconnection\n\timplements ISummarizerRuntime, ISummarizerInternalsProvider\n{\n\tpublic readonly logger = createChildLogger();\n\tpublic readonly summarizerClientId: string | undefined;\n\tpublic readonly summarizer: Summarizer;\n\n\tprivate readonly summaryManager: SummaryManager;\n\tprivate readonly connectedState: MockConnectedState;\n\tprivate readonly summaryCollection: SummaryCollection;\n\tprivate readonly summarizerClientElection: MockSummarizerClientElection;\n\n\tconstructor(\n\t\tdataStoreRuntime: MockFluidDataStoreRuntime,\n\t\tfactory: MockContainerRuntimeFactoryForSummarizer,\n\t\truntimeOptions: IMockContainerRuntimeForSummarizerOptions = {},\n\t) {\n\t\t// trackRemoteOps is needed for replaying all ops on creating new ContainerRuntime\n\t\tsuper(dataStoreRuntime, factory, runtimeOptions, { trackRemoteOps: true });\n\n\t\tthis.deltaManager.on(\"op\", (message: ISequencedDocumentMessage) => {\n\t\t\tthis.emit(\"op\", message);\n\t\t});\n\n\t\tthis.summarizerClientElection = new MockSummarizerClientElection(this.clientId);\n\t\tthis.connectedState = new MockConnectedState(this.logger, this.clientId);\n\t\tthis.summaryCollection = new SummaryCollection(this.deltaManager, this.logger);\n\n\t\tconst summaryConfiguration: ISummaryConfiguration = {\n\t\t\t...DefaultSummaryConfiguration,\n\t\t\t...runtimeOptions.summaryConfiguration,\n\t\t};\n\n\t\tthis.summarizer = new Summarizer(\n\t\t\tthis /* summarizerRuntime */,\n\t\t\t() => summaryConfiguration /* configurationGetter */,\n\t\t\tthis /* ISummarizerInternalsProvider */,\n\t\t\t{} as any /* handleContext */,\n\t\t\tthis.summaryCollection,\n\t\t\tasync (runtime: IConnectableRuntime) =>\n\t\t\t\tRunWhileConnectedCoordinator.create(runtime, () => this.deltaManager.active),\n\t\t);\n\n\t\tthis.summaryManager = new SummaryManager(\n\t\t\tthis.summarizerClientElection,\n\t\t\tthis.connectedState,\n\t\t\tthis.summaryCollection,\n\t\t\tthis.logger,\n\t\t\tasync () => this.summarizer,\n\t\t\tnew MockThrottler(),\n\t\t);\n\t\tthis.summaryManager.start();\n\t}\n\n\tprivate nackScheduled = false;\n\t/** Prepare a SummaryNack to be sent by the server */\n\tpublic prepareSummaryNack() {\n\t\tthis.nackScheduled = true;\n\t}\n\n\t/** Call on the Summarizer object to summarize */\n\tpublic async summarize() {\n\t\tconst result = this.summarizer.summarizeOnDemand({\n\t\t\treason: \"fuzzTest\",\n\t\t\tretryOnFailure: false,\n\t\t});\n\t\treturn Promise.all([\n\t\t\tresult.summarySubmitted,\n\t\t\tresult.summaryOpBroadcasted,\n\t\t\tresult.receivedSummaryAckOrNack,\n\t\t]);\n\t}\n\n\tpublic async submitSummary(options: ISubmitSummaryOptions): Promise<SubmitSummaryResult> {\n\t\tconst handle = uuid();\n\t\tconst summaryMessage: ISummaryContent = {\n\t\t\thandle,\n\t\t\thead: \"\",\n\t\t\tmessage: \"\",\n\t\t\tparents: [],\n\t\t};\n\t\tconst clientSequenceNumber = ++this.deltaManager.clientSequenceNumber;\n\t\tconst referenceSequenceNumber = this.deltaManager.lastSequenceNumber;\n\t\tconst minimumSequenceNumber = this.factory.getMinSeq();\n\n\t\tconst summarizeMessage: IDocumentMessage = {\n\t\t\ttype: MessageType.Summarize,\n\t\t\tclientSequenceNumber,\n\t\t\treferenceSequenceNumber,\n\t\t\tcontents: summaryMessage,\n\t\t};\n\t\tthis.deltaManager.outbound.push([summarizeMessage]);\n\t\tthis.addPendingMessage(\n\t\t\tsummarizeMessage.contents,\n\t\t\tsummarizeMessage.metadata,\n\t\t\tsummarizeMessage.clientSequenceNumber,\n\t\t);\n\n\t\tthis.factory.processAllMessages();\n\t\tthis.scheduleAckNack(\n\t\t\tthis.nackScheduled /* isNack */,\n\t\t\thandle,\n\t\t\tthis.deltaManager.lastSequenceNumber,\n\t\t);\n\t\tthis.nackScheduled = false;\n\n\t\tconst summaryStats: IGeneratedSummaryStats = {\n\t\t\t...mergeStats(),\n\t\t\tdataStoreCount: 1,\n\t\t\tsummarizedDataStoreCount: 1,\n\t\t\tsummaryNumber: 1,\n\t\t};\n\n\t\treturn {\n\t\t\tstage: \"submit\",\n\t\t\thandle,\n\t\t\tclientSequenceNumber,\n\t\t\treferenceSequenceNumber,\n\t\t\tminimumSequenceNumber,\n\t\t\tsubmitOpDuration: 0,\n\t\t\tuploadDuration: 0,\n\t\t\tgenerateDuration: 0,\n\t\t\tforcedFullTree: false,\n\t\t\tsummaryTree: {\n\t\t\t\ttype: SummaryType.Tree,\n\t\t\t\ttree: {},\n\t\t\t},\n\t\t\tsummaryStats,\n\t\t};\n\t}\n\n\tprivate scheduleAckNack(isNack: boolean, handle: string, summarySequenceNumber: number) {\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t\tPromise.resolve().then(() => {\n\t\t\tconst contents: ISummaryAck | ISummaryNack = {\n\t\t\t\thandle,\n\t\t\t\tsummaryProposal: {\n\t\t\t\t\tsummarySequenceNumber,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst summaryAckMessage = {\n\t\t\t\ttype: isNack ? MessageType.SummaryNack : MessageType.SummaryAck,\n\t\t\t\tclientSequenceNumber: ++this.deltaManager.clientSequenceNumber,\n\t\t\t\treferenceSequenceNumber: this.deltaManager.lastSequenceNumber,\n\t\t\t\tcontents,\n\t\t\t};\n\t\t\tthis.deltaManager.outbound.push([summaryAckMessage]);\n\t\t\tthis.addPendingMessage(\n\t\t\t\tsummaryAckMessage.contents,\n\t\t\t\tundefined,\n\t\t\t\tsummaryAckMessage.clientSequenceNumber,\n\t\t\t);\n\t\t\tthis.factory.processAllMessages();\n\t\t});\n\t}\n\n\tpublic async refreshLatestSummaryAck(options: IRefreshSummaryAckOptions): Promise<void> {\n\t\t// Do nothing\n\t}\n\n\tpublic setConnectedState(value: boolean) {\n\t\tsuper.setConnectedState(value);\n\n\t\tthis.connectedState.setConnectedState(value, this.clientId);\n\t\tthis.summarizerClientElection.setClientId(this.clientId);\n\t}\n\n\tpublic closeFn() {\n\t\tthis.disposeFn();\n\t}\n\n\tpublic disposed: boolean = false;\n\tpublic disposeFn() {\n\t\tthis.connected = false;\n\t\tthis.disposed = true;\n\t\tthis.summaryManager.dispose();\n\t\tthis.summarizer.dispose();\n\t\tthis.deltaManager.dispose();\n\t}\n}\n\nclass MockSummarizerClientElection\n\textends TypedEventEmitter<ISummarizerClientElectionEvents>\n\timplements ISummarizerClientElection\n{\n\tpublic electedClientId: string | undefined;\n\tpublic electedParentId: string | undefined;\n\n\tconstructor(clientId: string) {\n\t\tsuper();\n\t\tthis.setClientId(clientId);\n\t}\n\n\tpublic setClientId(clientId: string) {\n\t\tthis.electedClientId = clientId;\n\t\tthis.electedParentId = clientId;\n\t}\n}\n\nclass MockConnectedState extends TypedEventEmitter<IConnectedEvents> implements IConnectedState {\n\tpublic connected: boolean = false;\n\n\tconstructor(\n\t\tprivate readonly logger: ITelemetryLoggerExt,\n\t\tpublic clientId: string,\n\t) {\n\t\tsuper();\n\t}\n\n\tpublic setConnectedState(connected: boolean, clientId: string): void {\n\t\tif (this.connected === connected) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clientId = clientId;\n\n\t\traiseConnectedEvent(this.logger, this, connected, clientId);\n\t}\n}\n\nclass MockThrottler implements IThrottler {\n\tpublic getDelay = () => 0;\n\tpublic numAttempts = 3;\n\tpublic delayWindowMs = 0;\n\tpublic maxDelayMs = 0;\n\tpublic delayFn = () => 0;\n}\n"]}
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
import { strict as assert } from "assert";
|
|
7
7
|
import { mkdirSync, readFileSync } from "fs";
|
|
8
8
|
import path from "path";
|
|
9
|
-
import { createFuzzDescribe, defaultOptions, asyncGeneratorFromArray, makeRandom, performFuzzActionsAsync, } from "@fluid-private/stochastic-test-utils";
|
|
10
|
-
import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils";
|
|
11
9
|
import { TypedEventEmitter } from "@fluid-internal/client-utils";
|
|
10
|
+
import { asyncGeneratorFromArray, createFuzzDescribe, defaultOptions, makeRandom, performFuzzActionsAsync, } from "@fluid-private/stochastic-test-utils";
|
|
11
|
+
import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils";
|
|
12
12
|
import { MockContainerRuntimeFactoryForSummarizer, } from "./summarizerFuzzMocks.js";
|
|
13
13
|
/**
|
|
14
14
|
* @internal
|
|
@@ -25,7 +25,6 @@ export function createSummarizerFuzzSuite(model, providedOptions) {
|
|
|
25
25
|
const options = {
|
|
26
26
|
...defaultSummarizerFuzzSuiteOptions,
|
|
27
27
|
...providedOptions,
|
|
28
|
-
saveFailures: false,
|
|
29
28
|
};
|
|
30
29
|
const only = new Set(options.only);
|
|
31
30
|
const skip = new Set(options.skip);
|
|
@@ -74,7 +73,11 @@ async function runTestForSeed(model, options, seed, saveInfo) {
|
|
|
74
73
|
};
|
|
75
74
|
options.emitter.emit("testStart", initialState);
|
|
76
75
|
const finalState = await performFuzzActionsAsync(model.generatorFactory(), model.reducer, initialState, saveInfo);
|
|
77
|
-
|
|
76
|
+
const oldRuntime = finalState.containerRuntime;
|
|
77
|
+
oldRuntime.disposeFn();
|
|
78
|
+
const newRuntime = containerRuntimeFactory.createContainerRuntime(new MockFluidDataStoreRuntime());
|
|
79
|
+
await newRuntime.initializeWithStashedOps(oldRuntime);
|
|
80
|
+
await newRuntime.summarize();
|
|
78
81
|
options.emitter.emit("testEnd", finalState);
|
|
79
82
|
return finalState;
|
|
80
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarizerFuzzSuite.js","sourceRoot":"","sources":["../../../src/test/fuzz/summarizerFuzzSuite.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/* eslint-disable import/no-nodejs-modules */\n\nimport { strict as assert } from \"assert\";\nimport { mkdirSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport {\n\tBaseFuzzTestState,\n\tcreateFuzzDescribe,\n\tdefaultOptions,\n\tAsyncGenerator,\n\tSaveInfo,\n\tasyncGeneratorFromArray,\n\tmakeRandom,\n\tperformFuzzActionsAsync,\n\tAsyncReducer,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tIMockContainerRuntimeForSummarizerOptions,\n\tMockContainerRuntimeFactoryForSummarizer,\n\tMockContainerRuntimeForSummarizer,\n} from \"./summarizerFuzzMocks.js\";\nimport type { SummarizerOperation } from \"./fuzzUtils.js\";\n\nexport interface SummarizerFuzzTestState extends BaseFuzzTestState {\n\tcontainerRuntimeFactory: MockContainerRuntimeFactoryForSummarizer;\n\tcontainerRuntime: MockContainerRuntimeForSummarizer;\n}\n\nexport interface SummarizerFuzzModel {\n\tworkloadName: string;\n\tgeneratorFactory: () => AsyncGenerator<SummarizerOperation, SummarizerFuzzTestState>;\n\treducer: AsyncReducer<SummarizerOperation, SummarizerFuzzTestState>;\n}\n\n/**\n * @internal\n */\nexport interface SummarizerFuzzHarnessEvents {\n\t/**\n\t * Raised for each non-summarizer client created during fuzz test execution.\n\t */\n\t(event: \"clientCreate\", listener: (client: SummarizerFuzzTestState) => void);\n\n\t/**\n\t * Raised after creating the initialState but prior to performing the fuzzActions..\n\t */\n\t(event: \"testStart\", listener: (initialState: SummarizerFuzzTestState) => void);\n\n\t/**\n\t * Raised after all fuzzActions have been completed.\n\t */\n\t(event: \"testEnd\", listener: (finalState: SummarizerFuzzTestState) => void);\n}\n\n/**\n * @internal\n */\nexport interface SummarizerFuzzSuiteOptions {\n\t/**\n\t * Number of tests to generate for correctness modes (which are run in the PR gate).\n\t */\n\tdefaultTestCount: number;\n\n\t/**\n\t * Event emitter which allows hooking into interesting points of Summarizer harness execution.\n\t * Test authors that want to subscribe to any of these events should create a `TypedEventEmitter`,\n\t * do so, and pass it in when creating the suite.\n\t */\n\temitter: TypedEventEmitter<SummarizerFuzzHarnessEvents>;\n\n\t/**\n\t * Seed which should be replayed from disk.\n\t *\n\t * This option is intended for quick, by-hand minimization of failure JSON. As such, it adds a `.only`\n\t * to the corresponding replay test.\n\t */\n\treplay?: number;\n\n\t/**\n\t * Runs only the provided seeds.\n\t *\n\t * @example\n\t *\n\t * ```typescript\n\t * // Runs only seed 42 for the given model.\n\t * createSummarizerFuzzSuite(model, { only: [42] });\n\t * ```\n\t *\n\t * @remarks\n\t * If you prefer, a variant of the standard `.only` syntax works. See {@link (createSummarizerFuzzSuite:namespace).only}.\n\t */\n\tonly: Iterable<number>;\n\n\t/**\n\t * Skips the provided seeds.\n\t *\n\t * @example\n\t *\n\t * ```typescript\n\t * // Skips seed 42 for the given model.\n\t * createSummarizerFuzzSuite(model, { skip: [42] });\n\t * ```\n\t *\n\t * @remarks\n\t * If you prefer, a variant of the standard `.skip` syntax works. See {@link (createSummarizerFuzzSuite:namespace).skip}.\n\t */\n\tskip: Iterable<number>;\n\n\t/**\n\t * Whether failure files should be saved to disk, and if so, the directory in which they should be saved.\n\t * Each seed will be saved in a subfolder of this directory obtained by kebab-casing the model name.\n\t *\n\t * Turning on this feature is encouraged for quick minimization.\n\t */\n\tsaveFailures: false | { directory: string };\n\n\tcontainerRuntimeOptions?: IMockContainerRuntimeForSummarizerOptions;\n\n\tparseOperations: (serialized: string) => SummarizerOperation[];\n}\n\n/**\n * @internal\n */\nexport const defaultSummarizerFuzzSuiteOptions: SummarizerFuzzSuiteOptions = {\n\tdefaultTestCount: defaultOptions.defaultTestCount,\n\temitter: new TypedEventEmitter(),\n\tonly: [],\n\tskip: [],\n\tsaveFailures: false,\n\tparseOperations: (serialized: string) => JSON.parse(serialized) as SummarizerOperation[],\n};\n\nexport function createSummarizerFuzzSuite(\n\tmodel: SummarizerFuzzModel,\n\tprovidedOptions?: Partial<SummarizerFuzzSuiteOptions>,\n): void {\n\tconst options: SummarizerFuzzSuiteOptions = {\n\t\t...defaultSummarizerFuzzSuiteOptions,\n\t\t...providedOptions,\n\t\tsaveFailures: false,\n\t};\n\n\tconst only = new Set(options.only);\n\tconst skip = new Set(options.skip);\n\tObject.assign(options, { only, skip });\n\tassert(isInternalOptions(options));\n\n\tconst describeFuzz = createFuzzDescribe({ defaultTestCount: options.defaultTestCount });\n\tdescribeFuzz(model.workloadName, ({ testCount }) => {\n\t\tconst directory = getSaveDirectory(model, options);\n\t\tbefore(() => {\n\t\t\tif (directory !== undefined) {\n\t\t\t\tmkdirSync(directory, { recursive: true });\n\t\t\t}\n\t\t});\n\n\t\tfor (let seed = 0; seed < testCount; seed++) {\n\t\t\trunTest(model, options, seed, getSaveInfo(model, options, seed));\n\t\t}\n\n\t\tif (options.replay !== undefined) {\n\t\t\tconst seed = options.replay;\n\t\t\tdescribe.only(`replay from file`, () => {\n\t\t\t\tconst saveInfo = getSaveInfo(model, options, seed);\n\t\t\t\tassert(\n\t\t\t\t\tsaveInfo !== undefined,\n\t\t\t\t\t\"Cannot replay a file without a directory to save files in!\",\n\t\t\t\t);\n\t\t\t\tconst operations = options.parseOperations(\n\t\t\t\t\treadFileSync(saveInfo.filepath).toString(),\n\t\t\t\t);\n\n\t\t\t\tconst replayModel = {\n\t\t\t\t\t...model,\n\t\t\t\t\t// We lose some type safety here because the options interface isn't generic\n\t\t\t\t\tgeneratorFactory: (): AsyncGenerator<SummarizerOperation, unknown> =>\n\t\t\t\t\t\tasyncGeneratorFromArray(operations),\n\t\t\t\t};\n\t\t\t\trunTest(replayModel, options, seed, undefined);\n\t\t\t});\n\t\t}\n\t});\n}\n\n/**\n * Runs the provided Summarizer fuzz model. All functionality is already assumed to be mixed in.\n * @privateRemarks This is currently file-exported for testing purposes, but it could be reasonable to\n * expose at the package level if we want to expose some of the harness's building blocks.\n */\nasync function runTestForSeed(\n\tmodel: SummarizerFuzzModel,\n\toptions: Omit<SummarizerFuzzSuiteOptions, \"only\" | \"skip\">,\n\tseed: number,\n\tsaveInfo?: SaveInfo,\n): Promise<SummarizerFuzzTestState> {\n\tconst random = makeRandom(seed);\n\tconst containerRuntimeFactory = new MockContainerRuntimeFactoryForSummarizer(\n\t\toptions.containerRuntimeOptions,\n\t);\n\n\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(\n\t\tnew MockFluidDataStoreRuntime(),\n\t);\n\n\tconst initialState: SummarizerFuzzTestState = {\n\t\tcontainerRuntimeFactory,\n\t\trandom,\n\t\tcontainerRuntime,\n\t};\n\n\toptions.emitter.emit(\"testStart\", initialState);\n\n\tconst finalState = await performFuzzActionsAsync(\n\t\tmodel.generatorFactory(),\n\t\tmodel.reducer,\n\t\tinitialState,\n\t\tsaveInfo,\n\t);\n\n\t// TODO AB#6954: Validate we can summarize\n\n\toptions.emitter.emit(\"testEnd\", finalState);\n\n\treturn finalState;\n}\n\nfunction runTest(\n\tmodel: SummarizerFuzzModel,\n\toptions: InternalOptions,\n\tseed: number,\n\tsaveInfo: SaveInfo | undefined,\n): void {\n\tconst itFn = options.only.has(seed) ? it.only : options.skip.has(seed) ? it.skip : it;\n\titFn(`seed ${seed}`, async () => {\n\t\tconst inCi = !!process.env.TF_BUILD;\n\t\tawait runTestForSeed(model, options, seed, inCi ? undefined : saveInfo);\n\t});\n}\n\n/**\n * @internal\n */\ninterface HasWorkloadName {\n\tworkloadName: string;\n}\n\nfunction getSaveDirectory(\n\tmodel: HasWorkloadName,\n\toptions: SummarizerFuzzSuiteOptions,\n): string | undefined {\n\tif (!options.saveFailures) {\n\t\treturn undefined;\n\t}\n\tconst workloadFriendly = model.workloadName.replace(/[\\s_]+/g, \"-\").toLowerCase();\n\treturn path.join(options.saveFailures.directory, workloadFriendly);\n}\n\nfunction getSaveInfo(\n\tmodel: HasWorkloadName,\n\toptions: SummarizerFuzzSuiteOptions,\n\tseed: number,\n): SaveInfo | undefined {\n\tconst directory = getSaveDirectory(model, options);\n\tif (!directory) {\n\t\treturn undefined;\n\t}\n\tconst filepath = path.join(directory, `${seed}.json`);\n\treturn { saveOnFailure: true, filepath };\n}\n\ntype InternalOptions = Omit<SummarizerFuzzSuiteOptions, \"only\" | \"skip\"> & {\n\tonly: Set<number>;\n\tskip: Set<number>;\n};\n\nfunction isInternalOptions(options: SummarizerFuzzSuiteOptions): options is InternalOptions {\n\treturn options.only instanceof Set && options.skip instanceof Set;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"summarizerFuzzSuite.js","sourceRoot":"","sources":["../../../src/test/fuzz/summarizerFuzzSuite.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\n/* eslint-disable import/no-nodejs-modules */\n\nimport { strict as assert } from \"assert\";\nimport { mkdirSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport { TypedEventEmitter } from \"@fluid-internal/client-utils\";\nimport {\n\tAsyncGenerator,\n\tAsyncReducer,\n\tBaseFuzzTestState,\n\tSaveInfo,\n\tasyncGeneratorFromArray,\n\tcreateFuzzDescribe,\n\tdefaultOptions,\n\tmakeRandom,\n\tperformFuzzActionsAsync,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport type { SummarizerOperation } from \"./fuzzUtils.js\";\nimport {\n\tIMockContainerRuntimeForSummarizerOptions,\n\tMockContainerRuntimeFactoryForSummarizer,\n\tMockContainerRuntimeForSummarizer,\n} from \"./summarizerFuzzMocks.js\";\n\nexport interface SummarizerFuzzTestState extends BaseFuzzTestState {\n\tcontainerRuntimeFactory: MockContainerRuntimeFactoryForSummarizer;\n\tcontainerRuntime: MockContainerRuntimeForSummarizer;\n}\n\nexport interface SummarizerFuzzModel {\n\tworkloadName: string;\n\tgeneratorFactory: () => AsyncGenerator<SummarizerOperation, SummarizerFuzzTestState>;\n\treducer: AsyncReducer<SummarizerOperation, SummarizerFuzzTestState>;\n}\n\n/**\n * @internal\n */\nexport interface SummarizerFuzzHarnessEvents {\n\t/**\n\t * Raised for each non-summarizer client created during fuzz test execution.\n\t */\n\t(event: \"clientCreate\", listener: (client: SummarizerFuzzTestState) => void);\n\n\t/**\n\t * Raised after creating the initialState but prior to performing the fuzzActions..\n\t */\n\t(event: \"testStart\", listener: (initialState: SummarizerFuzzTestState) => void);\n\n\t/**\n\t * Raised after all fuzzActions have been completed.\n\t */\n\t(event: \"testEnd\", listener: (finalState: SummarizerFuzzTestState) => void);\n}\n\n/**\n * @internal\n */\nexport interface SummarizerFuzzSuiteOptions {\n\t/**\n\t * Number of tests to generate for correctness modes (which are run in the PR gate).\n\t */\n\tdefaultTestCount: number;\n\n\t/**\n\t * Event emitter which allows hooking into interesting points of Summarizer harness execution.\n\t * Test authors that want to subscribe to any of these events should create a `TypedEventEmitter`,\n\t * do so, and pass it in when creating the suite.\n\t */\n\temitter: TypedEventEmitter<SummarizerFuzzHarnessEvents>;\n\n\t/**\n\t * Seed which should be replayed from disk.\n\t *\n\t * This option is intended for quick, by-hand minimization of failure JSON. As such, it adds a `.only`\n\t * to the corresponding replay test.\n\t */\n\treplay?: number;\n\n\t/**\n\t * Runs only the provided seeds.\n\t *\n\t * @example\n\t *\n\t * ```typescript\n\t * // Runs only seed 42 for the given model.\n\t * createSummarizerFuzzSuite(model, { only: [42] });\n\t * ```\n\t *\n\t * @remarks\n\t * If you prefer, a variant of the standard `.only` syntax works. See {@link (createSummarizerFuzzSuite:namespace).only}.\n\t */\n\tonly: Iterable<number>;\n\n\t/**\n\t * Skips the provided seeds.\n\t *\n\t * @example\n\t *\n\t * ```typescript\n\t * // Skips seed 42 for the given model.\n\t * createSummarizerFuzzSuite(model, { skip: [42] });\n\t * ```\n\t *\n\t * @remarks\n\t * If you prefer, a variant of the standard `.skip` syntax works. See {@link (createSummarizerFuzzSuite:namespace).skip}.\n\t */\n\tskip: Iterable<number>;\n\n\t/**\n\t * Whether failure files should be saved to disk, and if so, the directory in which they should be saved.\n\t * Each seed will be saved in a subfolder of this directory obtained by kebab-casing the model name.\n\t *\n\t * Turning on this feature is encouraged for quick minimization.\n\t */\n\tsaveFailures: false | { directory: string };\n\n\tcontainerRuntimeOptions?: IMockContainerRuntimeForSummarizerOptions;\n\n\tparseOperations: (serialized: string) => SummarizerOperation[];\n}\n\n/**\n * @internal\n */\nexport const defaultSummarizerFuzzSuiteOptions: SummarizerFuzzSuiteOptions = {\n\tdefaultTestCount: defaultOptions.defaultTestCount,\n\temitter: new TypedEventEmitter(),\n\tonly: [],\n\tskip: [],\n\tsaveFailures: false,\n\tparseOperations: (serialized: string) => JSON.parse(serialized) as SummarizerOperation[],\n};\n\nexport function createSummarizerFuzzSuite(\n\tmodel: SummarizerFuzzModel,\n\tprovidedOptions?: Partial<SummarizerFuzzSuiteOptions>,\n): void {\n\tconst options: SummarizerFuzzSuiteOptions = {\n\t\t...defaultSummarizerFuzzSuiteOptions,\n\t\t...providedOptions,\n\t};\n\n\tconst only = new Set(options.only);\n\tconst skip = new Set(options.skip);\n\tObject.assign(options, { only, skip });\n\tassert(isInternalOptions(options));\n\n\tconst describeFuzz = createFuzzDescribe({ defaultTestCount: options.defaultTestCount });\n\tdescribeFuzz(model.workloadName, ({ testCount }) => {\n\t\tconst directory = getSaveDirectory(model, options);\n\t\tbefore(() => {\n\t\t\tif (directory !== undefined) {\n\t\t\t\tmkdirSync(directory, { recursive: true });\n\t\t\t}\n\t\t});\n\n\t\tfor (let seed = 0; seed < testCount; seed++) {\n\t\t\trunTest(model, options, seed, getSaveInfo(model, options, seed));\n\t\t}\n\n\t\tif (options.replay !== undefined) {\n\t\t\tconst seed = options.replay;\n\t\t\tdescribe.only(`replay from file`, () => {\n\t\t\t\tconst saveInfo = getSaveInfo(model, options, seed);\n\t\t\t\tassert(\n\t\t\t\t\tsaveInfo !== undefined,\n\t\t\t\t\t\"Cannot replay a file without a directory to save files in!\",\n\t\t\t\t);\n\t\t\t\tconst operations = options.parseOperations(\n\t\t\t\t\treadFileSync(saveInfo.filepath).toString(),\n\t\t\t\t);\n\n\t\t\t\tconst replayModel = {\n\t\t\t\t\t...model,\n\t\t\t\t\t// We lose some type safety here because the options interface isn't generic\n\t\t\t\t\tgeneratorFactory: (): AsyncGenerator<SummarizerOperation, unknown> =>\n\t\t\t\t\t\tasyncGeneratorFromArray(operations),\n\t\t\t\t};\n\t\t\t\trunTest(replayModel, options, seed, undefined);\n\t\t\t});\n\t\t}\n\t});\n}\n\n/**\n * Runs the provided Summarizer fuzz model. All functionality is already assumed to be mixed in.\n * @privateRemarks This is currently file-exported for testing purposes, but it could be reasonable to\n * expose at the package level if we want to expose some of the harness's building blocks.\n */\nasync function runTestForSeed(\n\tmodel: SummarizerFuzzModel,\n\toptions: Omit<SummarizerFuzzSuiteOptions, \"only\" | \"skip\">,\n\tseed: number,\n\tsaveInfo?: SaveInfo,\n): Promise<SummarizerFuzzTestState> {\n\tconst random = makeRandom(seed);\n\tconst containerRuntimeFactory = new MockContainerRuntimeFactoryForSummarizer(\n\t\toptions.containerRuntimeOptions,\n\t);\n\n\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(\n\t\tnew MockFluidDataStoreRuntime(),\n\t);\n\n\tconst initialState: SummarizerFuzzTestState = {\n\t\tcontainerRuntimeFactory,\n\t\trandom,\n\t\tcontainerRuntime,\n\t};\n\n\toptions.emitter.emit(\"testStart\", initialState);\n\n\tconst finalState = await performFuzzActionsAsync(\n\t\tmodel.generatorFactory(),\n\t\tmodel.reducer,\n\t\tinitialState,\n\t\tsaveInfo,\n\t);\n\n\tconst oldRuntime = finalState.containerRuntime;\n\toldRuntime.disposeFn();\n\tconst newRuntime = containerRuntimeFactory.createContainerRuntime(\n\t\tnew MockFluidDataStoreRuntime(),\n\t);\n\tawait newRuntime.initializeWithStashedOps(oldRuntime);\n\tawait newRuntime.summarize();\n\n\toptions.emitter.emit(\"testEnd\", finalState);\n\n\treturn finalState;\n}\n\nfunction runTest(\n\tmodel: SummarizerFuzzModel,\n\toptions: InternalOptions,\n\tseed: number,\n\tsaveInfo: SaveInfo | undefined,\n): void {\n\tconst itFn = options.only.has(seed) ? it.only : options.skip.has(seed) ? it.skip : it;\n\titFn(`seed ${seed}`, async () => {\n\t\tconst inCi = !!process.env.TF_BUILD;\n\t\tawait runTestForSeed(model, options, seed, inCi ? undefined : saveInfo);\n\t});\n}\n\n/**\n * @internal\n */\ninterface HasWorkloadName {\n\tworkloadName: string;\n}\n\nfunction getSaveDirectory(\n\tmodel: HasWorkloadName,\n\toptions: SummarizerFuzzSuiteOptions,\n): string | undefined {\n\tif (!options.saveFailures) {\n\t\treturn undefined;\n\t}\n\tconst workloadFriendly = model.workloadName.replace(/[\\s_]+/g, \"-\").toLowerCase();\n\treturn path.join(options.saveFailures.directory, workloadFriendly);\n}\n\nfunction getSaveInfo(\n\tmodel: HasWorkloadName,\n\toptions: SummarizerFuzzSuiteOptions,\n\tseed: number,\n): SaveInfo | undefined {\n\tconst directory = getSaveDirectory(model, options);\n\tif (!directory) {\n\t\treturn undefined;\n\t}\n\tconst filepath = path.join(directory, `${seed}.json`);\n\treturn { saveOnFailure: true, filepath };\n}\n\ntype InternalOptions = Omit<SummarizerFuzzSuiteOptions, \"only\" | \"skip\"> & {\n\tonly: Set<number>;\n\tskip: Set<number>;\n};\n\nfunction isInternalOptions(options: SummarizerFuzzSuiteOptions): options is InternalOptions {\n\treturn options.only instanceof Set && options.skip instanceof Set;\n}\n"]}
|
|
@@ -3,15 +3,15 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { strict as assert } from "assert";
|
|
6
|
-
import { useFakeTimers, spy } from "sinon";
|
|
7
6
|
import { ContainerErrorTypes, } from "@fluidframework/container-definitions";
|
|
8
7
|
import { SummaryType } from "@fluidframework/protocol-definitions";
|
|
9
|
-
import {
|
|
10
|
-
import { MockLogger, mixinMonitoringContext, tagCodeArtifacts,
|
|
11
|
-
import {
|
|
8
|
+
import { channelsTreeName, gcBlobPrefix, gcDeletedBlobKey, gcTombstoneBlobKey, gcTreeKey, } from "@fluidframework/runtime-definitions";
|
|
9
|
+
import { MockLogger, createChildLogger, mixinMonitoringContext, tagCodeArtifacts, } from "@fluidframework/telemetry-utils";
|
|
10
|
+
import { spy, useFakeTimers } from "sinon";
|
|
11
|
+
import { GCNodeType, GarbageCollectionMessageType, GarbageCollector, UnreferencedState, concatGarbageCollectionStates, defaultSessionExpiryDurationMs, defaultSweepGracePeriodMs, oneDayMs, stableGCVersion, } from "../../gc/index.js";
|
|
12
12
|
import { ContainerMessageType } from "../../messageTypes.js";
|
|
13
|
-
import { dataStoreAttributesBlobName, metadataBlobName, } from "../../summary/index.js";
|
|
14
13
|
import { pkgVersion } from "../../packageVersion.js";
|
|
14
|
+
import { dataStoreAttributesBlobName, metadataBlobName, } from "../../summary/index.js";
|
|
15
15
|
import { createTestConfigProvider } from "./gcUnitTestHelpers.js";
|
|
16
16
|
describe("Garbage Collection Tests", () => {
|
|
17
17
|
const defaultSnapshotCacheExpiryMs = 5 * 24 * 60 * 60 * 1000;
|