@fluid-experimental/tree 0.59.2001 → 0.59.3000
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/.eslintrc.js +2 -0
- package/.vscode/SharedTree.code-workspace +15 -0
- package/.vscode/settings.json +6 -0
- package/dist/ChangeCompression.js +9 -9
- package/dist/ChangeCompression.js.map +1 -1
- package/dist/ChangeTypes.d.ts +1 -6
- package/dist/ChangeTypes.d.ts.map +1 -1
- package/dist/ChangeTypes.js +5 -5
- package/dist/ChangeTypes.js.map +1 -1
- package/dist/Checkout.js +14 -14
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +21 -3
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +29 -4
- package/dist/Common.js.map +1 -1
- package/dist/EditLog.js +26 -25
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.js +17 -17
- package/dist/EditUtilities.js.map +1 -1
- package/dist/Forest.js +31 -31
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.js +9 -9
- package/dist/HistoryEditFactory.js.map +1 -1
- package/dist/IdConversion.js +9 -9
- package/dist/IdConversion.js.map +1 -1
- package/dist/Identifiers.d.ts +4 -0
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js.map +1 -1
- package/dist/LogViewer.d.ts +1 -5
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +11 -19
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.js +2 -2
- package/dist/MergeHealth.js.map +1 -1
- package/dist/NodeIdUtilities.js +2 -2
- package/dist/NodeIdUtilities.js.map +1 -1
- package/dist/PayloadUtilities.js +1 -1
- package/dist/PayloadUtilities.js.map +1 -1
- package/dist/RevisionValueCache.d.ts +13 -10
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +14 -11
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.js +4 -4
- package/dist/RevisionView.js.map +1 -1
- package/dist/SerializationUtilities.js +4 -4
- package/dist/SerializationUtilities.js.map +1 -1
- package/dist/SharedTree.d.ts +93 -31
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +160 -131
- package/dist/SharedTree.js.map +1 -1
- package/dist/SharedTreeEncoder.d.ts +3 -3
- package/dist/SharedTreeEncoder.d.ts.map +1 -1
- package/dist/SharedTreeEncoder.js +36 -36
- package/dist/SharedTreeEncoder.js.map +1 -1
- package/dist/StringInterner.js +1 -1
- package/dist/StringInterner.js.map +1 -1
- package/dist/Summary.js +1 -1
- package/dist/Summary.js.map +1 -1
- package/dist/SummaryBackCompatibility.js +8 -8
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/Transaction.js +1 -1
- package/dist/Transaction.js.map +1 -1
- package/dist/TransactionInternal.js +17 -17
- package/dist/TransactionInternal.js.map +1 -1
- package/dist/TreeCompressor.d.ts.map +1 -1
- package/dist/TreeCompressor.js +6 -8
- package/dist/TreeCompressor.js.map +1 -1
- package/dist/TreeNodeHandle.js +4 -4
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.js +7 -7
- package/dist/TreeView.js.map +1 -1
- package/dist/TreeViewUtilities.js +2 -2
- package/dist/TreeViewUtilities.js.map +1 -1
- package/dist/UndoRedoHandler.js +1 -1
- package/dist/UndoRedoHandler.js.map +1 -1
- package/dist/UuidUtilities.d.ts +30 -0
- package/dist/UuidUtilities.d.ts.map +1 -0
- package/dist/UuidUtilities.js +106 -0
- package/dist/UuidUtilities.js.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts +52 -28
- package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
- package/dist/id-compressor/AppendOnlySortedMap.js +167 -90
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/dist/id-compressor/IdCompressor.d.ts +43 -42
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +179 -177
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/dist/id-compressor/IdRange.js +1 -1
- package/dist/id-compressor/IdRange.js.map +1 -1
- package/dist/id-compressor/NumericUuid.d.ts +6 -14
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
- package/dist/id-compressor/NumericUuid.js +15 -76
- package/dist/id-compressor/NumericUuid.js.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.d.ts +122 -0
- package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -0
- package/dist/id-compressor/SessionIdNormalizer.js +418 -0
- package/dist/id-compressor/SessionIdNormalizer.js.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts +6 -13
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/persisted-types/0.1.1.d.ts +1 -6
- package/dist/persisted-types/0.1.1.d.ts.map +1 -1
- package/dist/persisted-types/0.1.1.js +3 -3
- package/dist/persisted-types/0.1.1.js.map +1 -1
- package/lib/ChangeTypes.d.ts +1 -6
- package/lib/ChangeTypes.d.ts.map +1 -1
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +21 -3
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +25 -3
- package/lib/Common.js.map +1 -1
- package/lib/EditLog.js +2 -1
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.js.map +1 -1
- package/lib/Forest.js.map +1 -1
- package/lib/HistoryEditFactory.js.map +1 -1
- package/lib/Identifiers.d.ts +4 -0
- package/lib/Identifiers.d.ts.map +1 -1
- package/lib/Identifiers.js.map +1 -1
- package/lib/LogViewer.d.ts +1 -5
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +5 -13
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.js.map +1 -1
- package/lib/NodeIdUtilities.js.map +1 -1
- package/lib/RevisionValueCache.d.ts +13 -10
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +10 -7
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.js.map +1 -1
- package/lib/SharedTree.d.ts +93 -31
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +107 -78
- package/lib/SharedTree.js.map +1 -1
- package/lib/SharedTreeEncoder.d.ts +3 -3
- package/lib/SharedTreeEncoder.d.ts.map +1 -1
- package/lib/SharedTreeEncoder.js +4 -4
- package/lib/SharedTreeEncoder.js.map +1 -1
- package/lib/StringInterner.js.map +1 -1
- package/lib/Summary.js.map +1 -1
- package/lib/TreeCompressor.d.ts.map +1 -1
- package/lib/TreeCompressor.js +1 -3
- package/lib/TreeCompressor.js.map +1 -1
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.js.map +1 -1
- package/lib/TreeViewUtilities.js.map +1 -1
- package/lib/UuidUtilities.d.ts +30 -0
- package/lib/UuidUtilities.d.ts.map +1 -0
- package/lib/UuidUtilities.js +98 -0
- package/lib/UuidUtilities.js.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts +52 -28
- package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -1
- package/lib/id-compressor/AppendOnlySortedMap.js +165 -88
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts +43 -42
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +97 -95
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/id-compressor/NumericUuid.d.ts +6 -14
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
- package/lib/id-compressor/NumericUuid.js +11 -70
- package/lib/id-compressor/NumericUuid.js.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.d.ts +122 -0
- package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -0
- package/lib/id-compressor/SessionIdNormalizer.js +414 -0
- package/lib/id-compressor/SessionIdNormalizer.js.map +1 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts +6 -13
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/persisted-types/0.1.1.d.ts +1 -6
- package/lib/persisted-types/0.1.1.d.ts.map +1 -1
- package/lib/persisted-types/0.1.1.js.map +1 -1
- package/lib/test/AppendOnlySortedMap.perf.tests.d.ts +6 -0
- package/lib/test/AppendOnlySortedMap.perf.tests.d.ts.map +1 -0
- package/lib/test/AppendOnlySortedMap.perf.tests.js +49 -0
- package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.js +56 -14
- package/lib/test/AppendOnlySortedMap.tests.js.map +1 -1
- package/lib/test/Checkout.tests.js +2 -2
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Forest.tests.js.map +1 -1
- package/lib/test/IdCompressor.perf.tests.js +8 -2
- package/lib/test/IdCompressor.perf.tests.js.map +1 -1
- package/lib/test/IdCompressor.tests.js +75 -24
- package/lib/test/IdCompressor.tests.js.map +1 -1
- package/lib/test/LogViewer.tests.js +3 -5
- package/lib/test/LogViewer.tests.js.map +1 -1
- package/lib/test/NumericUuid.perf.tests.js +4 -4
- package/lib/test/NumericUuid.perf.tests.js.map +1 -1
- package/lib/test/NumericUuid.tests.js +5 -4
- package/lib/test/NumericUuid.tests.js.map +1 -1
- package/lib/test/RevisionValueCache.tests.js.map +1 -1
- package/lib/test/RevisionView.tests.js.map +1 -1
- package/lib/test/SessionIdNormalizer.tests.d.ts +6 -0
- package/lib/test/SessionIdNormalizer.tests.d.ts.map +1 -0
- package/lib/test/SessionIdNormalizer.tests.js +299 -0
- package/lib/test/SessionIdNormalizer.tests.js.map +1 -0
- package/lib/test/Summary.tests.js +1 -1
- package/lib/test/Summary.tests.js.map +1 -1
- package/lib/test/TreeCompression.tests.js +1 -1
- package/lib/test/TreeCompression.tests.js.map +1 -1
- package/lib/test/Virtualization.tests.js +1 -1
- package/lib/test/Virtualization.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts +3 -14
- package/lib/test/fuzz/Generators.d.ts.map +1 -1
- package/lib/test/fuzz/Generators.js +60 -151
- package/lib/test/fuzz/Generators.js.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +10 -7
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.js +94 -104
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
- package/lib/test/fuzz/Types.d.ts +2 -9
- package/lib/test/fuzz/Types.d.ts.map +1 -1
- package/lib/test/fuzz/Types.js +1 -1
- package/lib/test/fuzz/Types.js.map +1 -1
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +57 -11
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/IdCompressorTestUtilities.js +112 -98
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.js +2 -1
- package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +30 -1
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.js +20 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -1
- package/lib/test/utilities/SummaryLoadPerfTests.js +6 -3
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -1
- package/lib/test/utilities/TestNode.js.map +1 -1
- package/lib/test/utilities/TestUtilities.d.ts +9 -1
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +27 -13
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/package.json +19 -17
- package/src/Common.ts +42 -4
- package/src/EditLog.ts +1 -1
- package/src/Identifiers.ts +5 -0
- package/src/LogViewer.ts +4 -20
- package/src/RevisionValueCache.ts +11 -8
- package/src/SharedTree.ts +222 -75
- package/src/SharedTreeEncoder.ts +17 -11
- package/src/TreeCompressor.ts +2 -4
- package/src/UuidUtilities.ts +123 -0
- package/src/id-compressor/AppendOnlySortedMap.ts +183 -94
- package/src/id-compressor/IdCompressor.ts +144 -132
- package/src/id-compressor/NumericUuid.ts +11 -80
- package/src/id-compressor/SessionIdNormalizer.ts +497 -0
- package/src/id-compressor/persisted-types/0.0.1.ts +12 -15
- package/src/index.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedTreeVersioningTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"SharedTreeVersioningTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,OAAO,EAIN,2BAA2B,EAC3B,wBAAwB,EAIxB,MAAM,iBAAiB,CAAC;AAOzB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,CAAC,OAAO,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,QA0fxF"}
|
|
@@ -9,6 +9,7 @@ import { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';
|
|
|
9
9
|
import { SharedTreeDiagnosticEvent } from '../../EventTypes';
|
|
10
10
|
import { SharedTreeOpType, WriteFormat } from '../../persisted-types';
|
|
11
11
|
import { TreeNodeHandle } from '../../TreeNodeHandle';
|
|
12
|
+
import { nilUuid } from '../../UuidUtilities';
|
|
12
13
|
import { applyTestEdits } from '../Summary.tests';
|
|
13
14
|
import { buildLeaf } from './TestNode';
|
|
14
15
|
import { applyNoop, setUpLocalServerTestSharedTree, setUpTestTree, spyOnSubmittedOps, testTrait, waitForSummary, } from './TestUtilities';
|
|
@@ -320,6 +321,25 @@ export function runSharedTreeVersioningTests(title, setUpTestSharedTree) {
|
|
|
320
321
|
await testObjectProvider.ensureSynchronized();
|
|
321
322
|
expect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;
|
|
322
323
|
}).timeout(10000);
|
|
324
|
+
it('attributes all pre-upgrade IDs to the nil UUID after upgrading from 0.0.2', async () => {
|
|
325
|
+
const { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({
|
|
326
|
+
writeFormat: WriteFormat.v0_0_2,
|
|
327
|
+
});
|
|
328
|
+
const attributionId = tree.attributionId;
|
|
329
|
+
expect(attributionId).to.equal(nilUuid);
|
|
330
|
+
const nodeId = tree.generateNodeId();
|
|
331
|
+
const stableNodeId = tree.convertToStableNodeId(nodeId);
|
|
332
|
+
tree.applyEdit(Change.insertTree(buildLeaf(nodeId), StablePlace.atStartOf(testTrait(tree.currentView))));
|
|
333
|
+
// New tree joins, causes an upgrade
|
|
334
|
+
const { tree: tree2 } = await setUpLocalServerTestSharedTree({
|
|
335
|
+
writeFormat: WriteFormat.v0_1_1,
|
|
336
|
+
testObjectProvider,
|
|
337
|
+
});
|
|
338
|
+
await testObjectProvider.ensureSynchronized();
|
|
339
|
+
expect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);
|
|
340
|
+
expect(tree.attributeNodeId(nodeId)).to.equal(attributionId);
|
|
341
|
+
expect(tree2.attributeNodeId(tree2.convertToNodeId(stableNodeId))).to.equal(attributionId);
|
|
342
|
+
});
|
|
323
343
|
describe('telemetry', () => {
|
|
324
344
|
const events = [];
|
|
325
345
|
const logger = { send: (event) => events.push(event) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SharedTreeVersioningTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.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 { ITelemetryBaseEvent } from '@fluidframework/common-definitions';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { expect } from 'chai';\nimport { StableRange, StablePlace, BuildNode, Change } from '../../ChangeTypes';\nimport { Mutable } from '../../Common';\nimport { EditLog } from '../../EditLog';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes';\nimport { NodeId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { SharedTreeOpType, SharedTreeUpdateOp, TreeNodeSequence, WriteFormat } from '../../persisted-types';\nimport { SharedTree } from '../../SharedTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { applyTestEdits } from '../Summary.tests';\nimport { buildLeaf } from './TestNode';\nimport {\n\tapplyNoop,\n\tsetUpLocalServerTestSharedTree,\n\tsetUpTestTree,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tspyOnSubmittedOps,\n\ttestTrait,\n\twaitForSummary,\n} from './TestUtilities';\n\nfunction spyOnVersionChanges(tree: SharedTree): WriteFormat[] {\n\tconst versions: WriteFormat[] = [];\n\ttree.on(SharedTreeDiagnosticEvent.WriteVersionChanged, (version) => versions.push(version));\n\treturn versions;\n}\n/**\n * Runs a test suite for operations on `SharedTree` that depend on correct versioning.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeVersioningTests(\n\ttitle: string,\n\tsetUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tdescribe(title, () => {\n\t\tconst oldVersion = WriteFormat.v0_0_2;\n\t\tconst newVersion = WriteFormat.v0_1_1;\n\t\tconst treeOptions = { localMode: false, writeFormat: oldVersion };\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\twriteFormat: newVersion,\n\t\t};\n\n\t\tit('only processes edit ops if they have the same version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The newer tree should have ignored the first edit\n\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\t\t});\n\n\t\tit('resubmits ops concurrent to an update op using the new format', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst rootStableId = testTree.stable.identifier;\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\ttree.applyEdit(...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify even though one edit was applied, 2 edit ops were sent due to the version upgrade.\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\n\t\t\t// Verify both trees apply the updated op.\n\t\t\tconst handle = new TreeNodeHandle(tree.currentView, tree.convertToNodeId(rootStableId));\n\t\t\texpect(handle.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t\tconst handle2 = new TreeNodeHandle(newerTree.currentView, newerTree.convertToNodeId(rootStableId));\n\t\t\texpect(handle2.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle2.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t});\n\n\t\tit('throws if an edit op with a newer version than the write version is received', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit and expect it to throw\n\t\t\tapplyNoop(newerTree);\n\t\t\texpect(() => containerRuntimeFactory.processAllMessages()).to.throw(\n\t\t\t\t'Newer op version received by a client that has yet to be updated.'\n\t\t\t);\n\t\t});\n\n\t\tit('ignores duplicate update ops', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\t\t\tconst { tree: newerTree2 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\t\t\tconst { tree: newerTree3 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\t\t\tconst versions2 = spyOnVersionChanges(newerTree2);\n\t\t\tconst versions3 = spyOnVersionChanges(newerTree3);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tnewerTree2.loadSummary(summary);\n\t\t\tnewerTree3.loadSummary(summary);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Each tree should have processed a version update once\n\t\t\texpect(versions).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions2).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions3).to.deep.equal([oldVersion, newVersion]);\n\t\t});\n\n\t\tit('maintains custom EditLog and LogViewer callbacks when updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\tlet editAdded = 0;\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\t(newerTree.edits as EditLog).registerEditAddedHandler(() => editAdded++);\n\n\t\t\texpect(versions).to.have.length(1);\n\t\t\texpect(versions[0]).to.equal(oldVersion);\n\n\t\t\t// Update occurs after the handler is added to the old edit log\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(versions).to.have.length(2);\n\t\t\texpect(versions[1]).to.equal(newVersion);\n\n\t\t\tconst additionalEdits = 5;\n\t\t\tfor (let i = 0; i < additionalEdits; i++) {\n\t\t\t\tapplyNoop(newerTree);\n\t\t\t}\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The edit added handler should run twice for each additional edit (once when applying locally and once when applying the sequenced edit)\n\t\t\texpect(editAdded).to.equal(additionalEdits * 2);\n\t\t});\n\n\t\tit('begins writing the new version only after updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst ops = spyOnSubmittedOps(newerContainerRuntimeFactory);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tapplyNoop(newerTree);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\tapplyNoop(newerTree);\n\n\t\t\texpect(ops.length).to.equal(4);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\t\t\t// Because the first op was submitted before the Update message was sequenced, it should use\n\t\t\t// the same write format as the loaded summary.\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t\texpect(ops[3].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('Existing client can update to a write version higher than the initialized write version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst versions = spyOnVersionChanges(tree);\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\t// Apply another arbitrary edit to the initial tree, which should now be using the new write version.\n\t\t\tapplyNoop(tree);\n\n\t\t\texpect(versions).to.eql([newVersion]);\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[0].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('New client can update to a write version higher than the initialized version on summary load', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a tree with older write version; it should recognize the document is already using\n\t\t\t// the new write version and use that instead.\n\t\t\tconst { tree: olderTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: oldVersion,\n\t\t\t});\n\n\t\t\tolderTree.loadSummary(summary);\n\t\t\tapplyNoop(olderTree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(ops.length).to.equal(2);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([SharedTreeOpType.Edit, SharedTreeOpType.Edit]);\n\t\t\texpect(ops.map((op) => op.version)).to.eql([newVersion, newVersion]);\n\t\t});\n\n\t\tit('can load a 0.1.1 summary and access the current view', () => {\n\t\t\t// This is a regression test for the logic initializing SharedTree's EditLog from a summary.\n\t\t\t// The 0.1.1 format omits `currentTree`, but EditLog should still tolerate synchronous access\n\t\t\t// of the first edit in the session (which is a single insert containing that tree).\n\t\t\tconst options: SharedTreeTestingOptions = {\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t\tlocalMode: false,\n\t\t\t};\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst { tree: newTree } = setUpTestSharedTree({ containerRuntimeFactory, ...options });\n\t\t\tnewTree.loadSummary(summary);\n\t\t\texpect(newTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(() => newTree.currentView).to.not.throw();\n\t\t});\n\n\t\tit('upgrades properly when no edits are sent', async () => {\n\t\t\t// Starts in 0.0.2 (so no upgrade)\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('generates unique IDs after upgrading from 0.0.2', async () => {\n\t\t\tconst idCount = 100;\n\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tapplyTestEdits(tree);\n\n\t\t\tconst nodeIds = new Set<NodeId>();\n\t\t\tconst stableIds = new Set<StableNodeId>();\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\tnodeIds.add(id);\n\t\t\t\tstableIds.add(tree.convertToStableNodeId(id));\n\t\t\t}\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\t// No IDs should be generated that were already generated before the update\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\texpect(nodeIds.has(id)).to.be.false;\n\t\t\t\texpect(stableIds.has(tree.convertToStableNodeId(id))).to.be.false;\n\t\t\t}\n\t\t\texpect(tree.equals(tree)).to.be.true;\n\t\t});\n\n\t\tit('converts IDs correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst idCount = 10;\n\t\t\tconst ids: [NodeId, StableNodeId][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree1.generateNodeId();\n\t\t\t\tids.push([id, tree1.convertToStableNodeId(id)]);\n\t\t\t}\n\n\t\t\t// Use some of the IDs in edits, but leave others unused.\n\t\t\t// They should all be valid and usable after upgrade.\n\t\t\tconst builds: Mutable<TreeNodeSequence<BuildNode>> = [];\n\t\t\tfor (let i = 1; i < ids.length; i += 2) {\n\t\t\t\tbuilds.push(buildLeaf(ids[i][0], i));\n\t\t\t}\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\tbuilds,\n\t\t\t\t\tStablePlace.atEndOf({ parent: tree1.currentView.root, label: 'foo' as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tconst view = tree1.currentView;\n\t\t\tfor (let i = 0; i < ids.length; i++) {\n\t\t\t\tconst [nodeIdBefore, stableIdBefore] = ids[i];\n\t\t\t\texpect(tree1.convertToStableNodeId(nodeIdBefore)).to.equal(stableIdBefore);\n\t\t\t\tif (i % 2 === 0) {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.false;\n\t\t\t\t} else {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.true;\n\t\t\t\t\tconst node = view.getViewNode(nodeIdBefore);\n\t\t\t\t\texpect(node.payload).to.equal(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('interns strings correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst {\n\t\t\t\ttestObjectProvider,\n\t\t\t\ttree: tree1,\n\t\t\t\tcontainer,\n\t\t\t} = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\n\t\t\tconst internedDefinition = 'internedDefinition';\n\n\t\t\tconst id = tree1.generateNodeId();\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: id },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\t\t\ttree1.applyEdit(Change.delete(StableRange.only(id)));\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst summaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\theaders: { [LoaderHeader.version]: summaryVersion },\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: tree1.generateNodeId() },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;\n\t\t}).timeout(10000);\n\n\t\tdescribe('telemetry', () => {\n\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\tconst logger = { send: (event) => events.push(event) };\n\t\t\tbeforeEach(() => {\n\t\t\t\tevents.length = 0;\n\t\t\t});\n\n\t\t\tit('emits RequestVersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\texpect(\n\t\t\t\t\tevents.some(\n\t\t\t\t\t\t(event) =>\n\t\t\t\t\t\t\tevent.eventName === 'SharedTree:RequestVersionUpdate' &&\n\t\t\t\t\t\t\tevent.versionTo === newVersion &&\n\t\t\t\t\t\t\tevent.versionFrom === oldVersion &&\n\t\t\t\t\t\t\tevent.category === 'generic'\n\t\t\t\t\t)\n\t\t\t\t).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits VersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\tconst matchesVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_end' &&\n\t\t\t\t\tevent.version === newVersion &&\n\t\t\t\t\tevent.category === 'performance' &&\n\t\t\t\t\ttypeof event.duration === 'number';\n\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(false);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits error events on VersionUpdate failure', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst op: SharedTreeUpdateOp = {\n\t\t\t\t\ttype: SharedTreeOpType.Update,\n\t\t\t\t\tversion: newVersion,\n\t\t\t\t};\n\t\t\t\tcontainerRuntimeFactory.pushMessage({ contents: op });\n\t\t\t\t(tree.edits as EditLog).getLocalEdits = () => {\n\t\t\t\t\tthrow new Error('Simulated issue in update');\n\t\t\t\t};\n\t\t\t\tconst matchesFailedVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_cancel' &&\n\t\t\t\t\tevent.category === 'error' &&\n\t\t\t\t\tevent.error === 'Simulated issue in update';\n\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(false);\n\t\t\t\texpect(() => containerRuntimeFactory.processAllMessages()).to.throw(/Simulated issue in update/);\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(true);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SharedTreeVersioningTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeVersioningTests.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 { ITelemetryBaseEvent } from '@fluidframework/common-definitions';\nimport { LoaderHeader } from '@fluidframework/container-definitions';\nimport { expect } from 'chai';\nimport { StableRange, StablePlace, BuildNode, Change } from '../../ChangeTypes';\nimport { Mutable } from '../../Common';\nimport { EditLog } from '../../EditLog';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { SharedTreeDiagnosticEvent } from '../../EventTypes';\nimport { NodeId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { SharedTreeOpType, SharedTreeUpdateOp, TreeNodeSequence, WriteFormat } from '../../persisted-types';\nimport { SharedTree } from '../../SharedTree';\nimport { TreeNodeHandle } from '../../TreeNodeHandle';\nimport { nilUuid } from '../../UuidUtilities';\nimport { applyTestEdits } from '../Summary.tests';\nimport { buildLeaf } from './TestNode';\nimport {\n\tapplyNoop,\n\tsetUpLocalServerTestSharedTree,\n\tsetUpTestTree,\n\tSharedTreeTestingComponents,\n\tSharedTreeTestingOptions,\n\tspyOnSubmittedOps,\n\ttestTrait,\n\twaitForSummary,\n} from './TestUtilities';\n\nfunction spyOnVersionChanges(tree: SharedTree): WriteFormat[] {\n\tconst versions: WriteFormat[] = [];\n\ttree.on(SharedTreeDiagnosticEvent.WriteVersionChanged, (version) => versions.push(version));\n\treturn versions;\n}\n/**\n * Runs a test suite for operations on `SharedTree` that depend on correct versioning.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSharedTreeVersioningTests(\n\ttitle: string,\n\tsetUpTestSharedTree: (options?: SharedTreeTestingOptions) => SharedTreeTestingComponents\n) {\n\tdescribe(title, () => {\n\t\tconst oldVersion = WriteFormat.v0_0_2;\n\t\tconst newVersion = WriteFormat.v0_1_1;\n\t\tconst treeOptions = { localMode: false, writeFormat: oldVersion };\n\t\tconst secondTreeOptions = {\n\t\t\tid: 'secondTestSharedTree',\n\t\t\tlocalMode: false,\n\t\t\twriteFormat: newVersion,\n\t\t};\n\n\t\tit('only processes edit ops if they have the same version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The newer tree should have ignored the first edit\n\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\t\t});\n\n\t\tit('resubmits ops concurrent to an update op using the new format', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tconst rootStableId = testTree.stable.identifier;\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\ttree.applyEdit(...Change.move(StableRange.only(testTree.left), StablePlace.after(testTree.right)));\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Verify even though one edit was applied, 2 edit ops were sent due to the version upgrade.\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\n\t\t\t// Verify both trees apply the updated op.\n\t\t\tconst handle = new TreeNodeHandle(tree.currentView, tree.convertToNodeId(rootStableId));\n\t\t\texpect(handle.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t\tconst handle2 = new TreeNodeHandle(newerTree.currentView, newerTree.convertToNodeId(rootStableId));\n\t\t\texpect(handle2.traits[testTree.left.traitLabel]).to.equal(undefined);\n\t\t\texpect(handle2.traits[testTree.right.traitLabel].length).to.equal(2);\n\t\t});\n\n\t\tit('throws if an edit op with a newer version than the write version is received', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\n\t\t\texpect(tree.edits.length).to.equal(0);\n\t\t\texpect(newerTree.edits.length).to.equal(0);\n\n\t\t\t// Process an edit and expect it to throw\n\t\t\tapplyNoop(newerTree);\n\t\t\texpect(() => containerRuntimeFactory.processAllMessages()).to.throw(\n\t\t\t\t'Newer op version received by a client that has yet to be updated.'\n\t\t\t);\n\t\t});\n\n\t\tit('ignores duplicate update ops', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\t\t\tconst { tree: newerTree2 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\t\t\tconst { tree: newerTree3 } = setUpTestSharedTree({\n\t\t\t\tcontainerRuntimeFactory: newerContainerRuntimeFactory,\n\t\t\t\t...secondTreeOptions,\n\t\t\t});\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\t\t\tconst versions2 = spyOnVersionChanges(newerTree2);\n\t\t\tconst versions3 = spyOnVersionChanges(newerTree3);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tnewerTree2.loadSummary(summary);\n\t\t\tnewerTree3.loadSummary(summary);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// Each tree should have processed a version update once\n\t\t\texpect(versions).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions2).to.deep.equal([oldVersion, newVersion]);\n\t\t\texpect(versions3).to.deep.equal([oldVersion, newVersion]);\n\t\t});\n\n\t\tit('maintains custom EditLog and LogViewer callbacks when updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\tlet editAdded = 0;\n\n\t\t\t// Load the summary into multiple newer trees to trigger version update ops\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst versions = spyOnVersionChanges(newerTree);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\t(newerTree.edits as EditLog).registerEditAddedHandler(() => editAdded++);\n\n\t\t\texpect(versions).to.have.length(1);\n\t\t\texpect(versions[0]).to.equal(oldVersion);\n\n\t\t\t// Update occurs after the handler is added to the old edit log\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(versions).to.have.length(2);\n\t\t\texpect(versions[1]).to.equal(newVersion);\n\n\t\t\tconst additionalEdits = 5;\n\t\t\tfor (let i = 0; i < additionalEdits; i++) {\n\t\t\t\tapplyNoop(newerTree);\n\t\t\t}\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\n\t\t\t// The edit added handler should run twice for each additional edit (once when applying locally and once when applying the sequenced edit)\n\t\t\texpect(editAdded).to.equal(additionalEdits * 2);\n\t\t});\n\n\t\tit('begins writing the new version only after updating', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree, containerRuntimeFactory: newerContainerRuntimeFactory } =\n\t\t\t\tsetUpTestSharedTree(secondTreeOptions);\n\n\t\t\tconst ops = spyOnSubmittedOps(newerContainerRuntimeFactory);\n\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tapplyNoop(newerTree);\n\t\t\tnewerContainerRuntimeFactory.processAllMessages();\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\tapplyNoop(newerTree);\n\n\t\t\texpect(ops.length).to.equal(4);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\t\t\t// Because the first op was submitted before the Update message was sequenced, it should use\n\t\t\t// the same write format as the loaded summary.\n\t\t\texpect(ops[1].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t\texpect(ops[3].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('Existing client can update to a write version higher than the initialized write version', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(treeOptions);\n\t\t\tconst versions = spyOnVersionChanges(tree);\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\t// Process an edit\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a newer tree to trigger a version update op\n\t\t\tconst { tree: newerTree } = setUpTestSharedTree({ containerRuntimeFactory, ...secondTreeOptions });\n\t\t\tnewerTree.loadSummary(summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(newerTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\t// Apply another arbitrary edit to the initial tree, which should now be using the new write version.\n\t\t\tapplyNoop(tree);\n\n\t\t\texpect(versions).to.eql([newVersion]);\n\t\t\texpect(ops.length).to.equal(3);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t\tSharedTreeOpType.Update,\n\t\t\t\tSharedTreeOpType.Edit,\n\t\t\t]);\n\n\t\t\texpect(ops[0].version).to.equal(oldVersion);\n\t\t\texpect(ops[2].version).to.equal(newVersion);\n\t\t});\n\n\t\tit('New client can update to a write version higher than the initialized version on summary load', () => {\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\twriteFormat: newVersion,\n\t\t\t});\n\t\t\tconst ops = spyOnSubmittedOps(containerRuntimeFactory);\n\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\n\t\t\t// Load the summary into a tree with older write version; it should recognize the document is already using\n\t\t\t// the new write version and use that instead.\n\t\t\tconst { tree: olderTree } = setUpTestSharedTree({\n\t\t\t\t...treeOptions,\n\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\twriteFormat: oldVersion,\n\t\t\t});\n\n\t\t\tolderTree.loadSummary(summary);\n\t\t\tapplyNoop(olderTree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\texpect(ops.length).to.equal(2);\n\t\t\texpect(ops.map((op) => op.type)).to.eql([SharedTreeOpType.Edit, SharedTreeOpType.Edit]);\n\t\t\texpect(ops.map((op) => op.version)).to.eql([newVersion, newVersion]);\n\t\t});\n\n\t\tit('can load a 0.1.1 summary and access the current view', () => {\n\t\t\t// This is a regression test for the logic initializing SharedTree's EditLog from a summary.\n\t\t\t// The 0.1.1 format omits `currentTree`, but EditLog should still tolerate synchronous access\n\t\t\t// of the first edit in the session (which is a single insert containing that tree).\n\t\t\tconst options: SharedTreeTestingOptions = {\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t\tlocalMode: false,\n\t\t\t};\n\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree(options);\n\t\t\tapplyNoop(tree);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst summary = tree.saveSummary();\n\t\t\tconst { tree: newTree } = setUpTestSharedTree({ containerRuntimeFactory, ...options });\n\t\t\tnewTree.loadSummary(summary);\n\t\t\texpect(newTree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(() => newTree.currentView).to.not.throw();\n\t\t});\n\n\t\tit('upgrades properly when no edits are sent', async () => {\n\t\t\t// Starts in 0.0.2 (so no upgrade)\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_0_2);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('generates unique IDs after upgrading from 0.0.2', async () => {\n\t\t\tconst idCount = 100;\n\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tapplyTestEdits(tree);\n\n\t\t\tconst nodeIds = new Set<NodeId>();\n\t\t\tconst stableIds = new Set<StableNodeId>();\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\tnodeIds.add(id);\n\t\t\t\tstableIds.add(tree.convertToStableNodeId(id));\n\t\t\t}\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\t// No IDs should be generated that were already generated before the update\n\t\t\t\tconst id = tree.generateNodeId();\n\t\t\t\texpect(nodeIds.has(id)).to.be.false;\n\t\t\t\texpect(stableIds.has(tree.convertToStableNodeId(id))).to.be.false;\n\t\t\t}\n\t\t\texpect(tree.equals(tree)).to.be.true;\n\t\t});\n\n\t\tit('converts IDs correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree1 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst idCount = 10;\n\t\t\tconst ids: [NodeId, StableNodeId][] = [];\n\t\t\tfor (let i = 0; i < idCount; i++) {\n\t\t\t\tconst id = tree1.generateNodeId();\n\t\t\t\tids.push([id, tree1.convertToStableNodeId(id)]);\n\t\t\t}\n\n\t\t\t// Use some of the IDs in edits, but leave others unused.\n\t\t\t// They should all be valid and usable after upgrade.\n\t\t\tconst builds: Mutable<TreeNodeSequence<BuildNode>> = [];\n\t\t\tfor (let i = 1; i < ids.length; i += 2) {\n\t\t\t\tbuilds.push(buildLeaf(ids[i][0], i));\n\t\t\t}\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\tbuilds,\n\t\t\t\t\tStablePlace.atEndOf({ parent: tree1.currentView.root, label: 'foo' as TraitLabel })\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\tconst view = tree1.currentView;\n\t\t\tfor (let i = 0; i < ids.length; i++) {\n\t\t\t\tconst [nodeIdBefore, stableIdBefore] = ids[i];\n\t\t\t\texpect(tree1.convertToStableNodeId(nodeIdBefore)).to.equal(stableIdBefore);\n\t\t\t\tif (i % 2 === 0) {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.false;\n\t\t\t\t} else {\n\t\t\t\t\texpect(view.hasNode(nodeIdBefore)).to.be.true;\n\t\t\t\t\tconst node = view.getViewNode(nodeIdBefore);\n\t\t\t\t\texpect(node.payload).to.equal(i);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(tree1.equals(tree2)).to.be.true;\n\t\t});\n\n\t\tit('interns strings correctly after upgrading from 0.0.2', async () => {\n\t\t\tconst {\n\t\t\t\ttestObjectProvider,\n\t\t\t\ttree: tree1,\n\t\t\t\tcontainer,\n\t\t\t} = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\tsummarizeHistory: false,\n\t\t\t});\n\n\t\t\tconst internedDefinition = 'internedDefinition';\n\n\t\t\tconst id = tree1.generateNodeId();\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: id },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\t\t\ttree1.applyEdit(Change.delete(StableRange.only(id)));\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tconst summaryVersion = await waitForSummary(container);\n\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t\theaders: { [LoaderHeader.version]: summaryVersion },\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree1.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree2.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\n\t\t\ttree1.applyEdit(\n\t\t\t\t...Change.insertTree(\n\t\t\t\t\t{ definition: internedDefinition, identifier: tree1.generateNodeId() },\n\t\t\t\t\tStablePlace.atStartOf(testTrait(tree1.currentView))\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(areRevisionViewsSemanticallyEqual(tree1.currentView, tree1, tree2.currentView, tree2)).to.be.true;\n\t\t}).timeout(10000);\n\n\t\tit('attributes all pre-upgrade IDs to the nil UUID after upgrading from 0.0.2', async () => {\n\t\t\tconst { testObjectProvider, tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t});\n\n\t\t\tconst attributionId = tree.attributionId;\n\t\t\texpect(attributionId).to.equal(nilUuid);\n\t\t\tconst nodeId = tree.generateNodeId();\n\t\t\tconst stableNodeId = tree.convertToStableNodeId(nodeId);\n\n\t\t\ttree.applyEdit(Change.insertTree(buildLeaf(nodeId), StablePlace.atStartOf(testTrait(tree.currentView))));\n\n\t\t\t// New tree joins, causes an upgrade\n\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\ttestObjectProvider,\n\t\t\t});\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\texpect(tree.getWriteFormat()).to.equal(WriteFormat.v0_1_1);\n\t\t\texpect(tree.attributeNodeId(nodeId)).to.equal(attributionId);\n\t\t\texpect(tree2.attributeNodeId(tree2.convertToNodeId(stableNodeId))).to.equal(attributionId);\n\t\t});\n\n\t\tdescribe('telemetry', () => {\n\t\t\tconst events: ITelemetryBaseEvent[] = [];\n\t\t\tconst logger = { send: (event) => events.push(event) };\n\t\t\tbeforeEach(() => {\n\t\t\t\tevents.length = 0;\n\t\t\t});\n\n\t\t\tit('emits RequestVersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\texpect(\n\t\t\t\t\tevents.some(\n\t\t\t\t\t\t(event) =>\n\t\t\t\t\t\t\tevent.eventName === 'SharedTree:RequestVersionUpdate' &&\n\t\t\t\t\t\t\tevent.versionTo === newVersion &&\n\t\t\t\t\t\t\tevent.versionFrom === oldVersion &&\n\t\t\t\t\t\t\tevent.category === 'generic'\n\t\t\t\t\t)\n\t\t\t\t).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits VersionUpdate events', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst { tree: newerTree } = setUpTestSharedTree({\n\t\t\t\t\tcontainerRuntimeFactory,\n\t\t\t\t\t...secondTreeOptions,\n\t\t\t\t\tlogger,\n\t\t\t\t});\n\n\t\t\t\tnewerTree.loadSummary(tree.saveSummary());\n\t\t\t\tconst matchesVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_end' &&\n\t\t\t\t\tevent.version === newVersion &&\n\t\t\t\t\tevent.category === 'performance' &&\n\t\t\t\t\ttypeof event.duration === 'number';\n\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(false);\n\t\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\t\texpect(events.some(matchesVersionUpdate)).to.equal(true);\n\t\t\t});\n\n\t\t\tit('emits error events on VersionUpdate failure', () => {\n\t\t\t\tconst { tree, containerRuntimeFactory } = setUpTestSharedTree({ ...treeOptions, logger });\n\t\t\t\tconst op: SharedTreeUpdateOp = {\n\t\t\t\t\ttype: SharedTreeOpType.Update,\n\t\t\t\t\tversion: newVersion,\n\t\t\t\t};\n\t\t\t\tcontainerRuntimeFactory.pushMessage({ contents: op });\n\t\t\t\t(tree.edits as EditLog).getLocalEdits = () => {\n\t\t\t\t\tthrow new Error('Simulated issue in update');\n\t\t\t\t};\n\t\t\t\tconst matchesFailedVersionUpdate = (event: ITelemetryBaseEvent) =>\n\t\t\t\t\tevent.eventName === 'SharedTree:VersionUpdate_cancel' &&\n\t\t\t\t\tevent.category === 'error' &&\n\t\t\t\t\tevent.error === 'Simulated issue in update';\n\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(false);\n\t\t\t\texpect(() => containerRuntimeFactory.processAllMessages()).to.throw(/Simulated issue in update/);\n\t\t\t\texpect(events.some(matchesFailedVersionUpdate)).to.equal(true);\n\t\t\t});\n\t\t});\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SummaryLoadPerfTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"SummaryLoadPerfTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiC3D"}
|
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { join } from 'path';
|
|
6
6
|
import * as fs from 'fs';
|
|
7
|
+
import { takeAsync } from '@fluid-internal/stochastic-test-utils';
|
|
7
8
|
import { benchmark, BenchmarkType } from '@fluid-tools/benchmark';
|
|
8
9
|
import { WriteFormat } from '../../persisted-types';
|
|
9
10
|
import { performFuzzActions } from '../fuzz/SharedTreeFuzzTests';
|
|
10
|
-
import { makeOpGenerator
|
|
11
|
+
import { makeOpGenerator } from '../fuzz/Generators';
|
|
11
12
|
import { expectAssert } from '../Summary.tests';
|
|
12
13
|
import { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';
|
|
13
14
|
import { setUpLocalServerTestSharedTree, setUpTestSharedTree, testDocumentsPathBase } from './TestUtilities';
|
|
@@ -22,7 +23,9 @@ export function runSummaryLoadPerfTests(title) {
|
|
|
22
23
|
it.skip('save files to disk', async () => {
|
|
23
24
|
await writeSummaryTestTrees();
|
|
24
25
|
});
|
|
25
|
-
const { summaryFileWithHistory_0_0_2, summaryFileNoHistory_0_0_2, summaryFileWithHistory_0_1_1, summaryFileNoHistory_0_1_1,
|
|
26
|
+
const { summaryFileWithHistory_0_0_2, summaryFileNoHistory_0_0_2, summaryFileWithHistory_0_1_1, summaryFileNoHistory_0_1_1,
|
|
27
|
+
// blobsFile: string;
|
|
28
|
+
} = loadSummaryTestFiles();
|
|
26
29
|
const tests = [
|
|
27
30
|
{ title: 'load 0.0.2 format without history', file: summaryFileNoHistory_0_0_2 },
|
|
28
31
|
{ title: 'load 0.0.2 format with history', file: summaryFileWithHistory_0_0_2 },
|
|
@@ -42,7 +45,7 @@ export function runSummaryLoadPerfTests(title) {
|
|
|
42
45
|
});
|
|
43
46
|
}
|
|
44
47
|
async function generateRandomTree(seed, maxTreeSize, writeFormat, summarizeHistory) {
|
|
45
|
-
const generator =
|
|
48
|
+
const generator = takeAsync(1000, makeOpGenerator({
|
|
46
49
|
editConfig: { maxTreeSize },
|
|
47
50
|
joinConfig: {
|
|
48
51
|
writeFormat: [writeFormat],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SummaryLoadPerfTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"SummaryLoadPerfTests.js","sourceRoot":"","sources":["../../../src/test/utilities/SummaryLoadPerfTests.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 { join } from 'path';\nimport * as fs from 'fs';\nimport { takeAsync } from '@fluid-internal/stochastic-test-utils';\nimport { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { SharedTree } from '../../SharedTree';\nimport { WriteFormat } from '../../persisted-types';\nimport { performFuzzActions } from '../fuzz/SharedTreeFuzzTests';\nimport { makeOpGenerator } from '../fuzz/Generators';\nimport { expectAssert } from '../Summary.tests';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { setUpLocalServerTestSharedTree, setUpTestSharedTree, testDocumentsPathBase } from './TestUtilities';\n\nconst directory = join(testDocumentsPathBase, 'summary-load-perf-tests');\n\n/**\n * Runs a test suite for summary load perf on `SharedTree`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runSummaryLoadPerfTests(title: string): void {\n\tdescribe(title, () => {\n\t\t// Re-enable this test for an easy way to write the test summary files to disk\n\t\tit.skip('save files to disk', async () => {\n\t\t\tawait writeSummaryTestTrees();\n\t\t});\n\n\t\tconst {\n\t\t\tsummaryFileWithHistory_0_0_2,\n\t\t\tsummaryFileNoHistory_0_0_2,\n\t\t\tsummaryFileWithHistory_0_1_1,\n\t\t\tsummaryFileNoHistory_0_1_1,\n\t\t\t// blobsFile: string;\n\t\t} = loadSummaryTestFiles();\n\n\t\tconst tests = [\n\t\t\t{ title: 'load 0.0.2 format without history', file: summaryFileNoHistory_0_0_2 },\n\t\t\t{ title: 'load 0.0.2 format with history', file: summaryFileWithHistory_0_0_2 },\n\t\t\t{ title: 'load 0.1.1 format without history', file: summaryFileNoHistory_0_1_1 },\n\t\t\t{ title: 'load 0.1.1 format with history', file: summaryFileWithHistory_0_1_1 },\n\t\t];\n\n\t\tfor (const { title, file } of tests) {\n\t\t\tbenchmark({\n\t\t\t\ttype: BenchmarkType.Measurement,\n\t\t\t\ttitle,\n\t\t\t\tbenchmarkFn: () => {\n\t\t\t\t\tconst { tree } = setUpTestSharedTree({ writeFormat: WriteFormat.v0_0_2 });\n\t\t\t\t\ttree.loadSerializedSummary(file);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t});\n}\n\nasync function generateRandomTree(\n\tseed: number,\n\tmaxTreeSize: number,\n\twriteFormat: WriteFormat,\n\tsummarizeHistory: boolean\n): Promise<SharedTree> {\n\tconst generator = takeAsync(\n\t\t1000,\n\t\tmakeOpGenerator({\n\t\t\teditConfig: { maxTreeSize },\n\t\t\tjoinConfig: {\n\t\t\t\twriteFormat: [writeFormat],\n\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\tmaximumActiveCollaborators: 2,\n\t\t\t\tmaximumPassiveCollaborators: 0,\n\t\t\t},\n\t\t})\n\t);\n\tconst { testObjectProvider } = await performFuzzActions(generator, seed, true);\n\tconst { tree: finalTree } = await setUpLocalServerTestSharedTree({\n\t\ttestObjectProvider,\n\t\tsummarizeHistory,\n\t\twriteFormat,\n\t});\n\tawait testObjectProvider.ensureSynchronized();\n\treturn finalTree;\n}\n\nasync function writeSummaryTestTrees(): Promise<void> {\n\tif (!fs.existsSync(directory)) {\n\t\tfs.mkdirSync(directory);\n\t}\n\n\tconst seed = 24601;\n\tconst tree002 = await generateRandomTree(seed, 1000, WriteFormat.v0_0_2, true);\n\tconst tree011 = await generateRandomTree(seed, 1000, WriteFormat.v0_1_1, true);\n\tconst tree002NoHistory = await generateRandomTree(seed, 1000, WriteFormat.v0_0_2, false);\n\tconst tree011NoHistory = await generateRandomTree(seed, 1000, WriteFormat.v0_1_1, false);\n\n\texpectAssert(areRevisionViewsSemanticallyEqual(tree002.currentView, tree002, tree011.currentView, tree011));\n\texpectAssert(\n\t\tareRevisionViewsSemanticallyEqual(tree002.currentView, tree002, tree002NoHistory.currentView, tree002NoHistory)\n\t);\n\texpectAssert(\n\t\tareRevisionViewsSemanticallyEqual(tree011.currentView, tree011, tree011NoHistory.currentView, tree011NoHistory)\n\t);\n\tconst { promises: fsP } = fs;\n\tawait fsP.writeFile(join(directory, 'summary-0-0-2.json'), tree002.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-0-1-1.json'), tree011.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-no-history-0-0-2.json'), tree002NoHistory.saveSerializedSummary());\n\tawait fsP.writeFile(join(directory, 'summary-no-history-0-1-1.json'), tree011NoHistory.saveSerializedSummary());\n}\n\nfunction loadSummaryTestFiles(): {\n\tsummaryFileWithHistory_0_0_2: string;\n\tsummaryFileNoHistory_0_0_2: string;\n\tsummaryFileWithHistory_0_1_1: string;\n\tsummaryFileNoHistory_0_1_1: string;\n} {\n\tconst readFile = (name: string): string => {\n\t\tconst contents = fs.readFileSync(join(directory, name), 'utf-8');\n\t\t// Round-trip the file so that performance testing summary doesn't require parsing unnecessary/unrealistic whitespace\n\t\treturn JSON.stringify(JSON.parse(contents));\n\t};\n\tconst summaryFileWithHistory_0_0_2 = readFile('summary-0-0-2.json');\n\tconst summaryFileNoHistory_0_0_2 = readFile('summary-no-history-0-0-2.json');\n\tconst summaryFileWithHistory_0_1_1 = readFile('summary-0-1-1.json');\n\tconst summaryFileNoHistory_0_1_1 = readFile('summary-no-history-0-1-1.json');\n\n\t// Note: We don't bother writing/reading a \"blobs\" file for this test suite because loading a serialized summary\n\t// with history should never involve attempting to get any of those blobs.\n\t// This *is* a fair comparison from a perf perspective b/c the whole point of chunking edit history is to decrease\n\t// summary size for potentially unused edit information.\n\n\treturn {\n\t\tsummaryFileWithHistory_0_0_2,\n\t\tsummaryFileNoHistory_0_0_2,\n\t\tsummaryFileWithHistory_0_1_1,\n\t\tsummaryFileNoHistory_0_1_1,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.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 { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn this.testTree.buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn this.testTree.buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.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 { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn this.testTree.buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn this.testTree.buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
|
|
@@ -8,7 +8,7 @@ import { TestObjectProvider } from '@fluidframework/test-utils';
|
|
|
8
8
|
import { ITelemetryBaseLogger } from '@fluidframework/common-definitions';
|
|
9
9
|
import type { IContainer } from '@fluidframework/container-definitions';
|
|
10
10
|
import type { IFluidHandle, IRequestHeader } from '@fluidframework/core-interfaces';
|
|
11
|
-
import { EditId, NodeId, OpSpaceNodeId, StableNodeId } from '../../Identifiers';
|
|
11
|
+
import { AttributionId, EditId, NodeId, OpSpaceNodeId, StableNodeId } from '../../Identifiers';
|
|
12
12
|
import { ReplaceRecursive } from '../../Common';
|
|
13
13
|
import { IdCompressor } from '../../id-compressor';
|
|
14
14
|
import { ChangeInternal, Edit, NodeData, Payload, SharedTreeOp, SharedTreeOp_0_0_2, WriteFormat } from '../../persisted-types';
|
|
@@ -61,6 +61,10 @@ export interface SharedTreeTestingOptions {
|
|
|
61
61
|
* If not set, summaries will be written in format 0.1.1.
|
|
62
62
|
*/
|
|
63
63
|
writeFormat?: WriteFormat;
|
|
64
|
+
/**
|
|
65
|
+
* Optional attribution ID to give to the new tree
|
|
66
|
+
*/
|
|
67
|
+
attributionId?: AttributionId;
|
|
64
68
|
/**
|
|
65
69
|
* If set, uses the given id as the edit id for tree setup. Only has an effect if initialTree is also set.
|
|
66
70
|
*/
|
|
@@ -109,6 +113,10 @@ export interface LocalServerSharedTreeTestingOptions {
|
|
|
109
113
|
* If not set, summaries will be written in format 0.0.2.
|
|
110
114
|
*/
|
|
111
115
|
writeFormat?: WriteFormat;
|
|
116
|
+
/**
|
|
117
|
+
* Optional attribution ID to give to the new tree
|
|
118
|
+
*/
|
|
119
|
+
attributionId?: AttributionId;
|
|
112
120
|
/**
|
|
113
121
|
* If not set, will upload edit chunks when they are full.
|
|
114
122
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,SAAS,EAAkC,MAAM,kCAAkC,CAAC;AAE7F,OAAO,EACN,2BAA2B,EAC3B,yBAAyB,EAEzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAGN,kBAAkB,EAIlB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,uCAAuC,CAAC;AACrF,OAAO,KAAK,EAAqB,YAAY,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAIvG,OAAO,
|
|
1
|
+
{"version":3,"file":"TestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestUtilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,7 @@ export function testTrait(view) {
|
|
|
34
34
|
}
|
|
35
35
|
/** Sets up and returns an object of components useful for testing SharedTree. */
|
|
36
36
|
export function setUpTestSharedTree(options = { localMode: true }) {
|
|
37
|
-
const { id, initialTree, localMode, containerRuntimeFactory, setupEditId, summarizeHistory, writeFormat } = options;
|
|
37
|
+
const { id, initialTree, localMode, containerRuntimeFactory, setupEditId, summarizeHistory, writeFormat, attributionId, } = options;
|
|
38
38
|
let componentRuntime;
|
|
39
39
|
if (options.logger) {
|
|
40
40
|
const proxyHandler = {
|
|
@@ -51,8 +51,18 @@ export function setUpTestSharedTree(options = { localMode: true }) {
|
|
|
51
51
|
componentRuntime = new MockFluidDataStoreRuntime();
|
|
52
52
|
}
|
|
53
53
|
// Enable expensiveValidation
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
let factory;
|
|
55
|
+
if (writeFormat === WriteFormat.v0_0_2) {
|
|
56
|
+
factory = SharedTree.getFactory(writeFormat, { summarizeHistory: summarizeHistory !== null && summarizeHistory !== void 0 ? summarizeHistory : true });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const options = {
|
|
60
|
+
summarizeHistory: (summarizeHistory !== null && summarizeHistory !== void 0 ? summarizeHistory : true) ? { uploadEditChunks: true } : false,
|
|
61
|
+
attributionId,
|
|
62
|
+
};
|
|
63
|
+
factory = SharedTree.getFactory(writeFormat !== null && writeFormat !== void 0 ? writeFormat : WriteFormat.v0_1_1, options);
|
|
64
|
+
}
|
|
65
|
+
const tree = factory.create(componentRuntime, id === undefined ? 'testSharedTree' : id);
|
|
56
66
|
if (options.allowInvalid === undefined || !options.allowInvalid) {
|
|
57
67
|
tree.on(SharedTreeDiagnosticEvent.DroppedInvalidEdit, () => fail('unexpected invalid edit'));
|
|
58
68
|
}
|
|
@@ -103,21 +113,25 @@ afterEach(() => {
|
|
|
103
113
|
* Any TestObjectProvider created by this function will be reset after the test completes (via afterEach) hook.
|
|
104
114
|
*/
|
|
105
115
|
export async function setUpLocalServerTestSharedTree(options) {
|
|
106
|
-
const { blobs, headers, id, initialTree, testObjectProvider, setupEditId, summarizeHistory, writeFormat, uploadEditChunks, } = options;
|
|
116
|
+
const { blobs, headers, id, initialTree, testObjectProvider, setupEditId, summarizeHistory, writeFormat, uploadEditChunks, attributionId, } = options;
|
|
107
117
|
const treeId = id !== null && id !== void 0 ? id : 'test';
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
let factory;
|
|
119
|
+
if (writeFormat === WriteFormat.v0_0_2) {
|
|
120
|
+
factory = SharedTree.getFactory(writeFormat, { summarizeHistory: summarizeHistory !== null && summarizeHistory !== void 0 ? summarizeHistory : true });
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const options = {
|
|
124
|
+
summarizeHistory: (summarizeHistory !== null && summarizeHistory !== void 0 ? summarizeHistory : true) ? { uploadEditChunks: uploadEditChunks !== null && uploadEditChunks !== void 0 ? uploadEditChunks : true } : false,
|
|
125
|
+
attributionId,
|
|
126
|
+
};
|
|
127
|
+
factory = SharedTree.getFactory(writeFormat !== null && writeFormat !== void 0 ? writeFormat : WriteFormat.v0_1_1, options);
|
|
128
|
+
}
|
|
129
|
+
const registry = [[treeId, factory]];
|
|
116
130
|
const innerRequestHandler = async (request, runtime) => runtime.IFluidHandleContext.resolveHandle(request);
|
|
117
131
|
const runtimeFactory = () => new TestContainerRuntimeFactory(TestDataStoreType, new TestFluidObjectFactory(registry), {
|
|
118
132
|
summaryOptions: {
|
|
119
133
|
summaryConfigOverrides: {
|
|
120
|
-
idleTime: 1000,
|
|
134
|
+
idleTime: 1000, // Current default idleTime is 15000 which will cause some SharedTree tests to timeout.
|
|
121
135
|
},
|
|
122
136
|
initialSummarizerDelayMs: 0,
|
|
123
137
|
},
|