@fluid-experimental/tree 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/Common.d.ts +12 -6
  2. package/dist/Common.d.ts.map +1 -1
  3. package/dist/Common.js +14 -8
  4. package/dist/Common.js.map +1 -1
  5. package/dist/SharedTree.d.ts +12 -1
  6. package/dist/SharedTree.d.ts.map +1 -1
  7. package/dist/SharedTree.js +61 -11
  8. package/dist/SharedTree.js.map +1 -1
  9. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  10. package/dist/id-compressor/IdCompressor.js +7 -11
  11. package/dist/id-compressor/IdCompressor.js.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/lib/Common.d.ts +12 -6
  16. package/lib/Common.d.ts.map +1 -1
  17. package/lib/Common.js +14 -8
  18. package/lib/Common.js.map +1 -1
  19. package/lib/SharedTree.d.ts +12 -1
  20. package/lib/SharedTree.d.ts.map +1 -1
  21. package/lib/SharedTree.js +61 -11
  22. package/lib/SharedTree.js.map +1 -1
  23. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  24. package/lib/id-compressor/IdCompressor.js +7 -11
  25. package/lib/id-compressor/IdCompressor.js.map +1 -1
  26. package/lib/index.d.ts +1 -1
  27. package/lib/index.d.ts.map +1 -1
  28. package/lib/index.js.map +1 -1
  29. package/lib/test/IdCompressor.tests.js +2 -1
  30. package/lib/test/IdCompressor.tests.js.map +1 -1
  31. package/lib/test/fuzz/Generators.d.ts.map +1 -1
  32. package/lib/test/fuzz/Generators.js +20 -10
  33. package/lib/test/fuzz/Generators.js.map +1 -1
  34. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
  35. package/lib/test/fuzz/SharedTreeFuzzTests.js +55 -20
  36. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
  37. package/lib/test/fuzz/Types.d.ts +14 -4
  38. package/lib/test/fuzz/Types.d.ts.map +1 -1
  39. package/lib/test/fuzz/Types.js.map +1 -1
  40. package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -1
  41. package/lib/test/utilities/PendingLocalStateTests.js +199 -56
  42. package/lib/test/utilities/PendingLocalStateTests.js.map +1 -1
  43. package/lib/test/utilities/TestUtilities.d.ts +12 -1
  44. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  45. package/lib/test/utilities/TestUtilities.js +12 -2
  46. package/lib/test/utilities/TestUtilities.js.map +1 -1
  47. package/package.json +17 -17
  48. package/src/Common.ts +14 -8
  49. package/src/SharedTree.ts +90 -12
  50. package/src/id-compressor/IdCompressor.ts +9 -11
  51. package/src/index.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAEN,cAAc,EAKd,MAAM,uCAAuC,CAAC;AAO/C,OAAO,EAMN,aAAa,EAGb,SAAS,EACT,yBAAyB,EAGzB,MAAM,SAAS,CAAC;AAkWjB,wBAAgB,eAAe,CAAC,YAAY,EAAE,yBAAyB,GAAG,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CA2BjH"}
