@fluid-experimental/tree 1.2.7 → 2.0.0-dev.1.3.0.96595

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 (173) hide show
  1. package/.mocharc.js +12 -0
  2. package/.prettierignore +6 -0
  3. package/README.md +1 -1
  4. package/dist/Checkout.d.ts +9 -4
  5. package/dist/Checkout.d.ts.map +1 -1
  6. package/dist/Checkout.js +34 -25
  7. package/dist/Checkout.js.map +1 -1
  8. package/dist/Common.d.ts +31 -18
  9. package/dist/Common.d.ts.map +1 -1
  10. package/dist/Common.js +33 -22
  11. package/dist/Common.js.map +1 -1
  12. package/dist/EditLog.js +2 -2
  13. package/dist/EditLog.js.map +1 -1
  14. package/dist/EditUtilities.d.ts +5 -0
  15. package/dist/EditUtilities.d.ts.map +1 -1
  16. package/dist/EditUtilities.js +4 -3
  17. package/dist/EditUtilities.js.map +1 -1
  18. package/dist/EventTypes.d.ts +11 -6
  19. package/dist/EventTypes.d.ts.map +1 -1
  20. package/dist/EventTypes.js +11 -6
  21. package/dist/EventTypes.js.map +1 -1
  22. package/dist/HistoryEditFactory.d.ts +5 -3
  23. package/dist/HistoryEditFactory.d.ts.map +1 -1
  24. package/dist/HistoryEditFactory.js +25 -6
  25. package/dist/HistoryEditFactory.js.map +1 -1
  26. package/dist/LogViewer.d.ts +12 -6
  27. package/dist/LogViewer.d.ts.map +1 -1
  28. package/dist/LogViewer.js.map +1 -1
  29. package/dist/RevisionValueCache.d.ts +8 -4
  30. package/dist/RevisionValueCache.d.ts.map +1 -1
  31. package/dist/RevisionValueCache.js +4 -2
  32. package/dist/RevisionValueCache.js.map +1 -1
  33. package/dist/SharedTree.d.ts +22 -11
  34. package/dist/SharedTree.d.ts.map +1 -1
  35. package/dist/SharedTree.js +25 -19
  36. package/dist/SharedTree.js.map +1 -1
  37. package/dist/StringInterner.d.ts +4 -3
  38. package/dist/StringInterner.d.ts.map +1 -1
  39. package/dist/StringInterner.js +4 -3
  40. package/dist/StringInterner.js.map +1 -1
  41. package/dist/Transaction.d.ts +2 -2
  42. package/dist/Transaction.d.ts.map +1 -1
  43. package/dist/Transaction.js +3 -2
  44. package/dist/Transaction.js.map +1 -1
  45. package/dist/TransactionInternal.d.ts.map +1 -1
  46. package/dist/TransactionInternal.js +1 -0
  47. package/dist/TransactionInternal.js.map +1 -1
  48. package/dist/id-compressor/IdCompressor.d.ts +14 -8
  49. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  50. package/dist/id-compressor/IdCompressor.js +14 -8
  51. package/dist/id-compressor/IdCompressor.js.map +1 -1
  52. package/dist/id-compressor/NumericUuid.d.ts +4 -0
  53. package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
  54. package/dist/id-compressor/NumericUuid.js +13 -3
  55. package/dist/id-compressor/NumericUuid.js.map +1 -1
  56. package/dist/id-compressor/SessionIdNormalizer.d.ts +8 -3
  57. package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  58. package/dist/id-compressor/SessionIdNormalizer.js +8 -3
  59. package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
  60. package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  61. package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
  62. package/dist/index.d.ts +1 -1
  63. package/dist/index.js +1 -1
  64. package/dist/index.js.map +1 -1
  65. package/lib/Checkout.d.ts +9 -4
  66. package/lib/Checkout.d.ts.map +1 -1
  67. package/lib/Checkout.js +36 -27
  68. package/lib/Checkout.js.map +1 -1
  69. package/lib/Common.d.ts +31 -18
  70. package/lib/Common.d.ts.map +1 -1
  71. package/lib/Common.js +31 -21
  72. package/lib/Common.js.map +1 -1
  73. package/lib/EditLog.js +2 -2
  74. package/lib/EditLog.js.map +1 -1
  75. package/lib/EditUtilities.d.ts +5 -0
  76. package/lib/EditUtilities.d.ts.map +1 -1
  77. package/lib/EditUtilities.js +4 -3
  78. package/lib/EditUtilities.js.map +1 -1
  79. package/lib/EventTypes.d.ts +11 -6
  80. package/lib/EventTypes.d.ts.map +1 -1
  81. package/lib/EventTypes.js +11 -6
  82. package/lib/EventTypes.js.map +1 -1
  83. package/lib/HistoryEditFactory.d.ts +5 -3
  84. package/lib/HistoryEditFactory.d.ts.map +1 -1
  85. package/lib/HistoryEditFactory.js +25 -6
  86. package/lib/HistoryEditFactory.js.map +1 -1
  87. package/lib/LogViewer.d.ts +12 -6
  88. package/lib/LogViewer.d.ts.map +1 -1
  89. package/lib/LogViewer.js.map +1 -1
  90. package/lib/RevisionValueCache.d.ts +8 -4
  91. package/lib/RevisionValueCache.d.ts.map +1 -1
  92. package/lib/RevisionValueCache.js +4 -2
  93. package/lib/RevisionValueCache.js.map +1 -1
  94. package/lib/SharedTree.d.ts +22 -11
  95. package/lib/SharedTree.d.ts.map +1 -1
  96. package/lib/SharedTree.js +26 -20
  97. package/lib/SharedTree.js.map +1 -1
  98. package/lib/StringInterner.d.ts +4 -3
  99. package/lib/StringInterner.d.ts.map +1 -1
  100. package/lib/StringInterner.js +4 -3
  101. package/lib/StringInterner.js.map +1 -1
  102. package/lib/Transaction.d.ts +2 -2
  103. package/lib/Transaction.d.ts.map +1 -1
  104. package/lib/Transaction.js +3 -2
  105. package/lib/Transaction.js.map +1 -1
  106. package/lib/TransactionInternal.d.ts.map +1 -1
  107. package/lib/TransactionInternal.js +1 -0
  108. package/lib/TransactionInternal.js.map +1 -1
  109. package/lib/id-compressor/IdCompressor.d.ts +14 -8
  110. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  111. package/lib/id-compressor/IdCompressor.js +14 -8
  112. package/lib/id-compressor/IdCompressor.js.map +1 -1
  113. package/lib/id-compressor/NumericUuid.d.ts +4 -0
  114. package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
  115. package/lib/id-compressor/NumericUuid.js +13 -3
  116. package/lib/id-compressor/NumericUuid.js.map +1 -1
  117. package/lib/id-compressor/SessionIdNormalizer.d.ts +8 -3
  118. package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
  119. package/lib/id-compressor/SessionIdNormalizer.js +8 -3
  120. package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
  121. package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
  122. package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
  123. package/lib/index.d.ts +1 -1
  124. package/lib/index.js +1 -1
  125. package/lib/index.js.map +1 -1
  126. package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -1
  127. package/lib/test/Checkout.tests.d.ts.map +1 -1
  128. package/lib/test/Checkout.tests.js +39 -10
  129. package/lib/test/Checkout.tests.js.map +1 -1
  130. package/lib/test/Common.tests.js +20 -1
  131. package/lib/test/Common.tests.js.map +1 -1
  132. package/lib/test/HistoryEditFactory.tests.js +48 -9
  133. package/lib/test/HistoryEditFactory.tests.js.map +1 -1
  134. package/lib/test/SessionIdNormalizer.tests.js +3 -2
  135. package/lib/test/SessionIdNormalizer.tests.js.map +1 -1
  136. package/lib/test/fuzz/Generators.d.ts.map +1 -1
  137. package/lib/test/fuzz/Generators.js.map +1 -1
  138. package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
  139. package/lib/test/fuzz/SharedTreeFuzzTests.js +2 -3
  140. package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
  141. package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
  142. package/lib/test/utilities/MockTransaction.js +1 -0
  143. package/lib/test/utilities/MockTransaction.js.map +1 -1
  144. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  145. package/lib/test/utilities/SharedTreeTests.js +35 -26
  146. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  147. package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
  148. package/lib/test/utilities/SharedTreeVersioningTests.js +7 -0
  149. package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
  150. package/lib/test/utilities/TestUtilities.d.ts +5 -0
  151. package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
  152. package/lib/test/utilities/TestUtilities.js +4 -3
  153. package/lib/test/utilities/TestUtilities.js.map +1 -1
  154. package/lib/test/utilities/UndoRedoTests.js +3 -2
  155. package/lib/test/utilities/UndoRedoTests.js.map +1 -1
  156. package/package.json +28 -23
  157. package/src/Checkout.ts +56 -14
  158. package/src/Common.ts +39 -21
  159. package/src/EditLog.ts +2 -2
  160. package/src/EditUtilities.ts +3 -3
  161. package/src/EventTypes.ts +12 -6
  162. package/src/HistoryEditFactory.ts +31 -6
  163. package/src/LogViewer.ts +12 -6
  164. package/src/RevisionValueCache.ts +8 -4
  165. package/src/SharedTree.ts +39 -26
  166. package/src/StringInterner.ts +4 -3
  167. package/src/Transaction.ts +5 -4
  168. package/src/TransactionInternal.ts +1 -0
  169. package/src/id-compressor/IdCompressor.ts +27 -17
  170. package/src/id-compressor/NumericUuid.ts +17 -3
  171. package/src/id-compressor/SessionIdNormalizer.ts +8 -3
  172. package/src/id-compressor/persisted-types/0.0.1.ts +1 -0
  173. package/src/index.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SessionIdNormalizer.tests.js","sourceRoot":"","sources":["../../src/test/SessionIdNormalizer.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 { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { expect } from 'chai';\nimport Random from 'random-js';\nimport {\n\tBaseFuzzTestState,\n\tchain,\n\tcreateWeightedGenerator,\n\tmakeRandom,\n\tperformFuzzActions,\n\ttake,\n\tGenerator,\n\tgeneratorFromArray,\n} from '@fluid-internal/stochastic-test-utils';\nimport { assert, fail } from '../Common';\nimport { isFinalId, isLocalId } from '../id-compressor';\nimport { SessionIdNormalizer } from '../id-compressor/SessionIdNormalizer';\nimport { FinalCompressedId, LocalCompressedId, SessionSpaceCompressedId } from '../Identifiers';\n\ndescribe('SessionIdNormalizer', () => {\n\tit('fails when adding finals with no corresponding locals', () => {\n\t\tconst normalizer = makeTestNormalizer();\n\t\texpect(() => normalizer.addFinalIds(final(0), final(1), undefined)).to.throw(\n\t\t\t'Final IDs must be added to an existing local range.'\n\t\t);\n\t});\n\n\tit('fails when adding finals out of order', () => {\n\t\tconst normalizer = makeTestNormalizer();\n\t\tnormalizer.addLocalId();\n\t\texpect(() => normalizer.addFinalIds(final(1), final(0), undefined)).to.throw('Malformed normalization range.');\n\t});\n\n\tit('fails when gaps in finals do not align with a local', () => {\n\t\t/**\n\t\t * Locals: [-1, -2, X, -4]\n\t\t * Finals: [ 0, 1, 2, 5]\n\t\t * Calling `addFinalIds` with first === last === 9 results in the following:\n\t\t * Locals: [-1, -2, X, -4, X]\n\t\t * Finals: [ 0, 1, 2, 5, 9]\n\t\t * ^should fail\n\t\t */\n\t\tconst normalizer = makeTestNormalizer();\n\t\tnormalizer.addLocalId(); // -1\n\t\tnormalizer.addLocalId(); // -2\n\t\tnormalizer.addFinalIds(final(0), final(2), undefined);\n\t\tnormalizer.addLocalId(); // -4\n\t\tnormalizer.addFinalIds(final(5), final(5), undefined);\n\t\texpect(() => normalizer.addFinalIds(final(9), final(9), undefined)).to.throw(\n\t\t\t'Gaps in final space must align to a local.'\n\t\t);\n\t});\n\n\tit('fails when attempting to normalize a local ID that was never registered', () => {\n\t\tconst normalizer = makeTestNormalizer();\n\t\texpect(() => normalizer.getFinalId(-1 as LocalCompressedId)).to.throw(\n\t\t\t'Local ID was never recorded with this normalizer.'\n\t\t);\n\t\tconst local = normalizer.addLocalId();\n\t\tconst secondLocal = (local - 1) as LocalCompressedId;\n\t\texpect(() => normalizer.getFinalId(secondLocal)).to.throw('Local ID was never recorded with this normalizer.');\n\t\tnormalizer.addFinalIds(final(0), final(5), undefined);\n\t\texpect(() => normalizer.getFinalId(secondLocal)).to.throw('Local ID was never recorded with this normalizer.');\n\t});\n\n\titWithNormalizer('can normalize IDs with only local forms', (normalizer) => {\n\t\tconst local1 = normalizer.addLocalId();\n\t\tconst local2 = normalizer.addLocalId();\n\t\tconst local3 = normalizer.addLocalId();\n\t\tconst local4 = normalizer.addLocalId();\n\t\texpect(local1).to.equal(-1);\n\t\texpect(local2).to.equal(-2);\n\t\texpect(local3).to.equal(-3);\n\t\texpect(local4).to.equal(-4);\n\t});\n\n\titWithNormalizer('can normalize IDs with trailing finals', (normalizer) => {\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\tnormalizer.addFinalIds(final(2), final(3), undefined);\n\t\tnormalizer.addFinalIds(final(4), final(10), undefined);\n\t});\n\n\titWithNormalizer('can normalize IDs with trailing locals', (normalizer) => {\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addLocalId();\n\t});\n\n\titWithNormalizer('can normalize IDs with a gap in final space', (normalizer) => {\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\tnormalizer.addFinalIds(final(10), final(11), undefined);\n\t});\n\n\titWithNormalizer('can normalize IDs with and without corresponding local forms', (normalizer) => {\n\t\tnormalizer.addLocalId(); // -1\n\t\tnormalizer.addLocalId(); // -2\n\t\tnormalizer.addLocalId(); // -3\n\t\tnormalizer.addFinalIds(final(0), final(3), dummy);\n\t\tnormalizer.addLocalId(); // -5\n\t\tnormalizer.addLocalId(); // -6\n\t\tnormalizer.addFinalIds(final(4), final(5), dummy);\n\t\tnormalizer.addLocalId(); // -7\n\t\tnormalizer.addFinalIds(final(8), final(9), dummy);\n\t\tnormalizer.addLocalId(); // -9\n\t\tnormalizer.addFinalIds(final(14), final(15), dummy);\n\t\tnormalizer.addLocalId(); // -11\n\t\tnormalizer.addLocalId(); // -12\n\t});\n\n\titWithNormalizer('can get the last final ID', (normalizer) => {\n\t\tnormalizer.addLocalId(); // -1\n\t\tnormalizer.addLocalId(); // -2\n\t\tnormalizer.addLocalId(); // -3\n\t\tnormalizer.addLocalId(); // -4\n\t\texpect(normalizer.getLastFinalId()).to.be.undefined;\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\texpect(normalizer.getLastFinalId()).to.equal(1);\n\t\tnormalizer.addFinalIds(final(2), final(2), undefined);\n\t\texpect(normalizer.getLastFinalId()).to.equal(2);\n\t\tnormalizer.addFinalIds(final(10), final(15), undefined);\n\t\texpect(normalizer.getLastFinalId()).to.equal(15);\n\t});\n\n\titWithNormalizer('can normalize IDs after fuzzed inputs', (normalizer) => {\n\t\tfuzzNormalizer(normalizer, 1000, 42);\n\t});\n});\n\ndescribe('SessionIdNormalizer Perf', () => {\n\tconst choiceCount = 1000;\n\tconst type = BenchmarkType.Measurement;\n\tlet normalizer: SessionIdNormalizer<DummyRange>;\n\tlet rand: Random;\n\tlet ids: SessionSpaceCompressedId[];\n\tlet finals: FinalCompressedId[];\n\tlet locals: LocalCompressedId[];\n\tlet localChoices: LocalCompressedId[];\n\tlet finalChoices: FinalCompressedId[];\n\tconst before = () => {\n\t\tnormalizer = new SessionIdNormalizer();\n\t\trand = fuzzNormalizer(normalizer, 10000, 3.14);\n\t\tids = [...normalizer];\n\t\tlocals = ids.filter<LocalCompressedId>((id): id is LocalCompressedId => isLocalId(id));\n\t\tfinals = ids.filter((id) => isFinalId(id)) as FinalCompressedId[];\n\t\tlocalChoices = [];\n\t\tfinalChoices = [];\n\t\tfor (let i = 0; i < choiceCount; i++) {\n\t\t\tlocalChoices.push(rand.pick(locals));\n\t\t\tfinalChoices.push(rand.pick(finals));\n\t\t}\n\t};\n\n\tlet localChoice = 0;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a local ID to a final ID`,\n\t\tbefore,\n\t\tbenchmarkFn: () => {\n\t\t\tnormalizer.getFinalId(localChoices[localChoice++ % localChoices.length]);\n\t\t},\n\t});\n\n\tlet finalChoice = 0;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a final ID to session space`,\n\t\tbefore,\n\t\tbenchmarkFn: () => {\n\t\t\tnormalizer.getSessionSpaceId(finalChoices[finalChoice++ % finalChoices.length]);\n\t\t},\n\t});\n});\n\nfunction itWithNormalizer(title: string, itFn: (normalizer: SessionIdNormalizer<DummyRange>) => void): void {\n\tit(title, () => {\n\t\tconst locals: (LocalCompressedId | undefined)[] = [];\n\t\tconst finals: (FinalCompressedId | undefined)[] = [];\n\t\tconst normalizer: SessionIdNormalizer<DummyRange> = makeNormalizerProxy(makeTestNormalizer(), locals, finals);\n\n\t\titFn(normalizer);\n\t\tconst allIds = [...normalizer];\n\t\tlet prevLocal: LocalCompressedId | undefined;\n\t\tlet prevFinal: FinalCompressedId | undefined;\n\t\tfor (let i = 0; i < locals.length && i < finals.length; i++) {\n\t\t\tconst localExpected = locals[i];\n\t\t\tconst finalExpected = finals[i];\n\t\t\t// local can be undefined in the case of eager final\n\t\t\t// final can be undefined in the case of trailing locals with no cluster\n\t\t\t// both should never occur\n\t\t\tassert(\n\t\t\t\t(localExpected !== undefined && isLocalId(localExpected)) ||\n\t\t\t\t\t(finalExpected !== undefined && isFinalId(finalExpected)),\n\t\t\t\t'Test error.'\n\t\t\t);\n\t\t\tif (prevFinal !== undefined && finalExpected !== undefined) {\n\t\t\t\tassert(finalExpected > prevFinal, 'Test error.');\n\t\t\t}\n\t\t\tif (prevLocal !== undefined && localExpected !== undefined) {\n\t\t\t\tassert(localExpected < prevLocal, 'Test error.');\n\t\t\t}\n\t\t\tprevLocal = localExpected;\n\t\t\tprevFinal = finalExpected;\n\n\t\t\tconst sessionIdExpected = localExpected === undefined ? finalExpected : localExpected;\n\t\t\tconst sessionIdActualAll = allIds[i];\n\t\t\tconst sessionIdActualNormalized =\n\t\t\t\tfinalExpected === undefined ? localExpected : normalizer.getSessionSpaceId(finalExpected);\n\n\t\t\tif (finalExpected !== undefined) {\n\t\t\t\tconst creationIndex = normalizer.getCreationIndex(finalExpected);\n\t\t\t\texpect(creationIndex).to.equal(i);\n\t\t\t}\n\n\t\t\tconst idByIndex = normalizer.getIdByCreationIndex(i);\n\t\t\texpect(idByIndex).to.equal(localExpected ?? finalExpected);\n\n\t\t\tif (localExpected !== undefined) {\n\t\t\t\tconst normalized = normalizer.getFinalId(localExpected);\n\t\t\t\tif (normalized === undefined) {\n\t\t\t\t\texpect(finalExpected).to.be.undefined;\n\t\t\t\t} else {\n\t\t\t\t\tconst [opIdActualNormalized] = normalized;\n\t\t\t\t\texpect(opIdActualNormalized).to.equal(finalExpected);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(sessionIdExpected).to.equal(sessionIdActualAll);\n\t\t\texpect(sessionIdActualAll).to.equal(sessionIdActualNormalized);\n\t\t}\n\t\texpect(normalizer.getLastFinalId()).to.equal(finals[finals.length - 1]);\n\t\tconst roundtripped = SessionIdNormalizer.deserialize(normalizer.serialize(), () => undefined);\n\t\texpect(roundtripped.equals(normalizer)).to.be.true;\n\t});\n}\n\nfunction makeNormalizerProxy(\n\tnormalizer: SessionIdNormalizer<DummyRange>,\n\tlocals: (LocalCompressedId | undefined)[],\n\tfinals: (FinalCompressedId | undefined)[]\n): SessionIdNormalizer<DummyRange> {\n\treturn new Proxy<SessionIdNormalizer<DummyRange>>(normalizer, {\n\t\tget(target, property: keyof SessionIdNormalizer<DummyRange>) {\n\t\t\tif (typeof target[property] === 'function') {\n\t\t\t\tif (property === 'addLocalId') {\n\t\t\t\t\treturn new Proxy(target[property], {\n\t\t\t\t\t\tapply: (func, thisArg, argumentsList) => {\n\t\t\t\t\t\t\tconst local = Reflect.apply(func, thisArg, argumentsList);\n\t\t\t\t\t\t\tif (locals.length > 0) {\n\t\t\t\t\t\t\t\tfor (let i = (locals[locals.length - 1] ?? fail()) - 1; i > local; i--) {\n\t\t\t\t\t\t\t\t\tlocals.push(undefined);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlocals.push(local);\n\t\t\t\t\t\t\treturn local;\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (property === 'addFinalIds') {\n\t\t\t\t\treturn new Proxy(target[property], {\n\t\t\t\t\t\tapply: (func, thisArg, argumentsList) => {\n\t\t\t\t\t\t\tconst firstFinal: FinalCompressedId = argumentsList[0];\n\t\t\t\t\t\t\tconst lastFinal: FinalCompressedId = argumentsList[1];\n\t\t\t\t\t\t\tfor (let i = firstFinal; i <= lastFinal; i++) {\n\t\t\t\t\t\t\t\tfinals.push(i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn Reflect.apply(func, thisArg, argumentsList);\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\treturn Reflect.get(target, property);\n\t\t},\n\t});\n}\n\ntype DummyRange = undefined;\nconst dummy: DummyRange = undefined;\n\nfunction final(num: number): FinalCompressedId {\n\tassert(num >= 0);\n\treturn num as FinalCompressedId;\n}\n\nfunction makeTestNormalizer(): SessionIdNormalizer<DummyRange> {\n\treturn new SessionIdNormalizer<DummyRange>(true);\n}\n\ninterface AddLocalId {\n\ttype: 'addLocalId';\n}\n\ninterface AddFinalIds {\n\ttype: 'addFinalIds';\n\tfirst: FinalCompressedId;\n\tlast: FinalCompressedId;\n}\n\ntype Operation = AddLocalId | AddFinalIds;\n\ninterface FuzzTestState extends BaseFuzzTestState {\n\tnormalizer: SessionIdNormalizer<DummyRange>;\n\tprevWasLocal: boolean;\n\tcurrentLocal: number;\n\tcurrentFinal: number;\n\tlocals: (LocalCompressedId | undefined)[];\n\tfinals: (FinalCompressedId | undefined)[];\n}\n\nfunction makeOpGenerator(numOperations: number): Generator<Operation, FuzzTestState> {\n\tfunction addLocalIdGenerator(state: FuzzTestState): AddLocalId {\n\t\tconst { locals, finals, random } = state;\n\t\tstate.currentLocal =\n\t\t\tlocals.length < finals.length && random.bool()\n\t\t\t\t? -locals.length - (finals.length - locals.length) - 1\n\t\t\t\t: -locals.length - 1;\n\t\tstate.prevWasLocal = true;\n\t\treturn { type: 'addLocalId' };\n\t}\n\n\tfunction addFinalIdsGenerator(state: FuzzTestState): AddFinalIds {\n\t\tconst { locals, finals, random } = state;\n\t\tif (state.prevWasLocal && locals.length > finals.length && random.integer(1, 3) === 3) {\n\t\t\tstate.currentFinal += random.integer(1, 4);\n\t\t}\n\t\tconst lastFinal = state.currentFinal + random.integer(0, 10);\n\t\tconst addFinal: AddFinalIds = { type: 'addFinalIds', first: final(state.currentFinal), last: final(lastFinal) };\n\t\tstate.currentFinal = lastFinal + 1;\n\t\tstate.prevWasLocal = false;\n\t\treturn addFinal;\n\t}\n\n\treturn chain(\n\t\tgeneratorFromArray([{ type: 'addLocalId' }]),\n\t\ttake(\n\t\t\tnumOperations - 1,\n\t\t\tcreateWeightedGenerator<Operation, FuzzTestState>([\n\t\t\t\t[addLocalIdGenerator, 8],\n\t\t\t\t[addFinalIdsGenerator, 2],\n\t\t\t])\n\t\t)\n\t);\n}\n\nfunction fuzzNormalizer(\n\tnormalizerToFuzz: SessionIdNormalizer<DummyRange>,\n\tnumOperations: number,\n\tseed: number\n): Random {\n\tconst locals: (LocalCompressedId | undefined)[] = [];\n\tconst finals: (FinalCompressedId | undefined)[] = [];\n\tconst normalizer: SessionIdNormalizer<DummyRange> = makeNormalizerProxy(normalizerToFuzz, locals, finals);\n\n\tconst initialState: FuzzTestState = {\n\t\trandom: makeRandom(seed),\n\t\tcurrentLocal: -1,\n\t\tcurrentFinal: 0,\n\t\tprevWasLocal: false,\n\t\tnormalizer,\n\t\tlocals,\n\t\tfinals,\n\t};\n\n\tperformFuzzActions(\n\t\tmakeOpGenerator(numOperations),\n\t\t{\n\t\t\taddLocalId: (state) => {\n\t\t\t\tstate.normalizer.addLocalId();\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\taddFinalIds: (state, { first, last }) => {\n\t\t\t\tstate.normalizer.addFinalIds(first, last, undefined);\n\t\t\t\treturn state;\n\t\t\t},\n\t\t},\n\t\tinitialState\n\t);\n\treturn initialState.random;\n}\n"]}
1
+ {"version":3,"file":"SessionIdNormalizer.tests.js","sourceRoot":"","sources":["../../src/test/SessionIdNormalizer.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 { benchmark, BenchmarkType } from '@fluid-tools/benchmark';\nimport { expect } from 'chai';\nimport {\n\tBaseFuzzTestState,\n\tchain,\n\tcreateWeightedGenerator,\n\tGenerator,\n\tgeneratorFromArray,\n\tIRandom,\n\tperformFuzzActions,\n\ttake,\n\tmakeRandom,\n} from '@fluid-internal/stochastic-test-utils';\nimport { assert, fail } from '../Common';\nimport { isFinalId, isLocalId } from '../id-compressor';\nimport { SessionIdNormalizer } from '../id-compressor/SessionIdNormalizer';\nimport { FinalCompressedId, LocalCompressedId, SessionSpaceCompressedId } from '../Identifiers';\n\ndescribe('SessionIdNormalizer', () => {\n\tit('fails when adding finals with no corresponding locals', () => {\n\t\tconst normalizer = makeTestNormalizer();\n\t\texpect(() => normalizer.addFinalIds(final(0), final(1), undefined)).to.throw(\n\t\t\t'Final IDs must be added to an existing local range.'\n\t\t);\n\t});\n\n\tit('fails when adding finals out of order', () => {\n\t\tconst normalizer = makeTestNormalizer();\n\t\tnormalizer.addLocalId();\n\t\texpect(() => normalizer.addFinalIds(final(1), final(0), undefined)).to.throw('Malformed normalization range.');\n\t});\n\n\tit('fails when gaps in finals do not align with a local', () => {\n\t\t/**\n\t\t * Locals: [-1, -2, X, -4]\n\t\t * Finals: [ 0, 1, 2, 5]\n\t\t * Calling `addFinalIds` with first === last === 9 results in the following:\n\t\t * Locals: [-1, -2, X, -4, X]\n\t\t * Finals: [ 0, 1, 2, 5, 9]\n\t\t *\n\t\t * ^should fail\n\t\t */\n\t\tconst normalizer = makeTestNormalizer();\n\t\tnormalizer.addLocalId(); // -1\n\t\tnormalizer.addLocalId(); // -2\n\t\tnormalizer.addFinalIds(final(0), final(2), undefined);\n\t\tnormalizer.addLocalId(); // -4\n\t\tnormalizer.addFinalIds(final(5), final(5), undefined);\n\t\texpect(() => normalizer.addFinalIds(final(9), final(9), undefined)).to.throw(\n\t\t\t'Gaps in final space must align to a local.'\n\t\t);\n\t});\n\n\tit('fails when attempting to normalize a local ID that was never registered', () => {\n\t\tconst normalizer = makeTestNormalizer();\n\t\texpect(() => normalizer.getFinalId(-1 as LocalCompressedId)).to.throw(\n\t\t\t'Local ID was never recorded with this normalizer.'\n\t\t);\n\t\tconst local = normalizer.addLocalId();\n\t\tconst secondLocal = (local - 1) as LocalCompressedId;\n\t\texpect(() => normalizer.getFinalId(secondLocal)).to.throw('Local ID was never recorded with this normalizer.');\n\t\tnormalizer.addFinalIds(final(0), final(5), undefined);\n\t\texpect(() => normalizer.getFinalId(secondLocal)).to.throw('Local ID was never recorded with this normalizer.');\n\t});\n\n\titWithNormalizer('can normalize IDs with only local forms', (normalizer) => {\n\t\tconst local1 = normalizer.addLocalId();\n\t\tconst local2 = normalizer.addLocalId();\n\t\tconst local3 = normalizer.addLocalId();\n\t\tconst local4 = normalizer.addLocalId();\n\t\texpect(local1).to.equal(-1);\n\t\texpect(local2).to.equal(-2);\n\t\texpect(local3).to.equal(-3);\n\t\texpect(local4).to.equal(-4);\n\t});\n\n\titWithNormalizer('can normalize IDs with trailing finals', (normalizer) => {\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\tnormalizer.addFinalIds(final(2), final(3), undefined);\n\t\tnormalizer.addFinalIds(final(4), final(10), undefined);\n\t});\n\n\titWithNormalizer('can normalize IDs with trailing locals', (normalizer) => {\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addLocalId();\n\t});\n\n\titWithNormalizer('can normalize IDs with a gap in final space', (normalizer) => {\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addLocalId();\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\tnormalizer.addFinalIds(final(10), final(11), undefined);\n\t});\n\n\titWithNormalizer('can normalize IDs with and without corresponding local forms', (normalizer) => {\n\t\tnormalizer.addLocalId(); // -1\n\t\tnormalizer.addLocalId(); // -2\n\t\tnormalizer.addLocalId(); // -3\n\t\tnormalizer.addFinalIds(final(0), final(3), dummy);\n\t\tnormalizer.addLocalId(); // -5\n\t\tnormalizer.addLocalId(); // -6\n\t\tnormalizer.addFinalIds(final(4), final(5), dummy);\n\t\tnormalizer.addLocalId(); // -7\n\t\tnormalizer.addFinalIds(final(8), final(9), dummy);\n\t\tnormalizer.addLocalId(); // -9\n\t\tnormalizer.addFinalIds(final(14), final(15), dummy);\n\t\tnormalizer.addLocalId(); // -11\n\t\tnormalizer.addLocalId(); // -12\n\t});\n\n\titWithNormalizer('can get the last final ID', (normalizer) => {\n\t\tnormalizer.addLocalId(); // -1\n\t\tnormalizer.addLocalId(); // -2\n\t\tnormalizer.addLocalId(); // -3\n\t\tnormalizer.addLocalId(); // -4\n\t\texpect(normalizer.getLastFinalId()).to.be.undefined;\n\t\tnormalizer.addFinalIds(final(0), final(1), undefined);\n\t\texpect(normalizer.getLastFinalId()).to.equal(1);\n\t\tnormalizer.addFinalIds(final(2), final(2), undefined);\n\t\texpect(normalizer.getLastFinalId()).to.equal(2);\n\t\tnormalizer.addFinalIds(final(10), final(15), undefined);\n\t\texpect(normalizer.getLastFinalId()).to.equal(15);\n\t});\n\n\titWithNormalizer('can normalize IDs after fuzzed inputs', (normalizer) => {\n\t\tfuzzNormalizer(normalizer, 1000, 42);\n\t});\n});\n\ndescribe('SessionIdNormalizer Perf', () => {\n\tconst choiceCount = 1000;\n\tconst type = BenchmarkType.Measurement;\n\tlet normalizer: SessionIdNormalizer<DummyRange>;\n\tlet rand: IRandom;\n\tlet ids: SessionSpaceCompressedId[];\n\tlet finals: FinalCompressedId[];\n\tlet locals: LocalCompressedId[];\n\tlet localChoices: LocalCompressedId[];\n\tlet finalChoices: FinalCompressedId[];\n\tconst before = () => {\n\t\tnormalizer = new SessionIdNormalizer();\n\t\trand = fuzzNormalizer(normalizer, 10000, 3.14);\n\t\tids = [...normalizer];\n\t\tlocals = ids.filter<LocalCompressedId>((id): id is LocalCompressedId => isLocalId(id));\n\t\tfinals = ids.filter((id) => isFinalId(id)) as FinalCompressedId[];\n\t\tlocalChoices = [];\n\t\tfinalChoices = [];\n\t\tfor (let i = 0; i < choiceCount; i++) {\n\t\t\tlocalChoices.push(rand.pick(locals));\n\t\t\tfinalChoices.push(rand.pick(finals));\n\t\t}\n\t};\n\n\tlet localChoice = 0;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a local ID to a final ID`,\n\t\tbefore,\n\t\tbenchmarkFn: () => {\n\t\t\tnormalizer.getFinalId(localChoices[localChoice++ % localChoices.length]);\n\t\t},\n\t});\n\n\tlet finalChoice = 0;\n\tbenchmark({\n\t\ttype,\n\t\ttitle: `normalize a final ID to session space`,\n\t\tbefore,\n\t\tbenchmarkFn: () => {\n\t\t\tnormalizer.getSessionSpaceId(finalChoices[finalChoice++ % finalChoices.length]);\n\t\t},\n\t});\n});\n\nfunction itWithNormalizer(title: string, itFn: (normalizer: SessionIdNormalizer<DummyRange>) => void): void {\n\tit(title, () => {\n\t\tconst locals: (LocalCompressedId | undefined)[] = [];\n\t\tconst finals: (FinalCompressedId | undefined)[] = [];\n\t\tconst normalizer: SessionIdNormalizer<DummyRange> = makeNormalizerProxy(makeTestNormalizer(), locals, finals);\n\n\t\titFn(normalizer);\n\t\tconst allIds = [...normalizer];\n\t\tlet prevLocal: LocalCompressedId | undefined;\n\t\tlet prevFinal: FinalCompressedId | undefined;\n\t\tfor (let i = 0; i < locals.length && i < finals.length; i++) {\n\t\t\tconst localExpected = locals[i];\n\t\t\tconst finalExpected = finals[i];\n\t\t\t// local can be undefined in the case of eager final\n\t\t\t// final can be undefined in the case of trailing locals with no cluster\n\t\t\t// both should never occur\n\t\t\tassert(\n\t\t\t\t(localExpected !== undefined && isLocalId(localExpected)) ||\n\t\t\t\t\t(finalExpected !== undefined && isFinalId(finalExpected)),\n\t\t\t\t'Test error.'\n\t\t\t);\n\t\t\tif (prevFinal !== undefined && finalExpected !== undefined) {\n\t\t\t\tassert(finalExpected > prevFinal, 'Test error.');\n\t\t\t}\n\t\t\tif (prevLocal !== undefined && localExpected !== undefined) {\n\t\t\t\tassert(localExpected < prevLocal, 'Test error.');\n\t\t\t}\n\t\t\tprevLocal = localExpected;\n\t\t\tprevFinal = finalExpected;\n\n\t\t\tconst sessionIdExpected = localExpected === undefined ? finalExpected : localExpected;\n\t\t\tconst sessionIdActualAll = allIds[i];\n\t\t\tconst sessionIdActualNormalized =\n\t\t\t\tfinalExpected === undefined ? localExpected : normalizer.getSessionSpaceId(finalExpected);\n\n\t\t\tif (finalExpected !== undefined) {\n\t\t\t\tconst creationIndex = normalizer.getCreationIndex(finalExpected);\n\t\t\t\texpect(creationIndex).to.equal(i);\n\t\t\t}\n\n\t\t\tconst idByIndex = normalizer.getIdByCreationIndex(i);\n\t\t\texpect(idByIndex).to.equal(localExpected ?? finalExpected);\n\n\t\t\tif (localExpected !== undefined) {\n\t\t\t\tconst normalized = normalizer.getFinalId(localExpected);\n\t\t\t\tif (normalized === undefined) {\n\t\t\t\t\texpect(finalExpected).to.be.undefined;\n\t\t\t\t} else {\n\t\t\t\t\tconst [opIdActualNormalized] = normalized;\n\t\t\t\t\texpect(opIdActualNormalized).to.equal(finalExpected);\n\t\t\t\t}\n\t\t\t}\n\t\t\texpect(sessionIdExpected).to.equal(sessionIdActualAll);\n\t\t\texpect(sessionIdActualAll).to.equal(sessionIdActualNormalized);\n\t\t}\n\t\texpect(normalizer.getLastFinalId()).to.equal(finals[finals.length - 1]);\n\t\tconst roundtripped = SessionIdNormalizer.deserialize(normalizer.serialize(), () => undefined);\n\t\texpect(roundtripped.equals(normalizer)).to.be.true;\n\t});\n}\n\nfunction makeNormalizerProxy(\n\tnormalizer: SessionIdNormalizer<DummyRange>,\n\tlocals: (LocalCompressedId | undefined)[],\n\tfinals: (FinalCompressedId | undefined)[]\n): SessionIdNormalizer<DummyRange> {\n\treturn new Proxy<SessionIdNormalizer<DummyRange>>(normalizer, {\n\t\tget(target, property: keyof SessionIdNormalizer<DummyRange>) {\n\t\t\tif (typeof target[property] === 'function') {\n\t\t\t\tif (property === 'addLocalId') {\n\t\t\t\t\treturn new Proxy(target[property], {\n\t\t\t\t\t\tapply: (func, thisArg, argumentsList) => {\n\t\t\t\t\t\t\tconst local = Reflect.apply(func, thisArg, argumentsList);\n\t\t\t\t\t\t\tif (locals.length > 0) {\n\t\t\t\t\t\t\t\tfor (let i = (locals[locals.length - 1] ?? fail()) - 1; i > local; i--) {\n\t\t\t\t\t\t\t\t\tlocals.push(undefined);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlocals.push(local);\n\t\t\t\t\t\t\treturn local;\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} else if (property === 'addFinalIds') {\n\t\t\t\t\treturn new Proxy(target[property], {\n\t\t\t\t\t\tapply: (func, thisArg, argumentsList) => {\n\t\t\t\t\t\t\tconst firstFinal: FinalCompressedId = argumentsList[0];\n\t\t\t\t\t\t\tconst lastFinal: FinalCompressedId = argumentsList[1];\n\t\t\t\t\t\t\tfor (let i = firstFinal; i <= lastFinal; i++) {\n\t\t\t\t\t\t\t\tfinals.push(i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn Reflect.apply(func, thisArg, argumentsList);\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\treturn Reflect.get(target, property);\n\t\t},\n\t});\n}\n\ntype DummyRange = undefined;\nconst dummy: DummyRange = undefined;\n\nfunction final(num: number): FinalCompressedId {\n\tassert(num >= 0);\n\treturn num as FinalCompressedId;\n}\n\nfunction makeTestNormalizer(): SessionIdNormalizer<DummyRange> {\n\treturn new SessionIdNormalizer<DummyRange>(true);\n}\n\ninterface AddLocalId {\n\ttype: 'addLocalId';\n}\n\ninterface AddFinalIds {\n\ttype: 'addFinalIds';\n\tfirst: FinalCompressedId;\n\tlast: FinalCompressedId;\n}\n\ntype Operation = AddLocalId | AddFinalIds;\n\ninterface FuzzTestState extends BaseFuzzTestState {\n\tnormalizer: SessionIdNormalizer<DummyRange>;\n\tprevWasLocal: boolean;\n\tcurrentLocal: number;\n\tcurrentFinal: number;\n\tlocals: (LocalCompressedId | undefined)[];\n\tfinals: (FinalCompressedId | undefined)[];\n}\n\nfunction makeOpGenerator(numOperations: number): Generator<Operation, FuzzTestState> {\n\tfunction addLocalIdGenerator(state: FuzzTestState): AddLocalId {\n\t\tconst { locals, finals, random } = state;\n\t\tstate.currentLocal =\n\t\t\tlocals.length < finals.length && random.bool()\n\t\t\t\t? -locals.length - (finals.length - locals.length) - 1\n\t\t\t\t: -locals.length - 1;\n\t\tstate.prevWasLocal = true;\n\t\treturn { type: 'addLocalId' };\n\t}\n\n\tfunction addFinalIdsGenerator(state: FuzzTestState): AddFinalIds {\n\t\tconst { locals, finals, random } = state;\n\t\tif (state.prevWasLocal && locals.length > finals.length && random.integer(1, 3) === 3) {\n\t\t\tstate.currentFinal += random.integer(1, 4);\n\t\t}\n\t\tconst lastFinal = state.currentFinal + random.integer(0, 10);\n\t\tconst addFinal: AddFinalIds = { type: 'addFinalIds', first: final(state.currentFinal), last: final(lastFinal) };\n\t\tstate.currentFinal = lastFinal + 1;\n\t\tstate.prevWasLocal = false;\n\t\treturn addFinal;\n\t}\n\n\treturn chain(\n\t\tgeneratorFromArray([{ type: 'addLocalId' }]),\n\t\ttake(\n\t\t\tnumOperations - 1,\n\t\t\tcreateWeightedGenerator<Operation, FuzzTestState>([\n\t\t\t\t[addLocalIdGenerator, 8],\n\t\t\t\t[addFinalIdsGenerator, 2],\n\t\t\t])\n\t\t)\n\t);\n}\n\nfunction fuzzNormalizer(\n\tnormalizerToFuzz: SessionIdNormalizer<DummyRange>,\n\tnumOperations: number,\n\tseed: number\n): IRandom {\n\tconst locals: (LocalCompressedId | undefined)[] = [];\n\tconst finals: (FinalCompressedId | undefined)[] = [];\n\tconst normalizer: SessionIdNormalizer<DummyRange> = makeNormalizerProxy(normalizerToFuzz, locals, finals);\n\n\tconst initialState: FuzzTestState = {\n\t\trandom: makeRandom(seed),\n\t\tcurrentLocal: -1,\n\t\tcurrentFinal: 0,\n\t\tprevWasLocal: false,\n\t\tnormalizer,\n\t\tlocals,\n\t\tfinals,\n\t};\n\n\tperformFuzzActions(\n\t\tmakeOpGenerator(numOperations),\n\t\t{\n\t\t\taddLocalId: (state) => {\n\t\t\t\tstate.normalizer.addLocalId();\n\t\t\t\treturn state;\n\t\t\t},\n\t\t\taddFinalIds: (state, { first, last }) => {\n\t\t\t\tstate.normalizer.addFinalIds(first, last, undefined);\n\t\t\t\treturn state;\n\t\t\t},\n\t\t},\n\t\tinitialState\n\t);\n\treturn initialState.random;\n}\n"]}
@@ -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;AAgXjB,wBAAgB,eAAe,CAAC,YAAY,EAAE,yBAAyB,GAAG,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CA4BjH"}
1
+ {"version":3,"file":"Generators.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/Generators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAEN,cAAc,EAMd,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"}
@@ -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 = (\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
+ {"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 { IsoBuffer } from '@fluidframework/common-utils';\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport {\n\tAcceptanceCondition,\n\tAsyncGenerator,\n\tAsyncWeights,\n\tIRandom,\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: IRandom\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;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"}
1
+ {"version":3,"file":"SharedTreeFuzzTests.d.ts","sourceRoot":"","sources":["../../../src/test/fuzz/SharedTreeFuzzTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACN,cAAc,EAMd,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,CAiI1D"}
@@ -5,7 +5,7 @@
5
5
  import { existsSync, mkdirSync } from 'fs';
6
6
  import { join } from 'path';
7
7
  import { expect } from 'chai';
8
- import { chainAsync as chain, makeRandom, takeAsync as take, performFuzzActionsAsync as performFuzzActionsBase, } from '@fluid-internal/stochastic-test-utils';
8
+ import { chainAsync as chain, describeFuzz, makeRandom, takeAsync as take, performFuzzActionsAsync as performFuzzActionsBase, } from '@fluid-internal/stochastic-test-utils';
9
9
  import { setUpLocalServerTestSharedTree, testDocumentsPathBase, withContainerOffline, } from '../utilities/TestUtilities';
10
10
  import { WriteFormat } from '../../persisted-types';
11
11
  import { fail } from '../../Common';
@@ -137,7 +137,7 @@ export function runSharedTreeFuzzTests(title) {
137
137
  // Some useful tips for debugging fuzz tests:
138
138
  // - A JSON dump of the operation sequence can be written to disk by passing `true` for `saveOnFailure`.
139
139
  // - Different shared-tree instances can be distinguished (e.g. in logs) by using `tree.getRuntime().clientId`
140
- describe(title, () => {
140
+ describeFuzz(title, ({ testCount }) => {
141
141
  function runTest(generatorFactory, seed, saveOnFailure) {
142
142
  it(`with seed ${seed}`, async () => {
143
143
  const saveInfo = saveOnFailure !== undefined
@@ -211,7 +211,6 @@ export function runSharedTreeFuzzTests(title) {
211
211
  }
212
212
  });
213
213
  }
214
- const testCount = 1;
215
214
  const testLength = 200;
216
215
  describe('with no-history summarization', () => {
217
216
  runMixedVersionTests(false, testCount, testLength);
@@ -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 {\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"]}
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\tdescribeFuzz,\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\tdescribeFuzz(title, ({ testCount }) => {\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 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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MockTransaction.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/MockTransaction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACN,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,EAExB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,yBAAiB,eAAe,CAAC;IAChC,UAAiB,OAAO;QACvB,aAAa,EAAE,UAAU,CAAC;KAC1B;IAEM,MAAM,cAAc,EAAE,OAE5B,CAAC;IAEF;;;;OAIG;IACH,SAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,GAAE,OAAwB,GAAG,kBAAkB,CAEjG;IAED;;;OAGG;IACH,MAAa,MAAO,YAAW,wBAAwB;QAC/C,OAAO,EAAE,OAAO,CAAC;oBAEL,OAAO,EAAE,OAAO;QAI5B,gBAAgB,CAAC,MAAM,KAAA,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC;QAI3E,eAAe,CAAC,KAAK,KAAA,GAAG,YAAY;QASpC,cAAc,CAAC,KAAK,KAAA,GAAG,YAAY;KAG1C;CACD"}
1
+ {"version":3,"file":"MockTransaction.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/MockTransaction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACN,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,EAExB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AAEH,yBAAiB,eAAe,CAAC;IAChC,UAAiB,OAAO;QACvB,aAAa,EAAE,UAAU,CAAC;KAC1B;IAEM,MAAM,cAAc,EAAE,OAE5B,CAAC;IAEF;;;;OAIG;IACH,SAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,GAAE,OAAwB,GAAG,kBAAkB,CAEjG;IAED;;;OAGG;IACH,MAAa,MAAO,YAAW,wBAAwB;QAC/C,OAAO,EAAE,OAAO,CAAC;oBAEL,OAAO,EAAE,OAAO;QAI5B,gBAAgB,CAAC,MAAM,KAAA,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC;QAI3E,eAAe,CAAC,KAAK,KAAA,GAAG,YAAY;QASpC,cAAc,CAAC,KAAK,KAAA,GAAG,YAAY;KAG1C;CACD"}
@@ -8,6 +8,7 @@ import { GenericTransaction, } from '../../TransactionInternal';
8
8
  /**
9
9
  * @internal
10
10
  */
11
+ // eslint-disable-next-line @typescript-eslint/no-namespace
11
12
  export var MockTransaction;
12
13
  (function (MockTransaction) {
13
14
  MockTransaction.defaultOptions = {
@@ -1 +1 @@
1
- {"version":3,"file":"MockTransaction.js","sourceRoot":"","sources":["../../../src/test/utilities/MockTransaction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAkB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAEN,kBAAkB,GAGlB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,KAAW,eAAe,CA8C/B;AA9CD,WAAiB,eAAe;IAKlB,8BAAc,GAAY;QACtC,aAAa,EAAE,UAAU,CAAC,OAAO;KACjC,CAAC;IAEF;;;;OAIG;IACH,SAAgB,OAAO,CAAC,IAAkB,EAAE,UAAmB,gBAAA,cAAc;QAC5E,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAFe,uBAAO,UAEtB,CAAA;IAED;;;OAGG;IACH,MAAa,MAAM;QAGlB,YAAmB,OAAgB;YAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,CAAC;QAEM,gBAAgB,CAAC,MAAM,EAAE,MAAsB;YACrD,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAEM,eAAe,CAAC,KAAK;YAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,UAAU,CAAC,OAAO;gBACvD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;gBACvB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBACb,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;oBAClC,OAAO,EAAE,SAAmD;iBAC3D,CAAC,CAAC;QACP,CAAC;QAEM,cAAc,CAAC,KAAK;YAC1B,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;KACD;IAvBY,sBAAM,SAuBlB,CAAA;AACF,CAAC,EA9CgB,eAAe,KAAf,eAAe,QA8C/B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Result } from '../../Common';\nimport { ChangeInternal, EditStatus } from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport {\n\tChangeResult,\n\tGenericTransaction,\n\tGenericTransactionPolicy,\n\tTransactionInternal,\n} from '../../TransactionInternal';\n\n/**\n * @internal\n */\nexport namespace MockTransaction {\n\texport interface Options {\n\t\tstatusOnClose: EditStatus;\n\t}\n\n\texport const defaultOptions: Options = {\n\t\tstatusOnClose: EditStatus.Applied,\n\t};\n\n\t/**\n\t * Makes a new {@link GenericTransaction} that follows the {@link MockTransaction.Policy} policy.\n\t *\n\t * @internal\n\t */\n\texport function factory(view: RevisionView, options: Options = defaultOptions): GenericTransaction {\n\t\treturn new GenericTransaction(view, new Policy(options));\n\t}\n\n\t/**\n\t * A mock implementation of `GenericTransaction` for use in tests.\n\t * @internal\n\t */\n\texport class Policy implements GenericTransactionPolicy {\n\t\tpublic options: Options;\n\n\t\tpublic constructor(options: Options) {\n\t\t\tthis.options = options;\n\t\t}\n\n\t\tpublic tryResolveChange(_state, change: ChangeInternal): Result.Ok<ChangeInternal> {\n\t\t\treturn Result.ok(change);\n\t\t}\n\n\t\tpublic validateOnClose(state): ChangeResult {\n\t\t\treturn this.options.statusOnClose === EditStatus.Applied\n\t\t\t\t? Result.ok(state.view)\n\t\t\t\t: Result.error({\n\t\t\t\t\t\tstatus: this.options.statusOnClose,\n\t\t\t\t\t\tfailure: undefined as unknown as TransactionInternal.Failure,\n\t\t\t\t });\n\t\t}\n\n\t\tpublic dispatchChange(state): ChangeResult {\n\t\t\treturn Result.ok(state.view);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"MockTransaction.js","sourceRoot":"","sources":["../../../src/test/utilities/MockTransaction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAkB,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAEN,kBAAkB,GAGlB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,2DAA2D;AAC3D,MAAM,KAAW,eAAe,CA8C/B;AA9CD,WAAiB,eAAe;IAKlB,8BAAc,GAAY;QACtC,aAAa,EAAE,UAAU,CAAC,OAAO;KACjC,CAAC;IAEF;;;;OAIG;IACH,SAAgB,OAAO,CAAC,IAAkB,EAAE,UAAmB,gBAAA,cAAc;QAC5E,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAFe,uBAAO,UAEtB,CAAA;IAED;;;OAGG;IACH,MAAa,MAAM;QAGlB,YAAmB,OAAgB;YAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,CAAC;QAEM,gBAAgB,CAAC,MAAM,EAAE,MAAsB;YACrD,OAAO,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAEM,eAAe,CAAC,KAAK;YAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,KAAK,UAAU,CAAC,OAAO;gBACvD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;gBACvB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBACb,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;oBAClC,OAAO,EAAE,SAAmD;iBAC3D,CAAC,CAAC;QACP,CAAC;QAEM,cAAc,CAAC,KAAK;YAC1B,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;KACD;IAvBY,sBAAM,SAuBlB,CAAA;AACF,CAAC,EA9CgB,eAAe,KAAf,eAAe,QA8C/B","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Result } from '../../Common';\nimport { ChangeInternal, EditStatus } from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport {\n\tChangeResult,\n\tGenericTransaction,\n\tGenericTransactionPolicy,\n\tTransactionInternal,\n} from '../../TransactionInternal';\n\n/**\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace MockTransaction {\n\texport interface Options {\n\t\tstatusOnClose: EditStatus;\n\t}\n\n\texport const defaultOptions: Options = {\n\t\tstatusOnClose: EditStatus.Applied,\n\t};\n\n\t/**\n\t * Makes a new {@link GenericTransaction} that follows the {@link MockTransaction.Policy} policy.\n\t *\n\t * @internal\n\t */\n\texport function factory(view: RevisionView, options: Options = defaultOptions): GenericTransaction {\n\t\treturn new GenericTransaction(view, new Policy(options));\n\t}\n\n\t/**\n\t * A mock implementation of `GenericTransaction` for use in tests.\n\t * @internal\n\t */\n\texport class Policy implements GenericTransactionPolicy {\n\t\tpublic options: Options;\n\n\t\tpublic constructor(options: Options) {\n\t\t\tthis.options = options;\n\t\t}\n\n\t\tpublic tryResolveChange(_state, change: ChangeInternal): Result.Ok<ChangeInternal> {\n\t\t\treturn Result.ok(change);\n\t\t}\n\n\t\tpublic validateOnClose(state): ChangeResult {\n\t\t\treturn this.options.statusOnClose === EditStatus.Applied\n\t\t\t\t? Result.ok(state.view)\n\t\t\t\t: Result.error({\n\t\t\t\t\t\tstatus: this.options.statusOnClose,\n\t\t\t\t\t\tfailure: undefined as unknown as TransactionInternal.Failure,\n\t\t\t\t });\n\t\t}\n\n\t\tpublic dispatchChange(state): ChangeResult {\n\t\t\treturn Result.ok(state.view);\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"SharedTreeTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAeN,WAAW,EACX,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAGN,2BAA2B,EAC3B,wBAAwB,EAcxB,MAAM,iBAAiB,CAAC;AAazB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,qCAAqC,EAAE,CAAC,OAAO,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,QA0/C1G"}
1
+ {"version":3,"file":"SharedTreeTests.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/SharedTreeTests.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAeN,WAAW,EACX,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAGN,2BAA2B,EAC3B,wBAAwB,EAcxB,MAAM,iBAAiB,CAAC;AAazB;;;GAGG;AACH,wBAAgB,4BAA4B,CAC3C,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,EACxB,qCAAqC,EAAE,CAAC,OAAO,CAAC,EAAE,wBAAwB,KAAK,2BAA2B,QA8gD1G"}
@@ -685,12 +685,23 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
685
685
  });
686
686
  });
687
687
  describe('telemetry', () => {
688
+ class LoggerThatOnlySeesSharedTreeEvents {
689
+ constructor(additionalFilter = (e) => true) {
690
+ this.additionalFilter = additionalFilter;
691
+ this.events = [];
692
+ }
693
+ send(event) {
694
+ if (isSharedTreeEvent(event) && this.additionalFilter(event)) {
695
+ this.events.push(event);
696
+ }
697
+ }
698
+ }
688
699
  describe('useFailedSequencedEditTelemetry', () => {
689
700
  it('decorates events with the correct properties', async () => {
690
701
  // Test that a handle can wrap a node and retrieve that node's properties
691
- const events = [];
702
+ const logger = new LoggerThatOnlySeesSharedTreeEvents();
692
703
  const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
693
- logger: { send: (event) => events.push(event) },
704
+ logger,
694
705
  allowInvalid: true,
695
706
  });
696
707
  useFailedSequencedEditTelemetry(sharedTree);
@@ -699,68 +710,66 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
699
710
  containerRuntimeFactory.processAllMessages();
700
711
  // Force demand, which will cause a telemetry event for the invalid edit to be emitted
701
712
  await sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
702
- expect(events.length).is.greaterThan(0);
703
- events.forEach((event) => {
713
+ expect(logger.events.length).is.greaterThan(0);
714
+ logger.events.forEach((event) => {
704
715
  expect(isSharedTreeEvent(event)).is.true;
705
716
  });
706
717
  });
707
718
  it('is logged for invalid locally generated edits when those edits are sequenced', async () => {
708
- const events = [];
719
+ const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
709
720
  const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
710
- logger: { send: (event) => !event.eventName.includes('IdCompressor') && events.push(event) },
721
+ logger,
711
722
  allowInvalid: true,
712
723
  });
713
724
  useFailedSequencedEditTelemetry(sharedTree);
714
725
  // Invalid edit
715
726
  sharedTree.applyEdit(...Change.insertTree([testTree.buildLeaf()], StablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))));
716
- expect(events.length).equals(0);
727
+ expect(logger.events.length).equals(0);
717
728
  containerRuntimeFactory.processAllMessages();
718
729
  // Force demand, which will cause a telemetry event for the invalid edit to be emitted
719
730
  await sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
720
- expect(events.length).equals(1);
721
- expect(events[0].category).equals('generic');
722
- expect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');
731
+ expect(logger.events.length).equals(1);
732
+ expect(logger.events[0].category).equals('generic');
733
+ expect(logger.events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');
723
734
  });
724
735
  it('can be disabled and re-enabled', async () => {
725
- const events = [];
736
+ const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
726
737
  const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
727
- logger: { send: (event) => !event.eventName.includes('IdCompressor') && events.push(event) },
738
+ logger,
728
739
  allowInvalid: true,
729
740
  });
730
741
  const { disable } = useFailedSequencedEditTelemetry(sharedTree);
731
742
  sharedTree.applyEdit(...Change.insertTree([testTree.buildLeaf()], StablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))));
732
- expect(events.length).equals(0);
743
+ expect(logger.events.length).equals(0);
733
744
  containerRuntimeFactory.processAllMessages();
734
745
  await sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
735
- expect(events.length).equals(1);
736
- expect(events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');
746
+ expect(logger.events.length).equals(1);
747
+ expect(logger.events[0].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');
737
748
  disable();
738
749
  sharedTree.applyEdit(...Change.insertTree([testTree.buildLeaf()], StablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))));
739
750
  containerRuntimeFactory.processAllMessages();
740
751
  await sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
741
- expect(events.length).equals(1);
752
+ expect(logger.events.length).equals(1);
742
753
  useFailedSequencedEditTelemetry(sharedTree);
743
754
  sharedTree.applyEdit(...Change.insertTree([testTree.buildLeaf()], StablePlace.after(testTree.buildLeaf(testTree.generateNodeId()))));
744
755
  containerRuntimeFactory.processAllMessages();
745
756
  await sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
746
- expect(events.length).equals(2);
747
- expect(events[1].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');
757
+ expect(logger.events.length).equals(2);
758
+ expect(logger.events[1].eventName).equals('SharedTree:SequencedEditApplied:InvalidSharedTreeEdit');
748
759
  });
749
760
  it('is not logged for valid edits', async () => {
750
- const events = [];
751
- const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
752
- logger: { send: (event) => !event.eventName.includes('IdCompressor') && events.push(event) },
753
- });
761
+ const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
762
+ const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({ logger });
754
763
  useFailedSequencedEditTelemetry(sharedTree);
755
764
  sharedTree.applyEdit(...Change.insertTree(testTree.buildLeaf(), StablePlace.after(testTree.left)));
756
765
  containerRuntimeFactory.processAllMessages();
757
766
  await sharedTree.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
758
- expect(events.length).equals(0);
767
+ expect(logger.events.length).equals(0);
759
768
  });
760
769
  it('is not logged for remote edits', async () => {
761
- const events = [];
770
+ const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
762
771
  const { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({
763
- logger: { send: (event) => !event.eventName.includes('IdCompressor') && events.push(event) },
772
+ logger,
764
773
  allowInvalid: true,
765
774
  localMode: false,
766
775
  });
@@ -773,7 +782,7 @@ export function runSharedTreeOperationsTests(title, writeFormat, setUpTestShared
773
782
  sharedTree2.applyEdit(...Change.insertTree([testTree2.buildLeaf()], StablePlace.after(testTree2.buildLeaf(testTree2.generateNodeId()))));
774
783
  containerRuntimeFactory.processAllMessages();
775
784
  await sharedTree1.logViewer.getRevisionView(Number.POSITIVE_INFINITY);
776
- expect(events.length).equals(0);
785
+ expect(logger.events.length).equals(0);
777
786
  });
778
787
  });
779
788
  });