@fluid-experimental/tree 0.59.3001 → 0.59.4000-71128

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 (54) hide show
  1. package/dist/Forest.js +1 -1
  2. package/dist/Forest.js.map +1 -1
  3. package/dist/id-compressor/IdCompressor.d.ts +19 -45
  4. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  5. package/dist/id-compressor/IdCompressor.js +151 -151
  6. package/dist/id-compressor/IdCompressor.js.map +1 -1
  7. package/dist/id-compressor/SessionIdNormalizer.d.ts +1 -16
  8. package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  9. package/dist/id-compressor/SessionIdNormalizer.js +23 -21
  10. package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
  11. package/dist/id-compressor/persisted-types/0.0.1.d.ts +23 -4
  12. package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  13. package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
  14. package/lib/Forest.js +1 -1
  15. package/lib/Forest.js.map +1 -1
  16. package/lib/id-compressor/IdCompressor.d.ts +19 -45
  17. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  18. package/lib/id-compressor/IdCompressor.js +152 -152
  19. package/lib/id-compressor/IdCompressor.js.map +1 -1
  20. package/lib/id-compressor/SessionIdNormalizer.d.ts +1 -16
  21. package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  22. package/lib/id-compressor/SessionIdNormalizer.js +23 -21
  23. package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
  24. package/lib/id-compressor/persisted-types/0.0.1.d.ts +23 -4
  25. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  26. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
  27. package/lib/test/IdCompressor.perf.tests.js +47 -67
  28. package/lib/test/IdCompressor.perf.tests.js.map +1 -1
  29. package/lib/test/IdCompressor.tests.js +196 -101
  30. package/lib/test/IdCompressor.tests.js.map +1 -1
  31. package/lib/test/Summary.tests.d.ts +0 -1
  32. package/lib/test/Summary.tests.d.ts.map +1 -1
  33. package/lib/test/Summary.tests.js +0 -3
  34. package/lib/test/Summary.tests.js.map +1 -1
  35. package/lib/test/Virtualization.tests.js +0 -4
  36. package/lib/test/Virtualization.tests.js.map +1 -1
  37. package/lib/test/utilities/IdCompressorTestUtilities.d.ts +14 -7
  38. package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -1
  39. package/lib/test/utilities/IdCompressorTestUtilities.js +40 -20
  40. package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -1
  41. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  42. package/lib/test/utilities/SharedTreeTests.js +0 -1
  43. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  44. package/lib/test/utilities/SummaryLoadPerfTests.js +1 -1
  45. package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -1
  46. package/lib/test/utilities/TestCommon.d.ts +4 -0
  47. package/lib/test/utilities/TestCommon.d.ts.map +1 -1
  48. package/lib/test/utilities/TestCommon.js +6 -0
  49. package/lib/test/utilities/TestCommon.js.map +1 -1
  50. package/package.json +24 -19
  51. package/src/Forest.ts +1 -1
  52. package/src/id-compressor/IdCompressor.ts +171 -198
  53. package/src/id-compressor/SessionIdNormalizer.ts +29 -41
  54. package/src/id-compressor/persisted-types/0.0.1.ts +25 -4
@@ -4,5 +4,4 @@ import { SharedTree } from '../SharedTree';
4
4
  export declare function applyTestEdits(sharedTree: SharedTree): void;
5
5
  export declare function createSummaryTestTree(writeFormat: WriteFormat, summarizeHistory: boolean): Promise<SharedTree>;
6
6
  export declare function runSummaryTests(title: string): void;
7
- export declare function expectAssert(condition: unknown, message?: string): asserts condition;
8
7
  //# sourceMappingURL=Summary.tests.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Summary.tests.d.ts","sourceRoot":"","sources":["../../src/test/Summary.tests.ts"],"names":[],"mappings":"AAcA,OAAO,EAKN,WAAW,EACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmB3C,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAsF3D;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAmCpH;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAwOnD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAEpF"}
1
+ {"version":3,"file":"Summary.tests.d.ts","sourceRoot":"","sources":["../../src/test/Summary.tests.ts"],"names":[],"mappings":"AAcA,OAAO,EAKN,WAAW,EACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmB3C,wHAAwH;AACxH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAsF3D;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAmCpH;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAwOnD"}
@@ -306,9 +306,6 @@ export function runSummaryTests(title) {
306
306
  });
307
307
  });
308
308
  }
