@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.
- package/.mocharc.js +12 -0
- package/.prettierignore +6 -0
- package/README.md +1 -1
- package/dist/Checkout.d.ts +9 -4
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +34 -25
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +31 -18
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +33 -22
- package/dist/Common.js.map +1 -1
- package/dist/EditLog.js +2 -2
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.d.ts +5 -0
- package/dist/EditUtilities.d.ts.map +1 -1
- package/dist/EditUtilities.js +4 -3
- package/dist/EditUtilities.js.map +1 -1
- package/dist/EventTypes.d.ts +11 -6
- package/dist/EventTypes.d.ts.map +1 -1
- package/dist/EventTypes.js +11 -6
- package/dist/EventTypes.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +5 -3
- package/dist/HistoryEditFactory.d.ts.map +1 -1
- package/dist/HistoryEditFactory.js +25 -6
- package/dist/HistoryEditFactory.js.map +1 -1
- package/dist/LogViewer.d.ts +12 -6
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js.map +1 -1
- package/dist/RevisionValueCache.d.ts +8 -4
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +4 -2
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/SharedTree.d.ts +22 -11
- package/dist/SharedTree.d.ts.map +1 -1
- package/dist/SharedTree.js +25 -19
- package/dist/SharedTree.js.map +1 -1
- package/dist/StringInterner.d.ts +4 -3
- package/dist/StringInterner.d.ts.map +1 -1
- package/dist/StringInterner.js +4 -3
- package/dist/StringInterner.js.map +1 -1
- package/dist/Transaction.d.ts +2 -2
- package/dist/Transaction.d.ts.map +1 -1
- package/dist/Transaction.js +3 -2
- package/dist/Transaction.js.map +1 -1
- package/dist/TransactionInternal.d.ts.map +1 -1
- package/dist/TransactionInternal.js +1 -0
- package/dist/TransactionInternal.js.map +1 -1
- package/dist/id-compressor/IdCompressor.d.ts +14 -8
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
- package/dist/id-compressor/IdCompressor.js +14 -8
- package/dist/id-compressor/IdCompressor.js.map +1 -1
- package/dist/id-compressor/NumericUuid.d.ts +4 -0
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -1
- package/dist/id-compressor/NumericUuid.js +13 -3
- package/dist/id-compressor/NumericUuid.js.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.d.ts +8 -3
- package/dist/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
- package/dist/id-compressor/SessionIdNormalizer.js +8 -3
- package/dist/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/lib/Checkout.d.ts +9 -4
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +36 -27
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +31 -18
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +31 -21
- package/lib/Common.js.map +1 -1
- package/lib/EditLog.js +2 -2
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.d.ts +5 -0
- package/lib/EditUtilities.d.ts.map +1 -1
- package/lib/EditUtilities.js +4 -3
- package/lib/EditUtilities.js.map +1 -1
- package/lib/EventTypes.d.ts +11 -6
- package/lib/EventTypes.d.ts.map +1 -1
- package/lib/EventTypes.js +11 -6
- package/lib/EventTypes.js.map +1 -1
- package/lib/HistoryEditFactory.d.ts +5 -3
- package/lib/HistoryEditFactory.d.ts.map +1 -1
- package/lib/HistoryEditFactory.js +25 -6
- package/lib/HistoryEditFactory.js.map +1 -1
- package/lib/LogViewer.d.ts +12 -6
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js.map +1 -1
- package/lib/RevisionValueCache.d.ts +8 -4
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +4 -2
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/SharedTree.d.ts +22 -11
- package/lib/SharedTree.d.ts.map +1 -1
- package/lib/SharedTree.js +26 -20
- package/lib/SharedTree.js.map +1 -1
- package/lib/StringInterner.d.ts +4 -3
- package/lib/StringInterner.d.ts.map +1 -1
- package/lib/StringInterner.js +4 -3
- package/lib/StringInterner.js.map +1 -1
- package/lib/Transaction.d.ts +2 -2
- package/lib/Transaction.d.ts.map +1 -1
- package/lib/Transaction.js +3 -2
- package/lib/Transaction.js.map +1 -1
- package/lib/TransactionInternal.d.ts.map +1 -1
- package/lib/TransactionInternal.js +1 -0
- package/lib/TransactionInternal.js.map +1 -1
- package/lib/id-compressor/IdCompressor.d.ts +14 -8
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
- package/lib/id-compressor/IdCompressor.js +14 -8
- package/lib/id-compressor/IdCompressor.js.map +1 -1
- package/lib/id-compressor/NumericUuid.d.ts +4 -0
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -1
- package/lib/id-compressor/NumericUuid.js +13 -3
- package/lib/id-compressor/NumericUuid.js.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.d.ts +8 -3
- package/lib/id-compressor/SessionIdNormalizer.d.ts.map +1 -1
- package/lib/id-compressor/SessionIdNormalizer.js +8 -3
- package/lib/id-compressor/SessionIdNormalizer.js.map +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/test/AppendOnlySortedMap.perf.tests.js.map +1 -1
- package/lib/test/Checkout.tests.d.ts.map +1 -1
- package/lib/test/Checkout.tests.js +39 -10
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Common.tests.js +20 -1
- package/lib/test/Common.tests.js.map +1 -1
- package/lib/test/HistoryEditFactory.tests.js +48 -9
- package/lib/test/HistoryEditFactory.tests.js.map +1 -1
- package/lib/test/SessionIdNormalizer.tests.js +3 -2
- package/lib/test/SessionIdNormalizer.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts.map +1 -1
- package/lib/test/fuzz/Generators.js.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -1
- package/lib/test/fuzz/SharedTreeFuzzTests.js +2 -3
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -1
- package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
- package/lib/test/utilities/MockTransaction.js +1 -0
- package/lib/test/utilities/MockTransaction.js.map +1 -1
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +35 -26
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.js +7 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -1
- package/lib/test/utilities/TestUtilities.d.ts +5 -0
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +4 -3
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/lib/test/utilities/UndoRedoTests.js +3 -2
- package/lib/test/utilities/UndoRedoTests.js.map +1 -1
- package/package.json +28 -23
- package/src/Checkout.ts +56 -14
- package/src/Common.ts +39 -21
- package/src/EditLog.ts +2 -2
- package/src/EditUtilities.ts +3 -3
- package/src/EventTypes.ts +12 -6
- package/src/HistoryEditFactory.ts +31 -6
- package/src/LogViewer.ts +12 -6
- package/src/RevisionValueCache.ts +8 -4
- package/src/SharedTree.ts +39 -26
- package/src/StringInterner.ts +4 -3
- package/src/Transaction.ts +5 -4
- package/src/TransactionInternal.ts +1 -0
- package/src/id-compressor/IdCompressor.ts +27 -17
- package/src/id-compressor/NumericUuid.ts +17 -3
- package/src/id-compressor/SessionIdNormalizer.ts +8 -3
- package/src/id-compressor/persisted-types/0.0.1.ts +1 -0
- 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;
|
|
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,
|
|
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
|
-
|
|
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;
|
|
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"}
|
|
@@ -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,
|
|
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
|
|
702
|
+
const logger = new LoggerThatOnlySeesSharedTreeEvents();
|
|
692
703
|
const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
|
|
693
|
-
logger
|
|
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
|
|
719
|
+
const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
|
|
709
720
|
const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
|
|
710
|
-
logger
|
|
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
|
|
736
|
+
const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
|
|
726
737
|
const { sharedTree, testTree, containerRuntimeFactory } = createSimpleTestTree({
|
|
727
|
-
logger
|
|
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
|
|
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
|
|
770
|
+
const logger = new LoggerThatOnlySeesSharedTreeEvents((event) => !event.eventName.includes('IdCompressor'));
|
|
762
771
|
const { sharedTree: sharedTree1, containerRuntimeFactory } = createSimpleTestTree({
|
|
763
|
-
logger
|
|
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
|
});
|