@fluid-experimental/tree 0.59.2000-61729 → 0.59.2000-63294

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/api-extractor.json +5 -9
  2. package/dist/Checkout.js +1 -1
  3. package/dist/Checkout.js.map +1 -1
  4. package/dist/SharedTree.d.ts +16 -10
  5. package/dist/SharedTree.d.ts.map +1 -1
  6. package/dist/SharedTree.js +22 -10
  7. package/dist/SharedTree.js.map +1 -1
  8. package/dist/SummaryTestUtilities.js.map +1 -1
  9. package/dist/Transaction.d.ts +1 -0
  10. package/dist/Transaction.d.ts.map +1 -1
  11. package/dist/Transaction.js +2 -2
  12. package/dist/Transaction.js.map +1 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/persisted-types/0.1.1.d.ts +9 -0
  18. package/dist/persisted-types/0.1.1.d.ts.map +1 -1
  19. package/dist/persisted-types/0.1.1.js.map +1 -1
  20. package/lib/Checkout.js +1 -1
  21. package/lib/Checkout.js.map +1 -1
  22. package/lib/SharedTree.d.ts +16 -10
  23. package/lib/SharedTree.d.ts.map +1 -1
  24. package/lib/SharedTree.js +22 -10
  25. package/lib/SharedTree.js.map +1 -1
  26. package/lib/SummaryTestUtilities.js.map +1 -1
  27. package/lib/Transaction.d.ts +1 -0
  28. package/lib/Transaction.d.ts.map +1 -1
  29. package/lib/Transaction.js +2 -2
  30. package/lib/Transaction.js.map +1 -1
  31. package/lib/index.d.ts +2 -2
  32. package/lib/index.d.ts.map +1 -1
  33. package/lib/index.js +1 -1
  34. package/lib/index.js.map +1 -1
  35. package/lib/persisted-types/0.1.1.d.ts +9 -0
  36. package/lib/persisted-types/0.1.1.d.ts.map +1 -1
  37. package/lib/persisted-types/0.1.1.js.map +1 -1
  38. package/lib/test/Forest.perf.tests.js +5 -3
  39. package/lib/test/Forest.perf.tests.js.map +1 -1
  40. package/lib/test/IdCompressor.tests.js +1 -1
  41. package/lib/test/IdCompressor.tests.js.map +1 -1
  42. package/lib/test/Summary.tests.d.ts.map +1 -1
  43. package/lib/test/Summary.tests.js +3 -3
  44. package/lib/test/Summary.tests.js.map +1 -1
  45. package/lib/test/fuzz/SharedTreeFuzzTests.js +2 -2
  46. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
  47. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
  48. package/lib/test/utilities/PendingLocalStateTests.js +4 -4
  49. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
  50. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  51. package/lib/test/utilities/SharedTreeTests.js +59 -7
  52. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  53. package/lib/test/utilities/SharedTreeVersioningTests.js +1 -1
  54. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
  55. package/lib/test/utilities/SummarySizeTests.js.map +1 -1
  56. package/lib/test/utilities/TestUtilities.d.ts +2 -0
  57. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  58. package/lib/test/utilities/TestUtilities.js +9 -1
  59. package/lib/test/utilities/TestUtilities.js.map +1 -1
  60. package/package.json +25 -22
  61. package/src/Checkout.ts +1 -1
  62. package/src/SharedTree.ts +39 -19
  63. package/src/SummaryTestUtilities.ts +1 -1
  64. package/src/Transaction.ts +3 -2
  65. package/src/index.ts +2 -1
  66. package/src/persisted-types/0.1.1.ts +11 -0
@@ -21,7 +21,7 @@ import { MutableStringInterner } from '../StringInterner';
21
21
  import { sequencedIdNormalizer } from '../NodeIdUtilities';
22
22
  import { expectDefined } from './utilities/TestCommon';
23
23
  import { TestFluidSerializer } from './utilities/TestSerializer';
24
- import { getIdNormalizerFromSharedTree, makeNodeIdContext, setUpLocalServerTestSharedTree, testDocumentsPathBase, } from './utilities/TestUtilities';
24
+ import { getEditLogInternal, getIdNormalizerFromSharedTree, makeNodeIdContext, setUpLocalServerTestSharedTree, testDocumentsPathBase, } from './utilities/TestUtilities';
25
25
  const directory = join(testDocumentsPathBase, 'summary-tests');
26
26
  /** Applies a smattering of interesting edits to the given shared tree in an attempt to cover a variety of use cases */