1
+ {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAEN,cAAc,EAKd,MAAM,uCAAuC,CAAC;AAO/C,OAAO,EAMN,aAAa,EAGb,SAAS,EACT,yBAAyB,EAGzB,MAAM,SAAS,CAAC;AAgXjB,wBAAgB,eAAe,CAAC,YAAY,EAAE,yBAAyB,GAAG,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CA4BjH"}
@@ -60,7 +60,7 @@ const defaultEditConfig = {
60
60
  setPayloadWeight: 1,
61
61
  traitLabelPoolSize: 20,
62
62
  };
63
- const makeEditGenerator = (passedConfig) => {
63
+ const makeEditGenerator = (passedConfig, passedJoinConfig, stashOps = false) => {
64
64
  const config = Object.assign(Object.assign({}, defaultEditConfig), passedConfig);
65
65
  const insertConfig = Object.assign(Object.assign({}, defaultInsertConfig), config.insertConfig);
66
66
  const poolRand = makeRandom(0);
@@ -215,10 +215,8 @@ const makeEditGenerator = (passedConfig) => {
215
215
  var _a, _b, _c, _d;
216
216
  // An ancestor cannot be moved to be a sibling of its descendant.
217
217
  const forbiddenDescendantId = (_c = (_b = (_a = destination.referenceTrait) === null || _a === void 0 ? void 0 : _a.parent) !== null && _b !== void 0 ? _b : destination.referenceSibling) !== null && _c !== void 0 ? _c : fail('Invalid place');
218
- const unadjustedStartIndex = view.findIndexWithinTrait(start);
219
- const unadjustedEndIndex = view.findIndexWithinTrait(end);
220
- const startIndex = unadjustedStartIndex + (start.side === Side.After ? 1 : 0);
221
- const endIndex = unadjustedEndIndex + (end.side === Side.After ? 1 : 0);
218
+ const startIndex = view.findIndexWithinTrait(start);
219
+ const endIndex = view.findIndexWithinTrait(end);
222
220
  const idsInSource = new Set(view.getTrait(start.trait).slice(startIndex, endIndex));
223
221
  for (let current = forbiddenDescendantId; current !== undefined; current = (_d = view.tryGetParentViewNode(current)) === null || _d === void 0 ? void 0 : _d.identifier) {
224
222
  if (idsInSource.has(current)) {
@@ -282,16 +280,27 @@ const makeEditGenerator = (passedConfig) => {
282
280
  if (contents === done) {
283
281
  return done;
284
282
  }
283
+ if (stashOps) {
284
+ const joinConfig = Object.assign(Object.assign({}, defaultJoinConfig), passedJoinConfig);
285
+ return {
286
+ type: 'stash',
287
+ contents,
288
+ index,
289
+ summarizeHistory: random.pick(joinConfig.summarizeHistory),
290
+ writeFormat: random.pick(joinConfig.writeFormat),
291
+ };
292
+ }
285
293
  return { type: 'edit', contents, index };
286
294
  };
287
295
  };
288
296
  const defaultOpConfig = {
289
297
  editConfig: defaultEditConfig,
290
298
  joinConfig: defaultJoinConfig,
291
- editWeight: 10,
292
- joinWeight: 1,
293
- leaveWeight: 1,
294
- synchronizeWeight: 1,
299
+ editWeight: 100,
300
+ joinWeight: 10,
301
+ leaveWeight: 10,
302
+ stashWeight: 1,
303
+ synchronizeWeight: 10,
295
304
  };
296
305
  export function makeOpGenerator(passedConfig) {
297
306
  const config = Object.assign(Object.assign({}, defaultOpConfig), passedConfig);
@@ -301,13 +310,14 @@ export function makeOpGenerator(passedConfig) {
301
310
  const atLeastOneClient = collaboratorsMatches((count) => count > 0);
302
311
  const atLeastOneActiveClient = ({ activeCollaborators }) => activeCollaborators.length > 0;
303
312
  const opWeights = [
304
- [makeEditGenerator(config.editConfig), config.editWeight, atLeastOneActiveClient],
313
+ [makeEditGenerator(config.editConfig, config.joinConfig), config.editWeight, atLeastOneActiveClient],
305
314
  [
306
315
  makeJoinGenerator(config.joinConfig),
307
316
  config.joinWeight,
308
317
  collaboratorsMatches((count) => count < maximumCollaborators),
309
318
  ],
310
319
  [leaveGenerator, config.leaveWeight, atLeastOneClient],
320
+ [makeEditGenerator(config.editConfig, config.joinConfig, true), config.stashWeight, atLeastOneActiveClient],
311
321
  [{ type: 'synchronize' }, config.synchronizeWeight, atLeastOneClient],
312
322
  ];
313
323
  return createWeightedAsyncGenerator(opWeights);
@@ -1 +1 @@
1
- {"version":3,"file":"Generators.js","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.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 Random from 'random-js';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport {\n\tAcceptanceCondition,\n\tAsyncGenerator,\n\tAsyncWeights,\n\tcreateWeightedAsyncGenerator,\n\tdone,\n\tmakeRandom,\n} from '@fluid-internal/stochastic-test-utils';\nimport { Side, TraitMap, WriteFormat } from '../../persisted-types';\nimport { BuildNode, ChangeType, StablePlace, StableRange } from '../../ChangeTypes';\nimport { TraitLocation, TreeView, TreeViewRange } from '../../TreeView';\nimport { Definition, DetachedSequenceId, NodeId, TraitLabel } from '../../Identifiers';\nimport { fail } from '../../Common';\nimport { rangeFromStableRange } from '../../TreeViewUtilities';\nimport {\n\tEditGenerationConfig,\n\tFuzzChange,\n\tFuzzDelete,\n\tFuzzInsert,\n\tFuzzMove,\n\tFuzzTestState,\n\tInsertGenerationConfig,\n\tJoinGenerationConfig,\n\tOperation,\n\tOperationGenerationConfig,\n\tTreeContext,\n\tTreeLeave,\n} from './Types';\n\nconst defaultJoinConfig: Required<JoinGenerationConfig> = {\n\tmaximumActiveCollaborators: 10,\n\tmaximumPassiveCollaborators: 10,\n\twriteFormat: [WriteFormat.v0_0_2, WriteFormat.v0_1_1],\n\tsummarizeHistory: [false],\n};\n\nfunction makeJoinGenerator(passedConfig: JoinGenerationConfig): AsyncGenerator<Operation, FuzzTestState> {\n\tconst config = { ...defaultJoinConfig, ...passedConfig };\n\treturn async ({ random, activeCollaborators, passiveCollaborators }) => {\n\t\tconst activeAllowed = activeCollaborators.length < config.maximumActiveCollaborators;\n\t\tconst passiveAllowed = passiveCollaborators.length < config.maximumPassiveCollaborators;\n\t\tconst isObserver =\n\t\t\tactiveAllowed && passiveAllowed\n\t\t\t\t? random.bool()\n\t\t\t\t: activeAllowed\n\t\t\t\t? false\n\t\t\t\t: passiveAllowed\n\t\t\t\t? true\n\t\t\t\t: fail(\n\t\t\t\t\t\t'Cannot generate join op when both active and passive collaborators are at the configured limit.'\n\t\t\t\t );\n\t\treturn {\n\t\t\ttype: 'join',\n\t\t\tsummarizeHistory: random.pick(config.summarizeHistory),\n\t\t\twriteFormat: random.pick(config.writeFormat),\n\t\t\tisObserver,\n\t\t};\n\t};\n}\n\nasync function leaveGenerator({\n\trandom,\n\tactiveCollaborators,\n\tpassiveCollaborators,\n}: FuzzTestState): Promise<TreeLeave> {\n\tconst canUsePassive = passiveCollaborators.length > 0;\n\tconst canUseActive = activeCollaborators.length > 0;\n\tconst isObserver =\n\t\tcanUsePassive && canUseActive\n\t\t\t? random.bool()\n\t\t\t: canUsePassive\n\t\t\t? true\n\t\t\t: canUseActive\n\t\t\t? false\n\t\t\t: fail('Cannot generate a leave op when there are no clients.');\n\tconst index = random.integer(0, (isObserver ? passiveCollaborators : activeCollaborators).length - 1);\n\treturn { type: 'leave', isObserver, index };\n}\n\nconst defaultInsertConfig: Required<InsertGenerationConfig> = {\n\tdefinitionPoolSize: 20,\n\tmaxTreeSequenceSize: 3,\n};\n\nconst defaultEditConfig: Required<EditGenerationConfig> = {\n\tmaxTreeSize: Number.POSITIVE_INFINITY,\n\tinsertWeight: 3,\n\tinsertConfig: defaultInsertConfig,\n\tdeleteWeight: 1,\n\tmoveWeight: 1,\n\tsetPayloadWeight: 1,\n\ttraitLabelPoolSize: 20,\n};\n\nconst makeEditGenerator = (passedConfig: EditGenerationConfig): AsyncGenerator<Operation, FuzzTestState> => {\n\tconst config = { ...defaultEditConfig, ...passedConfig };\n\tconst insertConfig = { ...defaultInsertConfig, ...config.insertConfig };\n\tconst poolRand = makeRandom(0);\n\tconst traitLabelPool = Array.from({ length: config.traitLabelPoolSize }, () => poolRand.uuid4() as TraitLabel);\n\tconst traitLabelGenerator = ({ random }: FuzzTestState) => random.pick(traitLabelPool);\n\n\tconst definitionPool = Array.from(\n\t\t{ length: insertConfig.definitionPoolSize },\n\t\t() => poolRand.uuid4() as Definition\n\t);\n\tconst definitionGenerator = ({ random }: FuzzTestState) => random.pick(definitionPool);\n\ttype EditState = FuzzTestState & TreeContext;\n\n\tfunction traitGenerator(state: EditState): TraitLocation {\n\t\tconst { idList, random, view } = state;\n\t\tconst id = random.pick(idList);\n\t\treturn view.tryGetTraitLocation(id) ?? { parent: id, label: traitLabelGenerator(state) };\n\t}\n\n\tfunction placeGenerator(state: EditState): StablePlace {\n\t\tconst { idList, random, view } = state;\n\t\t// Note: this gives a 50% chance of adding to a new trait; we may want to tune this at some point\n\t\tif (random.bool()) {\n\t\t\tconst parent = random.pick(idList);\n\t\t\treturn StablePlace.atStartOf({ parent, label: traitLabelGenerator(state) });\n\t\t}\n\t\tconst traitLocation = traitGenerator(state);\n\t\tconst trait = view.getTrait(traitLocation);\n\t\tinterface Descriptor {\n\t\t\tindex: number;\n\t\t\tside: Side;\n\t\t}\n\t\t// For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.\n\t\t// index === trait.length is treated as either the start or end of the trait.\n\t\tconst makeDescriptor = (): Descriptor => ({\n\t\t\tindex: random.integer(0, trait.length),\n\t\t\tside: random.bool() ? Side.Before : Side.After,\n\t\t});\n\t\tconst descriptor = makeDescriptor();\n\n\t\tconst placeFromDescriptor = ({ index, side }: Descriptor): StablePlace =>\n\t\t\tindex === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };\n\t\treturn placeFromDescriptor(descriptor);\n\t}\n\n\tfunction rangeGenerator(state: EditState): StableRange {\n\t\tconst { random, view } = state;\n\t\tconst traitLocation = traitGenerator(state);\n\t\tconst trait = view.getTrait(traitLocation);\n\t\tinterface Descriptor {\n\t\t\tindex: number;\n\t\t\tside: Side;\n\t\t}\n\t\t// For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.\n\t\t// index === trait.length is treated as either the start or end of the trait.\n\t\tconst makeDescriptor = (): Descriptor => ({\n\t\t\tindex: random.integer(0, trait.length),\n\t\t\tside: random.bool() ? Side.Before : Side.After,\n\t\t});\n\t\tconst descriptor1 = makeDescriptor();\n\t\tlet descriptor2: Descriptor;\n\t\tdo {\n\t\t\tdescriptor2 = makeDescriptor();\n\t\t} while (descriptor1.index === descriptor2.index && descriptor1.side === descriptor2.side);\n\n\t\tconst sortedDescriptors = [descriptor1, descriptor2];\n\t\tsortedDescriptors.sort((a, b) => {\n\t\t\tif (a.index === b.index && a.side === b.side) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (a.index === trait.length) {\n\t\t\t\tif (a.side === Side.After) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (b.index === trait.length) {\n\t\t\t\tif (b.side === Side.After) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.index < b.index) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn a.side === Side.Before ? -1 : 1;\n\t\t});\n\t\tconst [startDescriptor, endDescriptor] = sortedDescriptors;\n\t\tconst placeFromDescriptor = ({ index, side }: Descriptor): StablePlace =>\n\t\t\tindex === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };\n\t\tconst start = placeFromDescriptor(startDescriptor);\n\t\tconst end = placeFromDescriptor(endDescriptor);\n\t\treturn StableRange.from(start).to(end);\n\t}\n\n\tfunction treeGenerator(state: EditState): BuildNode {\n\t\tconst { random, idGenerator } = state;\n\t\tconst treeType = random.pick(['leaf', 'stick', 'balanced']);\n\t\tconst makeNode = (traits?: TraitMap<BuildNode>): BuildNode => ({\n\t\t\tidentifier: idGenerator.generateNodeId(),\n\t\t\tdefinition: definitionGenerator(state),\n\t\t\ttraits: traits ?? {},\n\t\t});\n\t\tswitch (treeType) {\n\t\t\tcase 'leaf':\n\t\t\t\treturn makeNode();\n\t\t\tcase 'stick':\n\t\t\t\treturn makeNode({\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode({ [traitLabelGenerator(state)]: [makeNode()] })],\n\t\t\t\t});\n\t\t\tcase 'balanced':\n\t\t\t\treturn makeNode({\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode()],\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode()],\n\t\t\t\t});\n\t\t\tdefault:\n\t\t\t\tfail(`Unexpected treeType ${treeType}`);\n\t\t}\n\t}\n\n\tasync function insertGenerator(state: EditState): Promise<FuzzInsert> {\n\t\tconst { maxTreeSequenceSize } = insertConfig;\n\t\tconst id = 1 as DetachedSequenceId;\n\t\tconst { view } = state;\n\t\tconst isValidInsertPlace = (destination: StablePlace): boolean => {\n\t\t\t// Disallow insertion adjacent to the root node.\n\t\t\tif (destination.referenceSibling === view.root) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tlet destination: StablePlace;\n\t\tdo {\n\t\t\tdestination = placeGenerator(state);\n\t\t} while (!isValidInsertPlace(destination));\n\n\t\treturn {\n\t\t\tfuzzType: 'insert',\n\t\t\tbuild: {\n\t\t\t\ttype: ChangeType.Build,\n\t\t\t\tdestination: id,\n\t\t\t\tsource: Array.from({ length: state.random.integer(1, maxTreeSequenceSize) }, () =>\n\t\t\t\t\ttreeGenerator(state)\n\t\t\t\t),\n\t\t\t},\n\t\t\tinsert: {\n\t\t\t\ttype: ChangeType.Insert,\n\t\t\t\tdestination,\n\t\t\t\tsource: id,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function deleteGenerator(state: EditState): Promise<FuzzDelete> {\n\t\tconst { view } = state;\n\t\tconst isValidDeleteRange = (source: StableRange): boolean => {\n\t\t\t// Disallow deletion of the root node.\n\t\t\tif (source.start.referenceSibling === view.root || source.end.referenceSibling === view.root) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tlet source: StableRange;\n\t\tdo {\n\t\t\tsource = rangeGenerator(state);\n\t\t} while (!isValidDeleteRange(source));\n\n\t\treturn {\n\t\t\tfuzzType: 'delete',\n\t\t\ttype: ChangeType.Detach,\n\t\t\tsource,\n\t\t};\n\t}\n\n\tasync function moveGenerator(state: EditState): Promise<FuzzMove> {\n\t\tconst id = 1 as DetachedSequenceId;\n\t\tconst { view } = state;\n\n\t\tconst isValidMoveRange = ({ start, end }: TreeViewRange, destination: StablePlace): boolean => {\n\t\t\t// An ancestor cannot be moved to be a sibling of its descendant.\n\t\t\tconst forbiddenDescendantId =\n\t\t\t\tdestination.referenceTrait?.parent ?? destination.referenceSibling ?? fail('Invalid place');\n\n\t\t\tconst unadjustedStartIndex: number = view.findIndexWithinTrait(start);\n\t\t\tconst unadjustedEndIndex: number = view.findIndexWithinTrait(end);\n\t\t\tconst startIndex = unadjustedStartIndex + (start.side === Side.After ? 1 : 0);\n\t\t\tconst endIndex = unadjustedEndIndex + (end.side === Side.After ? 1 : 0);\n\n\t\t\tconst idsInSource = new Set(view.getTrait(start.trait).slice(startIndex, endIndex));\n\t\t\tfor (\n\t\t\t\tlet current: NodeId | undefined = forbiddenDescendantId;\n\t\t\t\tcurrent !== undefined;\n\t\t\t\tcurrent = view.tryGetParentViewNode(current)?.identifier\n\t\t\t) {\n\t\t\t\tif (idsInSource.has(current)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tlet source: StableRange;\n\t\tlet destination: StablePlace;\n\t\tdo {\n\t\t\tsource = rangeGenerator(state);\n\t\t\tdestination = placeGenerator(state);\n\t\t} while (!isValidMoveRange(rangeFromStableRange(view, source), destination));\n\n\t\treturn {\n\t\t\tfuzzType: 'move',\n\t\t\tdetach: {\n\t\t\t\ttype: ChangeType.Detach,\n\t\t\t\tdestination: id,\n\t\t\t\tsource,\n\t\t\t},\n\t\t\tinsert: {\n\t\t\t\ttype: ChangeType.Insert,\n\t\t\t\tdestination,\n\t\t\t\tsource: id,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function setPayloadGenerator({ dataStoreRuntime, idList, random, view }: EditState): Promise<FuzzChange> {\n\t\tconst nodeToModify = random.pick(idList);\n\t\tconst getPayloadContents = async (\n\t\t\trandom: Random\n\t\t): Promise<string | { blob: IFluidHandle<ArrayBufferLike> }> => {\n\t\t\tif (random.bool()) {\n\t\t\t\treturn random.string(4);\n\t\t\t}\n\t\t\tconst handle = await dataStoreRuntime.uploadBlob(IsoBuffer.from(random.string(10)));\n\t\t\treturn { blob: handle };\n\t\t};\n\n\t\tconst viewNode = view.getViewNode(nodeToModify);\n\t\tconst payload =\n\t\t\tviewNode.payload !== undefined ? (random.bool() ? await getPayloadContents(random) : undefined) : undefined;\n\t\treturn {\n\t\t\tfuzzType: 'setPayload',\n\t\t\ttype: ChangeType.SetValue,\n\t\t\tnodeToModify: random.pick(idList),\n\t\t\tpayload,\n\t\t};\n\t}\n\n\tconst baseEditGenerator = createWeightedAsyncGenerator<FuzzChange, EditState>([\n\t\t[insertGenerator, config.insertWeight, ({ idList }) => idList.length < config.maxTreeSize],\n\t\t[deleteGenerator, config.deleteWeight, ({ idList }) => idList.length > 1],\n\t\t[moveGenerator, config.moveWeight, ({ idList }) => idList.length > 1],\n\t\t[setPayloadGenerator, config.setPayloadWeight],\n\t]);\n\n\treturn async (state: FuzzTestState): Promise<Operation | typeof done> => {\n\t\tconst { random, activeCollaborators } = state;\n\t\tconst index = random.integer(0, activeCollaborators.length - 1);\n\t\tconst { tree } = activeCollaborators[index];\n\t\tconst view = tree.currentView;\n\t\tconst idList = getIdList(view);\n\t\tconst contents = await baseEditGenerator({\n\t\t\t...state,\n\t\t\tview,\n\t\t\tidList,\n\t\t\tdataStoreRuntime: tree.getRuntime(),\n\t\t\tidGenerator: tree,\n\t\t});\n\t\tif (contents === done) {\n\t\t\treturn done;\n\t\t}\n\t\treturn { type: 'edit', contents, index };\n\t};\n};\n\nconst defaultOpConfig: Required<OperationGenerationConfig> = {\n\teditConfig: defaultEditConfig,\n\tjoinConfig: defaultJoinConfig,\n\teditWeight: 10,\n\tjoinWeight: 1,\n\tleaveWeight: 1,\n\tsynchronizeWeight: 1,\n};\n\nexport function makeOpGenerator(passedConfig: OperationGenerationConfig): AsyncGenerator<Operation, FuzzTestState> {\n\tconst config = {\n\t\t...defaultOpConfig,\n\t\t...passedConfig,\n\t};\n\n\tconst { maximumPassiveCollaborators, maximumActiveCollaborators } = { ...defaultJoinConfig, ...config.joinConfig };\n\tconst maximumCollaborators = maximumPassiveCollaborators + maximumActiveCollaborators;\n\n\tconst collaboratorsMatches =\n\t\t(criteria: (collaboratorCount: number) => boolean): AcceptanceCondition<FuzzTestState> =>\n\t\t({ activeCollaborators, passiveCollaborators }) =>\n\t\t\tcriteria(activeCollaborators.length + passiveCollaborators.length);\n\tconst atLeastOneClient = collaboratorsMatches((count) => count > 0);\n\tconst atLeastOneActiveClient: AcceptanceCondition<FuzzTestState> = ({ activeCollaborators }) =>\n\t\tactiveCollaborators.length > 0;\n\tconst opWeights: AsyncWeights<Operation, FuzzTestState> = [\n\t\t[makeEditGenerator(config.editConfig), config.editWeight, atLeastOneActiveClient],\n\t\t[\n\t\t\tmakeJoinGenerator(config.joinConfig),\n\t\t\tconfig.joinWeight,\n\t\t\tcollaboratorsMatches((count) => count < maximumCollaborators),\n\t\t],\n\t\t[leaveGenerator, config.leaveWeight, atLeastOneClient],\n\t\t[{ type: 'synchronize' }, config.synchronizeWeight, atLeastOneClient],\n\t];\n\treturn createWeightedAsyncGenerator(opWeights);\n}\n\nfunction getIdList(tree: TreeView): NodeId[] {\n\tconst allIds: NodeId[] = [];\n\tconst toVisit: NodeId[] = [tree.root];\n\twhile (toVisit.length > 0) {\n\t\tconst id = toVisit.pop() ?? fail();\n\t\tallIds.push(id);\n\t\tconst node = tree.getViewNode(id);\n\t\tfor (const [_, childIds] of node.traits) {\n\t\t\ttoVisit.push(...childIds);\n\t\t}\n\t}\n\treturn allIds;\n}\n"]}
1
+ {"version":3,"file":"Generators.js","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.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 Random from 'random-js';\nimport { IsoBuffer } from '@fluidframework/common-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport {\n\tAcceptanceCondition,\n\tAsyncGenerator,\n\tAsyncWeights,\n\tcreateWeightedAsyncGenerator,\n\tdone,\n\tmakeRandom,\n} from '@fluid-internal/stochastic-test-utils';\nimport { Side, TraitMap, WriteFormat } from '../../persisted-types';\nimport { BuildNode, ChangeType, StablePlace, StableRange } from '../../ChangeTypes';\nimport { TraitLocation, TreeView, TreeViewRange } from '../../TreeView';\nimport { Definition, DetachedSequenceId, NodeId, TraitLabel } from '../../Identifiers';\nimport { fail } from '../../Common';\nimport { rangeFromStableRange } from '../../TreeViewUtilities';\nimport {\n\tEditGenerationConfig,\n\tFuzzChange,\n\tFuzzDelete,\n\tFuzzInsert,\n\tFuzzMove,\n\tFuzzTestState,\n\tInsertGenerationConfig,\n\tJoinGenerationConfig,\n\tOperation,\n\tOperationGenerationConfig,\n\tTreeContext,\n\tTreeLeave,\n} from './Types';\n\nconst defaultJoinConfig: Required<JoinGenerationConfig> = {\n\tmaximumActiveCollaborators: 10,\n\tmaximumPassiveCollaborators: 10,\n\twriteFormat: [WriteFormat.v0_0_2, WriteFormat.v0_1_1],\n\tsummarizeHistory: [false],\n};\n\nfunction makeJoinGenerator(passedConfig: JoinGenerationConfig): AsyncGenerator<Operation, FuzzTestState> {\n\tconst config = { ...defaultJoinConfig, ...passedConfig };\n\treturn async ({ random, activeCollaborators, passiveCollaborators }) => {\n\t\tconst activeAllowed = activeCollaborators.length < config.maximumActiveCollaborators;\n\t\tconst passiveAllowed = passiveCollaborators.length < config.maximumPassiveCollaborators;\n\t\tconst isObserver =\n\t\t\tactiveAllowed && passiveAllowed\n\t\t\t\t? random.bool()\n\t\t\t\t: activeAllowed\n\t\t\t\t? false\n\t\t\t\t: passiveAllowed\n\t\t\t\t? true\n\t\t\t\t: fail(\n\t\t\t\t\t\t'Cannot generate join op when both active and passive collaborators are at the configured limit.'\n\t\t\t\t );\n\t\treturn {\n\t\t\ttype: 'join',\n\t\t\tsummarizeHistory: random.pick(config.summarizeHistory),\n\t\t\twriteFormat: random.pick(config.writeFormat),\n\t\t\tisObserver,\n\t\t};\n\t};\n}\n\nasync function leaveGenerator({\n\trandom,\n\tactiveCollaborators,\n\tpassiveCollaborators,\n}: FuzzTestState): Promise<TreeLeave> {\n\tconst canUsePassive = passiveCollaborators.length > 0;\n\tconst canUseActive = activeCollaborators.length > 0;\n\tconst isObserver =\n\t\tcanUsePassive && canUseActive\n\t\t\t? random.bool()\n\t\t\t: canUsePassive\n\t\t\t? true\n\t\t\t: canUseActive\n\t\t\t? false\n\t\t\t: fail('Cannot generate a leave op when there are no clients.');\n\tconst index = random.integer(0, (isObserver ? passiveCollaborators : activeCollaborators).length - 1);\n\treturn { type: 'leave', isObserver, index };\n}\n\nconst defaultInsertConfig: Required<InsertGenerationConfig> = {\n\tdefinitionPoolSize: 20,\n\tmaxTreeSequenceSize: 3,\n};\n\nconst defaultEditConfig: Required<EditGenerationConfig> = {\n\tmaxTreeSize: Number.POSITIVE_INFINITY,\n\tinsertWeight: 3,\n\tinsertConfig: defaultInsertConfig,\n\tdeleteWeight: 1,\n\tmoveWeight: 1,\n\tsetPayloadWeight: 1,\n\ttraitLabelPoolSize: 20,\n};\n\nconst makeEditGenerator = (\n\tpassedConfig: EditGenerationConfig,\n\tpassedJoinConfig: JoinGenerationConfig,\n\tstashOps = false\n): AsyncGenerator<Operation, FuzzTestState> => {\n\tconst config = { ...defaultEditConfig, ...passedConfig };\n\tconst insertConfig = { ...defaultInsertConfig, ...config.insertConfig };\n\tconst poolRand = makeRandom(0);\n\tconst traitLabelPool = Array.from({ length: config.traitLabelPoolSize }, () => poolRand.uuid4() as TraitLabel);\n\tconst traitLabelGenerator = ({ random }: FuzzTestState) => random.pick(traitLabelPool);\n\n\tconst definitionPool = Array.from(\n\t\t{ length: insertConfig.definitionPoolSize },\n\t\t() => poolRand.uuid4() as Definition\n\t);\n\tconst definitionGenerator = ({ random }: FuzzTestState) => random.pick(definitionPool);\n\ttype EditState = FuzzTestState & TreeContext;\n\n\tfunction traitGenerator(state: EditState): TraitLocation {\n\t\tconst { idList, random, view } = state;\n\t\tconst id = random.pick(idList);\n\t\treturn view.tryGetTraitLocation(id) ?? { parent: id, label: traitLabelGenerator(state) };\n\t}\n\n\tfunction placeGenerator(state: EditState): StablePlace {\n\t\tconst { idList, random, view } = state;\n\t\t// Note: this gives a 50% chance of adding to a new trait; we may want to tune this at some point\n\t\tif (random.bool()) {\n\t\t\tconst parent = random.pick(idList);\n\t\t\treturn StablePlace.atStartOf({ parent, label: traitLabelGenerator(state) });\n\t\t}\n\t\tconst traitLocation = traitGenerator(state);\n\t\tconst trait = view.getTrait(traitLocation);\n\t\tinterface Descriptor {\n\t\t\tindex: number;\n\t\t\tside: Side;\n\t\t}\n\t\t// For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.\n\t\t// index === trait.length is treated as either the start or end of the trait.\n\t\tconst makeDescriptor = (): Descriptor => ({\n\t\t\tindex: random.integer(0, trait.length),\n\t\t\tside: random.bool() ? Side.Before : Side.After,\n\t\t});\n\t\tconst descriptor = makeDescriptor();\n\n\t\tconst placeFromDescriptor = ({ index, side }: Descriptor): StablePlace =>\n\t\t\tindex === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };\n\t\treturn placeFromDescriptor(descriptor);\n\t}\n\n\tfunction rangeGenerator(state: EditState): StableRange {\n\t\tconst { random, view } = state;\n\t\tconst traitLocation = traitGenerator(state);\n\t\tconst trait = view.getTrait(traitLocation);\n\t\tinterface Descriptor {\n\t\t\tindex: number;\n\t\t\tside: Side;\n\t\t}\n\t\t// For a trait of length N, there are 2N + 2valid places: start, before index 1, after index 1, etc.\n\t\t// index === trait.length is treated as either the start or end of the trait.\n\t\tconst makeDescriptor = (): Descriptor => ({\n\t\t\tindex: random.integer(0, trait.length),\n\t\t\tside: random.bool() ? Side.Before : Side.After,\n\t\t});\n\t\tconst descriptor1 = makeDescriptor();\n\t\tlet descriptor2: Descriptor;\n\t\tdo {\n\t\t\tdescriptor2 = makeDescriptor();\n\t\t} while (descriptor1.index === descriptor2.index && descriptor1.side === descriptor2.side);\n\n\t\tconst sortedDescriptors = [descriptor1, descriptor2];\n\t\tsortedDescriptors.sort((a, b) => {\n\t\t\tif (a.index === b.index && a.side === b.side) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (a.index === trait.length) {\n\t\t\t\tif (a.side === Side.After) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (b.index === trait.length) {\n\t\t\t\tif (b.side === Side.After) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif (a.index < b.index) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\treturn a.side === Side.Before ? -1 : 1;\n\t\t});\n\t\tconst [startDescriptor, endDescriptor] = sortedDescriptors;\n\t\tconst placeFromDescriptor = ({ index, side }: Descriptor): StablePlace =>\n\t\t\tindex === trait.length ? { referenceTrait: traitLocation, side } : { referenceSibling: trait[index], side };\n\t\tconst start = placeFromDescriptor(startDescriptor);\n\t\tconst end = placeFromDescriptor(endDescriptor);\n\t\treturn StableRange.from(start).to(end);\n\t}\n\n\tfunction treeGenerator(state: EditState): BuildNode {\n\t\tconst { random, idGenerator } = state;\n\t\tconst treeType = random.pick(['leaf', 'stick', 'balanced']);\n\t\tconst makeNode = (traits?: TraitMap<BuildNode>): BuildNode => ({\n\t\t\tidentifier: idGenerator.generateNodeId(),\n\t\t\tdefinition: definitionGenerator(state),\n\t\t\ttraits: traits ?? {},\n\t\t});\n\t\tswitch (treeType) {\n\t\t\tcase 'leaf':\n\t\t\t\treturn makeNode();\n\t\t\tcase 'stick':\n\t\t\t\treturn makeNode({\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode({ [traitLabelGenerator(state)]: [makeNode()] })],\n\t\t\t\t});\n\t\t\tcase 'balanced':\n\t\t\t\treturn makeNode({\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode()],\n\t\t\t\t\t[traitLabelGenerator(state)]: [makeNode()],\n\t\t\t\t});\n\t\t\tdefault:\n\t\t\t\tfail(`Unexpected treeType ${treeType}`);\n\t\t}\n\t}\n\n\tasync function insertGenerator(state: EditState): Promise<FuzzInsert> {\n\t\tconst { maxTreeSequenceSize } = insertConfig;\n\t\tconst id = 1 as DetachedSequenceId;\n\t\tconst { view } = state;\n\t\tconst isValidInsertPlace = (destination: StablePlace): boolean => {\n\t\t\t// Disallow insertion adjacent to the root node.\n\t\t\tif (destination.referenceSibling === view.root) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tlet destination: StablePlace;\n\t\tdo {\n\t\t\tdestination = placeGenerator(state);\n\t\t} while (!isValidInsertPlace(destination));\n\n\t\treturn {\n\t\t\tfuzzType: 'insert',\n\t\t\tbuild: {\n\t\t\t\ttype: ChangeType.Build,\n\t\t\t\tdestination: id,\n\t\t\t\tsource: Array.from({ length: state.random.integer(1, maxTreeSequenceSize) }, () =>\n\t\t\t\t\ttreeGenerator(state)\n\t\t\t\t),\n\t\t\t},\n\t\t\tinsert: {\n\t\t\t\ttype: ChangeType.Insert,\n\t\t\t\tdestination,\n\t\t\t\tsource: id,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function deleteGenerator(state: EditState): Promise<FuzzDelete> {\n\t\tconst { view } = state;\n\t\tconst isValidDeleteRange = (source: StableRange): boolean => {\n\t\t\t// Disallow deletion of the root node.\n\t\t\tif (source.start.referenceSibling === view.root || source.end.referenceSibling === view.root) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\tlet source: StableRange;\n\t\tdo {\n\t\t\tsource = rangeGenerator(state);\n\t\t} while (!isValidDeleteRange(source));\n\n\t\treturn {\n\t\t\tfuzzType: 'delete',\n\t\t\ttype: ChangeType.Detach,\n\t\t\tsource,\n\t\t};\n\t}\n\n\tasync function moveGenerator(state: EditState): Promise<FuzzMove> {\n\t\tconst id = 1 as DetachedSequenceId;\n\t\tconst { view } = state;\n\n\t\tconst isValidMoveRange = ({ start, end }: TreeViewRange, destination: StablePlace): boolean => {\n\t\t\t// An ancestor cannot be moved to be a sibling of its descendant.\n\t\t\tconst forbiddenDescendantId =\n\t\t\t\tdestination.referenceTrait?.parent ?? destination.referenceSibling ?? fail('Invalid place');\n\n\t\t\tconst startIndex = view.findIndexWithinTrait(start);\n\t\t\tconst endIndex = view.findIndexWithinTrait(end);\n\t\t\tconst idsInSource = new Set(view.getTrait(start.trait).slice(startIndex, endIndex));\n\t\t\tfor (\n\t\t\t\tlet current: NodeId | undefined = forbiddenDescendantId;\n\t\t\t\tcurrent !== undefined;\n\t\t\t\tcurrent = view.tryGetParentViewNode(current)?.identifier\n\t\t\t) {\n\t\t\t\tif (idsInSource.has(current)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t};\n\n\t\tlet source: StableRange;\n\t\tlet destination: StablePlace;\n\t\tdo {\n\t\t\tsource = rangeGenerator(state);\n\t\t\tdestination = placeGenerator(state);\n\t\t} while (!isValidMoveRange(rangeFromStableRange(view, source), destination));\n\n\t\treturn {\n\t\t\tfuzzType: 'move',\n\t\t\tdetach: {\n\t\t\t\ttype: ChangeType.Detach,\n\t\t\t\tdestination: id,\n\t\t\t\tsource,\n\t\t\t},\n\t\t\tinsert: {\n\t\t\t\ttype: ChangeType.Insert,\n\t\t\t\tdestination,\n\t\t\t\tsource: id,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync function setPayloadGenerator({ dataStoreRuntime, idList, random, view }: EditState): Promise<FuzzChange> {\n\t\tconst nodeToModify = random.pick(idList);\n\t\tconst getPayloadContents = async (\n\t\t\trandom: Random\n\t\t): Promise<string | { blob: IFluidHandle<ArrayBufferLike> }> => {\n\t\t\tif (random.bool()) {\n\t\t\t\treturn random.string(4);\n\t\t\t}\n\t\t\tconst handle = await dataStoreRuntime.uploadBlob(IsoBuffer.from(random.string(10)));\n\t\t\treturn { blob: handle };\n\t\t};\n\n\t\tconst viewNode = view.getViewNode(nodeToModify);\n\t\tconst payload =\n\t\t\tviewNode.payload !== undefined ? (random.bool() ? await getPayloadContents(random) : undefined) : undefined;\n\t\treturn {\n\t\t\tfuzzType: 'setPayload',\n\t\t\ttype: ChangeType.SetValue,\n\t\t\tnodeToModify: random.pick(idList),\n\t\t\tpayload,\n\t\t};\n\t}\n\n\tconst baseEditGenerator = createWeightedAsyncGenerator<FuzzChange, EditState>([\n\t\t[insertGenerator, config.insertWeight, ({ idList }) => idList.length < config.maxTreeSize],\n\t\t[deleteGenerator, config.deleteWeight, ({ idList }) => idList.length > 1],\n\t\t[moveGenerator, config.moveWeight, ({ idList }) => idList.length > 1],\n\t\t[setPayloadGenerator, config.setPayloadWeight],\n\t]);\n\n\treturn async (state: FuzzTestState): Promise<Operation | typeof done> => {\n\t\tconst { random, activeCollaborators } = state;\n\t\tconst index = random.integer(0, activeCollaborators.length - 1);\n\t\tconst { tree } = activeCollaborators[index];\n\t\tconst view = tree.currentView;\n\t\tconst idList = getIdList(view);\n\t\tconst contents = await baseEditGenerator({\n\t\t\t...state,\n\t\t\tview,\n\t\t\tidList,\n\t\t\tdataStoreRuntime: tree.getRuntime(),\n\t\t\tidGenerator: tree,\n\t\t});\n\t\tif (contents === done) {\n\t\t\treturn done;\n\t\t}\n\n\t\tif (stashOps) {\n\t\t\tconst joinConfig = { ...defaultJoinConfig, ...passedJoinConfig };\n\t\t\treturn {\n\t\t\t\ttype: 'stash',\n\t\t\t\tcontents,\n\t\t\t\tindex,\n\t\t\t\tsummarizeHistory: random.pick(joinConfig.summarizeHistory),\n\t\t\t\twriteFormat: random.pick(joinConfig.writeFormat),\n\t\t\t};\n\t\t}\n\n\t\treturn { type: 'edit', contents, index };\n\t};\n};\n\nconst defaultOpConfig: Required<OperationGenerationConfig> = {\n\teditConfig: defaultEditConfig,\n\tjoinConfig: defaultJoinConfig,\n\teditWeight: 100,\n\tjoinWeight: 10,\n\tleaveWeight: 10,\n\tstashWeight: 1,\n\tsynchronizeWeight: 10,\n};\n\nexport function makeOpGenerator(passedConfig: OperationGenerationConfig): AsyncGenerator<Operation, FuzzTestState> {\n\tconst config = {\n\t\t...defaultOpConfig,\n\t\t...passedConfig,\n\t};\n\n\tconst { maximumPassiveCollaborators, maximumActiveCollaborators } = { ...defaultJoinConfig, ...config.joinConfig };\n\tconst maximumCollaborators = maximumPassiveCollaborators + maximumActiveCollaborators;\n\n\tconst collaboratorsMatches =\n\t\t(criteria: (collaboratorCount: number) => boolean): AcceptanceCondition<FuzzTestState> =>\n\t\t({ activeCollaborators, passiveCollaborators }) =>\n\t\t\tcriteria(activeCollaborators.length + passiveCollaborators.length);\n\tconst atLeastOneClient = collaboratorsMatches((count) => count > 0);\n\tconst atLeastOneActiveClient: AcceptanceCondition<FuzzTestState> = ({ activeCollaborators }) =>\n\t\tactiveCollaborators.length > 0;\n\tconst opWeights: AsyncWeights<Operation, FuzzTestState> = [\n\t\t[makeEditGenerator(config.editConfig, config.joinConfig), config.editWeight, atLeastOneActiveClient],\n\t\t[\n\t\t\tmakeJoinGenerator(config.joinConfig),\n\t\t\tconfig.joinWeight,\n\t\t\tcollaboratorsMatches((count) => count < maximumCollaborators),\n\t\t],\n\t\t[leaveGenerator, config.leaveWeight, atLeastOneClient],\n\t\t[makeEditGenerator(config.editConfig, config.joinConfig, true), config.stashWeight, atLeastOneActiveClient],\n\t\t[{ type: 'synchronize' }, config.synchronizeWeight, atLeastOneClient],\n\t];\n\treturn createWeightedAsyncGenerator(opWeights);\n}\n\nfunction getIdList(tree: TreeView): NodeId[] {\n\tconst allIds: NodeId[] = [];\n\tconst toVisit: NodeId[] = [tree.root];\n\twhile (toVisit.length > 0) {\n\t\tconst id = toVisit.pop() ?? fail();\n\t\tallIds.push(id);\n\t\tconst node = tree.getViewNode(id);\n\t\tfor (const [_, childIds] of node.traits) {\n\t\t\ttoVisit.push(...childIds);\n\t\t}\n\t}\n\treturn allIds;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeFuzzTests.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/SharedTreeFuzzTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACN,cAAc,EAKd,MAAM,uCAAuC,CAAC;AAK/C,OAAO,EAAE,aAAa,EAAwB,SAAS,EAAE,MAAM,SAAS,CAAC;AASzE;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACvC,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,EACnD,IAAI,EAAE,MAAM,EACZ,gBAAgB,GAAE,OAAc,EAChC,QAAQ,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CA8GlC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAkI1D"}
1
+ {"version":3,"file":"SharedTreeFuzzTests.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/SharedTreeFuzzTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACN,cAAc,EAKd,MAAM,uCAAuC,CAAC;AAU/C,OAAO,EAAE,aAAa,EAAwB,SAAS,EAAc,MAAM,SAAS,CAAC;AASrF;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACvC,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,EACnD,IAAI,EAAE,MAAM,EACZ,gBAAgB,GAAE,OAAc,EAChC,QAAQ,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CA+HlC;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAkI1D"}
@@ -6,7 +6,7 @@ import { existsSync, mkdirSync } from 'fs';
6
6
  import { join } from 'path';
7
7
  import { expect } from 'chai';
8
8
  import { chainAsync as chain, makeRandom, takeAsync as take, performFuzzActionsAsync as performFuzzActionsBase, } from '@fluid-internal/stochastic-test-utils';
9
- import { setUpLocalServerTestSharedTree, testDocumentsPathBase } from '../utilities/TestUtilities';
9
+ import { setUpLocalServerTestSharedTree, testDocumentsPathBase, withContainerOffline, } from '../utilities/TestUtilities';
10
10
  import { WriteFormat } from '../../persisted-types';
11
11
  import { fail } from '../../Common';
12
12
  import { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';
@@ -33,23 +33,7 @@ export async function performFuzzActions(generator, seed, synchronizeAtEnd = tru
33
33
  edit: async (state, operation) => {
34
34
  const { index, contents } = operation;
35
35
  const { tree } = state.activeCollaborators[index];
36
- switch (contents.fuzzType) {
37
- case 'insert':
38
- tree.applyEdit(contents.build, contents.insert);
39
- break;
40
- case 'delete':
41
- tree.applyEdit(contents);
42
- break;
43
- case 'move':
44
- tree.applyEdit(contents.detach, contents.insert);
45
- break;
46
- case 'setPayload':
47
- tree.applyEdit(contents);
48
- break;
49
- default:
50
- fail('Invalid edit.');
51
- break;
52
- }
36
+ applyFuzzChange(tree, contents);
53
37
  return state;
54
38
  },
55
39
  join: async (state, operation) => {
@@ -69,6 +53,26 @@ export async function performFuzzActions(generator, seed, synchronizeAtEnd = tru
69
53
  treeList.splice(index, 1);
70
54
  return state;
71
55
  },
56
+ stash: async (state, operation) => {
57
+ var _a;
58
+ const { index, contents, writeFormat, summarizeHistory } = operation;
59
+ const testObjectProvider = (_a = state.testObjectProvider) !== null && _a !== void 0 ? _a : fail('Attempted to synchronize with undefined testObjectProvider');
60
+ const { container, tree } = state.activeCollaborators[index];
61
+ await testObjectProvider.ensureSynchronized();
62
+ const { pendingLocalState } = await withContainerOffline(testObjectProvider, container, () => {
63
+ applyFuzzChange(tree, contents);
64
+ });
65
+ const { container: newContainer, tree: newTree, testObjectProvider: newTestObjectProvider, } = await setUpLocalServerTestSharedTree({
66
+ writeFormat,
67
+ summarizeHistory,
68
+ testObjectProvider,
69
+ pendingLocalState,
70
+ });
71
+ state.activeCollaborators.splice(index, 1, { container: newContainer, tree: newTree });
72
+ await newTestObjectProvider.ensureSynchronized();
73
+ await newTestObjectProvider.ensureSynchronized(); // Synchronize twice in case stashed ops caused an upgrade round-trip
74
+ return Object.assign(Object.assign({}, state), { testObjectProvider: newTestObjectProvider });
75
+ },
72
76
  synchronize: async (state) => {
73
77
  const { testObjectProvider } = state;
74
78
  if (testObjectProvider === undefined) {
@@ -103,8 +107,21 @@ export async function performFuzzActions(generator, seed, synchronizeAtEnd = tru
103
107
  await finalState.testObjectProvider.ensureSynchronized();
104
108
  const events = finalState.testObjectProvider.logger.reportAndClearTrackedEvents();
105
109
  expect(events.expectedNotFound.length).to.equal(0);
106
- // Tolerate failed edit chunk uploads, because they are fire-and-forget and can fail (e.g. the uploading client leaves before upload completes).
107
- expect(events.unexpectedErrors.every((e) => e.eventName === 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure')).to.be.true;
110
+ for (const event of events.unexpectedErrors) {
111
+ switch (event.eventName) {
112
+ // Tolerate failed edit chunk uploads, because they are fire-and-forget and can fail (e.g. the uploading client leaves before upload completes).
113
+ case 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure':
114
+ // TODO:#1120
115
+ case 'fluid:telemetry:OrderedClientElection:InitialElectedClientNotFound':
116
+ // Summary nacks can happen as part of normal operation and are handled by the framework
117
+ case 'fluid:telemetry:Summarizer:Running:SummaryNack':
118
+ case 'fluid:telemetry:Summarizer:summarizingError':
119
+ case 'fluid:telemetry:Summarizer:Running:Summarize_cancel':
120
+ break;
121
+ default:
122
+ expect.fail(`Unexpected error event: ${event.eventName}`);
123
+ }
124
+ }
108
125
  }
109
126
  const trees = [
110
127
  ...finalState.activeCollaborators.map(({ tree }) => tree),
@@ -204,4 +221,22 @@ export function runSharedTreeFuzzTests(title) {
204
221
  });
205
222
  });
206
223
  }
224
+ function applyFuzzChange(tree, contents) {
225
+ switch (contents.fuzzType) {
226
+ case 'insert':
227
+ tree.applyEdit(contents.build, contents.insert);
228
+ break;
229
+ case 'delete':
230
+ tree.applyEdit(contents);
231
+ break;
232
+ case 'move':
233
+ tree.applyEdit(contents.detach, contents.insert);
234
+ break;
235
+ case 'setPayload':
236
+ tree.applyEdit(contents);
237
+ break;
238
+ default:
239
+ fail('Invalid edit.');
240
+ }
241
+ }
207
242
  //# sourceMappingURL=SharedTreeFuzzTests.js.map
@@ -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 { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { expect } from 'chai';\nimport {\n\tAsyncGenerator,\n\tchainAsync as chain,\n\tmakeRandom,\n\ttakeAsync as take,\n\tperformFuzzActionsAsync as performFuzzActionsBase,\n} from '@fluid-internal/stochastic-test-utils';\nimport { setUpLocalServerTestSharedTree, testDocumentsPathBase } from '../utilities/TestUtilities';\nimport { WriteFormat } from '../../persisted-types';\nimport { fail } from '../../Common';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { FuzzTestState, EditGenerationConfig, Operation } from './Types';\nimport { makeOpGenerator } 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 = 0;\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\n * 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\n * the test\n * @param saveInfo - optionally provide an operation number at which a history of all operations will be saved to disk\n * at a given filepath. This can be useful for debugging why a fuzz test may have failed.\n */\nexport async function performFuzzActions(\n\tgenerator: AsyncGenerator<Operation, FuzzTestState>,\n\tseed: number,\n\tsynchronizeAtEnd: boolean = true,\n\tsaveInfo?: { saveAt?: number; saveOnFailure: boolean; filepath: string }\n): Promise<Required<FuzzTestState>> {\n\tconst random = makeRandom(seed);\n\n\t// Note: the direct fields of `state` aren't mutated, but it is mutated transitively.\n\tconst initialState: FuzzTestState = { random, passiveCollaborators: [], activeCollaborators: [] };\n\tconst finalState = await performFuzzActionsBase(\n\t\tgenerator,\n\t\t{\n\t\t\tedit: async (state, operation) => {\n\t\t\t\tconst { index, contents } = operation;\n\t\t\t\tconst { tree } = state.activeCollaborators[index];\n\t\t\t\tswitch (contents.fuzzType) {\n\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\ttree.applyEdit(contents.build, contents.insert);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\ttree.applyEdit(contents);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'move':\n\t\t\t\t\t\ttree.applyEdit(contents.detach, contents.insert);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'setPayload':\n\t\t\t\t\t\ttree.applyEdit(contents);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tfail('Invalid edit.');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\tjoin: async (state, operation) => {\n\t\t\t\tconst { isObserver, summarizeHistory, writeFormat } = operation;\n\t\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\twriteFormat,\n\t\t\t\t\tsummarizeHistory,\n\t\t\t\t\ttestObjectProvider: state.testObjectProvider,\n\t\t\t\t});\n\t\t\t\t(isObserver ? state.passiveCollaborators : state.activeCollaborators).push({ container, tree });\n\t\t\t\treturn { ...state, testObjectProvider };\n\t\t\t},\n\t\t\tleave: async (state, operation) => {\n\t\t\t\tconst { index, isObserver } = operation;\n\t\t\t\tconst treeList = isObserver ? state.passiveCollaborators : state.activeCollaborators;\n\t\t\t\ttreeList[index].container.close();\n\t\t\t\ttreeList.splice(index, 1);\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\tsynchronize: async (state) => {\n\t\t\t\tconst { testObjectProvider } = state;\n\t\t\t\tif (testObjectProvider === undefined) {\n\t\t\t\t\tfail('Attempted to synchronize with undefined testObjectProvider');\n\t\t\t\t}\n\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\tconst trees = [...state.activeCollaborators, ...state.passiveCollaborators];\n\t\t\t\tif (trees.length > 1) {\n\t\t\t\t\tconst first = trees[0].tree;\n\t\t\t\t\tfor (let i = 1; i < trees.length; i++) {\n\t\t\t\t\t\tconst tree = trees[i].tree;\n\t\t\t\t\t\tconst editLogA = first.edits;\n\t\t\t\t\t\tconst editLogB = tree.edits;\n\t\t\t\t\t\tconst minEdits = Math.min(editLogA.length, editLogB.length);\n\t\t\t\t\t\tfor (let j = 0; j < minEdits - 1; j++) {\n\t\t\t\t\t\t\tconst editA = await editLogA.getEditAtIndex(editLogA.length - j - 1);\n\t\t\t\t\t\t\tconst editB = await editLogB.getEditAtIndex(editLogB.length - j - 1);\n\t\t\t\t\t\t\texpect(editA.id).to.equal(editB.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\texpect(areRevisionViewsSemanticallyEqual(tree.currentView, tree, first.currentView, first)).to\n\t\t\t\t\t\t\t.be.true;\n\n\t\t\t\t\t\tfor (const node of tree.currentView) {\n\t\t\t\t\t\t\texpect(tree.attributeNodeId(node.identifier)).to.equal(\n\t\t\t\t\t\t\t\tfirst.attributeNodeId(\n\t\t\t\t\t\t\t\t\tfirst.convertToNodeId(tree.convertToStableNodeId(node.identifier))\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\t\t\t\t}\n\t\t\t\treturn state;\n\t\t\t},\n\t\t},\n\t\tinitialState,\n\t\tsaveInfo\n\t);\n\n\tif (synchronizeAtEnd) {\n\t\tif (finalState.testObjectProvider !== undefined) {\n\t\t\tawait finalState.testObjectProvider.ensureSynchronized();\n\t\t\tconst events = finalState.testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.expectedNotFound.length).to.equal(0);\n\t\t\t// Tolerate failed edit chunk uploads, because they are fire-and-forget and can fail (e.g. the uploading client leaves before upload completes).\n\t\t\texpect(\n\t\t\t\tevents.unexpectedErrors.every(\n\t\t\t\t\t(e) => e.eventName === 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure'\n\t\t\t\t)\n\t\t\t).to.be.true;\n\t\t}\n\t\tconst trees = [\n\t\t\t...finalState.activeCollaborators.map(({ tree }) => tree),\n\t\t\t...finalState.passiveCollaborators.map(({ tree }) => tree),\n\t\t];\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 finalState 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, FuzzTestState>,\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, testLength: 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() =>\n\t\t\t\t\t\t\ttake(testLength, 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\ttestLength,\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\ttestLength,\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 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\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\tconst testLength = 200;\n\t\tdescribe('with no-history summarization', () => {\n\t\t\trunMixedVersionTests(false, testCount, testLength);\n\t\t});\n\n\t\tdescribe('with history summarization', () => {\n\t\t\trunMixedVersionTests(true, testCount, testLength);\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 { existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { expect } from 'chai';\nimport {\n\tAsyncGenerator,\n\tchainAsync as chain,\n\tmakeRandom,\n\ttakeAsync as take,\n\tperformFuzzActionsAsync as performFuzzActionsBase,\n} from '@fluid-internal/stochastic-test-utils';\nimport {\n\tsetUpLocalServerTestSharedTree,\n\ttestDocumentsPathBase,\n\twithContainerOffline,\n} from '../utilities/TestUtilities';\nimport { WriteFormat } from '../../persisted-types';\nimport { fail } from '../../Common';\nimport { areRevisionViewsSemanticallyEqual } from '../../EditUtilities';\nimport { SharedTree } from '../../SharedTree';\nimport { FuzzTestState, EditGenerationConfig, Operation, FuzzChange } from './Types';\nimport { makeOpGenerator } 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 = 0;\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\n * 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\n * the test\n * @param saveInfo - optionally provide an operation number at which a history of all operations will be saved to disk\n * at a given filepath. This can be useful for debugging why a fuzz test may have failed.\n */\nexport async function performFuzzActions(\n\tgenerator: AsyncGenerator<Operation, FuzzTestState>,\n\tseed: number,\n\tsynchronizeAtEnd: boolean = true,\n\tsaveInfo?: { saveAt?: number; saveOnFailure: boolean; filepath: string }\n): Promise<Required<FuzzTestState>> {\n\tconst random = makeRandom(seed);\n\n\t// Note: the direct fields of `state` aren't mutated, but it is mutated transitively.\n\tconst initialState: FuzzTestState = { random, passiveCollaborators: [], activeCollaborators: [] };\n\tconst finalState = await performFuzzActionsBase(\n\t\tgenerator,\n\t\t{\n\t\t\tedit: async (state, operation) => {\n\t\t\t\tconst { index, contents } = operation;\n\t\t\t\tconst { tree } = state.activeCollaborators[index];\n\t\t\t\tapplyFuzzChange(tree, contents);\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\tjoin: async (state, operation) => {\n\t\t\t\tconst { isObserver, summarizeHistory, writeFormat } = operation;\n\t\t\t\tconst { container, tree, testObjectProvider } = await setUpLocalServerTestSharedTree({\n\t\t\t\t\twriteFormat,\n\t\t\t\t\tsummarizeHistory,\n\t\t\t\t\ttestObjectProvider: state.testObjectProvider,\n\t\t\t\t});\n\t\t\t\t(isObserver ? state.passiveCollaborators : state.activeCollaborators).push({ container, tree });\n\t\t\t\treturn { ...state, testObjectProvider };\n\t\t\t},\n\t\t\tleave: async (state, operation) => {\n\t\t\t\tconst { index, isObserver } = operation;\n\t\t\t\tconst treeList = isObserver ? state.passiveCollaborators : state.activeCollaborators;\n\t\t\t\ttreeList[index].container.close();\n\t\t\t\ttreeList.splice(index, 1);\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\tstash: async (state, operation) => {\n\t\t\t\tconst { index, contents, writeFormat, summarizeHistory } = operation;\n\t\t\t\tconst testObjectProvider =\n\t\t\t\t\tstate.testObjectProvider ?? fail('Attempted to synchronize with undefined testObjectProvider');\n\n\t\t\t\tconst { container, tree } = state.activeCollaborators[index];\n\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\tconst { pendingLocalState } = await withContainerOffline(testObjectProvider, container, () => {\n\t\t\t\t\tapplyFuzzChange(tree, contents);\n\t\t\t\t});\n\n\t\t\t\tconst {\n\t\t\t\t\tcontainer: newContainer,\n\t\t\t\t\ttree: newTree,\n\t\t\t\t\ttestObjectProvider: newTestObjectProvider,\n\t\t\t\t} = await setUpLocalServerTestSharedTree({\n\t\t\t\t\twriteFormat,\n\t\t\t\t\tsummarizeHistory,\n\t\t\t\t\ttestObjectProvider,\n\t\t\t\t\tpendingLocalState,\n\t\t\t\t});\n\n\t\t\t\tstate.activeCollaborators.splice(index, 1, { container: newContainer, tree: newTree });\n\t\t\t\tawait newTestObjectProvider.ensureSynchronized();\n\t\t\t\tawait newTestObjectProvider.ensureSynchronized(); // Synchronize twice in case stashed ops caused an upgrade round-trip\n\t\t\t\treturn { ...state, testObjectProvider: newTestObjectProvider };\n\t\t\t},\n\t\t\tsynchronize: async (state) => {\n\t\t\t\tconst { testObjectProvider } = state;\n\t\t\t\tif (testObjectProvider === undefined) {\n\t\t\t\t\tfail('Attempted to synchronize with undefined testObjectProvider');\n\t\t\t\t}\n\t\t\t\tawait testObjectProvider.ensureSynchronized();\n\t\t\t\tconst trees = [...state.activeCollaborators, ...state.passiveCollaborators];\n\t\t\t\tif (trees.length > 1) {\n\t\t\t\t\tconst first = trees[0].tree;\n\t\t\t\t\tfor (let i = 1; i < trees.length; i++) {\n\t\t\t\t\t\tconst tree = trees[i].tree;\n\t\t\t\t\t\tconst editLogA = first.edits;\n\t\t\t\t\t\tconst editLogB = tree.edits;\n\t\t\t\t\t\tconst minEdits = Math.min(editLogA.length, editLogB.length);\n\t\t\t\t\t\tfor (let j = 0; j < minEdits - 1; j++) {\n\t\t\t\t\t\t\tconst editA = await editLogA.getEditAtIndex(editLogA.length - j - 1);\n\t\t\t\t\t\t\tconst editB = await editLogB.getEditAtIndex(editLogB.length - j - 1);\n\t\t\t\t\t\t\texpect(editA.id).to.equal(editB.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t\texpect(areRevisionViewsSemanticallyEqual(tree.currentView, tree, first.currentView, first)).to\n\t\t\t\t\t\t\t.be.true;\n\n\t\t\t\t\t\tfor (const node of tree.currentView) {\n\t\t\t\t\t\t\texpect(tree.attributeNodeId(node.identifier)).to.equal(\n\t\t\t\t\t\t\t\tfirst.attributeNodeId(\n\t\t\t\t\t\t\t\t\tfirst.convertToNodeId(tree.convertToStableNodeId(node.identifier))\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\t\t\t\t}\n\t\t\t\treturn state;\n\t\t\t},\n\t\t},\n\t\tinitialState,\n\t\tsaveInfo\n\t);\n\n\tif (synchronizeAtEnd) {\n\t\tif (finalState.testObjectProvider !== undefined) {\n\t\t\tawait finalState.testObjectProvider.ensureSynchronized();\n\t\t\tconst events = finalState.testObjectProvider.logger.reportAndClearTrackedEvents();\n\t\t\texpect(events.expectedNotFound.length).to.equal(0);\n\t\t\tfor (const event of events.unexpectedErrors) {\n\t\t\t\tswitch (event.eventName) {\n\t\t\t\t\t// Tolerate failed edit chunk uploads, because they are fire-and-forget and can fail (e.g. the uploading client leaves before upload completes).\n\t\t\t\t\tcase 'fluid:telemetry:FluidDataStoreRuntime:SharedTree:EditChunkUploadFailure':\n\t\t\t\t\t// TODO:#1120\n\t\t\t\t\tcase 'fluid:telemetry:OrderedClientElection:InitialElectedClientNotFound':\n\t\t\t\t\t// Summary nacks can happen as part of normal operation and are handled by the framework\n\t\t\t\t\tcase 'fluid:telemetry:Summarizer:Running:SummaryNack':\n\t\t\t\t\tcase 'fluid:telemetry:Summarizer:summarizingError':\n\t\t\t\t\tcase 'fluid:telemetry:Summarizer:Running:Summarize_cancel':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\texpect.fail(`Unexpected error event: ${event.eventName}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst trees = [\n\t\t\t...finalState.activeCollaborators.map(({ tree }) => tree),\n\t\t\t...finalState.passiveCollaborators.map(({ tree }) => tree),\n\t\t];\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 finalState 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, FuzzTestState>,\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, testLength: 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() =>\n\t\t\t\t\t\t\ttake(testLength, 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\ttestLength,\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\ttestLength,\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 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\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\tconst testLength = 200;\n\t\tdescribe('with no-history summarization', () => {\n\t\t\trunMixedVersionTests(false, testCount, testLength);\n\t\t});\n\n\t\tdescribe('with history summarization', () => {\n\t\t\trunMixedVersionTests(true, testCount, testLength);\n\t\t});\n\t});\n}\n\nfunction applyFuzzChange(tree: SharedTree, contents: FuzzChange): void {\n\tswitch (contents.fuzzType) {\n\t\tcase 'insert':\n\t\t\ttree.applyEdit(contents.build, contents.insert);\n\t\t\tbreak;\n\n\t\tcase 'delete':\n\t\t\ttree.applyEdit(contents);\n\t\t\tbreak;\n\n\t\tcase 'move':\n\t\t\ttree.applyEdit(contents.detach, contents.insert);\n\t\t\tbreak;\n\n\t\tcase 'setPayload':\n\t\t\ttree.applyEdit(contents);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tfail('Invalid edit.');\n\t}\n}\n"]}
@@ -38,6 +38,14 @@ export interface TreeLeave {
38
38
  isObserver: boolean;
39
39
  index: number;
40
40
  }
41
+ /** Applies an edit after disconnecting the container, then rejoins */
42
+ export interface TreeStash {
43
+ type: 'stash';
44
+ contents: FuzzChange;
45
+ summarizeHistory: boolean;
46
+ writeFormat: WriteFormat;
47
+ index: number;
48
+ }
41
49
  export interface Synchronize {
42
50
  type: 'synchronize';
43
51
  }
@@ -52,7 +60,7 @@ export interface Synchronize {
52
60
  * Future potential work:
53
61
  * - More fine-grained control of summarization processes
54
62
  */
55
- export declare type Operation = TreeEdit | TreeJoin | TreeLeave | Synchronize;
63
+ export declare type Operation = TreeEdit | TreeJoin | TreeLeave | TreeStash | Synchronize;
56
64
  export interface FuzzInsert {
57
65
  fuzzType: 'insert';
58
66
  build: Build;
@@ -114,13 +122,15 @@ export interface JoinGenerationConfig {
114
122
  export interface OperationGenerationConfig {
115
123
  editConfig?: EditGenerationConfig;
116
124
  joinConfig?: JoinGenerationConfig;
117
- /** default: 10 */
125
+ /** default: 100 */
118
126
  editWeight?: number;
119
- /** default: 1 */
127
+ /** default: 10 */
120
128
  joinWeight?: number;
121
- /** default: 1 */
129
+ /** default: 10 */
122
130
  leaveWeight?: number;
123
131
  /** default: 1 */
132
+ stashWeight?: number;
133
+ /** default: 10 */
124
134
  synchronizeWeight?: number;
125
135
  }
126
136
  //# sourceMappingURL=Types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/Types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/Types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../src/test/fuzz/Types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { TestObjectProvider } from '@fluidframework/test-utils';\nimport type { IContainer } from '@fluidframework/container-definitions';\nimport type { BaseFuzzTestState } from '@fluid-internal/stochastic-test-utils';\nimport type { IFluidDataStoreRuntime } from '@fluidframework/datastore-definitions';\nimport type { SharedTree } from '../../SharedTree';\nimport type { WriteFormat } from '../../persisted-types';\nimport type { Build, Detach, Insert, SetValue } from '../../ChangeTypes';\nimport type { TreeView } from '../../TreeView';\nimport type { NodeId } from '../../Identifiers';\nimport type { NodeIdGenerator } from '../../NodeIdUtilities';\n\nexport interface FuzzTestState extends BaseFuzzTestState {\n\ttestObjectProvider?: TestObjectProvider;\n\tactiveCollaborators: Collaborator[];\n\tpassiveCollaborators: Collaborator[];\n}\n\nexport interface Collaborator {\n\tcontainer: IContainer;\n\ttree: SharedTree;\n}\n\nexport interface TreeEdit {\n\ttype: 'edit';\n\tcontents: FuzzChange;\n\t/** index of the tree to apply the edit to. */\n\tindex: number;\n}\n\nexport interface TreeJoin {\n\ttype: 'join';\n\tsummarizeHistory: boolean;\n\twriteFormat: WriteFormat;\n\tisObserver: boolean;\n}\n\nexport interface TreeLeave {\n\ttype: 'leave';\n\tisObserver: boolean;\n\tindex: number;\n}\n\nexport interface Synchronize {\n\ttype: 'synchronize';\n}\n\n/**\n * Operations:\n * - Any valid edit on any shared tree\n * - New SharedTree joins session with some initial params\n * - Existing SharedTree leaves session\n * - Local server synchronizes connected clients\n *\n * Note that these objects should be JSON serializable for ease in debugging fuzz tests.\n * Future potential work:\n * - More fine-grained control of summarization processes\n */\nexport type Operation = TreeEdit | TreeJoin | TreeLeave | Synchronize;\n\nexport interface FuzzInsert {\n\tfuzzType: 'insert';\n\tbuild: Build;\n\tinsert: Insert;\n}\n\nexport type FuzzDelete = Detach & { fuzzType: 'delete' };\n\nexport interface FuzzMove {\n\tfuzzType: 'move';\n\tdetach: Detach;\n\tinsert: Insert;\n}\n\nexport type FuzzSetPayload = SetValue & { fuzzType: 'setPayload' };\n\nexport type FuzzChange = FuzzInsert | FuzzDelete | FuzzMove | FuzzSetPayload;\n\nexport interface TreeContext {\n\tview: TreeView;\n\tidGenerator: NodeIdGenerator;\n\tidList: NodeId[];\n\tdataStoreRuntime: IFluidDataStoreRuntime;\n}\n\nexport interface InsertGenerationConfig {\n\t/** default: 3 */\n\tmaxTreeSequenceSize?: number;\n\t/** The number of possible definitions. Default: 20. */\n\tdefinitionPoolSize?: number;\n}\n\nexport interface EditGenerationConfig {\n\t/** default: Number.POSITIVE_INFINITY (no max size) */\n\tmaxTreeSize?: number;\n\t/** default: 3 */\n\tinsertWeight?: number;\n\t/** default: 1 */\n\tdeleteWeight?: number;\n\t/** default: 1 */\n\tmoveWeight?: number;\n\t/** default: 1 */\n\tsetPayloadWeight?: number;\n\tinsertConfig?: InsertGenerationConfig;\n\t/** The number of possible trait labels. Default: 20. */\n\ttraitLabelPoolSize?: number;\n}\n\nexport interface JoinGenerationConfig {\n\t/**\n\t * Valid `summarizeHistory` values. Defaults to [false].\n\t */\n\tsummarizeHistory?: boolean[];\n\t/**\n\t * Valid `writeFormat` values. Defaults to 0.0.2 and 0.1.1.\n\t */\n\twriteFormat?: WriteFormat[];\n\t/** default: Number.POSITIVE_INFINITY (no max size) */\n\tmaximumPassiveCollaborators?: number;\n\t/** default: Number.POSITIVE_INFINITY (no max size) */\n\tmaximumActiveCollaborators?: number;\n}\n\nexport interface OperationGenerationConfig {\n\teditConfig?: EditGenerationConfig;\n\tjoinConfig?: JoinGenerationConfig;\n\t/** default: 10 */\n\teditWeight?: number;\n\t/** default: 1 */\n\tjoinWeight?: number;\n\t/** default: 1 */\n\tleaveWeight?: number;\n\t/** default: 1 */\n\tsynchronizeWeight?: number;\n}\n"]}
1
+ {"version":3,"file":"Types.js","sourceRoot":"","sources":["../../../src/test/fuzz/Types.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { TestObjectProvider } from '@fluidframework/test-utils';\nimport type { IContainer } from '@fluidframework/container-definitions';\nimport type { BaseFuzzTestState } from '@fluid-internal/stochastic-test-utils';\nimport type { IFluidDataStoreRuntime } from '@fluidframework/datastore-definitions';\nimport type { SharedTree } from '../../SharedTree';\nimport type { WriteFormat } from '../../persisted-types';\nimport type { Build, Detach, Insert, SetValue } from '../../ChangeTypes';\nimport type { TreeView } from '../../TreeView';\nimport type { NodeId } from '../../Identifiers';\nimport type { NodeIdGenerator } from '../../NodeIdUtilities';\n\nexport interface FuzzTestState extends BaseFuzzTestState {\n\ttestObjectProvider?: TestObjectProvider;\n\tactiveCollaborators: Collaborator[];\n\tpassiveCollaborators: Collaborator[];\n}\n\nexport interface Collaborator {\n\tcontainer: IContainer;\n\ttree: SharedTree;\n}\n\nexport interface TreeEdit {\n\ttype: 'edit';\n\tcontents: FuzzChange;\n\t/** index of the tree to apply the edit to. */\n\tindex: number;\n}\n\nexport interface TreeJoin {\n\ttype: 'join';\n\tsummarizeHistory: boolean;\n\twriteFormat: WriteFormat;\n\tisObserver: boolean;\n}\n\nexport interface TreeLeave {\n\ttype: 'leave';\n\tisObserver: boolean;\n\tindex: number;\n}\n\n/** Applies an edit after disconnecting the container, then rejoins */\nexport interface TreeStash {\n\ttype: 'stash';\n\tcontents: FuzzChange;\n\tsummarizeHistory: boolean;\n\twriteFormat: WriteFormat;\n\tindex: number;\n}\n\nexport interface Synchronize {\n\ttype: 'synchronize';\n}\n\n/**\n * Operations:\n * - Any valid edit on any shared tree\n * - New SharedTree joins session with some initial params\n * - Existing SharedTree leaves session\n * - Local server synchronizes connected clients\n *\n * Note that these objects should be JSON serializable for ease in debugging fuzz tests.\n * Future potential work:\n * - More fine-grained control of summarization processes\n */\nexport type Operation = TreeEdit | TreeJoin | TreeLeave | TreeStash | Synchronize;\n\nexport interface FuzzInsert {\n\tfuzzType: 'insert';\n\tbuild: Build;\n\tinsert: Insert;\n}\n\nexport type FuzzDelete = Detach & { fuzzType: 'delete' };\n\nexport interface FuzzMove {\n\tfuzzType: 'move';\n\tdetach: Detach;\n\tinsert: Insert;\n}\n\nexport type FuzzSetPayload = SetValue & { fuzzType: 'setPayload' };\n\nexport type FuzzChange = FuzzInsert | FuzzDelete | FuzzMove | FuzzSetPayload;\n\nexport interface TreeContext {\n\tview: TreeView;\n\tidGenerator: NodeIdGenerator;\n\tidList: NodeId[];\n\tdataStoreRuntime: IFluidDataStoreRuntime;\n}\n\nexport interface InsertGenerationConfig {\n\t/** default: 3 */\n\tmaxTreeSequenceSize?: number;\n\t/** The number of possible definitions. Default: 20. */\n\tdefinitionPoolSize?: number;\n}\n\nexport interface EditGenerationConfig {\n\t/** default: Number.POSITIVE_INFINITY (no max size) */\n\tmaxTreeSize?: number;\n\t/** default: 3 */\n\tinsertWeight?: number;\n\t/** default: 1 */\n\tdeleteWeight?: number;\n\t/** default: 1 */\n\tmoveWeight?: number;\n\t/** default: 1 */\n\tsetPayloadWeight?: number;\n\tinsertConfig?: InsertGenerationConfig;\n\t/** The number of possible trait labels. Default: 20. */\n\ttraitLabelPoolSize?: number;\n}\n\nexport interface JoinGenerationConfig {\n\t/**\n\t * Valid `summarizeHistory` values. Defaults to [false].\n\t */\n\tsummarizeHistory?: boolean[];\n\t/**\n\t * Valid `writeFormat` values. Defaults to 0.0.2 and 0.1.1.\n\t */\n\twriteFormat?: WriteFormat[];\n\t/** default: Number.POSITIVE_INFINITY (no max size) */\n\tmaximumPassiveCollaborators?: number;\n\t/** default: Number.POSITIVE_INFINITY (no max size) */\n\tmaximumActiveCollaborators?: number;\n}\n\nexport interface OperationGenerationConfig {\n\teditConfig?: EditGenerationConfig;\n\tjoinConfig?: JoinGenerationConfig;\n\t/** default: 100 */\n\teditWeight?: number;\n\t/** default: 10 */\n\tjoinWeight?: number;\n\t/** default: 10 */\n\tleaveWeight?: number;\n\t/** default: 1 */\n\tstashWeight?: number;\n\t/** default: 10 */\n\tsynchronizeWeight?: number;\n}\n"]}
@@ -1 +1 @@
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,QAgHpD"}
1
+ {"version":3,"file":"PendingLocalStateTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/PendingLocalStateTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAGN,sCAAsC,EACtC,mCAAmC,EAInC,MAAM,iBAAiB,CAAC;AAGzB;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,EACb,8BAA8B,EAAE,CAC/B,OAAO,EAAE,mCAAmC,KACxC,OAAO,CAAC,sCAAsC,CAAC,QA6TpD"}