309
- export function expectAssert(condition, message) {
310
- expect(condition, message);
311
- }
312
309
  async function expectSharedTreesEqual(sharedTreeA, sharedTreeB, compareEditIds = true) {
313
310
  if (!areRevisionViewsSemanticallyEqual(sharedTreeA.currentView, sharedTreeA, sharedTreeB.currentView, sharedTreeB)) {
314
311
  expect.fail('trees have different current views');
@@ -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\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"]}
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\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"]}
@@ -155,12 +155,10 @@ describe('SharedTree history virtualization', () => {
155
155
  expect(editChunksUploaded).to.equal(0);
156
156
  });
157
157
  it('can upload full chunks with incomplete chunks in the edit log', async () => {
158
- testObjectProvider.logger.registerExpectedEvent({ eventName: 'fluid:telemetry:Batching:LengthTooBig' }, { eventName: 'fluid:telemetry:Batching:LengthTooBig' });
159
158
  await addNewEditChunks(1, 50);
160
159
  expect(editChunksUploaded).to.equal(1);
161
160
  });
162
161
  it('correctly saves handles and their corresponding starting revisions to the summary', async () => {
163
- testObjectProvider.logger.registerExpectedEvent({ eventName: 'fluid:telemetry:Batching:LengthTooBig' }, { eventName: 'fluid:telemetry:Batching:LengthTooBig' });
164
162
  await addNewEditChunks(4);
165
163
  const { editHistory } = sharedTree.saveSummary();
166
164
  const { editChunks } = assertNotUndefined(editHistory);
@@ -206,7 +204,6 @@ describe('SharedTree history virtualization', () => {
206
204
  expect(sharedTree2HandleRoute).to.equal(sharedTree3HandleRoute);
207
205
  });
208
206
  it('does not cause misaligned chunks', async () => {
209
- testObjectProvider.logger.registerExpectedEvent({ eventName: 'fluid:telemetry:Batching:LengthTooBig' }, { eventName: 'fluid:telemetry:Batching:LengthTooBig' }, { eventName: 'fluid:telemetry:Batching:LengthTooBig' });
210
207
  await addNewEditChunks(1, 50);
211
208
  const summary = sharedTree.saveSummary();
212
209
  // Connect another client
@@ -226,7 +223,6 @@ describe('SharedTree history virtualization', () => {
226
223
  });
227
224
  it('does not cause misaligned chunks for format version 0.0.2', async () => {
228
225
  await useSharedTreeSummaryv0_0_2();
229
- testObjectProvider.logger.registerExpectedEvent({ eventName: 'fluid:telemetry:Batching:LengthTooBig' }, { eventName: 'fluid:telemetry:Batching:LengthTooBig' }, { eventName: 'fluid:telemetry:Batching:LengthTooBig' });
230
226
  // Add enough edits for a chunk and a half
231
227
  await addNewEditChunks(1, 50);
232
228
  // Connect another client
@@ -1 +1 @@
1
- {"version":3,"file":"Virtualization.tests.js","sourceRoot":"","sources":["../../src/test/Virtualization.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 */\n\nimport { expect } from 'chai';\nimport { TestObjectProvider } from '@fluidframework/test-utils';\nimport { EditLog } from '../EditLog';\nimport { assertNotUndefined } from '../Common';\nimport { initialTree } from '../InitialTree';\nimport { SharedTree } from '../SharedTree';\nimport {\n\tChangeInternal,\n\tEdit,\n\tPayload,\n\treservedIdCount,\n\tFluidEditHandle,\n\tSharedTreeSummary,\n\tWriteFormat,\n\teditsPerChunk,\n} from '../persisted-types';\nimport { SharedTreeDiagnosticEvent } from '../EventTypes';\nimport { IdCompressor } from '../id-compressor';\nimport { createSessionId } from '../id-compressor/NumericUuid';\nimport { SharedTreeEncoder_0_1_1 } from '../SharedTreeEncoder';\nimport { CachingLogViewer } from '../LogViewer';\nimport { RevisionView } from '../RevisionView';\nimport { MutableStringInterner } from '../StringInterner';\nimport {\n\tapplyNoop,\n\tcreateStableEdits,\n\tmakeNodeIdContext,\n\tsetUpLocalServerTestSharedTree,\n} from './utilities/TestUtilities';\nimport { SimpleTestTree } from './utilities/TestNode';\n\ndescribe('SharedTree history virtualization', () => {\n\tlet sharedTree: SharedTree;\n\tlet testObjectProvider: TestObjectProvider;\n\tlet editChunksUploaded = 0;\n\tconst editCount = 250;\n\tconst expectedFullChunkCount = Math.floor(editCount / editsPerChunk);\n\n\t// Create a summary used to test catchup blobbing\n\tfunction createCatchUpSummary(numberOfEdits: number, payload?: (i: number) => Payload): SharedTreeSummary {\n\t\tconst idCompressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\tconst context = makeNodeIdContext(idCompressor);\n\t\tconst edits = createStableEdits(numberOfEdits, context, payload);\n\t\tidCompressor.finalizeCreationRange(idCompressor.takeNextCreationRange());\n\t\tconst editLog = new EditLog<ChangeInternal>();\n\t\tfor (let i = 0; i < edits.length; i++) {\n\t\t\teditLog.addSequencedEdit(edits[i], { sequenceNumber: i + 1, referenceSequenceNumber: i });\n\t\t}\n\t\tconst logViewer = new CachingLogViewer(editLog, RevisionView.fromTree(initialTree, context, true));\n\n\t\tconst internedStrings = [\n\t\t\tSimpleTestTree.definition,\n\t\t\tSimpleTestTree.traitLabel,\n\t\t\tSimpleTestTree.leftTraitLabel,\n\t\t\tSimpleTestTree.rightTraitLabel,\n\t\t];\n\t\tconst interner = new MutableStringInterner(internedStrings);\n\t\tconst encoder = new SharedTreeEncoder_0_1_1(true);\n\t\treturn encoder.encodeSummary(\n\t\t\teditLog,\n\t\t\tlogViewer.getRevisionViewInSession(Number.POSITIVE_INFINITY),\n\t\t\tcontext,\n\t\t\tcontext,\n\t\t\tinterner,\n\t\t\tidCompressor.serialize(false)\n\t\t);\n\t}\n\n\tbeforeEach(async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.EditChunkUploaded, () => {\n\t\t\teditChunksUploaded++;\n\t\t});\n\t});\n\n\tafterEach(() => {\n\t\teditChunksUploaded = 0;\n\t});\n\n\t// Replace sharedTree with one that writes summary format 0.0.2\n\tconst useSharedTreeSummaryv0_0_2 = async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.EditChunkUploaded, () => {\n\t\t\teditChunksUploaded++;\n\t\t});\n\t};\n\n\t// Adds edits to sharedTree1 to make up the specified number of chunks.\n\tconst addNewEditChunks = async (numberOfChunks = 1, additionalEdits = 0) => {\n\t\tconst expectedEdits: Edit<unknown>[] = [];\n\n\t\t// Add some edits to create a chunk with.\n\t\twhile (expectedEdits.length < (sharedTree.edits as EditLog).editsPerChunk * numberOfChunks + additionalEdits) {\n\t\t\texpectedEdits.push(applyNoop(sharedTree));\n\t\t}\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\treturn expectedEdits;\n\t};\n\n\tit('can upload edit chunks and load chunks from handles', async () => {\n\t\tconst expectedEdits: Edit<unknown>[] = await addNewEditChunks();\n\n\t\tconst summary = sharedTree.saveSummary() as SharedTreeSummary;\n\n\t\tconst { editHistory } = summary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(1);\n\t\texpect(typeof (editChunks[0].chunk as FluidEditHandle).get).to.equal('function');\n\n\t\t// Load a second tree using the summary\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Ensure chunked edit can be retrieved\n\t\texpect((await sharedTree2.edits.getEditAtIndex(2)).id).to.equal(expectedEdits[2].id);\n\t});\n\n\tit('can upload catchup blobs', async () => {\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for the op to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\tsharedTree.loadSummary(createCatchUpSummary(250));\n\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(expectedFullChunkCount);\n\n\t\tconst { editHistory } = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(expectedFullChunkCount + 1);\n\t\texpect(typeof (editChunks[0].chunk as FluidEditHandle).get).to.equal('function');\n\t});\n\n\tit('only uploads catchup blobs from one client', async () => {\n\t\t// Create more connected trees\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree3.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for processing again in case there are more no ops\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t// Try to load summaries on all the trees\n\t\tconst summary = createCatchUpSummary(250);\n\t\tsharedTree.loadSummary(summary);\n\t\tsharedTree2.loadSummary(summary);\n\t\tsharedTree3.loadSummary(summary);\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(expectedFullChunkCount);\n\n\t\t// Make sure the trees are still the same\n\t\texpect(sharedTree.equals(sharedTree2)).to.be.true;\n\t\texpect(sharedTree.equals(sharedTree3)).to.be.true;\n\t});\n\n\tit(\"doesn't upload incomplete chunks\", async () => {\n\t\tawait addNewEditChunks(0, 50);\n\t\texpect(editChunksUploaded).to.equal(0);\n\t});\n\n\tit('can upload full chunks with incomplete chunks in the edit log', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait addNewEditChunks(1, 50);\n\t\texpect(editChunksUploaded).to.equal(1);\n\t});\n\n\tit('correctly saves handles and their corresponding starting revisions to the summary', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait addNewEditChunks(4);\n\n\t\tconst { editHistory } = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(4);\n\n\t\t// Make sure each starting revision is correct and each chunk in the summary is a handle\n\t\teditChunks.forEach(({ startRevision, chunk }, index) => {\n\t\t\texpect(startRevision).to.equal(index * (sharedTree.edits as EditLog).editsPerChunk);\n\t\t\texpect(typeof (chunk as FluidEditHandle).get).to.equal('function');\n\t\t});\n\t});\n\n\tit('sends handle ops to connected clients when chunks are uploaded', async () => {\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\t// All shared trees should have no edits or chunks\n\t\texpect((sharedTree.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\t\texpect((sharedTree2.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\t\texpect((sharedTree3.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\n\t\tawait addNewEditChunks();\n\n\t\t// All shared trees should have the new handle\n\t\tconst sharedTreeSummary = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTree2Summary = sharedTree2.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTree3Summary = sharedTree3.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTreeChunk = assertNotUndefined(sharedTreeSummary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree2Chunk = assertNotUndefined(sharedTree2Summary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree3Chunk = assertNotUndefined(sharedTree3Summary.editHistory).editChunks[0].chunk;\n\n\t\t// Make sure the chunk of the first shared tree is a handle\n\t\texpect(typeof (sharedTreeChunk as FluidEditHandle).get).to.equal('function');\n\n\t\tconst sharedTreeHandleRoute = (sharedTreeChunk as any).absolutePath;\n\t\tconst sharedTree2HandleRoute = (sharedTree2Chunk as any).absolutePath;\n\t\tconst sharedTree3HandleRoute = (sharedTree3Chunk as any).absolutePath;\n\n\t\t// Make sure the handle route of the first shared tree is a string\n\t\texpect(typeof sharedTreeHandleRoute).to.equal('string');\n\n\t\texpect(sharedTreeHandleRoute).to.equal(sharedTree2HandleRoute);\n\t\texpect(sharedTree2HandleRoute).to.equal(sharedTree3HandleRoute);\n\t});\n\n\tit('does not cause misaligned chunks', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\t\tawait addNewEditChunks(1, 50);\n\n\t\tconst summary = sharedTree.saveSummary();\n\n\t\t// Connect another client\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tlet unexpectedHistoryChunk = false;\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {\n\t\t\tunexpectedHistoryChunk = true;\n\t\t});\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Finish off the incomplete chunk\n\t\tawait addNewEditChunks();\n\n\t\texpect(unexpectedHistoryChunk).to.be.false;\n\t});\n\n\tit('does not cause misaligned chunks for format version 0.0.2', async () => {\n\t\tawait useSharedTreeSummaryv0_0_2();\n\t\ttestObjectProvider.logger.registerExpectedEvent(\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' },\n\t\t\t{ eventName: 'fluid:telemetry:Batching:LengthTooBig' }\n\t\t);\n\n\t\t// Add enough edits for a chunk and a half\n\t\tawait addNewEditChunks(1, 50);\n\n\t\t// Connect another client\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t});\n\n\t\tlet unexpectedHistoryChunk = false;\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {\n\t\t\tunexpectedHistoryChunk = true;\n\t\t});\n\n\t\tsharedTree2.loadSummary(sharedTree.saveSummary());\n\n\t\t// Finish off the incomplete chunk\n\t\tawait addNewEditChunks();\n\n\t\texpect(unexpectedHistoryChunk).to.be.false;\n\t});\n\n\tit('does not upload blobs larger than 4MB', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent({\n\t\t\teventName: 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure',\n\t\t});\n\t\tconst numberOfEdits = editsPerChunk;\n\t\tconst fourMegas = 2 ** 22;\n\t\t// Without the 1.1, we would generate 100 edits of size roughly 40kb here, but not all of them end up in the first edit chunk\n\t\t// due to some setup edits.\n\t\t// So we'd barely land within the 4MB limit. Bumping each payload size by 10% is enough to account for this.\n\t\tconst bigPayload = 'a'.repeat(Math.ceil((1.1 * fourMegas) / numberOfEdits));\n\t\tconst fakeSummary = createCatchUpSummary(numberOfEdits, () => bigPayload);\n\t\tsharedTree.loadSummary(fakeSummary);\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(editChunksUploaded).to.equal(0);\n\t});\n});\n"]}
1
+ {"version":3,"file":"Virtualization.tests.js","sourceRoot":"","sources":["../../src/test/Virtualization.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 */\n\nimport { expect } from 'chai';\nimport { TestObjectProvider } from '@fluidframework/test-utils';\nimport { EditLog } from '../EditLog';\nimport { assertNotUndefined } from '../Common';\nimport { initialTree } from '../InitialTree';\nimport { SharedTree } from '../SharedTree';\nimport {\n\tChangeInternal,\n\tEdit,\n\tPayload,\n\treservedIdCount,\n\tFluidEditHandle,\n\tSharedTreeSummary,\n\tWriteFormat,\n\teditsPerChunk,\n} from '../persisted-types';\nimport { SharedTreeDiagnosticEvent } from '../EventTypes';\nimport { IdCompressor } from '../id-compressor';\nimport { createSessionId } from '../id-compressor/NumericUuid';\nimport { SharedTreeEncoder_0_1_1 } from '../SharedTreeEncoder';\nimport { CachingLogViewer } from '../LogViewer';\nimport { RevisionView } from '../RevisionView';\nimport { MutableStringInterner } from '../StringInterner';\nimport {\n\tapplyNoop,\n\tcreateStableEdits,\n\tmakeNodeIdContext,\n\tsetUpLocalServerTestSharedTree,\n} from './utilities/TestUtilities';\nimport { SimpleTestTree } from './utilities/TestNode';\n\ndescribe('SharedTree history virtualization', () => {\n\tlet sharedTree: SharedTree;\n\tlet testObjectProvider: TestObjectProvider;\n\tlet editChunksUploaded = 0;\n\tconst editCount = 250;\n\tconst expectedFullChunkCount = Math.floor(editCount / editsPerChunk);\n\n\t// Create a summary used to test catchup blobbing\n\tfunction createCatchUpSummary(numberOfEdits: number, payload?: (i: number) => Payload): SharedTreeSummary {\n\t\tconst idCompressor = new IdCompressor(createSessionId(), reservedIdCount);\n\t\tconst context = makeNodeIdContext(idCompressor);\n\t\tconst edits = createStableEdits(numberOfEdits, context, payload);\n\t\tidCompressor.finalizeCreationRange(idCompressor.takeNextCreationRange());\n\t\tconst editLog = new EditLog<ChangeInternal>();\n\t\tfor (let i = 0; i < edits.length; i++) {\n\t\t\teditLog.addSequencedEdit(edits[i], { sequenceNumber: i + 1, referenceSequenceNumber: i });\n\t\t}\n\t\tconst logViewer = new CachingLogViewer(editLog, RevisionView.fromTree(initialTree, context, true));\n\n\t\tconst internedStrings = [\n\t\t\tSimpleTestTree.definition,\n\t\t\tSimpleTestTree.traitLabel,\n\t\t\tSimpleTestTree.leftTraitLabel,\n\t\t\tSimpleTestTree.rightTraitLabel,\n\t\t];\n\t\tconst interner = new MutableStringInterner(internedStrings);\n\t\tconst encoder = new SharedTreeEncoder_0_1_1(true);\n\t\treturn encoder.encodeSummary(\n\t\t\teditLog,\n\t\t\tlogViewer.getRevisionViewInSession(Number.POSITIVE_INFINITY),\n\t\t\tcontext,\n\t\t\tcontext,\n\t\t\tinterner,\n\t\t\tidCompressor.serialize(false)\n\t\t);\n\t}\n\n\tbeforeEach(async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.EditChunkUploaded, () => {\n\t\t\teditChunksUploaded++;\n\t\t});\n\t});\n\n\tafterEach(() => {\n\t\teditChunksUploaded = 0;\n\t});\n\n\t// Replace sharedTree with one that writes summary format 0.0.2\n\tconst useSharedTreeSummaryv0_0_2 = async () => {\n\t\tconst testingComponents = await setUpLocalServerTestSharedTree({\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t});\n\t\tsharedTree = testingComponents.tree;\n\t\ttestObjectProvider = testingComponents.testObjectProvider;\n\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.EditChunkUploaded, () => {\n\t\t\teditChunksUploaded++;\n\t\t});\n\t};\n\n\t// Adds edits to sharedTree1 to make up the specified number of chunks.\n\tconst addNewEditChunks = async (numberOfChunks = 1, additionalEdits = 0) => {\n\t\tconst expectedEdits: Edit<unknown>[] = [];\n\n\t\t// Add some edits to create a chunk with.\n\t\twhile (expectedEdits.length < (sharedTree.edits as EditLog).editsPerChunk * numberOfChunks + additionalEdits) {\n\t\t\texpectedEdits.push(applyNoop(sharedTree));\n\t\t}\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\t// Wait for the ops to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\treturn expectedEdits;\n\t};\n\n\tit('can upload edit chunks and load chunks from handles', async () => {\n\t\tconst expectedEdits: Edit<unknown>[] = await addNewEditChunks();\n\n\t\tconst summary = sharedTree.saveSummary() as SharedTreeSummary;\n\n\t\tconst { editHistory } = summary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(1);\n\t\texpect(typeof (editChunks[0].chunk as FluidEditHandle).get).to.equal('function');\n\n\t\t// Load a second tree using the summary\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Ensure chunked edit can be retrieved\n\t\texpect((await sharedTree2.edits.getEditAtIndex(2)).id).to.equal(expectedEdits[2].id);\n\t});\n\n\tit('can upload catchup blobs', async () => {\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for the op to to be submitted and processed across the containers.\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\tsharedTree.loadSummary(createCatchUpSummary(250));\n\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(expectedFullChunkCount);\n\n\t\tconst { editHistory } = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(expectedFullChunkCount + 1);\n\t\texpect(typeof (editChunks[0].chunk as FluidEditHandle).get).to.equal('function');\n\t});\n\n\tit('only uploads catchup blobs from one client', async () => {\n\t\t// Create more connected trees\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tlet catchUpBlobsUploaded = 0;\n\t\tsharedTree.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\t\tsharedTree3.on(SharedTreeDiagnosticEvent.CatchUpBlobUploaded, () => {\n\t\t\tcatchUpBlobsUploaded++;\n\t\t});\n\n\t\t// Wait for processing again in case there are more no ops\n\t\tawait testObjectProvider.ensureSynchronized();\n\n\t\t// Try to load summaries on all the trees\n\t\tconst summary = createCatchUpSummary(250);\n\t\tsharedTree.loadSummary(summary);\n\t\tsharedTree2.loadSummary(summary);\n\t\tsharedTree3.loadSummary(summary);\n\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(catchUpBlobsUploaded).to.equal(expectedFullChunkCount);\n\n\t\t// Make sure the trees are still the same\n\t\texpect(sharedTree.equals(sharedTree2)).to.be.true;\n\t\texpect(sharedTree.equals(sharedTree3)).to.be.true;\n\t});\n\n\tit(\"doesn't upload incomplete chunks\", async () => {\n\t\tawait addNewEditChunks(0, 50);\n\t\texpect(editChunksUploaded).to.equal(0);\n\t});\n\n\tit('can upload full chunks with incomplete chunks in the edit log', async () => {\n\t\tawait addNewEditChunks(1, 50);\n\t\texpect(editChunksUploaded).to.equal(1);\n\t});\n\n\tit('correctly saves handles and their corresponding starting revisions to the summary', async () => {\n\t\tawait addNewEditChunks(4);\n\n\t\tconst { editHistory } = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst { editChunks } = assertNotUndefined(editHistory);\n\t\texpect(editChunks.length).to.equal(4);\n\n\t\t// Make sure each starting revision is correct and each chunk in the summary is a handle\n\t\teditChunks.forEach(({ startRevision, chunk }, index) => {\n\t\t\texpect(startRevision).to.equal(index * (sharedTree.edits as EditLog).editsPerChunk);\n\t\t\texpect(typeof (chunk as FluidEditHandle).get).to.equal('function');\n\t\t});\n\t});\n\n\tit('sends handle ops to connected clients when chunks are uploaded', async () => {\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\t\tconst { tree: sharedTree3 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\t// All shared trees should have no edits or chunks\n\t\texpect((sharedTree.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\t\texpect((sharedTree2.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\t\texpect((sharedTree3.saveSummary() as SharedTreeSummary).editHistory?.editChunks.length).to.equal(0);\n\n\t\tawait addNewEditChunks();\n\n\t\t// All shared trees should have the new handle\n\t\tconst sharedTreeSummary = sharedTree.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTree2Summary = sharedTree2.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTree3Summary = sharedTree3.saveSummary() as SharedTreeSummary;\n\t\tconst sharedTreeChunk = assertNotUndefined(sharedTreeSummary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree2Chunk = assertNotUndefined(sharedTree2Summary.editHistory).editChunks[0].chunk;\n\t\tconst sharedTree3Chunk = assertNotUndefined(sharedTree3Summary.editHistory).editChunks[0].chunk;\n\n\t\t// Make sure the chunk of the first shared tree is a handle\n\t\texpect(typeof (sharedTreeChunk as FluidEditHandle).get).to.equal('function');\n\n\t\tconst sharedTreeHandleRoute = (sharedTreeChunk as any).absolutePath;\n\t\tconst sharedTree2HandleRoute = (sharedTree2Chunk as any).absolutePath;\n\t\tconst sharedTree3HandleRoute = (sharedTree3Chunk as any).absolutePath;\n\n\t\t// Make sure the handle route of the first shared tree is a string\n\t\texpect(typeof sharedTreeHandleRoute).to.equal('string');\n\n\t\texpect(sharedTreeHandleRoute).to.equal(sharedTree2HandleRoute);\n\t\texpect(sharedTree2HandleRoute).to.equal(sharedTree3HandleRoute);\n\t});\n\n\tit('does not cause misaligned chunks', async () => {\n\t\tawait addNewEditChunks(1, 50);\n\n\t\tconst summary = sharedTree.saveSummary();\n\n\t\t// Connect another client\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_1_1,\n\t\t});\n\n\t\tlet unexpectedHistoryChunk = false;\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {\n\t\t\tunexpectedHistoryChunk = true;\n\t\t});\n\n\t\tsharedTree2.loadSummary(summary);\n\n\t\t// Finish off the incomplete chunk\n\t\tawait addNewEditChunks();\n\n\t\texpect(unexpectedHistoryChunk).to.be.false;\n\t});\n\n\tit('does not cause misaligned chunks for format version 0.0.2', async () => {\n\t\tawait useSharedTreeSummaryv0_0_2();\n\n\t\t// Add enough edits for a chunk and a half\n\t\tawait addNewEditChunks(1, 50);\n\n\t\t// Connect another client\n\t\tconst { tree: sharedTree2 } = await setUpLocalServerTestSharedTree({\n\t\t\ttestObjectProvider,\n\t\t\tsummarizeHistory: true,\n\t\t\twriteFormat: WriteFormat.v0_0_2,\n\t\t});\n\n\t\tlet unexpectedHistoryChunk = false;\n\t\tsharedTree2.on(SharedTreeDiagnosticEvent.UnexpectedHistoryChunk, () => {\n\t\t\tunexpectedHistoryChunk = true;\n\t\t});\n\n\t\tsharedTree2.loadSummary(sharedTree.saveSummary());\n\n\t\t// Finish off the incomplete chunk\n\t\tawait addNewEditChunks();\n\n\t\texpect(unexpectedHistoryChunk).to.be.false;\n\t});\n\n\tit('does not upload blobs larger than 4MB', async () => {\n\t\ttestObjectProvider.logger.registerExpectedEvent({\n\t\t\teventName: 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure',\n\t\t});\n\t\tconst numberOfEdits = editsPerChunk;\n\t\tconst fourMegas = 2 ** 22;\n\t\t// Without the 1.1, we would generate 100 edits of size roughly 40kb here, but not all of them end up in the first edit chunk\n\t\t// due to some setup edits.\n\t\t// So we'd barely land within the 4MB limit. Bumping each payload size by 10% is enough to account for this.\n\t\tconst bigPayload = 'a'.repeat(Math.ceil((1.1 * fourMegas) / numberOfEdits));\n\t\tconst fakeSummary = createCatchUpSummary(numberOfEdits, () => bigPayload);\n\t\tsharedTree.loadSummary(fakeSummary);\n\t\t// `ensureSynchronized` does not guarantee blob upload\n\t\tawait new Promise((resolve) => setImmediate(resolve));\n\t\tawait testObjectProvider.ensureSynchronized();\n\t\texpect(editChunksUploaded).to.equal(0);\n\t});\n});\n"]}
@@ -4,9 +4,9 @@
4
4
  */
5
5
  import { Generator, SaveInfo, BaseFuzzTestState } from '@fluid-internal/stochastic-test-utils';
6
6
  import { ClosedMap } from '../../Common';
7
- import { IdCompressor, IdRangeDescriptor } from '../../id-compressor/IdCompressor';
7
+ import { IdCompressor } from '../../id-compressor/IdCompressor';
8
8
  import { NumericUuid } from '../../id-compressor/NumericUuid';
9
- import { SessionId, StableId, SessionSpaceCompressedId, AttributionId } from '../../Identifiers';
9
+ import { SessionId, StableId, SessionSpaceCompressedId, AttributionId, OpSpaceCompressedId } from '../../Identifiers';
10
10
  import type { IdCreationRange, SerializedIdCompressorWithOngoingSession, SerializedIdCompressorWithNoSession } from '../../id-compressor';
11
11
  /** Identifies a compressor in a network */
12
12
  export declare enum Client {
@@ -98,12 +98,18 @@ export declare class IdCompressorTestNetwork {
98
98
  * should only be used if the network will not be used again.
99
99
  */
100
100
  getCompressorUnsafe(client: Client): IdCompressor;
101
+ /**
102
+ * Returns a mutable handle to a compressor in the network. Use of mutation methods will break the network invariants and
103
+ * should only be used if the network will not be used again. Additionally, the returned compressor will be invalidated/unusable
104
+ * if any network operations cause it to be regenerated (serialization/deserialization, etc.).
105
+ */
106
+ getCompressorUnsafeNoProxy(client: Client): IdCompressor;
101
107
  /**
102
108
  * Returns data for all IDs created and received by this client, including ack's of their own (i.e. their own IDs will appear twice)
103
109
  */
104
110
  getIdLog(client: Client): readonly TestIdData[];
105
111
  /**
106
- * Returns data for all IDs received by this client, including ack's of their own (i.e. their own IDs will appear twice)
112
+ * Returns data for all IDs received by this client, including ack's of their own.
107
113
  */
108
114
  getSequencedIdLog(client: Client): readonly TestIdData[];
109
115
  /**
@@ -119,10 +125,7 @@ export declare class IdCompressorTestNetwork {
119
125
  * Allocates a new range of local IDs and enqueues them for future delivery via a `testIdDelivery` action.
120
126
  * Calls to this method determine the total order of delivery, regardless of when `deliverOperations` is called.
121
127
  */
122
- allocateAndSendIds(client: Client, numIds: number): {
123
- range: IdRangeDescriptor<SessionSpaceCompressedId>;
124
- sessionId: SessionId;
125
- };
128
+ allocateAndSendIds(client: Client, numIds: number): OpSpaceCompressedId[];
126
129
  /**
127
130
  * Allocates a new range of local IDs and enqueues them for future delivery via a `testIdDelivery` action.
128
131
  * Calls to this method determine the total order of delivery, regardless of when `deliverOperations` is called.
@@ -222,5 +225,9 @@ export declare function integerToStableId(num: number | bigint): StableId;
222
225
  * Pads the strings to a length of 32 with zeroes.
223
226
  */
224
227
  export declare function padToUuidLength(str: string): string;
228
+ /**
229
+ * Helper to generate a fixed number of IDs.
230
+ */
231
+ export declare function generateCompressedIds(compressor: IdCompressor, count: number): SessionSpaceCompressedId[];
225
232
  export {};
226
233
  //# sourceMappingURL=IdCompressorTestUtilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IdCompressorTestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/IdCompressorTestUtilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IdCompressorTestUtilities.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/IdCompressorTestUtilities.ts"],"names":[],"mappings":"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"}
@@ -114,6 +114,14 @@ export class IdCompressorTestNetwork {
114
114
  getCompressorUnsafe(client) {
115
115
  return this.getCompressor(client);
116
116
  }
117
+ /**
118
+ * Returns a mutable handle to a compressor in the network. Use of mutation methods will break the network invariants and
119
+ * should only be used if the network will not be used again. Additionally, the returned compressor will be invalidated/unusable
120
+ * if any network operations cause it to be regenerated (serialization/deserialization, etc.).
121
+ */
122
+ getCompressorUnsafeNoProxy(client) {
123
+ return this.compressors.get(client);
124
+ }
117
125
  /**
118
126
  * Returns data for all IDs created and received by this client, including ack's of their own (i.e. their own IDs will appear twice)
119
127
  */
@@ -121,7 +129,7 @@ export class IdCompressorTestNetwork {
121
129
  return this.idLogs.get(client);
122
130
  }
123
131
  /**
124
- * Returns data for all IDs received by this client, including ack's of their own (i.e. their own IDs will appear twice)
132
+ * Returns data for all IDs received by this client, including ack's of their own.
125
133
  */
126
134
  getSequencedIdLog(client) {
127
135
  return this.sequencedIdLogs.get(client);
@@ -162,28 +170,32 @@ export class IdCompressorTestNetwork {
162
170
  assert(numIds > 0, 'Must allocate a non-zero number of IDs');
163
171
  const compressor = this.compressors.get(client);
164
172
  let nextIdIndex = 0;
173
+ const opSpaceIds = [];
165
174
  for (const [overrideIndex, uuid] of Object.entries(overrides)
166
175
  .map(([id, uuid]) => [Number.parseInt(id, 10), uuid])
167
176
  .sort(([a], [b]) => a - b)) {
168
177
  while (nextIdIndex < overrideIndex) {
169
- this.addNewId(client, compressor.generateCompressedId(), undefined, client, false);
178
+ const newId = compressor.generateCompressedId();
179
+ opSpaceIds.push(compressor.normalizeToOpSpace(newId));
180
+ this.addNewId(client, newId, undefined, client, false);
170
181
  nextIdIndex += 1;
171
182
  }
172
- this.addNewId(client, compressor.generateCompressedId(uuid), uuid, client, false);
183
+ const newOverrideId = compressor.generateCompressedId(uuid);
184
+ opSpaceIds.push(compressor.normalizeToOpSpace(newOverrideId));
185
+ this.addNewId(client, newOverrideId, uuid, client, false);
173
186
  nextIdIndex += 1;
174
187
  }
175
188
  const numTrailingIds = numIds - nextIdIndex;
176
- let range;
177
189
  if (numTrailingIds > 0) {
178
- range = compressor.generateCompressedIdRange(numTrailingIds);
179
- const ids = compressor.getIdsFromRange(range, compressor.localSessionId);
190
+ const sessionSpaceIds = generateCompressedIds(compressor, numTrailingIds);
180
191
  for (let i = 0; i < numTrailingIds; i++) {
181
- this.addNewId(client, ids.get(i), undefined, client, false);
192
+ this.addNewId(client, sessionSpaceIds[i], undefined, client, false);
182
193
  }
194
+ sessionSpaceIds.forEach((id) => opSpaceIds.push(compressor.normalizeToOpSpace(id)));
183
195
  }
184
196
  const creationRange = compressor.takeNextCreationRange();
185
- this.serverOperations.push([creationRange, client]);
186
- return nextIdIndex === 0 ? { range: range !== null && range !== void 0 ? range : fail(), sessionId: compressor.localSessionId } : creationRange;
197
+ this.serverOperations.push([creationRange, opSpaceIds, client]);
198
+ return nextIdIndex === 0 ? opSpaceIds : creationRange;
187
199
  }
188
200
  /**
189
201
  * Delivers all undelivered ID ranges and cluster capacity changes from the server to the target clients.
@@ -197,13 +209,13 @@ export class IdCompressorTestNetwork {
197
209
  compressorTo.clusterCapacity = operation;
198
210
  }
199
211
  else {
200
- const [range, clientFrom] = operation;
212
+ const [range, opSpaceIds, clientFrom] = operation;
201
213
  compressorTo.finalizeCreationRange(range);
202
214
  const ids = getIds(range);
203
215
  if (ids !== undefined) {
204
216
  let overrideIndex = 0;
205
217
  const overrides = ids.overrides;
206
- for (let id = ids.first; id >= ids.last; id--) {
218
+ for (const id of opSpaceIds) {
207
219
  let override;
208
220
  if (overrides !== undefined &&
209
221
  overrideIndex < overrides.length &&
@@ -273,9 +285,6 @@ export class IdCompressorTestNetwork {
273
285
  for (const [current, next] of getLogIndices(i)) {
274
286
  const [compressorA, idDataA] = current;
275
287
  const sessionSpaceIdA = idDataA.id;
276
- if (isLocalId(sessionSpaceIdA)) {
277
- localCount += 1;
278
- }
279
288
  const idIndex = getOrCreate(idIndicesAggregator, idDataA.originatingClient, () => 0);
280
289
  originatingClient !== null && originatingClient !== void 0 ? originatingClient : (originatingClient = idDataA.originatingClient);
281
290
  assert(idDataA.originatingClient === originatingClient, 'Test infra gave wrong originating client to TestIdData');
@@ -304,8 +313,9 @@ export class IdCompressorTestNetwork {
304
313
  const opSpaceIdA = compressorA.normalizeToOpSpace(sessionSpaceIdA);
305
314
  if (isLocalId(opSpaceIdA)) {
306
315
  expect.fail('IDs should have been finalized.');
316
+ fail();
307
317
  }
308
- // TODO: This cast can be removed on typescript 4.6
318
+ expect(compressorA.normalizeToSessionSpace(opSpaceIdA, compressorA.localSessionId)).equals(sessionSpaceIdA);
309
319
  finalIds.add(opSpaceIdA);
310
320
  const uuidAOpSpace = compressorA.decompress(opSpaceIdA);
311
321
  expect(uuidASessionSpace).to.equal(uuidAOpSpace);
@@ -328,12 +338,12 @@ export class IdCompressorTestNetwork {
328
338
  }
329
339
  rowCount += 1;
330
340
  }
331
- // A local count > 1 indicates that this ID was unified, as more than one client has a local ID for it
332
- // in their session space.
341
+ // A local count === 0 indicates the ID was created as an eager final, and thus cannot have had an
342
+ // override to unify.
333
343
  if (rowCount === this.sequencedIdLogs.size && localCount <= 1) {
334
- expect(localCount).to.equal(1);
344
+ expect(localCount).to.lessThanOrEqual(1);
335
345
  for (const [[compressor, { id, originatingClient }]] of getLogIndices(i)) {
336
- expect(compressor.attributeId(id)).to.equal(originatingClient);
346
+ expect(compressor.attributeId(id)).to.equal(attributionIds.get(originatingClient));
337
347
  }
338
348
  }
339
349
  expect(uuids.size).to.equal(finalIds.size);
@@ -420,7 +430,7 @@ export function makeOpGenerator(options) {
420
430
  function allocateIdsGenerator({ activeClients, clusterSize, random }) {
421
431
  const client = random.pick(activeClients);
422
432
  const maxIdsPerUsage = clusterSize * 2;
423
- const numIds = Math.floor(random.real(0, 1) ** 2 * maxIdsPerUsage) + 1;
433
+ const numIds = Math.floor(random.real(0, 1) ** 3 * maxIdsPerUsage) + 1;
424
434
  const overrides = {};
425
435
  if (includeOverrides && random.bool(1 / 4)) {
426
436
  for (let j = 0; j < numIds; j++) {
@@ -539,4 +549,14 @@ export function padToUuidLength(str) {
539
549
  function padToLength(str, char, length) {
540
550
  return char.repeat(length - str.length) + str;
541
551
  }
552
+ /**
553
+ * Helper to generate a fixed number of IDs.
554
+ */
555
+ export function generateCompressedIds(compressor, count) {
556
+ const ids = [];
557
+ for (let i = 0; i < count; i++) {
558
+ ids.push(compressor.generateCompressedId());
559
+ }
560
+ return ids;
561
+ }
542
562
  //# sourceMappingURL=IdCompressorTestUtilities.js.map