27
27
  export function applyTestEdits(sharedTree) {
@@ -318,8 +318,8 @@ async function expectSharedTreesEqual(sharedTreeA, sharedTreeB, compareEditIds =
318
318
  }
319
319
  for (let i = 0; i < sharedTreeA.edits.length; i++) {
320
320
  const roundTrip = (obj) => JSON.parse(JSON.stringify(obj));
321
- const editA = roundTrip(convertEditIds(await sharedTreeA.editsInternal.getEditAtIndex(i), (id) => sharedTreeA.convertToStableNodeId(id)));
322
- const editB = roundTrip(convertEditIds(await sharedTreeB.editsInternal.getEditAtIndex(i), (id) => sharedTreeB.convertToStableNodeId(id)));
321
+ const editA = roundTrip(convertEditIds(await getEditLogInternal(sharedTreeA).getEditAtIndex(i), (id) => sharedTreeA.convertToStableNodeId(id)));
322
+ const editB = roundTrip(convertEditIds(await getEditLogInternal(sharedTreeB).getEditAtIndex(i), (id) => sharedTreeB.convertToStableNodeId(id)));
323
323
  if (compareEditIds) {
324
324
  expect(editA).to.deep.equal(editB, `trees have different edits (index ${i})`);
325
325
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Summary.tests.js","sourceRoot":"","sources":["../../src/test/Summary.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport * as fs from 'fs';\nimport { join } from 'path';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { expect } from 'chai';\nimport { v5 } from 'uuid';\nimport { Change, StablePlace, StableRange } from '../ChangeTypes';\nimport { assert, RecursiveMutable } from '../Common';\nimport { areRevisionViewsSemanticallyEqual } from '../EditUtilities';\nimport { EditId, NodeId, SessionId, StableId, TraitLabel } from '../Identifiers';\nimport { initialTree } from '../InitialTree';\nimport {\n\teditsPerChunk,\n\treservedIdCount,\n\tSharedTreeSummary,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n} from '../persisted-types';\nimport { getChangeNodeFromView } from '../SerializationUtilities';\nimport { SharedTree } from '../SharedTree';\nimport { deserialize, getSummaryStatistics, SummaryStatistics } from '../SummaryBackCompatibility';\nimport { getUploadedEditChunkContents, UploadedEditChunkContents } from '../SummaryTestUtilities';\nimport { IdCompressor } from '../id-compressor';\nimport { convertEditIds } from '../IdConversion';\nimport { MutableStringInterner } from '../StringInterner';\nimport { sequencedIdNormalizer } from '../NodeIdUtilities';\nimport { expectDefined } from './utilities/TestCommon';\nimport { TestFluidSerializer } from './utilities/TestSerializer';\nimport {\n\tgetIdNormalizerFromSharedTree,\n\tmakeNodeIdContext,\n\tsetUpLocalServerTestSharedTree,\n\ttestDocumentsPathBase,\n} from './utilities/TestUtilities';\n\nconst directory = join(testDocumentsPathBase, 'summary-tests');\n\n/** Applies a smattering of interesting edits to the given shared tree in an attempt to cover a variety of use cases */\nexport function applyTestEdits(sharedTree: SharedTree): void {\n\tconst uuid = new DeterministicIdGenerator(sharedTree.getWriteFormat(), sharedTree);\n\n\tfunction applyEdit(changes: Change[]): void {\n\t\tconst internalChanges = changes.map((c) => sharedTree.internalizeChange(c));\n\t\tsharedTree.applyEditInternal({ id: uuid.getNextEditId(), changes: internalChanges });\n\t}\n\n\t/**\n\t * Build a tree that looks like the following:\n\t *\n\t * ROOT\n\t * | 'root'\n\t * [root]\n\t * 'left' / \\ 'right'\n\t * [A] [B, C, D]\n\t * | 'leaf'\n\t * [E('payload')]\n\t */\n\n\tconst cDetachedId = 0;\n\tconst rootDetachedId = 1;\n\tconst aId = uuid.getNextNodeId();\n\tconst cId = uuid.getNextNodeId();\n\tconst dId = uuid.getNextNodeId();\n\n\tapplyEdit([\n\t\tChange.build(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tdefinition: 'C',\n\t\t\t\t\tidentifier: cId,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tleaf: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdefinition: 'E',\n\t\t\t\t\t\t\t\tidentifier: uuid.getNextNodeId(),\n\t\t\t\t\t\t\t\tpayload: 'payload',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tcDetachedId\n\t\t),\n\t\tChange.build(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tdefinition: 'Root',\n\t\t\t\t\tidentifier: uuid.getNextNodeId(),\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tleft: [{ definition: 'A', identifier: aId }],\n\t\t\t\t\t\tright: [\n\t\t\t\t\t\t\t{ definition: 'B', identifier: uuid.getNextNodeId() },\n\t\t\t\t\t\t\tcDetachedId,\n\t\t\t\t\t\t\t{ definition: 'D', identifier: dId },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\trootDetachedId\n\t\t),\n\t\tChange.insert(\n\t\t\trootDetachedId,\n\t\t\tStablePlace.atStartOf({\n\t\t\t\tlabel: 'root' as TraitLabel,\n\t\t\t\tparent: sharedTree.convertToNodeId(initialTree.identifier),\n\t\t\t})\n\t\t),\n\t]);\n\n\t/**\n\t * Edit the tree\n\t *\n\t * 1. Move C after A\n\t * 2. Delete D\n\t * 3.\n\t * ...\n\t * 102. Set the payload of A to _i_ for all _i_ in 0...100\n\t */\n\n\tapplyEdit([...Change.move(StableRange.only(cId), StablePlace.after(aId))]);\n\tapplyEdit([Change.delete(StableRange.only(dId))]);\n\tfor (let i = 0; i < 100; i++) {\n\t\tapplyEdit([Change.setPayload(aId, i)]);\n\t}\n}\n\nexport async function createSummaryTestTree(writeFormat: WriteFormat, summarizeHistory: boolean): Promise<SharedTree> {\n\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\twriteFormat,\n\t\tsummarizeHistory,\n\t\tuploadEditChunks: summarizeHistory,\n\t});\n\n\tif (writeFormat === WriteFormat.v0_1_1) {\n\t\tconst idCompressor = new IdCompressor('968bee41-bcf7-46d2-8035-6eb163b76c4c' as SessionId, reservedIdCount);\n\t\tconst interner = new MutableStringInterner([initialTree.definition]);\n\t\tconst context = makeNodeIdContext(idCompressor);\n\t\tconst normalizer = sequencedIdNormalizer(context);\n\t\tconst sharedTreeSummaryWithConstantSessionId: SharedTreeSummary = {\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tcurrentTree: summarizeHistory\n\t\t\t\t? [\n\t\t\t\t\t\tinterner.getOrCreateInternedId(initialTree.definition),\n\t\t\t\t\t\tnormalizer.normalizeToOpSpace(context.convertToNodeId(initialTree.identifier)),\n\t\t\t\t ]\n\t\t\t\t: undefined,\n\t\t\teditHistory: {\n\t\t\t\teditIds: [],\n\t\t\t\teditChunks: [],\n\t\t\t},\n\t\t\tidCompressor: idCompressor.serialize(true),\n\t\t\tinternedStrings: interner.getSerializable(),\n\t\t};\n\n\t\ttree.loadSummary(sharedTreeSummaryWithConstantSessionId);\n\t}\n\n\tapplyTestEdits(tree);\n\n\tawait testObjectProvider.ensureSynchronized();\n\treturn tree;\n}\n\nexport function runSummaryTests(title: string): void {\n\tdescribe(title, () => {\n\t\t// Note: this test serializer doesn't handle blobs properly (it just uses JSON.stringify/JSON.parse).\n\t\tconst testSerializer = new TestFluidSerializer();\n\n\t\tconst {\n\t\t\tsummaryFileWithHistory_0_0_2,\n\t\t\tsummaryFileNoHistory_0_0_2,\n\t\t\tsummaryFileEmptyTraits_0_0_2,\n\t\t\tsummaryFileWithHistory_0_1_1,\n\t\t\tsummaryFileNoHistory_0_1_1,\n\t\t\tsummaryFileUpgrade_0_1_1,\n\t\t\tblobsFile,\n\t\t} = loadSummaryTestFiles();\n\n\t\t// Note: Fluid setup gives stable `absolutePath`s for these blobs across sessions. If that were not the case,\n\t\t// this test suite would need to build some kind of map from the blob info saved on disk to the `IFluidHandle`\n\t\t// list returned by uploading these blobs.\n\t\tconst blobsParsed: UploadedEditChunkContents[] = JSON.parse(blobsFile);\n\t\tconst blobs: ArrayBufferLike[] = blobsParsed.map((blob) =>\n\t\t\tIsoBuffer.from(JSON.stringify(blob.chunkContents), 'utf8')\n\t\t);\n\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 makeSummaryTestFiles();\n\t\t});\n\n\t\tdescribe('0.0.2 write format', () => {\n\t\t\tconst setUp002Tree: typeof setUpLocalServerTestSharedTree = async (options) =>\n\t\t\t\tsetUpLocalServerTestSharedTree({ writeFormat: WriteFormat.v0_0_2, ...options });\n\n\t\t\tconst setUp002SummaryTestTree = async (summarizeHistory: boolean): Promise<SharedTree> =>\n\t\t\t\tcreateSummaryTestTree(WriteFormat.v0_0_2, summarizeHistory);\n\n\t\t\tit('Normalizes a denormalized summary containing nodes with empty traits', async () => {\n\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\ttree.loadSerializedSummary(summaryFileEmptyTraits_0_0_2);\n\n\t\t\t\tconst { tree: expectedTree } = await setUp002Tree({});\n\t\t\t\texpectedTree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\texpect(getChangeNodeFromView(tree.currentView)).deep.equals(\n\t\t\t\t\tgetChangeNodeFromView(expectedTree.currentView)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('writes 0.0.2 files without history', async () => {\n\t\t\t\tconst tree = await setUp002SummaryTestTree(false);\n\t\t\t\tconst summary: RecursiveMutable<SharedTreeSummary_0_0_2> = JSON.parse(tree.saveSerializedSummary());\n\t\t\t\tconst expectedSummary: SharedTreeSummary_0_0_2 = JSON.parse(summaryFileNoHistory_0_0_2);\n\t\t\t\t// The edit ID of the single \"no history edit\" is generated randomly. Replace it with the baseline edit for the sake of this test.\n\t\t\t\tsummary.sequencedEdits[0].id = expectedSummary.sequencedEdits[0].id;\n\t\t\t\texpect(summary).to.deep.equal(expectedSummary);\n\t\t\t});\n\n\t\t\tit('writes 0.0.2 files with history', async () => {\n\t\t\t\tconst tree = await setUp002SummaryTestTree(true);\n\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\tJSON.parse(summaryFileWithHistory_0_0_2)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tdescribe('reading the same version', () => {\n\t\t\t\tit('reads 0.0.2 files without history', async () => {\n\t\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileNoHistory_0_0_2);\n\t\t\t\t\t// Tree should have exactly one edit, as all \"no history\" summaries do.\n\t\t\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\t\t\t// Load a baseline tree's own summary with no history to compare with\n\t\t\t\t\tconst summaryNoHistory = (await setUp002SummaryTestTree(false)).saveSummary();\n\t\t\t\t\tconst { tree: expectedTree } = await setUp002Tree({ summarizeHistory: false });\n\t\t\t\t\texpectedTree.loadSummary(summaryNoHistory);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree, false);\n\t\t\t\t});\n\n\t\t\t\tit('reads 0.0.2 files with history', async () => {\n\t\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\tconst expectedTree = await setUp002SummaryTestTree(true);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('reading next version', () => {\n\t\t\t\tit('reads 0.1.1', async () => {\n\t\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_1_1);\n\t\t\t\t\t// TODO: There may need to be a testObjectProvider synchronization here to upload\n\t\t\t\t\t// blobs from this summary.\n\t\t\t\t\t// We should also look at how this test asserts behavior w.r.t blobs.\n\t\t\t\t\tconst newSummary = JSON.parse(tree.saveSerializedSummary());\n\t\t\t\t\tconst expectedSummary = JSON.parse(summaryFileWithHistory_0_1_1);\n\t\t\t\t\texpect(newSummary).to.deep.equal(expectedSummary);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('gives correct SummaryStatistics', async () => {\n\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\tconst editCount = tree.edits.length;\n\t\t\t\tconst summary = deserialize(summaryFileWithHistory_0_0_2, testSerializer);\n\t\t\t\tconst telemetryInfo = getSummaryStatistics(summary);\n\t\t\t\tconst expectedTelemetryInfo: SummaryStatistics = {\n\t\t\t\t\tformatVersion: WriteFormat.v0_0_2,\n\t\t\t\t\thistorySize: editCount,\n\t\t\t\t};\n\t\t\t\texpect(telemetryInfo).to.deep.equals(expectedTelemetryInfo);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('0.1.1 write format', () => {\n\t\t\tconst setUp011Tree: typeof setUpLocalServerTestSharedTree = async (options) =>\n\t\t\t\tsetUpLocalServerTestSharedTree({ writeFormat: WriteFormat.v0_1_1, ...options });\n\n\t\t\tconst setUp011SummaryTestTree = async (summarizeHistory: boolean): Promise<SharedTree> =>\n\t\t\t\tcreateSummaryTestTree(WriteFormat.v0_1_1, summarizeHistory);\n\n\t\t\tit('writes 0.1.1 files without history', async () => {\n\t\t\t\tconst tree = await setUp011SummaryTestTree(false);\n\t\t\t\tconst summary: RecursiveMutable<SharedTreeSummary> = JSON.parse(tree.saveSerializedSummary());\n\t\t\t\tconst expectedSummary: SharedTreeSummary = JSON.parse(summaryFileNoHistory_0_1_1);\n\t\t\t\t// The edit ID of the single \"no history edit\" is generated randomly. Replace it with the baseline edit for the sake of this test.\n\t\t\t\texpectDefined(summary.editHistory).editIds[0] = expectDefined(expectedSummary.editHistory?.editIds[0]);\n\t\t\t\texpect(summary).to.deep.equal(expectedSummary);\n\t\t\t\texpect(await getUploadedEditChunkContents(tree)).to.deep.equal([]);\n\t\t\t});\n\n\t\t\tit('writes 0.1.1 files with history', async () => {\n\t\t\t\tconst tree = await setUp011SummaryTestTree(true);\n\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\tJSON.parse(summaryFileWithHistory_0_1_1)\n\t\t\t\t);\n\t\t\t\texpect(await getUploadedEditChunkContents(tree)).to.deep.equal(blobsParsed);\n\t\t\t});\n\n\t\t\tdescribe('reading the same version', () => {\n\t\t\t\tit('reads 0.1.1 files without history', async () => {\n\t\t\t\t\tconst { tree } = await setUp011Tree({ blobs });\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileNoHistory_0_1_1);\n\t\t\t\t\t// Tree should have exactly one edit, as all \"no history\" summaries do.\n\t\t\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\t\t\t// Load a baseline tree's own summary with no history to compare with\n\t\t\t\t\tconst summaryNoHistory = (await setUp011SummaryTestTree(false)).saveSummary();\n\t\t\t\t\tconst { tree: expectedTree } = await setUp011Tree({ summarizeHistory: false });\n\t\t\t\t\texpectedTree.loadSummary(summaryNoHistory);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree, false);\n\t\t\t\t});\n\n\t\t\t\tit('reads 0.1.1 files with history', async () => {\n\t\t\t\t\tconst { tree } = await setUp011Tree({ blobs });\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_1_1);\n\t\t\t\t\tconst expectedTree = await setUp011SummaryTestTree(false);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('reading previous versions', () => {\n\t\t\t\tit('reads 0.0.2', async () => {\n\t\t\t\t\tconst expectedTree = await setUp011SummaryTestTree(true);\n\t\t\t\t\tconst { tree } = await setUp011Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\t\tJSON.parse(summaryFileWithHistory_0_0_2)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit('upgrades 0.0.2', async () => {\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUp011Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\t// Synchronize to give a chance for the update op to be sequenced.\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst expectedTree = await setUp011SummaryTestTree(true);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\t\tJSON.parse(summaryFileUpgrade_0_1_1)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit('upgrades 0.0.2 that has several stale ops that it resubmits', async () => {\n\t\t\t\t\tconst { tree: resubmitTree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\t\t});\n\t\t\t\t\tapplyTestEdits(resubmitTree);\n\t\t\t\t\tconst { tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tawait expectSharedTreesEqual(resubmitTree, tree);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, await createSummaryTestTree(WriteFormat.v0_1_1, true));\n\t\t\t\t});\n\n\t\t\t\tit('Normalizes a denormalized summary containing nodes with empty traits', async () => {\n\t\t\t\t\tconst { tree } = await setUp011Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileEmptyTraits_0_0_2);\n\n\t\t\t\t\tconst { tree: expectedTree } = await setUp011Tree({});\n\t\t\t\t\texpectedTree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\texpect(\n\t\t\t\t\t\tareRevisionViewsSemanticallyEqual(\n\t\t\t\t\t\t\ttree.currentView,\n\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\texpectedTree.currentView,\n\t\t\t\t\t\t\texpectedTree\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('gives correct SummaryStatistics', async () => {\n\t\t\t\tconst { tree } = await setUp011Tree({});\n\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_1_1);\n\t\t\t\tconst editCount = tree.edits.length;\n\t\t\t\tconst summary = deserialize(summaryFileWithHistory_0_1_1, testSerializer);\n\t\t\t\tconst telemetryInfo = getSummaryStatistics(summary);\n\t\t\t\tconst totalChunks = Math.ceil(editCount / editsPerChunk);\n\t\t\t\tconst expectedTelemetryInfo: SummaryStatistics = {\n\t\t\t\t\tformatVersion: WriteFormat.v0_1_1,\n\t\t\t\t\thistorySize: editCount,\n\t\t\t\t\ttotalNumberOfChunks: totalChunks,\n\t\t\t\t\tuploadedChunks:\n\t\t\t\t\t\t// If the last chunk is bigger than the number of edits per chunk, it has also been uploaded\n\t\t\t\t\t\teditCount - Math.floor(editCount / editsPerChunk) * editsPerChunk < editsPerChunk &&\n\t\t\t\t\t\ttotalChunks !== 0\n\t\t\t\t\t\t\t? totalChunks - 1\n\t\t\t\t\t\t\t: totalChunks,\n\t\t\t\t};\n\t\t\t\texpect(telemetryInfo).to.deep.equals(expectedTelemetryInfo);\n\t\t\t});\n\t\t});\n\t});\n}\n\nexport function expectAssert(condition: unknown, message?: string): asserts condition {\n\texpect(condition, message);\n}\n\nasync function expectSharedTreesEqual(\n\tsharedTreeA: SharedTree,\n\tsharedTreeB: SharedTree,\n\tcompareEditIds = true\n): Promise<void> {\n\tif (\n\t\t!areRevisionViewsSemanticallyEqual(sharedTreeA.currentView, sharedTreeA, sharedTreeB.currentView, sharedTreeB)\n\t) {\n\t\texpect.fail('trees have different current views');\n\t}\n\n\tif (sharedTreeA.edits.length !== sharedTreeB.edits.length) {\n\t\texpect.fail('trees have different amounts of edits');\n\t}\n\n\tfor (let i = 0; i < sharedTreeA.edits.length; i++) {\n\t\tconst roundTrip = <T>(obj: T): T => JSON.parse(JSON.stringify(obj)) as T;\n\n\t\tconst editA = roundTrip(\n\t\t\tconvertEditIds(await sharedTreeA.editsInternal.getEditAtIndex(i), (id) =>\n\t\t\t\tsharedTreeA.convertToStableNodeId(id)\n\t\t\t)\n\t\t);\n\t\tconst editB = roundTrip(\n\t\t\tconvertEditIds(await sharedTreeB.editsInternal.getEditAtIndex(i), (id) =>\n\t\t\t\tsharedTreeB.convertToStableNodeId(id)\n\t\t\t)\n\t\t);\n\t\tif (compareEditIds) {\n\t\t\texpect(editA).to.deep.equal(editB, `trees have different edits (index ${i})`);\n\t\t} else {\n\t\t\texpect(editA.changes).to.deep.equal(editB.changes, `edits have different changes (index ${i})`);\n\t\t}\n\t}\n}\n\nfunction loadSummaryTestFiles(): {\n\tsummaryFileWithHistory_0_0_2: string;\n\tsummaryFileNoHistory_0_0_2: string;\n\tsummaryFileEmptyTraits_0_0_2: string;\n\tsummaryFileWithHistory_0_1_1: string;\n\tsummaryFileNoHistory_0_1_1: string;\n\tsummaryFileUpgrade_0_1_1: string;\n\tblobsFile: string;\n} {\n\tconst summaryFileWithHistory_0_0_2 = fs.readFileSync(join(directory, 'summary-0-0-2.json'), 'utf8');\n\tconst summaryFileNoHistory_0_0_2 = fs.readFileSync(join(directory, 'summary-no-history-0-0-2.json'), 'utf8');\n\tconst summaryFileEmptyTraits_0_0_2 = fs.readFileSync(join(directory, 'summary-empty-traits-0-0-2.json'), 'utf8');\n\tconst summaryFileWithHistory_0_1_1 = fs.readFileSync(join(directory, 'summary-0-1-1.json'), 'utf8');\n\tconst summaryFileNoHistory_0_1_1 = fs.readFileSync(join(directory, 'summary-no-history-0-1-1.json'), 'utf8');\n\tconst summaryFileUpgrade_0_1_1 = fs.readFileSync(join(directory, 'summary-upgrade-0-1-1.json'), 'utf8');\n\tconst blobsFile = fs.readFileSync(join(directory, 'blobs-0-1-1.json'), 'utf8');\n\n\treturn {\n\t\tsummaryFileWithHistory_0_0_2,\n\t\tsummaryFileNoHistory_0_0_2,\n\t\tsummaryFileEmptyTraits_0_0_2,\n\t\tsummaryFileWithHistory_0_1_1,\n\t\tsummaryFileNoHistory_0_1_1,\n\t\tsummaryFileUpgrade_0_1_1,\n\t\tblobsFile,\n\t};\n}\n\nasync function makeSummaryTestFiles(): Promise<void> {\n\ttry {\n\t\tfs.accessSync(directory);\n\t} catch {\n\t\tfs.mkdirSync(directory);\n\t}\n\n\tconst treeWithHistory_0_0_2 = await createSummaryTestTree(WriteFormat.v0_0_2, true);\n\tconst treeNoHistory_0_0_2 = await createSummaryTestTree(WriteFormat.v0_0_2, false);\n\tconst treeWithHistory_0_1_1 = await createSummaryTestTree(WriteFormat.v0_1_1, true);\n\tconst treeNoHistory_0_1_1 = await createSummaryTestTree(WriteFormat.v0_1_1, false);\n\n\tfs.writeFileSync(join(directory, `summary-0-0-2.json`), treeWithHistory_0_0_2.saveSerializedSummary());\n\tfs.writeFileSync(join(directory, `summary-no-history-0-0-2.json`), treeNoHistory_0_0_2.saveSerializedSummary());\n\tfs.writeFileSync(join(directory, `summary-0-1-1.json`), treeWithHistory_0_1_1.saveSerializedSummary());\n\tfs.writeFileSync(join(directory, `summary-no-history-0-1-1.json`), treeNoHistory_0_1_1.saveSerializedSummary());\n\n\tconst blobs = await getUploadedEditChunkContents(treeWithHistory_0_1_1);\n\tassert(blobs.length > 0);\n\tfs.writeFileSync(join(directory, `blobs-0-1-1.json`), JSON.stringify(blobs));\n\n\tconst { tree: upgradedTree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\twriteFormat: WriteFormat.v0_1_1,\n\t\tsummarizeHistory: true,\n\t});\n\tupgradedTree.loadSummary(treeWithHistory_0_0_2.saveSummary());\n\tawait testObjectProvider.ensureSynchronized();\n\tfs.writeFileSync(join(directory, `summary-upgrade-0-1-1.json`), upgradedTree.saveSerializedSummary());\n}\n\n/** Every instance of this class generates the same sequence of v5 UUIDs */\nclass DeterministicIdGenerator {\n\tpublic static readonly sessionId = '968bee41-bcf7-46d2-8035-6eb163b76c4c' as SessionId;\n\tprivate static readonly uuidNamespace = '44864298-500e-4cf8-9f44-a249e5b3a286';\n\tprivate editIdCount = 0;\n\tprivate readonly constantIdCompressor?: IdCompressor;\n\n\tpublic constructor(public readonly writeFormat: WriteFormat, private readonly sharedTree: SharedTree) {\n\t\tif (this.writeFormat === WriteFormat.v0_1_1) {\n\t\t\tassert(getIdNormalizerFromSharedTree(sharedTree).localSessionId === DeterministicIdGenerator.sessionId);\n\t\t} else {\n\t\t\tassert(getIdNormalizerFromSharedTree(sharedTree).localSessionId !== DeterministicIdGenerator.sessionId);\n\t\t\tthis.constantIdCompressor = new IdCompressor(DeterministicIdGenerator.sessionId, reservedIdCount);\n\t\t}\n\t}\n\n\tpublic getNextEditId(): EditId {\n\t\treturn v5((this.editIdCount++).toString(), DeterministicIdGenerator.uuidNamespace) as EditId;\n\t}\n\n\tpublic getNextNodeId(): NodeId {\n\t\tif (this.writeFormat === WriteFormat.v0_0_2) {\n\t\t\treturn this.sharedTree.generateNodeId(this.getNextStableId());\n\t\t} else {\n\t\t\treturn this.sharedTree.generateNodeId();\n\t\t}\n\t}\n\n\tprivate getNextStableId(): StableId {\n\t\tassert(this.constantIdCompressor !== undefined);\n\t\treturn this.constantIdCompressor.decompress(this.constantIdCompressor.generateCompressedId()) as StableId;\n\t}\n}\n"]}
1
+ {"version":3,"file":"Summary.tests.js","sourceRoot":"","sources":["../../src/test/Summary.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport * as fs from 'fs';\nimport { join } from 'path';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { expect } from 'chai';\nimport { v5 } from 'uuid';\nimport { Change, StablePlace, StableRange } from '../ChangeTypes';\nimport { assert, RecursiveMutable } from '../Common';\nimport { areRevisionViewsSemanticallyEqual } from '../EditUtilities';\nimport { EditId, NodeId, SessionId, StableId, TraitLabel } from '../Identifiers';\nimport { initialTree } from '../InitialTree';\nimport {\n\teditsPerChunk,\n\treservedIdCount,\n\tSharedTreeSummary,\n\tSharedTreeSummary_0_0_2,\n\tWriteFormat,\n} from '../persisted-types';\nimport { getChangeNodeFromView } from '../SerializationUtilities';\nimport { SharedTree } from '../SharedTree';\nimport { deserialize, getSummaryStatistics, SummaryStatistics } from '../SummaryBackCompatibility';\nimport { getUploadedEditChunkContents, UploadedEditChunkContents } from '../SummaryTestUtilities';\nimport { IdCompressor } from '../id-compressor';\nimport { convertEditIds } from '../IdConversion';\nimport { MutableStringInterner } from '../StringInterner';\nimport { sequencedIdNormalizer } from '../NodeIdUtilities';\nimport { expectDefined } from './utilities/TestCommon';\nimport { TestFluidSerializer } from './utilities/TestSerializer';\nimport {\n\tgetEditLogInternal,\n\tgetIdNormalizerFromSharedTree,\n\tmakeNodeIdContext,\n\tsetUpLocalServerTestSharedTree,\n\ttestDocumentsPathBase,\n} from './utilities/TestUtilities';\n\nconst directory = join(testDocumentsPathBase, 'summary-tests');\n\n/** Applies a smattering of interesting edits to the given shared tree in an attempt to cover a variety of use cases */\nexport function applyTestEdits(sharedTree: SharedTree): void {\n\tconst uuid = new DeterministicIdGenerator(sharedTree.getWriteFormat(), sharedTree);\n\n\tfunction applyEdit(changes: Change[]): void {\n\t\tconst internalChanges = changes.map((c) => sharedTree.internalizeChange(c));\n\t\tsharedTree.applyEditInternal({ id: uuid.getNextEditId(), changes: internalChanges });\n\t}\n\n\t/**\n\t * Build a tree that looks like the following:\n\t *\n\t * ROOT\n\t * | 'root'\n\t * [root]\n\t * 'left' / \\ 'right'\n\t * [A] [B, C, D]\n\t * | 'leaf'\n\t * [E('payload')]\n\t */\n\n\tconst cDetachedId = 0;\n\tconst rootDetachedId = 1;\n\tconst aId = uuid.getNextNodeId();\n\tconst cId = uuid.getNextNodeId();\n\tconst dId = uuid.getNextNodeId();\n\n\tapplyEdit([\n\t\tChange.build(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tdefinition: 'C',\n\t\t\t\t\tidentifier: cId,\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tleaf: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdefinition: 'E',\n\t\t\t\t\t\t\t\tidentifier: uuid.getNextNodeId(),\n\t\t\t\t\t\t\t\tpayload: 'payload',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tcDetachedId\n\t\t),\n\t\tChange.build(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tdefinition: 'Root',\n\t\t\t\t\tidentifier: uuid.getNextNodeId(),\n\t\t\t\t\ttraits: {\n\t\t\t\t\t\tleft: [{ definition: 'A', identifier: aId }],\n\t\t\t\t\t\tright: [\n\t\t\t\t\t\t\t{ definition: 'B', identifier: uuid.getNextNodeId() },\n\t\t\t\t\t\t\tcDetachedId,\n\t\t\t\t\t\t\t{ definition: 'D', identifier: dId },\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\trootDetachedId\n\t\t),\n\t\tChange.insert(\n\t\t\trootDetachedId,\n\t\t\tStablePlace.atStartOf({\n\t\t\t\tlabel: 'root' as TraitLabel,\n\t\t\t\tparent: sharedTree.convertToNodeId(initialTree.identifier),\n\t\t\t})\n\t\t),\n\t]);\n\n\t/**\n\t * Edit the tree\n\t *\n\t * 1. Move C after A\n\t * 2. Delete D\n\t * 3.\n\t * ...\n\t * 102. Set the payload of A to _i_ for all _i_ in 0...100\n\t */\n\n\tapplyEdit([...Change.move(StableRange.only(cId), StablePlace.after(aId))]);\n\tapplyEdit([Change.delete(StableRange.only(dId))]);\n\tfor (let i = 0; i < 100; i++) {\n\t\tapplyEdit([Change.setPayload(aId, i)]);\n\t}\n}\n\nexport async function createSummaryTestTree(writeFormat: WriteFormat, summarizeHistory: boolean): Promise<SharedTree> {\n\tconst { tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\twriteFormat,\n\t\tsummarizeHistory,\n\t\tuploadEditChunks: summarizeHistory,\n\t});\n\n\tif (writeFormat === WriteFormat.v0_1_1) {\n\t\tconst idCompressor = new IdCompressor('968bee41-bcf7-46d2-8035-6eb163b76c4c' as SessionId, reservedIdCount);\n\t\tconst interner = new MutableStringInterner([initialTree.definition]);\n\t\tconst context = makeNodeIdContext(idCompressor);\n\t\tconst normalizer = sequencedIdNormalizer(context);\n\t\tconst sharedTreeSummaryWithConstantSessionId: SharedTreeSummary = {\n\t\t\tversion: WriteFormat.v0_1_1,\n\t\t\tcurrentTree: summarizeHistory\n\t\t\t\t? [\n\t\t\t\t\t\tinterner.getOrCreateInternedId(initialTree.definition),\n\t\t\t\t\t\tnormalizer.normalizeToOpSpace(context.convertToNodeId(initialTree.identifier)),\n\t\t\t\t ]\n\t\t\t\t: undefined,\n\t\t\teditHistory: {\n\t\t\t\teditIds: [],\n\t\t\t\teditChunks: [],\n\t\t\t},\n\t\t\tidCompressor: idCompressor.serialize(true),\n\t\t\tinternedStrings: interner.getSerializable(),\n\t\t};\n\n\t\ttree.loadSummary(sharedTreeSummaryWithConstantSessionId);\n\t}\n\n\tapplyTestEdits(tree);\n\n\tawait testObjectProvider.ensureSynchronized();\n\treturn tree;\n}\n\nexport function runSummaryTests(title: string): void {\n\tdescribe(title, () => {\n\t\t// Note: this test serializer doesn't handle blobs properly (it just uses JSON.stringify/JSON.parse).\n\t\tconst testSerializer = new TestFluidSerializer();\n\n\t\tconst {\n\t\t\tsummaryFileWithHistory_0_0_2,\n\t\t\tsummaryFileNoHistory_0_0_2,\n\t\t\tsummaryFileEmptyTraits_0_0_2,\n\t\t\tsummaryFileWithHistory_0_1_1,\n\t\t\tsummaryFileNoHistory_0_1_1,\n\t\t\tsummaryFileUpgrade_0_1_1,\n\t\t\tblobsFile,\n\t\t} = loadSummaryTestFiles();\n\n\t\t// Note: Fluid setup gives stable `absolutePath`s for these blobs across sessions. If that were not the case,\n\t\t// this test suite would need to build some kind of map from the blob info saved on disk to the `IFluidHandle`\n\t\t// list returned by uploading these blobs.\n\t\tconst blobsParsed: UploadedEditChunkContents[] = JSON.parse(blobsFile);\n\t\tconst blobs: ArrayBufferLike[] = blobsParsed.map((blob) =>\n\t\t\tIsoBuffer.from(JSON.stringify(blob.chunkContents), 'utf8')\n\t\t);\n\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 makeSummaryTestFiles();\n\t\t});\n\n\t\tdescribe('0.0.2 write format', () => {\n\t\t\tconst setUp002Tree: typeof setUpLocalServerTestSharedTree = async (options) =>\n\t\t\t\tsetUpLocalServerTestSharedTree({ writeFormat: WriteFormat.v0_0_2, ...options });\n\n\t\t\tconst setUp002SummaryTestTree = async (summarizeHistory: boolean): Promise<SharedTree> =>\n\t\t\t\tcreateSummaryTestTree(WriteFormat.v0_0_2, summarizeHistory);\n\n\t\t\tit('Normalizes a denormalized summary containing nodes with empty traits', async () => {\n\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\ttree.loadSerializedSummary(summaryFileEmptyTraits_0_0_2);\n\n\t\t\t\tconst { tree: expectedTree } = await setUp002Tree({});\n\t\t\t\texpectedTree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\texpect(getChangeNodeFromView(tree.currentView)).deep.equals(\n\t\t\t\t\tgetChangeNodeFromView(expectedTree.currentView)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tit('writes 0.0.2 files without history', async () => {\n\t\t\t\tconst tree = await setUp002SummaryTestTree(false);\n\t\t\t\tconst summary: RecursiveMutable<SharedTreeSummary_0_0_2> = JSON.parse(tree.saveSerializedSummary());\n\t\t\t\tconst expectedSummary: SharedTreeSummary_0_0_2 = JSON.parse(summaryFileNoHistory_0_0_2);\n\t\t\t\t// The edit ID of the single \"no history edit\" is generated randomly. Replace it with the baseline edit for the sake of this test.\n\t\t\t\tsummary.sequencedEdits[0].id = expectedSummary.sequencedEdits[0].id;\n\t\t\t\texpect(summary).to.deep.equal(expectedSummary);\n\t\t\t});\n\n\t\t\tit('writes 0.0.2 files with history', async () => {\n\t\t\t\tconst tree = await setUp002SummaryTestTree(true);\n\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\tJSON.parse(summaryFileWithHistory_0_0_2)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tdescribe('reading the same version', () => {\n\t\t\t\tit('reads 0.0.2 files without history', async () => {\n\t\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileNoHistory_0_0_2);\n\t\t\t\t\t// Tree should have exactly one edit, as all \"no history\" summaries do.\n\t\t\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\t\t\t// Load a baseline tree's own summary with no history to compare with\n\t\t\t\t\tconst summaryNoHistory = (await setUp002SummaryTestTree(false)).saveSummary();\n\t\t\t\t\tconst { tree: expectedTree } = await setUp002Tree({ summarizeHistory: false });\n\t\t\t\t\texpectedTree.loadSummary(summaryNoHistory);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree, false);\n\t\t\t\t});\n\n\t\t\t\tit('reads 0.0.2 files with history', async () => {\n\t\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\tconst expectedTree = await setUp002SummaryTestTree(true);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('reading next version', () => {\n\t\t\t\tit('reads 0.1.1', async () => {\n\t\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_1_1);\n\t\t\t\t\t// TODO: There may need to be a testObjectProvider synchronization here to upload\n\t\t\t\t\t// blobs from this summary.\n\t\t\t\t\t// We should also look at how this test asserts behavior w.r.t blobs.\n\t\t\t\t\tconst newSummary = JSON.parse(tree.saveSerializedSummary());\n\t\t\t\t\tconst expectedSummary = JSON.parse(summaryFileWithHistory_0_1_1);\n\t\t\t\t\texpect(newSummary).to.deep.equal(expectedSummary);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('gives correct SummaryStatistics', async () => {\n\t\t\t\tconst { tree } = await setUp002Tree({});\n\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\tconst editCount = tree.edits.length;\n\t\t\t\tconst summary = deserialize(summaryFileWithHistory_0_0_2, testSerializer);\n\t\t\t\tconst telemetryInfo = getSummaryStatistics(summary);\n\t\t\t\tconst expectedTelemetryInfo: SummaryStatistics = {\n\t\t\t\t\tformatVersion: WriteFormat.v0_0_2,\n\t\t\t\t\thistorySize: editCount,\n\t\t\t\t};\n\t\t\t\texpect(telemetryInfo).to.deep.equals(expectedTelemetryInfo);\n\t\t\t});\n\t\t});\n\n\t\tdescribe('0.1.1 write format', () => {\n\t\t\tconst setUp011Tree: typeof setUpLocalServerTestSharedTree = async (options) =>\n\t\t\t\tsetUpLocalServerTestSharedTree({ writeFormat: WriteFormat.v0_1_1, ...options });\n\n\t\t\tconst setUp011SummaryTestTree = async (summarizeHistory: boolean): Promise<SharedTree> =>\n\t\t\t\tcreateSummaryTestTree(WriteFormat.v0_1_1, summarizeHistory);\n\n\t\t\tit('writes 0.1.1 files without history', async () => {\n\t\t\t\tconst tree = await setUp011SummaryTestTree(false);\n\t\t\t\tconst summary: RecursiveMutable<SharedTreeSummary> = JSON.parse(tree.saveSerializedSummary());\n\t\t\t\tconst expectedSummary: SharedTreeSummary = JSON.parse(summaryFileNoHistory_0_1_1);\n\t\t\t\t// The edit ID of the single \"no history edit\" is generated randomly. Replace it with the baseline edit for the sake of this test.\n\t\t\t\texpectDefined(summary.editHistory).editIds[0] = expectDefined(expectedSummary.editHistory?.editIds[0]);\n\t\t\t\texpect(summary).to.deep.equal(expectedSummary);\n\t\t\t\texpect(await getUploadedEditChunkContents(tree)).to.deep.equal([]);\n\t\t\t});\n\n\t\t\tit('writes 0.1.1 files with history', async () => {\n\t\t\t\tconst tree = await setUp011SummaryTestTree(true);\n\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\tJSON.parse(summaryFileWithHistory_0_1_1)\n\t\t\t\t);\n\t\t\t\texpect(await getUploadedEditChunkContents(tree)).to.deep.equal(blobsParsed);\n\t\t\t});\n\n\t\t\tdescribe('reading the same version', () => {\n\t\t\t\tit('reads 0.1.1 files without history', async () => {\n\t\t\t\t\tconst { tree } = await setUp011Tree({ blobs });\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileNoHistory_0_1_1);\n\t\t\t\t\t// Tree should have exactly one edit, as all \"no history\" summaries do.\n\t\t\t\t\texpect(tree.edits.length).to.equal(1);\n\t\t\t\t\t// Load a baseline tree's own summary with no history to compare with\n\t\t\t\t\tconst summaryNoHistory = (await setUp011SummaryTestTree(false)).saveSummary();\n\t\t\t\t\tconst { tree: expectedTree } = await setUp011Tree({ summarizeHistory: false });\n\t\t\t\t\texpectedTree.loadSummary(summaryNoHistory);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree, false);\n\t\t\t\t});\n\n\t\t\t\tit('reads 0.1.1 files with history', async () => {\n\t\t\t\t\tconst { tree } = await setUp011Tree({ blobs });\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_1_1);\n\t\t\t\t\tconst expectedTree = await setUp011SummaryTestTree(false);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tdescribe('reading previous versions', () => {\n\t\t\t\tit('reads 0.0.2', async () => {\n\t\t\t\t\tconst expectedTree = await setUp011SummaryTestTree(true);\n\t\t\t\t\tconst { tree } = await setUp011Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\t\tJSON.parse(summaryFileWithHistory_0_0_2)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit('upgrades 0.0.2', async () => {\n\t\t\t\t\tconst { tree, testObjectProvider } = await setUp011Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\t// Synchronize to give a chance for the update op to be sequenced.\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst expectedTree = await setUp011SummaryTestTree(true);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, expectedTree);\n\t\t\t\t\texpect(JSON.parse(tree.saveSerializedSummary())).to.deep.equal(\n\t\t\t\t\t\tJSON.parse(summaryFileUpgrade_0_1_1)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit('upgrades 0.0.2 that has several stale ops that it resubmits', async () => {\n\t\t\t\t\tconst { tree: resubmitTree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t\t\t\t});\n\t\t\t\t\tapplyTestEdits(resubmitTree);\n\t\t\t\t\tconst { tree: tree } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tawait expectSharedTreesEqual(resubmitTree, tree);\n\t\t\t\t\tawait expectSharedTreesEqual(tree, await createSummaryTestTree(WriteFormat.v0_1_1, true));\n\t\t\t\t});\n\n\t\t\t\tit('Normalizes a denormalized summary containing nodes with empty traits', async () => {\n\t\t\t\t\tconst { tree } = await setUp011Tree({});\n\t\t\t\t\ttree.loadSerializedSummary(summaryFileEmptyTraits_0_0_2);\n\n\t\t\t\t\tconst { tree: expectedTree } = await setUp011Tree({});\n\t\t\t\t\texpectedTree.loadSerializedSummary(summaryFileWithHistory_0_0_2);\n\t\t\t\t\texpect(\n\t\t\t\t\t\tareRevisionViewsSemanticallyEqual(\n\t\t\t\t\t\t\ttree.currentView,\n\t\t\t\t\t\t\ttree,\n\t\t\t\t\t\t\texpectedTree.currentView,\n\t\t\t\t\t\t\texpectedTree\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tit('gives correct SummaryStatistics', async () => {\n\t\t\t\tconst { tree } = await setUp011Tree({});\n\t\t\t\ttree.loadSerializedSummary(summaryFileWithHistory_0_1_1);\n\t\t\t\tconst editCount = tree.edits.length;\n\t\t\t\tconst summary = deserialize(summaryFileWithHistory_0_1_1, testSerializer);\n\t\t\t\tconst telemetryInfo = getSummaryStatistics(summary);\n\t\t\t\tconst totalChunks = Math.ceil(editCount / editsPerChunk);\n\t\t\t\tconst expectedTelemetryInfo: SummaryStatistics = {\n\t\t\t\t\tformatVersion: WriteFormat.v0_1_1,\n\t\t\t\t\thistorySize: editCount,\n\t\t\t\t\ttotalNumberOfChunks: totalChunks,\n\t\t\t\t\tuploadedChunks:\n\t\t\t\t\t\t// If the last chunk is bigger than the number of edits per chunk, it has also been uploaded\n\t\t\t\t\t\teditCount - Math.floor(editCount / editsPerChunk) * editsPerChunk < editsPerChunk &&\n\t\t\t\t\t\ttotalChunks !== 0\n\t\t\t\t\t\t\t? totalChunks - 1\n\t\t\t\t\t\t\t: totalChunks,\n\t\t\t\t};\n\t\t\t\texpect(telemetryInfo).to.deep.equals(expectedTelemetryInfo);\n\t\t\t});\n\t\t});\n\t});\n}\n\nexport function expectAssert(condition: unknown, message?: string): asserts condition {\n\texpect(condition, message);\n}\n\nasync function expectSharedTreesEqual(\n\tsharedTreeA: SharedTree,\n\tsharedTreeB: SharedTree,\n\tcompareEditIds = true\n): Promise<void> {\n\tif (\n\t\t!areRevisionViewsSemanticallyEqual(sharedTreeA.currentView, sharedTreeA, sharedTreeB.currentView, sharedTreeB)\n\t) {\n\t\texpect.fail('trees have different current views');\n\t}\n\n\tif (sharedTreeA.edits.length !== sharedTreeB.edits.length) {\n\t\texpect.fail('trees have different amounts of edits');\n\t}\n\n\tfor (let i = 0; i < sharedTreeA.edits.length; i++) {\n\t\tconst roundTrip = <T>(obj: T): T => JSON.parse(JSON.stringify(obj)) as T;\n\n\t\tconst editA = roundTrip(\n\t\t\tconvertEditIds(await getEditLogInternal(sharedTreeA).getEditAtIndex(i), (id) =>\n\t\t\t\tsharedTreeA.convertToStableNodeId(id)\n\t\t\t)\n\t\t);\n\t\tconst editB = roundTrip(\n\t\t\tconvertEditIds(await getEditLogInternal(sharedTreeB).getEditAtIndex(i), (id) =>\n\t\t\t\tsharedTreeB.convertToStableNodeId(id)\n\t\t\t)\n\t\t);\n\t\tif (compareEditIds) {\n\t\t\texpect(editA).to.deep.equal(editB, `trees have different edits (index ${i})`);\n\t\t} else {\n\t\t\texpect(editA.changes).to.deep.equal(editB.changes, `edits have different changes (index ${i})`);\n\t\t}\n\t}\n}\n\nfunction loadSummaryTestFiles(): {\n\tsummaryFileWithHistory_0_0_2: string;\n\tsummaryFileNoHistory_0_0_2: string;\n\tsummaryFileEmptyTraits_0_0_2: string;\n\tsummaryFileWithHistory_0_1_1: string;\n\tsummaryFileNoHistory_0_1_1: string;\n\tsummaryFileUpgrade_0_1_1: string;\n\tblobsFile: string;\n} {\n\tconst summaryFileWithHistory_0_0_2 = fs.readFileSync(join(directory, 'summary-0-0-2.json'), 'utf8');\n\tconst summaryFileNoHistory_0_0_2 = fs.readFileSync(join(directory, 'summary-no-history-0-0-2.json'), 'utf8');\n\tconst summaryFileEmptyTraits_0_0_2 = fs.readFileSync(join(directory, 'summary-empty-traits-0-0-2.json'), 'utf8');\n\tconst summaryFileWithHistory_0_1_1 = fs.readFileSync(join(directory, 'summary-0-1-1.json'), 'utf8');\n\tconst summaryFileNoHistory_0_1_1 = fs.readFileSync(join(directory, 'summary-no-history-0-1-1.json'), 'utf8');\n\tconst summaryFileUpgrade_0_1_1 = fs.readFileSync(join(directory, 'summary-upgrade-0-1-1.json'), 'utf8');\n\tconst blobsFile = fs.readFileSync(join(directory, 'blobs-0-1-1.json'), 'utf8');\n\n\treturn {\n\t\tsummaryFileWithHistory_0_0_2,\n\t\tsummaryFileNoHistory_0_0_2,\n\t\tsummaryFileEmptyTraits_0_0_2,\n\t\tsummaryFileWithHistory_0_1_1,\n\t\tsummaryFileNoHistory_0_1_1,\n\t\tsummaryFileUpgrade_0_1_1,\n\t\tblobsFile,\n\t};\n}\n\nasync function makeSummaryTestFiles(): Promise<void> {\n\ttry {\n\t\tfs.accessSync(directory);\n\t} catch {\n\t\tfs.mkdirSync(directory);\n\t}\n\n\tconst treeWithHistory_0_0_2 = await createSummaryTestTree(WriteFormat.v0_0_2, true);\n\tconst treeNoHistory_0_0_2 = await createSummaryTestTree(WriteFormat.v0_0_2, false);\n\tconst treeWithHistory_0_1_1 = await createSummaryTestTree(WriteFormat.v0_1_1, true);\n\tconst treeNoHistory_0_1_1 = await createSummaryTestTree(WriteFormat.v0_1_1, false);\n\n\tfs.writeFileSync(join(directory, `summary-0-0-2.json`), treeWithHistory_0_0_2.saveSerializedSummary());\n\tfs.writeFileSync(join(directory, `summary-no-history-0-0-2.json`), treeNoHistory_0_0_2.saveSerializedSummary());\n\tfs.writeFileSync(join(directory, `summary-0-1-1.json`), treeWithHistory_0_1_1.saveSerializedSummary());\n\tfs.writeFileSync(join(directory, `summary-no-history-0-1-1.json`), treeNoHistory_0_1_1.saveSerializedSummary());\n\n\tconst blobs = await getUploadedEditChunkContents(treeWithHistory_0_1_1);\n\tassert(blobs.length > 0);\n\tfs.writeFileSync(join(directory, `blobs-0-1-1.json`), JSON.stringify(blobs));\n\n\tconst { tree: upgradedTree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\twriteFormat: WriteFormat.v0_1_1,\n\t\tsummarizeHistory: true,\n\t});\n\tupgradedTree.loadSummary(treeWithHistory_0_0_2.saveSummary());\n\tawait testObjectProvider.ensureSynchronized();\n\tfs.writeFileSync(join(directory, `summary-upgrade-0-1-1.json`), upgradedTree.saveSerializedSummary());\n}\n\n/** Every instance of this class generates the same sequence of v5 UUIDs */\nclass DeterministicIdGenerator {\n\tpublic static readonly sessionId = '968bee41-bcf7-46d2-8035-6eb163b76c4c' as SessionId;\n\tprivate static readonly uuidNamespace = '44864298-500e-4cf8-9f44-a249e5b3a286';\n\tprivate editIdCount = 0;\n\tprivate readonly constantIdCompressor?: IdCompressor;\n\n\tpublic constructor(public readonly writeFormat: WriteFormat, private readonly sharedTree: SharedTree) {\n\t\tif (this.writeFormat === WriteFormat.v0_1_1) {\n\t\t\tassert(getIdNormalizerFromSharedTree(sharedTree).localSessionId === DeterministicIdGenerator.sessionId);\n\t\t} else {\n\t\t\tassert(getIdNormalizerFromSharedTree(sharedTree).localSessionId !== DeterministicIdGenerator.sessionId);\n\t\t\tthis.constantIdCompressor = new IdCompressor(DeterministicIdGenerator.sessionId, reservedIdCount);\n\t\t}\n\t}\n\n\tpublic getNextEditId(): EditId {\n\t\treturn v5((this.editIdCount++).toString(), DeterministicIdGenerator.uuidNamespace) as EditId;\n\t}\n\n\tpublic getNextNodeId(): NodeId {\n\t\tif (this.writeFormat === WriteFormat.v0_0_2) {\n\t\t\treturn this.sharedTree.generateNodeId(this.getNextStableId());\n\t\t} else {\n\t\t\treturn this.sharedTree.generateNodeId();\n\t\t}\n\t}\n\n\tprivate getNextStableId(): StableId {\n\t\tassert(this.constantIdCompressor !== undefined);\n\t\treturn this.constantIdCompressor.decompress(this.constantIdCompressor.generateCompressedId()) as StableId;\n\t}\n}\n"]}
@@ -91,8 +91,8 @@ export async function performFuzzActions(generator, seed, synchronizeAtEnd = tru
91
91
  const first = trees[0].tree;
92
92
  for (let i = 1; i < trees.length; i++) {
93
93
  const tree = trees[i].tree;
94
- const editLogA = first.editsInternal;
95
- const editLogB = tree.editsInternal;
94
+ const editLogA = first.edits;
95
+ const editLogB = tree.edits;
96
96
  const minEdits = Math.min(editLogA.length, editLogB.length);
97
97
  for (let j = 0; j < minEdits - 1; j++) {
98
98
  const editA = await editLogA.getEditAtIndex(editLogA.length - j - 1);
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeFuzzTests.js","sourceRoot":"","sources":["../../../src/test/fuzz/SharedTreeFuzzTests.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 { promises as fs, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport Prando from 'prando';\nimport { expect } from 'chai';\nimport { setUpLocalServerTestSharedTree, testDocumentsPathBase } from '../utilities/TestUtilities';\nimport { ChangeInternal, WriteFormat } from '../../persisted-types';\nimport { fail } from '../../Common';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { EditLog } from '../../EditLog';\nimport { FuzzTestState, done, EditGenerationConfig, AsyncGenerator, Operation } from './Types';\nimport { chain, makeOpGenerator, take } from './Generators';\n\nconst directory = join(testDocumentsPathBase, 'fuzz-tests');\n\n// TODO: Kludge: Use this to change the seed such that the tests avoid hitting bugs in the Fluid Framework.\n// Should be removed once fuzz tests pass reliably with any seed.\nconst adjustSeed = 2;\n\n/**\n * Performs random actions on a set of clients.\n * @param generator finite generator for a sequence of Operations to test. The test will run until this generator is exhausted.\n * @param seed the seed for the random generation of the fuzz actions\n * @param synchronizeAtEnd if provided, all client will have all operations delivered from the server at the end of the test\n * @param saveInfo optionally provide an operation number at which a history of all operations will be saved to disk at a given filepath.\n * This can be useful for debugging why a fuzz test may have failed.\n */\nexport async function performFuzzActions(\n\tgenerator: AsyncGenerator<Operation, undefined>,\n\tseed: number,\n\tsynchronizeAtEnd: boolean = true,\n\tsaveInfo?: { saveAt?: number; saveOnFailure: boolean; filepath: string }\n): Promise<Required<FuzzTestState>> {\n\tconst rand = new Prando(seed);\n\n\t// Note: the direct fields of `state` aren't mutated, but it is mutated transitively.\n\tconst state: FuzzTestState = { rand, passiveCollaborators: [], activeCollaborators: [] };\n\tconst { activeCollaborators, passiveCollaborators } = state;\n\tconst operations: Operation[] = [];\n\tfor (\n\t\tlet operation = await generator(state, undefined);\n\t\toperation !== done;\n\t\toperation = await generator(state, undefined)\n\t) {\n\t\toperations.push(operation);\n\t\tif (saveInfo !== undefined && operations.length === saveInfo.saveAt) {\n\t\t\tawait fs.writeFile(saveInfo.filepath, JSON.stringify(operations));\n\t\t}\n\n\t\ttry {\n\t\t\tswitch (operation.type) {\n\t\t\t\tcase 'edit': {\n\t\t\t\t\tconst { index, contents } = operation;\n\t\t\t\t\tconst { tree } = activeCollaborators[index];\n\t\t\t\t\tswitch (contents.fuzzType) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\ttree.applyEdit(contents.build, contents.insert);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\ttree.applyEdit(contents);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'move':\n\t\t\t\t\t\t\ttree.applyEdit(contents.detach, contents.insert);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'setPayload':\n\t\t\t\t\t\t\ttree.applyEdit(contents);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tfail('Invalid edit.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'join': {\n\t\t\t\t\tconst { isObserver, summarizeHistory, writeFormat } = operation;\n\t\t\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t\tsummarizeHistory,\n\t\t\t\t\t\ttestObjectProvider: state.testObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tif (state.testObjectProvider === undefined) {\n\t\t\t\t\t\tstate.testObjectProvider = testObjectProvider;\n\t\t\t\t\t}\n\t\t\t\t\t(isObserver ? passiveCollaborators : activeCollaborators).push({ container, tree });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'leave': {\n\t\t\t\t\tconst { index, isObserver } = operation;\n\t\t\t\t\tconst treeList = isObserver ? passiveCollaborators : activeCollaborators;\n\t\t\t\t\ttreeList[index].container.close();\n\t\t\t\t\ttreeList.splice(index, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'synchronize': {\n\t\t\t\t\tconst { testObjectProvider } = state;\n\t\t\t\t\tif (testObjectProvider === undefined) {\n\t\t\t\t\t\tfail('Attempted to synchronize with undefined testObjectProvider');\n\t\t\t\t\t}\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst trees = [...state.activeCollaborators, ...state.passiveCollaborators];\n\t\t\t\t\tif (trees.length > 1) {\n\t\t\t\t\t\tconst first = trees[0].tree;\n\t\t\t\t\t\tfor (let i = 1; i < trees.length; i++) {\n\t\t\t\t\t\t\tconst tree = trees[i].tree;\n\t\t\t\t\t\t\tconst editLogA = first.editsInternal as EditLog<ChangeInternal>;\n\t\t\t\t\t\t\tconst editLogB = tree.editsInternal as EditLog<ChangeInternal>;\n\t\t\t\t\t\t\tconst minEdits = Math.min(editLogA.length, editLogB.length);\n\t\t\t\t\t\t\tfor (let j = 0; j < minEdits - 1; j++) {\n\t\t\t\t\t\t\t\tconst editA = await editLogA.getEditAtIndex(editLogA.length - j - 1);\n\t\t\t\t\t\t\t\tconst editB = await editLogB.getEditAtIndex(editLogB.length - j - 1);\n\t\t\t\t\t\t\t\texpect(editA.id).to.equal(editB.id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\texpect(areRevisionViewsSemanticallyEqual(tree.currentView, tree, first.currentView, first))\n\t\t\t\t\t\t\t\t.to.be.true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error('Unknown operation.');\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.log(`Error encountered on operation number ${operations.length}`);\n\t\t\tif (saveInfo !== undefined && saveInfo.saveOnFailure) {\n\t\t\t\tawait fs.writeFile(saveInfo.filepath, JSON.stringify(operations));\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tif (synchronizeAtEnd) {\n\t\tawait state.testObjectProvider?.ensureSynchronized();\n\t\tconst trees = [...activeCollaborators.map(({ tree }) => tree), ...passiveCollaborators.map(({ tree }) => tree)];\n\t\tfor (let i = 0; i < trees.length - 1; i++) {\n\t\t\texpect(trees[i].equals(trees[i + 1]));\n\t\t}\n\t}\n\n\treturn state as Required<FuzzTestState>;\n}\n\nexport function runSharedTreeFuzzTests(title: string): void {\n\t// Some useful tips for debugging fuzz tests:\n\t// - A JSON dump of the operation sequence can be written to disk by passing `true` for `saveOnFailure`.\n\t// - Different shared-tree instances can be distinguished (e.g. in logs) by using `tree.getRuntime().clientId`\n\tdescribe(title, () => {\n\t\tfunction runTest(\n\t\t\tgeneratorFactory: () => AsyncGenerator<Operation, undefined>,\n\t\t\tseed: number,\n\t\t\tsaveOnFailure?: boolean\n\t\t): void {\n\t\t\tit(`with seed ${seed}`, async () => {\n\t\t\t\tconst saveInfo =\n\t\t\t\t\tsaveOnFailure !== undefined\n\t\t\t\t\t\t? { filepath: join(directory, `test-history-${seed}.json`), saveOnFailure }\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (saveInfo !== undefined && !existsSync(directory)) {\n\t\t\t\t\tmkdirSync(directory);\n\t\t\t\t}\n\t\t\t\tawait performFuzzActions(generatorFactory(), seed + adjustSeed, true, saveInfo);\n\t\t\t}).timeout(10000);\n\t\t}\n\n\t\tfunction runMixedVersionTests(summarizeHistory: boolean, testsPerSuite: number): void {\n\t\t\tdescribe('using 0.0.2 and 0.1.1 trees', () => {\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(\n\t\t\t\t\t\t() => take(1000, makeOpGenerator({ joinConfig: { summarizeHistory: [summarizeHistory] } })),\n\t\t\t\t\t\tseed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdescribe('using only version 0.0.2', () => {\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\t\t1000,\n\t\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_0_2],\n\t\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tseed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdescribe('using only version 0.1.1', () => {\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\t\t1000,\n\t\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_1_1],\n\t\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tseed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdescribe('upgrading halfway through', () => {\n\t\t\t\tconst testLength = 500;\n\t\t\t\tconst maximumActiveCollaborators = 10;\n\t\t\t\tconst maximumPassiveCollaborators = 5;\n\t\t\t\tconst editConfig: EditGenerationConfig = { maxTreeSize: 1000 };\n\t\t\t\tconst generatorFactory = () =>\n\t\t\t\t\tchain(\n\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\ttestLength / 2 - 1,\n\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\teditConfig,\n\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\tmaximumActiveCollaborators,\n\t\t\t\t\t\t\t\t\tmaximumPassiveCollaborators,\n\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_0_2],\n\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\tmaximumActiveCollaborators: maximumActiveCollaborators + 1,\n\t\t\t\t\t\t\t\t\tmaximumPassiveCollaborators,\n\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_1_1],\n\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\teditWeight: 0,\n\t\t\t\t\t\t\t\tjoinWeight: 1,\n\t\t\t\t\t\t\t\tleaveWeight: 0,\n\t\t\t\t\t\t\t\tsynchronizeWeight: 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\ttestLength / 2,\n\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\teditConfig,\n\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\tmaximumActiveCollaborators,\n\t\t\t\t\t\t\t\t\tmaximumPassiveCollaborators,\n\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(generatorFactory, seed);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst testCount = 1;\n\t\tdescribe('with no-history summarization', () => {\n\t\t\trunMixedVersionTests(false, testCount);\n\t\t});\n\n\t\tdescribe('with history summarization', () => {\n\t\t\trunMixedVersionTests(true, testCount);\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"SharedTreeFuzzTests.js","sourceRoot":"","sources":["../../../src/test/fuzz/SharedTreeFuzzTests.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 { promises as fs, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport Prando from 'prando';\nimport { expect } from 'chai';\nimport { setUpLocalServerTestSharedTree, testDocumentsPathBase } from '../utilities/TestUtilities';\nimport { ChangeInternal, WriteFormat } from '../../persisted-types';\nimport { fail } from '../../Common';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { EditLog } from '../../EditLog';\nimport { FuzzTestState, done, EditGenerationConfig, AsyncGenerator, Operation } from './Types';\nimport { chain, makeOpGenerator, take } from './Generators';\n\nconst directory = join(testDocumentsPathBase, 'fuzz-tests');\n\n// TODO: Kludge: Use this to change the seed such that the tests avoid hitting bugs in the Fluid Framework.\n// Should be removed once fuzz tests pass reliably with any seed.\nconst adjustSeed = 2;\n\n/**\n * Performs random actions on a set of clients.\n * @param generator finite generator for a sequence of Operations to test. The test will run until this generator is exhausted.\n * @param seed the seed for the random generation of the fuzz actions\n * @param synchronizeAtEnd if provided, all client will have all operations delivered from the server at the end of the test\n * @param saveInfo optionally provide an operation number at which a history of all operations will be saved to disk at a given filepath.\n * This can be useful for debugging why a fuzz test may have failed.\n */\nexport async function performFuzzActions(\n\tgenerator: AsyncGenerator<Operation, undefined>,\n\tseed: number,\n\tsynchronizeAtEnd: boolean = true,\n\tsaveInfo?: { saveAt?: number; saveOnFailure: boolean; filepath: string }\n): Promise<Required<FuzzTestState>> {\n\tconst rand = new Prando(seed);\n\n\t// Note: the direct fields of `state` aren't mutated, but it is mutated transitively.\n\tconst state: FuzzTestState = { rand, passiveCollaborators: [], activeCollaborators: [] };\n\tconst { activeCollaborators, passiveCollaborators } = state;\n\tconst operations: Operation[] = [];\n\tfor (\n\t\tlet operation = await generator(state, undefined);\n\t\toperation !== done;\n\t\toperation = await generator(state, undefined)\n\t) {\n\t\toperations.push(operation);\n\t\tif (saveInfo !== undefined && operations.length === saveInfo.saveAt) {\n\t\t\tawait fs.writeFile(saveInfo.filepath, JSON.stringify(operations));\n\t\t}\n\n\t\ttry {\n\t\t\tswitch (operation.type) {\n\t\t\t\tcase 'edit': {\n\t\t\t\t\tconst { index, contents } = operation;\n\t\t\t\t\tconst { tree } = activeCollaborators[index];\n\t\t\t\t\tswitch (contents.fuzzType) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\ttree.applyEdit(contents.build, contents.insert);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\ttree.applyEdit(contents);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'move':\n\t\t\t\t\t\t\ttree.applyEdit(contents.detach, contents.insert);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'setPayload':\n\t\t\t\t\t\t\ttree.applyEdit(contents);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tfail('Invalid edit.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'join': {\n\t\t\t\t\tconst { isObserver, summarizeHistory, writeFormat } = operation;\n\t\t\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t\tsummarizeHistory,\n\t\t\t\t\t\ttestObjectProvider: state.testObjectProvider,\n\t\t\t\t\t});\n\t\t\t\t\tif (state.testObjectProvider === undefined) {\n\t\t\t\t\t\tstate.testObjectProvider = testObjectProvider;\n\t\t\t\t\t}\n\t\t\t\t\t(isObserver ? passiveCollaborators : activeCollaborators).push({ container, tree });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'leave': {\n\t\t\t\t\tconst { index, isObserver } = operation;\n\t\t\t\t\tconst treeList = isObserver ? passiveCollaborators : activeCollaborators;\n\t\t\t\t\ttreeList[index].container.close();\n\t\t\t\t\ttreeList.splice(index, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'synchronize': {\n\t\t\t\t\tconst { testObjectProvider } = state;\n\t\t\t\t\tif (testObjectProvider === undefined) {\n\t\t\t\t\t\tfail('Attempted to synchronize with undefined testObjectProvider');\n\t\t\t\t\t}\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst trees = [...state.activeCollaborators, ...state.passiveCollaborators];\n\t\t\t\t\tif (trees.length > 1) {\n\t\t\t\t\t\tconst first = trees[0].tree;\n\t\t\t\t\t\tfor (let i = 1; i < trees.length; i++) {\n\t\t\t\t\t\t\tconst tree = trees[i].tree;\n\t\t\t\t\t\t\tconst editLogA = first.edits;\n\t\t\t\t\t\t\tconst editLogB = tree.edits;\n\t\t\t\t\t\t\tconst minEdits = Math.min(editLogA.length, editLogB.length);\n\t\t\t\t\t\t\tfor (let j = 0; j < minEdits - 1; j++) {\n\t\t\t\t\t\t\t\tconst editA = await editLogA.getEditAtIndex(editLogA.length - j - 1);\n\t\t\t\t\t\t\t\tconst editB = await editLogB.getEditAtIndex(editLogB.length - j - 1);\n\t\t\t\t\t\t\t\texpect(editA.id).to.equal(editB.id);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\texpect(areRevisionViewsSemanticallyEqual(tree.currentView, tree, first.currentView, first))\n\t\t\t\t\t\t\t\t.to.be.true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error('Unknown operation.');\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.log(`Error encountered on operation number ${operations.length}`);\n\t\t\tif (saveInfo !== undefined && saveInfo.saveOnFailure) {\n\t\t\t\tawait fs.writeFile(saveInfo.filepath, JSON.stringify(operations));\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tif (synchronizeAtEnd) {\n\t\tawait state.testObjectProvider?.ensureSynchronized();\n\t\tconst trees = [...activeCollaborators.map(({ tree }) => tree), ...passiveCollaborators.map(({ tree }) => tree)];\n\t\tfor (let i = 0; i < trees.length - 1; i++) {\n\t\t\texpect(trees[i].equals(trees[i + 1]));\n\t\t}\n\t}\n\n\treturn state as Required<FuzzTestState>;\n}\n\nexport function runSharedTreeFuzzTests(title: string): void {\n\t// Some useful tips for debugging fuzz tests:\n\t// - A JSON dump of the operation sequence can be written to disk by passing `true` for `saveOnFailure`.\n\t// - Different shared-tree instances can be distinguished (e.g. in logs) by using `tree.getRuntime().clientId`\n\tdescribe(title, () => {\n\t\tfunction runTest(\n\t\t\tgeneratorFactory: () => AsyncGenerator<Operation, undefined>,\n\t\t\tseed: number,\n\t\t\tsaveOnFailure?: boolean\n\t\t): void {\n\t\t\tit(`with seed ${seed}`, async () => {\n\t\t\t\tconst saveInfo =\n\t\t\t\t\tsaveOnFailure !== undefined\n\t\t\t\t\t\t? { filepath: join(directory, `test-history-${seed}.json`), saveOnFailure }\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (saveInfo !== undefined && !existsSync(directory)) {\n\t\t\t\t\tmkdirSync(directory);\n\t\t\t\t}\n\t\t\t\tawait performFuzzActions(generatorFactory(), seed + adjustSeed, true, saveInfo);\n\t\t\t}).timeout(10000);\n\t\t}\n\n\t\tfunction runMixedVersionTests(summarizeHistory: boolean, testsPerSuite: number): void {\n\t\t\tdescribe('using 0.0.2 and 0.1.1 trees', () => {\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(\n\t\t\t\t\t\t() => take(1000, makeOpGenerator({ joinConfig: { summarizeHistory: [summarizeHistory] } })),\n\t\t\t\t\t\tseed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdescribe('using only version 0.0.2', () => {\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\t\t1000,\n\t\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_0_2],\n\t\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tseed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdescribe('using only version 0.1.1', () => {\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\t\t1000,\n\t\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_1_1],\n\t\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\tseed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdescribe('upgrading halfway through', () => {\n\t\t\t\tconst testLength = 500;\n\t\t\t\tconst maximumActiveCollaborators = 10;\n\t\t\t\tconst maximumPassiveCollaborators = 5;\n\t\t\t\tconst editConfig: EditGenerationConfig = { maxTreeSize: 1000 };\n\t\t\t\tconst generatorFactory = () =>\n\t\t\t\t\tchain(\n\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\ttestLength / 2 - 1,\n\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\teditConfig,\n\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\tmaximumActiveCollaborators,\n\t\t\t\t\t\t\t\t\tmaximumPassiveCollaborators,\n\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_0_2],\n\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\tmaximumActiveCollaborators: maximumActiveCollaborators + 1,\n\t\t\t\t\t\t\t\t\tmaximumPassiveCollaborators,\n\t\t\t\t\t\t\t\t\twriteFormat: [WriteFormat.v0_1_1],\n\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\teditWeight: 0,\n\t\t\t\t\t\t\t\tjoinWeight: 1,\n\t\t\t\t\t\t\t\tleaveWeight: 0,\n\t\t\t\t\t\t\t\tsynchronizeWeight: 0,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttake(\n\t\t\t\t\t\t\ttestLength / 2,\n\t\t\t\t\t\t\tmakeOpGenerator({\n\t\t\t\t\t\t\t\teditConfig,\n\t\t\t\t\t\t\t\tjoinConfig: {\n\t\t\t\t\t\t\t\t\tmaximumActiveCollaborators,\n\t\t\t\t\t\t\t\t\tmaximumPassiveCollaborators,\n\t\t\t\t\t\t\t\t\tsummarizeHistory: [summarizeHistory],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\tfor (let seed = 0; seed < testsPerSuite; seed++) {\n\t\t\t\t\trunTest(generatorFactory, seed);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst testCount = 1;\n\t\tdescribe('with no-history summarization', () => {\n\t\t\trunMixedVersionTests(false, testCount);\n\t\t});\n\n\t\tdescribe('with history summarization', () => {\n\t\t\trunMixedVersionTests(true, testCount);\n\t\t});\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PendingLocalStateTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/PendingLocalStateTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EACN,sCAAsC,EACtC,mCAAmC,EAGnC,MAAM,iBAAiB,CAAC;AAezB;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,EACb,8BAA8B,EAAE,CAC/B,OAAO,EAAE,mCAAmC,KACxC,OAAO,CAAC,sCAAsC,CAAC,QAqHpD"}
1
+ {"version":3,"file":"PendingLocalStateTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/PendingLocalStateTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAEN,sCAAsC,EACtC,mCAAmC,EAGnC,MAAM,iBAAiB,CAAC;AAezB;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,EACb,8BAA8B,EAAE,CAC/B,OAAO,EAAE,mCAAmC,KACxC,OAAO,CAAC,sCAAsC,CAAC,QAmHpD"}
@@ -7,7 +7,7 @@ import { requestFluidObject } from '@fluidframework/runtime-utils';
7
7
  import { fail } from '../../Common';
8
8
  import { WriteFormat } from '../../persisted-types';
9
9
  import { Change, StablePlace } from '../../ChangeTypes';
10
- import { setUpTestTree, stabilizeEdit, } from './TestUtilities';
10
+ import { getEditLogInternal, setUpTestTree, stabilizeEdit, } from './TestUtilities';
11
11
  async function withContainerOffline(provider, container, action) {
12
12
  await provider.ensureSynchronized();
13
13
  await provider.opProcessingController.pauseProcessing(container);
@@ -49,14 +49,14 @@ export function runPendingLocalStateTests(title, setUpLocalServerTestSharedTree)
49
49
  const container3 = await loader.resolve({ url }, pendingLocalState);
50
50
  const dataObject3 = await requestFluidObject(container3, '/');
51
51
  const tree3 = await dataObject3.getSharedObject(documentId);
52
- expect(tree3.editsInternal.isLocalEdit(edit.id)).to.be.true; // Kludge
52
+ expect(tree3.edits.isLocalEdit(edit.id)).to.be.true; // Kludge
53
53
  await testObjectProvider.ensureSynchronized();
54
54
  expect(leftTraitAfterOfflineClose.length).to.equal(1, 'Second tree should not receive edits made by first tree after it went offline.');
55
55
  expect(tree3.currentView.getTrait(testTree.left.traitLocation.translate(tree3)).length).to.equal(2, 'Tree which loaded with stashed pending edits should apply them.');
56
56
  expect(tree2.currentView.getTrait(testTree.left.traitLocation.translate(tree2)).length).to.equal(2, 'Tree collaborating with a client that applies stashed pending edits should see them.');
57
57
  const stableEdit = stabilizeEdit(tree, edit);
58
- expect(stabilizeEdit(tree2, (_b = (await tree2.editsInternal.tryGetEdit(edit.id))) !== null && _b !== void 0 ? _b : fail())).to.deep.equal(stableEdit);
59
- expect(stabilizeEdit(tree3, (_c = (await tree3.editsInternal.tryGetEdit(edit.id))) !== null && _c !== void 0 ? _c : fail())).to.deep.equal(stableEdit);
58
+ expect(stabilizeEdit(tree2, (_b = (await getEditLogInternal(tree2).tryGetEdit(edit.id))) !== null && _b !== void 0 ? _b : fail())).to.deep.equal(stableEdit);
59
+ expect(stabilizeEdit(tree3, (_c = (await getEditLogInternal(tree3).tryGetEdit(edit.id))) !== null && _c !== void 0 ? _c : fail())).to.deep.equal(stableEdit);
60
60
  expect(tree2.edits.length).to.equal(initialEditLogLength + 1);
61
61
  expect(tree3.edits.length).to.equal(initialEditLogLength + 1);
62
62
  });
@@ -1 +1 @@
1
- {"version":3,"file":"PendingLocalStateTests.js","sourceRoot":"","sources":["../../../src/test/utilities/PendingLocalStateTests.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 { expect } from 'chai';\nimport { IContainer } from '@fluidframework/container-definitions';\nimport { requestFluidObject } from '@fluidframework/runtime-utils';\nimport { ITestFluidObject, ITestObjectProvider } from '@fluidframework/test-utils';\nimport { fail } from '../../Common';\nimport { ChangeInternal, Edit, WriteFormat } from '../../persisted-types';\nimport type { EditLog } from '../../EditLog';\nimport { SharedTree } from '../../SharedTree';\nimport { Change, StablePlace } from '../../ChangeTypes';\nimport {\n\tLocalServerSharedTreeTestingComponents,\n\tLocalServerSharedTreeTestingOptions,\n\tsetUpTestTree,\n\tstabilizeEdit,\n} from './TestUtilities';\n\nasync function withContainerOffline<TReturn>(\n\tprovider: ITestObjectProvider,\n\tcontainer: IContainer,\n\taction: () => TReturn\n): Promise<{ actionReturn: TReturn; pendingLocalState: string }> {\n\tawait provider.ensureSynchronized();\n\tawait provider.opProcessingController.pauseProcessing(container);\n\tconst actionReturn = action();\n\tconst pendingLocalState = container.closeAndGetPendingLocalState();\n\tprovider.opProcessingController.resumeProcessing(container);\n\treturn { actionReturn, pendingLocalState };\n}\n\n/**\n * Runs a test suite for SharedTree's ability to apply pending local state stashed by the host.\n * See documentation on `applyStashedOp`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runPendingLocalStateTests(\n\ttitle: string,\n\tsetUpLocalServerTestSharedTree: (\n\t\toptions: LocalServerSharedTreeTestingOptions\n\t) => Promise<LocalServerSharedTreeTestingComponents>\n) {\n\tdescribe(title, () => {\n\t\tconst documentId = 'documentId';\n\n\t\t[WriteFormat.v0_0_2 /* TODO: Enable when stashed ops are supported: WriteFormat.v0_1_1 */].forEach(\n\t\t\t(writeFormat) => {\n\t\t\t\tit(`is applied to all connected containers (v${writeFormat})`, async () => {\n\t\t\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst url = (await container.getAbsoluteUrl('/')) ?? fail('Container unable to resolve \"/\".');\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst initialEditLogLength = tree.edits.length;\n\n\t\t\t\t\tconst { pendingLocalState, actionReturn: edit } = await withContainerOffline(\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttree.applyEdit(\n\t\t\t\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left))\n\t\t\t\t\t\t\t) as Edit<ChangeInternal>\n\t\t\t\t\t);\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst leftTraitAfterOfflineClose = tree2.currentView.getTrait(\n\t\t\t\t\t\ttestTree.left.traitLocation.translate(tree2)\n\t\t\t\t\t);\n\t\t\t\t\tconst loader = testObjectProvider.makeTestLoader();\n\n\t\t\t\t\t// Simulate reconnect of user 1; a new container will be created which passes the stashed local state in its\n\t\t\t\t\t// load request.\n\t\t\t\t\tconst container3 = await loader.resolve({ url }, pendingLocalState);\n\t\t\t\t\tconst dataObject3 = await requestFluidObject<ITestFluidObject>(container3, '/');\n\t\t\t\t\tconst tree3 = await dataObject3.getSharedObject<SharedTree>(documentId);\n\t\t\t\t\texpect((tree3.editsInternal as EditLog<ChangeInternal>).isLocalEdit(edit.id)).to.be.true; // Kludge\n\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\texpect(leftTraitAfterOfflineClose.length).to.equal(\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t'Second tree should not receive edits made by first tree after it went offline.'\n\t\t\t\t\t);\n\t\t\t\t\texpect(tree3.currentView.getTrait(testTree.left.traitLocation.translate(tree3)).length).to.equal(\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t'Tree which loaded with stashed pending edits should apply them.'\n\t\t\t\t\t);\n\t\t\t\t\texpect(tree2.currentView.getTrait(testTree.left.traitLocation.translate(tree2)).length).to.equal(\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t'Tree collaborating with a client that applies stashed pending edits should see them.'\n\t\t\t\t\t);\n\n\t\t\t\t\tconst stableEdit = stabilizeEdit(tree, edit);\n\t\t\t\t\texpect(\n\t\t\t\t\t\tstabilizeEdit(tree2, (await tree2.editsInternal.tryGetEdit(edit.id)) ?? fail())\n\t\t\t\t\t).to.deep.equal(stableEdit);\n\t\t\t\t\texpect(\n\t\t\t\t\t\tstabilizeEdit(tree3, (await tree3.editsInternal.tryGetEdit(edit.id)) ?? fail())\n\t\t\t\t\t).to.deep.equal(stableEdit);\n\t\t\t\t\texpect(tree2.edits.length).to.equal(initialEditLogLength + 1);\n\t\t\t\t\texpect(tree3.edits.length).to.equal(initialEditLogLength + 1);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\tit('Deals with stashed handle ops gracefully', async () => {\n\t\t\t// Setup\n\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\tid: documentId,\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t});\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\tid: documentId,\n\t\t\t\ttestObjectProvider,\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t});\n\n\t\t\tconst url = (await container.getAbsoluteUrl('/')) ?? fail('Container unable to resolve \"/\".');\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tawait testObjectProvider.opProcessingController.pauseProcessing();\n\t\t\t// Generate enough edits to cause a chunk upload.\n\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk; i++) {\n\t\t\t\ttree.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.left.traitLocation))\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Process all of those messages, sequencing them but without informing the container that they have been sequenced.\n\t\t\tawait testObjectProvider.opProcessingController.processOutgoing(container);\n\t\t\t// Inform the container that all of the edits it generated above have been sequenced, thereby filling an edit chunk\n\t\t\t// whose responsibility to upload is on the container.\n\t\t\tawait testObjectProvider.opProcessingController.processIncoming(container);\n\t\t\t// Process outgoing/incoming once more to handle the blob attach op.\n\t\t\tawait testObjectProvider.opProcessingController.processOutgoing(container);\n\t\t\tawait testObjectProvider.opProcessingController.processIncoming(container);\n\n\t\t\tconst pendingLocalState = container.closeAndGetPendingLocalState();\n\t\t\tconst loader = testObjectProvider.makeTestLoader();\n\n\t\t\tconst container2 = await loader.resolve({ url }, pendingLocalState);\n\t\t\tconst dataObject2 = await requestFluidObject<ITestFluidObject>(container2, '/');\n\t\t\tconst tree2 = await dataObject2.getSharedObject<SharedTree>(documentId);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\tconst editLog = tree2.edits as EditLog;\n\t\t\tconst unuploadedEditChunks = Array.from(editLog.getEditChunksReadyForUpload());\n\t\t\texpect(unuploadedEditChunks.length).to.equal(0);\n\t\t\texpect(editLog.getEditLogSummary().editChunks.length).to.equal(2);\n\t\t});\n\t});\n}\n"]}
1
+ {"version":3,"file":"PendingLocalStateTests.js","sourceRoot":"","sources":["../../../src/test/utilities/PendingLocalStateTests.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 { expect } from 'chai';\nimport { IContainer } from '@fluidframework/container-definitions';\nimport { requestFluidObject } from '@fluidframework/runtime-utils';\nimport { ITestFluidObject, ITestObjectProvider } from '@fluidframework/test-utils';\nimport { fail } from '../../Common';\nimport { ChangeInternal, Edit, WriteFormat } from '../../persisted-types';\nimport type { EditLog } from '../../EditLog';\nimport { SharedTree } from '../../SharedTree';\nimport { Change, StablePlace } from '../../ChangeTypes';\nimport {\n\tgetEditLogInternal,\n\tLocalServerSharedTreeTestingComponents,\n\tLocalServerSharedTreeTestingOptions,\n\tsetUpTestTree,\n\tstabilizeEdit,\n} from './TestUtilities';\n\nasync function withContainerOffline<TReturn>(\n\tprovider: ITestObjectProvider,\n\tcontainer: IContainer,\n\taction: () => TReturn\n): Promise<{ actionReturn: TReturn; pendingLocalState: string }> {\n\tawait provider.ensureSynchronized();\n\tawait provider.opProcessingController.pauseProcessing(container);\n\tconst actionReturn = action();\n\tconst pendingLocalState = container.closeAndGetPendingLocalState();\n\tprovider.opProcessingController.resumeProcessing(container);\n\treturn { actionReturn, pendingLocalState };\n}\n\n/**\n * Runs a test suite for SharedTree's ability to apply pending local state stashed by the host.\n * See documentation on `applyStashedOp`.\n * This suite can be used to test other implementations that aim to fulfill `SharedTree`'s contract.\n */\nexport function runPendingLocalStateTests(\n\ttitle: string,\n\tsetUpLocalServerTestSharedTree: (\n\t\toptions: LocalServerSharedTreeTestingOptions\n\t) => Promise<LocalServerSharedTreeTestingComponents>\n) {\n\tdescribe(title, () => {\n\t\tconst documentId = 'documentId';\n\n\t\t[WriteFormat.v0_0_2 /* TODO: Enable when stashed ops are supported: WriteFormat.v0_1_1 */].forEach(\n\t\t\t(writeFormat) => {\n\t\t\t\tit(`is applied to all connected containers (v${writeFormat})`, async () => {\n\t\t\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\t\t\tconst { tree: tree2 } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\t\tid: documentId,\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t\twriteFormat,\n\t\t\t\t\t});\n\t\t\t\t\tconst url = (await container.getAbsoluteUrl('/')) ?? fail('Container unable to resolve \"/\".');\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst initialEditLogLength = tree.edits.length;\n\n\t\t\t\t\tconst { pendingLocalState, actionReturn: edit } = await withContainerOffline(\n\t\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\t\tcontainer,\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\ttree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)))\n\t\t\t\t\t);\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\t\tconst leftTraitAfterOfflineClose = tree2.currentView.getTrait(\n\t\t\t\t\t\ttestTree.left.traitLocation.translate(tree2)\n\t\t\t\t\t);\n\t\t\t\t\tconst loader = testObjectProvider.makeTestLoader();\n\n\t\t\t\t\t// Simulate reconnect of user 1; a new container will be created which passes the stashed local state in its\n\t\t\t\t\t// load request.\n\t\t\t\t\tconst container3 = await loader.resolve({ url }, pendingLocalState);\n\t\t\t\t\tconst dataObject3 = await requestFluidObject<ITestFluidObject>(container3, '/');\n\t\t\t\t\tconst tree3 = await dataObject3.getSharedObject<SharedTree>(documentId);\n\t\t\t\t\texpect((tree3.edits as unknown as EditLog<ChangeInternal>).isLocalEdit(edit.id)).to.be.true; // Kludge\n\n\t\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\t\t\texpect(leftTraitAfterOfflineClose.length).to.equal(\n\t\t\t\t\t\t1,\n\t\t\t\t\t\t'Second tree should not receive edits made by first tree after it went offline.'\n\t\t\t\t\t);\n\t\t\t\t\texpect(tree3.currentView.getTrait(testTree.left.traitLocation.translate(tree3)).length).to.equal(\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t'Tree which loaded with stashed pending edits should apply them.'\n\t\t\t\t\t);\n\t\t\t\t\texpect(tree2.currentView.getTrait(testTree.left.traitLocation.translate(tree2)).length).to.equal(\n\t\t\t\t\t\t2,\n\t\t\t\t\t\t'Tree collaborating with a client that applies stashed pending edits should see them.'\n\t\t\t\t\t);\n\n\t\t\t\t\tconst stableEdit = stabilizeEdit(tree, edit as unknown as Edit<ChangeInternal>);\n\t\t\t\t\texpect(\n\t\t\t\t\t\tstabilizeEdit(tree2, (await getEditLogInternal(tree2).tryGetEdit(edit.id)) ?? fail())\n\t\t\t\t\t).to.deep.equal(stableEdit);\n\t\t\t\t\texpect(\n\t\t\t\t\t\tstabilizeEdit(tree3, (await getEditLogInternal(tree3).tryGetEdit(edit.id)) ?? fail())\n\t\t\t\t\t).to.deep.equal(stableEdit);\n\t\t\t\t\texpect(tree2.edits.length).to.equal(initialEditLogLength + 1);\n\t\t\t\t\texpect(tree3.edits.length).to.equal(initialEditLogLength + 1);\n\t\t\t\t});\n\t\t\t}\n\t\t);\n\n\t\tit('Deals with stashed handle ops gracefully', async () => {\n\t\t\t// Setup\n\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\tid: documentId,\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t});\n\t\t\tconst testTree = setUpTestTree(tree);\n\t\t\tawait setUpLocalServerTestSharedTree({\n\t\t\t\tid: documentId,\n\t\t\t\ttestObjectProvider,\n\t\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t\t});\n\n\t\t\tconst url = (await container.getAbsoluteUrl('/')) ?? fail('Container unable to resolve \"/\".');\n\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\tawait testObjectProvider.opProcessingController.pauseProcessing();\n\t\t\t// Generate enough edits to cause a chunk upload.\n\t\t\tfor (let i = 0; i < (tree.edits as EditLog).editsPerChunk; i++) {\n\t\t\t\ttree.applyEdit(\n\t\t\t\t\t...Change.insertTree(testTree.buildLeaf(), StablePlace.atEndOf(testTree.left.traitLocation))\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Process all of those messages, sequencing them but without informing the container that they have been sequenced.\n\t\t\tawait testObjectProvider.opProcessingController.processOutgoing(container);\n\t\t\t// Inform the container that all of the edits it generated above have been sequenced, thereby filling an edit chunk\n\t\t\t// whose responsibility to upload is on the container.\n\t\t\tawait testObjectProvider.opProcessingController.processIncoming(container);\n\t\t\t// Process outgoing/incoming once more to handle the blob attach op.\n\t\t\tawait testObjectProvider.opProcessingController.processOutgoing(container);\n\t\t\tawait testObjectProvider.opProcessingController.processIncoming(container);\n\n\t\t\tconst pendingLocalState = container.closeAndGetPendingLocalState();\n\t\t\tconst loader = testObjectProvider.makeTestLoader();\n\n\t\t\tconst container2 = await loader.resolve({ url }, pendingLocalState);\n\t\t\tconst dataObject2 = await requestFluidObject<ITestFluidObject>(container2, '/');\n\t\t\tconst tree2 = await dataObject2.getSharedObject<SharedTree>(documentId);\n\t\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t\tconst editLog = tree2.edits as EditLog;\n\t\t\tconst unuploadedEditChunks = Array.from(editLog.getEditChunksReadyForUpload());\n\t\t\texpect(unuploadedEditChunks.length).to.equal(0);\n\t\t\texpect(editLog.getEditLogSummary().editChunks.length).to.equal(2);\n\t\t});\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAeN,WAAW,EACX,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EAGN,2BAA2B,EAC3B,wBAAwB,EAaxB,MAAM,iBAAiB,CAAC;AAazB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,qCAAqC,EAAE,CAAC,OAAO,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,QAk2C1G"}
1
+ {"version":3,"file":"SharedTreeTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAeN,WAAW,EACX,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EAGN,2BAA2B,EAC3B,wBAAwB,EAcxB,MAAM,iBAAiB,CAAC;AAazB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,qCAAqC,EAAE,CAAC,OAAO,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,QAk6C1G"}
@@ -26,7 +26,7 @@ import { convertNodeDataIds } from '../../IdConversion';
26
26
  import { buildLeaf, SimpleTestTree } from './TestNode';
27
27
  import { TestFluidHandle, TestFluidSerializer } from './TestSerializer';
28
28
  import { runSharedTreeUndoRedoTestSuite } from './UndoRedoTests';
29
- import { areNodesEquivalent, assertNoDelta, setUpTestTree, testTrait, testTraitLabel, translateId, spyOnSubmittedOps, normalizeIds, normalizeId, normalizeEdit, setUpLocalServerTestSharedTree, applyNoop, getIdNormalizerFromSharedTree, waitForSummary, } from './TestUtilities';
29
+ import { areNodesEquivalent, assertNoDelta, setUpTestTree, testTrait, testTraitLabel, translateId, spyOnSubmittedOps, normalizeIds, normalizeId, normalizeEdit, setUpLocalServerTestSharedTree, applyNoop, getIdNormalizerFromSharedTree, waitForSummary, getEditLogInternal, } from './TestUtilities';
30
30
  function revertEditInTree(tree, edit) {
31
31
  return tree.revert(edit);
32
32
  }
@@ -836,7 +836,7 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
836
836
  headers: { [LoaderHeader.version]: secondSummaryVersion },
837
837
  });
838
838
  // Verify we loaded a no-history summary.
839
- expect(tree3.editsInternal.length).to.equal(1);
839
+ expect(tree3.edits.length).to.equal(1);
840
840
  let unexpectedHistoryChunkCount = 0;
841
841
  tree3.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => unexpectedHistoryChunkCount++);
842
842
  await testObjectProvider.ensureSynchronized();
@@ -885,10 +885,12 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
885
885
  expect(tree.equals(secondTree)).to.be.false;
886
886
  containerRuntimeFactory.processAllMessages();
887
887
  const { internedStrings } = tree.saveSummary();
888
- const insertEdit = normalizeEdit(tree, tree.editsInternal.getEditInSessionAtIndex(1));
889
- const moveEdit = normalizeEdit(tree, tree.editsInternal.getEditInSessionAtIndex(2));
890
- const insertEdit2 = normalizeEdit(secondTree, secondTree.editsInternal.getEditInSessionAtIndex(1));
891
- const moveEdit2 = normalizeEdit(secondTree, secondTree.editsInternal.getEditInSessionAtIndex(2));
888
+ const log = getEditLogInternal(tree);
889
+ const log2 = getEditLogInternal(secondTree);
890
+ const insertEdit = normalizeEdit(tree, log.getEditInSessionAtIndex(1));
891
+ const moveEdit = normalizeEdit(tree, log.getEditInSessionAtIndex(2));
892
+ const insertEdit2 = normalizeEdit(secondTree, log2.getEditInSessionAtIndex(1));
893
+ const moveEdit2 = normalizeEdit(secondTree, log2.getEditInSessionAtIndex(2));
892
894
  expect(insertEdit).to.deep.equal(insertEdit2);
893
895
  expect(moveEdit).to.deep.equal(moveEdit2);
894
896
  expect(tree.equals(secondTree)).to.be.true;
@@ -920,7 +922,7 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
920
922
  const testTree = setUpTestTree(tree);
921
923
  const uncompressedEdits = [
922
924
  {
923
- changes: tree.edits.getEditInSessionAtIndex(0).changes,
925
+ changes: getEditLogInternal(tree).getEditInSessionAtIndex(0).changes,
924
926
  },
925
927
  ];
926
928
  // Apply enough edits for the upload of an edit chunk
@@ -955,6 +957,56 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
955
957
  });
956
958
  });
957
959
  }
960
+ describe('mergeEditsFrom', () => {
961
+ const getTestTreeRootHandle = (tree, testTree) => {
962
+ const view = tree.currentView;
963
+ const handle = new TreeNodeHandle(view, view.root);
964
+ return handle.traits[testTree.traitLabel][0];
965
+ };
966
+ it('can be used with simple edits', () => {
967
+ const { sharedTree, testTree } = createSimpleTestTree();
968
+ const { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree();
969
+ sharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));
970
+ sharedTree.applyEdit(Change.delete(StableRange.all({ parent: testTree.identifier, label: testTree.right.traitLabel })));
971
+ const preEditRootHandle = getTestTreeRootHandle(sharedTree2, testTree2);
972
+ const edits = [0, 1, 2].map((i) => sharedTree.edits.getEditInSessionAtIndex(i));
973
+ // Since the TestTree setup edit is a `setTrait`, this should wipe `testTree2` state.
974
+ sharedTree2.mergeEditsFrom(sharedTree, edits);
975
+ expect(sharedTree2.edits.length).to.equal(4);
976
+ const rootHandle = getTestTreeRootHandle(sharedTree2, testTree2);
977
+ expect(preEditRootHandle.identifier).to.not.equal(rootHandle.identifier);
978
+ expect(rootHandle.traits[testTree2.left.traitLabel].length).to.equal(2);
979
+ });
980
+ it('can be used with a translation map', () => {
981
+ const { sharedTree, testTree } = createSimpleTestTree();
982
+ const { sharedTree: sharedTree2, testTree: testTree2 } = createSimpleTestTree();
983
+ // For each of the identities in the simple test tree...
984
+ const nodeIdGetters = [
985
+ (tree) => tree.identifier,
986
+ (tree) => tree.left.identifier,
987
+ (tree) => tree.right.identifier,
988
+ ];
989
+ // Make a map translating that identifier from `testTree` to `testTree2`
990
+ const translationMap = new Map(nodeIdGetters.map((getter) => [
991
+ sharedTree.convertToStableNodeId(getter(testTree)),
992
+ sharedTree2.convertToStableNodeId(getter(testTree2)),
993
+ ]));
994
+ sharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));
995
+ sharedTree.applyEdit(Change.delete(StableRange.all({ parent: testTree.identifier, label: testTree.right.traitLabel })));
996
+ const edits = [1, 2].map((i) => sharedTree.edits.getEditInSessionAtIndex(i));
997
+ sharedTree2.mergeEditsFrom(sharedTree, edits, (id) => { var _a; return (_a = translationMap.get(id)) !== null && _a !== void 0 ? _a : id; });
998
+ const root = getTestTreeRootHandle(sharedTree, testTree);
999
+ const root2 = getTestTreeRootHandle(sharedTree2, testTree2);
1000
+ const leftTrait = root.traits[testTree.left.traitLabel];
1001
+ const leftTrait2 = root2.traits[testTree2.left.traitLabel];
1002
+ // Inserted leaves should be equivalent.
1003
+ expect(leftTrait2.length).to.equal(2);
1004
+ expect(leftTrait2[1]).to.deep.equal(leftTrait[1]);
1005
+ // Right subtree should have been deleted.
1006
+ expect(Object.entries(root2.traits).length).to.equal(1);
1007
+ expect(root2.traits[testTree2.right.traitLabel]).to.equal(undefined);
1008
+ });
1009
+ });
958
1010
  });
959
1011
  }
960
1012
  //# sourceMappingURL=SharedTreeTests.js.map