@itwin/core-backend 5.13.0-dev.18 → 5.13.0-dev.20
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/CHANGELOG.md +11 -1
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +1 -0
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +5 -1
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +4 -0
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +15 -0
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +24 -0
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts +37 -9
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +125 -6
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SynchronousChannel.d.ts +62 -0
- package/lib/cjs/SynchronousChannel.d.ts.map +1 -0
- package/lib/cjs/SynchronousChannel.js +11 -0
- package/lib/cjs/SynchronousChannel.js.map +1 -0
- package/lib/cjs/TxnManager.d.ts +44 -4
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +63 -14
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +22 -0
- package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js +13 -0
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NoReservations.d.ts +6 -0
- package/lib/cjs/internal/NoReservations.d.ts.map +1 -0
- package/lib/cjs/internal/NoReservations.js +21 -0
- package/lib/cjs/internal/NoReservations.js.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/cjs/internal/SchemaSyncReservations.js +118 -0
- package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +1 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +2 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +1 -0
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +5 -1
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +5 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +15 -0
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +24 -0
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts +37 -9
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +127 -8
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SynchronousChannel.d.ts +62 -0
- package/lib/esm/SynchronousChannel.d.ts.map +1 -0
- package/lib/esm/SynchronousChannel.js +9 -0
- package/lib/esm/SynchronousChannel.js.map +1 -0
- package/lib/esm/TxnManager.d.ts +44 -4
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +63 -14
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +22 -0
- package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js +13 -0
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NoReservations.d.ts +6 -0
- package/lib/esm/internal/NoReservations.d.ts.map +1 -0
- package/lib/esm/internal/NoReservations.js +18 -0
- package/lib/esm/internal/NoReservations.js.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts +4 -0
- package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -0
- package/lib/esm/internal/SchemaSyncReservations.js +115 -0
- package/lib/esm/internal/SchemaSyncReservations.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +1 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +1 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/test/imodel/IModelLifecycle.test.js +1 -0
- package/lib/esm/test/imodel/IModelLifecycle.test.js.map +1 -1
- package/lib/esm/test/index.d.ts +0 -1
- package/lib/esm/test/index.d.ts.map +1 -1
- package/lib/esm/test/index.js +0 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js +29 -10
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js +221 -0
- package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts +2 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +459 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js +1 -0
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js +108 -8
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/package.json +13 -13
- package/lib/esm/test/RevisionUtility.d.ts +0 -33
- package/lib/esm/test/RevisionUtility.d.ts.map +0 -1
- package/lib/esm/test/RevisionUtility.js +0 -52
- package/lib/esm/test/RevisionUtility.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnapshotDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SnapshotDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as sinon from \"sinon\";\r\nimport { ChangesetIdWithIndex } from \"@itwin/core-common\";\r\nimport { CheckpointManager, V2CheckpointManager } from \"../../CheckpointManager\";\r\nimport { IModelDb, SnapshotDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SpatialCategory } from \"../../Category\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport * as path from \"path\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\ndescribe(\"SnapshotDb.refreshContainerForRpc\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n const changeset: ChangesetIdWithIndex = { id: \"fakeChangeSetId\", index: 10 };\r\n const iTwinId = \"fakeIModelId\";\r\n const iModelId = \"fakeIModelId\";\r\n const makeToken = (date: string) => {\r\n const dateUri = encodeURIComponent(date);\r\n return `?sv=2018-03-28&st=${dateUri}&se=${dateUri}&sr=c&sp=rl&sig=bad`;\r\n };\r\n\r\n const mockCheckpointV2 = {\r\n accountName: \"testAccount\",\r\n containerId: \"imodelblocks-123\",\r\n sasToken: makeToken(\"2021-01-01T01:00:00Z\"),\r\n dbName: \"testDb\",\r\n storageType: \"azure?sas=1\",\r\n };\r\n\r\n const cloudContainer = { accessToken: mockCheckpointV2.sasToken };\r\n const fakeSnapshotDb: any = {\r\n cloudContainer,\r\n isReadonly: () => true,\r\n isOpen: () => true,\r\n getIModelId: () => iModelId,\r\n getITwinId: () => iTwinId,\r\n getCurrentChangeset: () => changeset,\r\n hasUnsavedChanges: () => false,\r\n setIModelDb: () => { },\r\n closeIModel: () => { },\r\n restartDefaultTxn: () => { },\r\n closeFile: () => { },\r\n getFilePath: () => \"fakeFilePath\",\r\n clearECDbCache: () => { },\r\n };\r\n it(\"perform checkpoint\", async () => {\r\n const sourceFileName = path.join(KnownTestLocations.outputDir, \"checkpoint1.bim\");\r\n if (IModelJsFs.existsSync(sourceFileName))\r\n IModelJsFs.removeSync(sourceFileName);\r\n\r\n const iModel = StandaloneDb.createEmpty(sourceFileName, {\r\n rootSubject: { name: sourceFileName },\r\n });\r\n\r\n iModel.clearCaches();\r\n iModel.performCheckpoint();\r\n\r\n withEditTxn(iModel, (txn) => SpatialCategory.insert(\r\n txn,\r\n IModelDb.dictionaryId,\r\n \"spatial category\",\r\n {}\r\n ));\r\n\r\n // Use to throw error SQLITE_LOCKED\r\n iModel.performCheckpoint();\r\n iModel.close();\r\n });\r\n it(\"should restart default txn after inactivity\", async () => {\r\n const clock = sinon.useFakeTimers();\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:00:00Z\"));\r\n const defaultTxnSpy = sinon.spy(SnapshotDb.prototype, \"restartDefaultTxn\");\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(V2CheckpointManager, \"attach\").callsFake(async () => {\r\n return { dbName: \"fakeDb\", container: cloudContainer } as any;\r\n });\r\n sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => mockCheckpointV2);\r\n\r\n const openDgnDbStub = sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n sinon.stub(CheckpointManager, \"validateCheckpointGuids\").returns();\r\n\r\n const userAccessToken = \"token\";\r\n const checkpoint = await SnapshotDb.openCheckpointFromRpc({ accessToken: userAccessToken, iTwinId, iModelId, changeset, reattachSafetySeconds: 60 });\r\n expect(openDgnDbStub.calledOnce).to.be.true;\r\n expect(openDgnDbStub.firstCall.firstArg.path).to.equal(\"fakeDb\");\r\n\r\n const tenMinutes = 10 * 60 * 1000;\r\n\r\n // Test 20 minute timer activated when opening v2 checkpoint works.\r\n await clock.tickAsync(tenMinutes - 100);\r\n expect(defaultTxnSpy.callCount).equal(0);\r\n await clock.tickAsync(101);\r\n expect(defaultTxnSpy.callCount).equal(1);\r\n\r\n // Make sure timeout doesn't trigger more than once unless refreshContainer is called.\r\n await clock.tickAsync(tenMinutes + 100);\r\n expect(defaultTxnSpy.callCount).equal(1);\r\n await checkpoint.refreshContainerForRpc(\"\"); // activates timeout again by calling refresh on the timer.\r\n expect(defaultTxnSpy.callCount).equal(1);\r\n await clock.tickAsync(tenMinutes + 100);\r\n expect(defaultTxnSpy.callCount).equal(2);\r\n\r\n // Keep calling refreshContainer and make sure that restartDefaultTxn doesn't get called.\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n await clock.tickAsync(tenMinutes - 100);\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n await clock.tickAsync(tenMinutes - 100);\r\n expect(defaultTxnSpy.callCount).equal(2);\r\n\r\n // advance time past 20 minutes without refreshing container and make sure defaultTxn still restarts\r\n await clock.tickAsync(tenMinutes + 100);\r\n expect(defaultTxnSpy.callCount).equal(3);\r\n });\r\n\r\n it(\"should refresh checkpoint sasToken from RPC\", async () => {\r\n const clock = sinon.useFakeTimers();\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:00:00Z\"));\r\n\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(V2CheckpointManager, \"attach\").callsFake(async () => {\r\n return { dbName: \"fakeDb\", container: cloudContainer } as any;\r\n });\r\n const queryStub = sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => mockCheckpointV2);\r\n\r\n const openDgnDbStub = sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n sinon.stub(CheckpointManager, \"validateCheckpointGuids\").returns();\r\n\r\n const userAccessToken = \"token\";\r\n const checkpoint = await SnapshotDb.openCheckpointFromRpc({ accessToken: userAccessToken, iTwinId, iModelId, changeset, reattachSafetySeconds: 60 });\r\n expect(checkpoint.cloudContainer?.accessToken).equal(mockCheckpointV2.sasToken);\r\n expect(openDgnDbStub.calledOnce).to.be.true;\r\n expect(openDgnDbStub.firstCall.firstArg.path).to.equal(\"fakeDb\");\r\n\r\n const errorLogStub = sinon.stub(Logger, \"logError\").callsFake(() => { });\r\n const infoLogStub = sinon.stub(Logger, \"logInfo\").callsFake(() => { });\r\n\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:58:10Z\")); // within safety period\r\n void expect(checkpoint.refreshContainerForRpc(\"\")).to.be.fulfilled;\r\n expect(queryStub.callCount).equal(0, \"should not need reattach yet\");\r\n\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:59:10Z\")); // after safety period\r\n\r\n mockCheckpointV2.sasToken = makeToken(\"2021-01-01T02:00:00Z\");\r\n const attachPromise = checkpoint.refreshContainerForRpc(\"\");\r\n const promise2 = checkpoint.refreshContainerForRpc(\"\"); // gets copy of first promise\r\n const promise3 = checkpoint.refreshContainerForRpc(\"\"); // \"\r\n expect(queryStub.callCount).equal(1); // shouldn't need to attach since first call already started the process\r\n expect(infoLogStub.callCount).equal(1);\r\n expect(infoLogStub.args[0][1]).include(\"attempting to refresh\");\r\n expect(errorLogStub.callCount).equal(0);\r\n\r\n void expect(attachPromise).to.not.be.fulfilled;\r\n void expect(promise2).to.not.be.fulfilled;\r\n void expect(promise3).to.not.be.fulfilled;\r\n await attachPromise;\r\n void expect(attachPromise).to.be.fulfilled;\r\n void expect(promise2).to.be.fulfilled;\r\n void expect(promise3).to.be.fulfilled;\r\n expect(infoLogStub.callCount).equal(2);\r\n expect(infoLogStub.args[1][1]).include(\"refreshed checkpoint sasToken\");\r\n\r\n clock.setSystemTime(Date.parse(\"2021-01-01T03:00:00Z\"));\r\n mockCheckpointV2.sasToken = makeToken(\"2021-01-01T03:00:10Z\"); // an expiry within safety interval should cause error log\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n expect(errorLogStub.callCount).equal(1);\r\n expect(errorLogStub.args[0][1]).include(\"timestamp that expires before safety interval\");\r\n\r\n queryStub.resetHistory();\r\n errorLogStub.resetHistory();\r\n infoLogStub.resetHistory();\r\n mockCheckpointV2.sasToken = makeToken(\"2021-01-01T04:00:10Z\"); // expiry after safety interval\r\n clock.setSystemTime(Date.parse(\"2021-01-01T03:00:02Z\"));\r\n // next call to reattach daemon should work fine and correct problem\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n expect(queryStub.callCount).equal(1);\r\n expect(infoLogStub.callCount).equal(2);\r\n expect(errorLogStub.callCount).equal(0);\r\n });\r\n\r\n it(\"should not refreshContainer if SnapshotDb is not a checkpoint\", async () => {\r\n const clock = sinon.useFakeTimers();\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:00:00Z\"));\r\n sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(CheckpointManager, \"validateCheckpointGuids\").returns();\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n\r\n const snapshot = IModelTestUtils.openCheckpoint(\"fakeFilePath\", { iTwinId: \"fakeITwinId\", iModelId: \"fake1\", changeset });\r\n const nowStub = sinon.stub(Date, \"now\");\r\n await snapshot.refreshContainerForRpc(\"\");\r\n snapshot.close();\r\n expect(nowStub.called).to.be.false;\r\n nowStub.restore();\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"SnapshotDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SnapshotDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as sinon from \"sinon\";\r\nimport { ChangesetIdWithIndex } from \"@itwin/core-common\";\r\nimport { CheckpointManager, V2CheckpointManager } from \"../../CheckpointManager\";\r\nimport { IModelDb, SnapshotDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SpatialCategory } from \"../../Category\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport * as path from \"path\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\ndescribe(\"SnapshotDb.refreshContainerForRpc\", () => {\r\n afterEach(() => sinon.restore());\r\n\r\n const changeset: ChangesetIdWithIndex = { id: \"fakeChangeSetId\", index: 10 };\r\n const iTwinId = \"fakeIModelId\";\r\n const iModelId = \"fakeIModelId\";\r\n const makeToken = (date: string) => {\r\n const dateUri = encodeURIComponent(date);\r\n return `?sv=2018-03-28&st=${dateUri}&se=${dateUri}&sr=c&sp=rl&sig=bad`;\r\n };\r\n\r\n const mockCheckpointV2 = {\r\n accountName: \"testAccount\",\r\n containerId: \"imodelblocks-123\",\r\n sasToken: makeToken(\"2021-01-01T01:00:00Z\"),\r\n dbName: \"testDb\",\r\n storageType: \"azure?sas=1\",\r\n };\r\n\r\n const cloudContainer = { accessToken: mockCheckpointV2.sasToken };\r\n const fakeSnapshotDb: any = {\r\n cloudContainer,\r\n isReadonly: () => true,\r\n isOpen: () => true,\r\n getIModelId: () => iModelId,\r\n getITwinId: () => iTwinId,\r\n getCurrentChangeset: () => changeset,\r\n hasUnsavedChanges: () => false,\r\n schemaSyncEnabled: () => false,\r\n setIModelDb: () => { },\r\n closeIModel: () => { },\r\n restartDefaultTxn: () => { },\r\n closeFile: () => { },\r\n getFilePath: () => \"fakeFilePath\",\r\n clearECDbCache: () => { },\r\n };\r\n it(\"perform checkpoint\", async () => {\r\n const sourceFileName = path.join(KnownTestLocations.outputDir, \"checkpoint1.bim\");\r\n if (IModelJsFs.existsSync(sourceFileName))\r\n IModelJsFs.removeSync(sourceFileName);\r\n\r\n const iModel = StandaloneDb.createEmpty(sourceFileName, {\r\n rootSubject: { name: sourceFileName },\r\n });\r\n\r\n iModel.clearCaches();\r\n iModel.performCheckpoint();\r\n\r\n withEditTxn(iModel, (txn) => SpatialCategory.insert(\r\n txn,\r\n IModelDb.dictionaryId,\r\n \"spatial category\",\r\n {}\r\n ));\r\n\r\n // Use to throw error SQLITE_LOCKED\r\n iModel.performCheckpoint();\r\n iModel.close();\r\n });\r\n it(\"should restart default txn after inactivity\", async () => {\r\n const clock = sinon.useFakeTimers();\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:00:00Z\"));\r\n const defaultTxnSpy = sinon.spy(SnapshotDb.prototype, \"restartDefaultTxn\");\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(V2CheckpointManager, \"attach\").callsFake(async () => {\r\n return { dbName: \"fakeDb\", container: cloudContainer } as any;\r\n });\r\n sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => mockCheckpointV2);\r\n\r\n const openDgnDbStub = sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n sinon.stub(CheckpointManager, \"validateCheckpointGuids\").returns();\r\n\r\n const userAccessToken = \"token\";\r\n const checkpoint = await SnapshotDb.openCheckpointFromRpc({ accessToken: userAccessToken, iTwinId, iModelId, changeset, reattachSafetySeconds: 60 });\r\n expect(openDgnDbStub.calledOnce).to.be.true;\r\n expect(openDgnDbStub.firstCall.firstArg.path).to.equal(\"fakeDb\");\r\n\r\n const tenMinutes = 10 * 60 * 1000;\r\n\r\n // Test 20 minute timer activated when opening v2 checkpoint works.\r\n await clock.tickAsync(tenMinutes - 100);\r\n expect(defaultTxnSpy.callCount).equal(0);\r\n await clock.tickAsync(101);\r\n expect(defaultTxnSpy.callCount).equal(1);\r\n\r\n // Make sure timeout doesn't trigger more than once unless refreshContainer is called.\r\n await clock.tickAsync(tenMinutes + 100);\r\n expect(defaultTxnSpy.callCount).equal(1);\r\n await checkpoint.refreshContainerForRpc(\"\"); // activates timeout again by calling refresh on the timer.\r\n expect(defaultTxnSpy.callCount).equal(1);\r\n await clock.tickAsync(tenMinutes + 100);\r\n expect(defaultTxnSpy.callCount).equal(2);\r\n\r\n // Keep calling refreshContainer and make sure that restartDefaultTxn doesn't get called.\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n await clock.tickAsync(tenMinutes - 100);\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n await clock.tickAsync(tenMinutes - 100);\r\n expect(defaultTxnSpy.callCount).equal(2);\r\n\r\n // advance time past 20 minutes without refreshing container and make sure defaultTxn still restarts\r\n await clock.tickAsync(tenMinutes + 100);\r\n expect(defaultTxnSpy.callCount).equal(3);\r\n });\r\n\r\n it(\"should refresh checkpoint sasToken from RPC\", async () => {\r\n const clock = sinon.useFakeTimers();\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:00:00Z\"));\r\n\r\n sinon.stub(IModelHost, _hubAccess).get(() => HubMock);\r\n sinon.stub(V2CheckpointManager, \"attach\").callsFake(async () => {\r\n return { dbName: \"fakeDb\", container: cloudContainer } as any;\r\n });\r\n const queryStub = sinon.stub(IModelHost[_hubAccess], \"queryV2Checkpoint\").callsFake(async () => mockCheckpointV2);\r\n\r\n const openDgnDbStub = sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n sinon.stub(CheckpointManager, \"validateCheckpointGuids\").returns();\r\n\r\n const userAccessToken = \"token\";\r\n const checkpoint = await SnapshotDb.openCheckpointFromRpc({ accessToken: userAccessToken, iTwinId, iModelId, changeset, reattachSafetySeconds: 60 });\r\n expect(checkpoint.cloudContainer?.accessToken).equal(mockCheckpointV2.sasToken);\r\n expect(openDgnDbStub.calledOnce).to.be.true;\r\n expect(openDgnDbStub.firstCall.firstArg.path).to.equal(\"fakeDb\");\r\n\r\n const errorLogStub = sinon.stub(Logger, \"logError\").callsFake(() => { });\r\n const infoLogStub = sinon.stub(Logger, \"logInfo\").callsFake(() => { });\r\n\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:58:10Z\")); // within safety period\r\n void expect(checkpoint.refreshContainerForRpc(\"\")).to.be.fulfilled;\r\n expect(queryStub.callCount).equal(0, \"should not need reattach yet\");\r\n\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:59:10Z\")); // after safety period\r\n\r\n mockCheckpointV2.sasToken = makeToken(\"2021-01-01T02:00:00Z\");\r\n const attachPromise = checkpoint.refreshContainerForRpc(\"\");\r\n const promise2 = checkpoint.refreshContainerForRpc(\"\"); // gets copy of first promise\r\n const promise3 = checkpoint.refreshContainerForRpc(\"\"); // \"\r\n expect(queryStub.callCount).equal(1); // shouldn't need to attach since first call already started the process\r\n expect(infoLogStub.callCount).equal(1);\r\n expect(infoLogStub.args[0][1]).include(\"attempting to refresh\");\r\n expect(errorLogStub.callCount).equal(0);\r\n\r\n void expect(attachPromise).to.not.be.fulfilled;\r\n void expect(promise2).to.not.be.fulfilled;\r\n void expect(promise3).to.not.be.fulfilled;\r\n await attachPromise;\r\n void expect(attachPromise).to.be.fulfilled;\r\n void expect(promise2).to.be.fulfilled;\r\n void expect(promise3).to.be.fulfilled;\r\n expect(infoLogStub.callCount).equal(2);\r\n expect(infoLogStub.args[1][1]).include(\"refreshed checkpoint sasToken\");\r\n\r\n clock.setSystemTime(Date.parse(\"2021-01-01T03:00:00Z\"));\r\n mockCheckpointV2.sasToken = makeToken(\"2021-01-01T03:00:10Z\"); // an expiry within safety interval should cause error log\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n expect(errorLogStub.callCount).equal(1);\r\n expect(errorLogStub.args[0][1]).include(\"timestamp that expires before safety interval\");\r\n\r\n queryStub.resetHistory();\r\n errorLogStub.resetHistory();\r\n infoLogStub.resetHistory();\r\n mockCheckpointV2.sasToken = makeToken(\"2021-01-01T04:00:10Z\"); // expiry after safety interval\r\n clock.setSystemTime(Date.parse(\"2021-01-01T03:00:02Z\"));\r\n // next call to reattach daemon should work fine and correct problem\r\n await checkpoint.refreshContainerForRpc(\"\");\r\n expect(queryStub.callCount).equal(1);\r\n expect(infoLogStub.callCount).equal(2);\r\n expect(errorLogStub.callCount).equal(0);\r\n });\r\n\r\n it(\"should not refreshContainer if SnapshotDb is not a checkpoint\", async () => {\r\n const clock = sinon.useFakeTimers();\r\n clock.setSystemTime(Date.parse(\"2021-01-01T00:00:00Z\"));\r\n sinon.stub(SnapshotDb, \"openDgnDb\").returns(fakeSnapshotDb);\r\n sinon.stub(CheckpointManager, \"validateCheckpointGuids\").returns();\r\n sinon.stub(IModelDb.prototype, \"initializeIModelDb\" as any);\r\n sinon.stub(IModelDb.prototype, \"loadIModelSettings\" as any);\r\n\r\n const snapshot = IModelTestUtils.openCheckpoint(\"fakeFilePath\", { iTwinId: \"fakeITwinId\", iModelId: \"fake1\", changeset });\r\n const nowStub = sinon.stub(Date, \"now\");\r\n await snapshot.refreshContainerForRpc(\"\");\r\n snapshot.close();\r\n expect(nowStub.called).to.be.false;\r\n nowStub.restore();\r\n });\r\n});\r\n"]}
|
|
@@ -58,7 +58,7 @@ import { assert, expect } from "chai";
|
|
|
58
58
|
import { BeDuration, Guid, Id64, IModelStatus, OpenMode } from "@itwin/core-bentley";
|
|
59
59
|
import { LineSegment3d, Point3d, YawPitchRollAngles } from "@itwin/core-geometry";
|
|
60
60
|
import { Code, ColorByName, DomainOptions, GeometryStreamBuilder, IModel, IModelError, SubCategoryAppearance, TxnAction, } from "@itwin/core-common";
|
|
61
|
-
import { _nativeDb, ChannelControl, IModelDb, IModelJsFs, PhysicalModel, PhysicalPartition, setMaxEntitiesPerEvent, SpatialCategory, StandaloneDb, SubjectOwnsPartitionElements, withEditTxn, } from "../../core-backend";
|
|
61
|
+
import { _nativeDb, ChannelControl, DocumentListModel, Drawing, IModelDb, IModelJsFs, PhysicalModel, PhysicalPartition, SectionDrawing, setMaxEntitiesPerEvent, SpatialCategory, StandaloneDb, SubjectOwnsPartitionElements, withEditTxn, } from "../../core-backend";
|
|
62
62
|
import { IModelTestUtils, TestElementDrivesElement, TestPhysicalObject } from "../IModelTestUtils";
|
|
63
63
|
import { IModelNative } from "../../internal/NativePlatform";
|
|
64
64
|
import { EntityClass, SchemaItemKey, SchemaKey } from "@itwin/ecschema-metadata";
|
|
@@ -438,8 +438,11 @@ describe("TxnManager", () => {
|
|
|
438
438
|
const iterName = iterNames[propName];
|
|
439
439
|
const entities = changes[iterName];
|
|
440
440
|
const dest = this[propName];
|
|
441
|
-
for (const entity of entities)
|
|
442
|
-
|
|
441
|
+
for (const entity of entities) {
|
|
442
|
+
expect(entity.metadata.classFullName).not.to.equal("");
|
|
443
|
+
expect(entity.metadata.is(entity.metadata.classFullName)).to.be.true;
|
|
444
|
+
dest.push({ id: entity.id, classId: entity.classId });
|
|
445
|
+
}
|
|
443
446
|
}
|
|
444
447
|
expectNumValidations(expected) {
|
|
445
448
|
expect(this.numValidates).to.equal(expected);
|
|
@@ -577,16 +580,110 @@ describe("TxnManager", () => {
|
|
|
577
580
|
});
|
|
578
581
|
});
|
|
579
582
|
});
|
|
583
|
+
it("includes class metadata in elements changed events", async () => {
|
|
584
|
+
const metadata = [];
|
|
585
|
+
const removeListener = imodel.txns.onElementsChanged.addListener((changes) => {
|
|
586
|
+
for (const change of changes.inserts)
|
|
587
|
+
metadata.push(change.metadata);
|
|
588
|
+
});
|
|
589
|
+
try {
|
|
590
|
+
await withEditTxn(imodel, "elements-event-metadata", async (editTxn) => {
|
|
591
|
+
editTxn.insertElement(props);
|
|
592
|
+
editTxn.insertElement(props);
|
|
593
|
+
editTxn.saveChanges("2 inserts");
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
finally {
|
|
597
|
+
removeListener();
|
|
598
|
+
}
|
|
599
|
+
assert.lengthOf(metadata, 2);
|
|
600
|
+
assert.strictEqual(metadata[0], metadata[1], "metadata should be shared by entities of the same class");
|
|
601
|
+
assert.equal(metadata[0].classFullName, "TestBim:TestPhysicalObject");
|
|
602
|
+
assert.isTrue(metadata[0].is("TestBim:TestPhysicalObject"));
|
|
603
|
+
assert.isTrue(metadata[0].is("BisCore:PhysicalElement"));
|
|
604
|
+
assert.isTrue(metadata[0].is("BisCore:Element"));
|
|
605
|
+
assert.isFalse(metadata[0].is("BisCore:Model"));
|
|
606
|
+
});
|
|
607
|
+
it("maps metadata to each changed class", async () => {
|
|
608
|
+
const changes = [];
|
|
609
|
+
const removeListener = imodel.txns.onElementsChanged.addListener((event) => {
|
|
610
|
+
for (const change of event.inserts)
|
|
611
|
+
changes.push({ ...change });
|
|
612
|
+
});
|
|
613
|
+
let physicalObjectId = "";
|
|
614
|
+
let categoryId = "";
|
|
615
|
+
try {
|
|
616
|
+
await withEditTxn(imodel, "elements-event-class-metadata", async (editTxn) => {
|
|
617
|
+
physicalObjectId = editTxn.insertElement(props);
|
|
618
|
+
categoryId = insertSpatialCategory(editTxn, IModel.dictionaryId, Guid.createValue(), new SubCategoryAppearance({ color: ColorByName.green }));
|
|
619
|
+
editTxn.saveChanges("multiple changed classes");
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
finally {
|
|
623
|
+
removeListener();
|
|
624
|
+
}
|
|
625
|
+
const byId = new Map(changes.map((change) => [change.id, change]));
|
|
626
|
+
assert.equal(byId.get(physicalObjectId)?.metadata.classFullName, "TestBim:TestPhysicalObject");
|
|
627
|
+
assert.equal(byId.get(categoryId)?.metadata.classFullName, "BisCore:SpatialCategory");
|
|
628
|
+
assert.equal(byId.get(IModel.getDefaultSubCategoryId(categoryId))?.metadata.classFullName, "BisCore:SubCategory");
|
|
629
|
+
});
|
|
630
|
+
it("handles changed classes when a base class is also changed", async () => {
|
|
631
|
+
const metadata = new Map();
|
|
632
|
+
const removeListener = imodel.txns.onElementsChanged.addListener((changes) => {
|
|
633
|
+
for (const change of changes.inserts)
|
|
634
|
+
metadata.set(change.metadata.classFullName, change.metadata);
|
|
635
|
+
});
|
|
636
|
+
const documentListModelId = withEditTxn(imodel, "document-list-model", (editTxn) => DocumentListModel.insert(editTxn, IModel.rootSubjectId, "Documents"));
|
|
637
|
+
try {
|
|
638
|
+
await withEditTxn(imodel, "elements-event-base-class-metadata", async (editTxn) => {
|
|
639
|
+
editTxn.insertElement({
|
|
640
|
+
classFullName: SectionDrawing.classFullName,
|
|
641
|
+
model: documentListModelId,
|
|
642
|
+
code: Drawing.createCode(imodel, documentListModelId, "DerivedDrawing"),
|
|
643
|
+
});
|
|
644
|
+
editTxn.insertElement({
|
|
645
|
+
classFullName: Drawing.classFullName,
|
|
646
|
+
model: documentListModelId,
|
|
647
|
+
code: Drawing.createCode(imodel, documentListModelId, "BaseDrawing"),
|
|
648
|
+
});
|
|
649
|
+
editTxn.saveChanges("derived and base drawings");
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
finally {
|
|
653
|
+
removeListener();
|
|
654
|
+
}
|
|
655
|
+
const sectionDrawingMetadata = metadata.get("BisCore:SectionDrawing");
|
|
656
|
+
const drawingMetadata = metadata.get("BisCore:Drawing");
|
|
657
|
+
assert.isDefined(sectionDrawingMetadata);
|
|
658
|
+
assert.isDefined(drawingMetadata);
|
|
659
|
+
assert.isTrue(sectionDrawingMetadata.is("BisCore:Drawing"));
|
|
660
|
+
assert.isTrue(sectionDrawingMetadata.is("BisCore:Document"));
|
|
661
|
+
assert.isTrue(drawingMetadata.is("BisCore:Document"));
|
|
662
|
+
});
|
|
580
663
|
it("dispatches events when models change", async () => {
|
|
581
664
|
await withEditTxn(imodel, "models-events", async (editTxn) => {
|
|
582
665
|
const existingModelId = props.model;
|
|
583
666
|
let newModelId;
|
|
667
|
+
let modelMetadataChecked = false;
|
|
584
668
|
EventAccumulator.testModels(imodel, (accum) => {
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
669
|
+
const removeMetadataListener = imodel.txns.onModelsChanged.addListener((changes) => {
|
|
670
|
+
for (const change of changes.inserts) {
|
|
671
|
+
assert.strictEqual(change.metadata.classFullName, "BisCore:PhysicalModel");
|
|
672
|
+
assert.isTrue(change.metadata.is("BisCore:Model"));
|
|
673
|
+
modelMetadataChecked = true;
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
try {
|
|
677
|
+
newModelId = insertPhysicalModel(editTxn, IModel.rootSubjectId, Guid.createValue());
|
|
678
|
+
editTxn.saveChanges("1 insert");
|
|
679
|
+
accum.expectNumValidations(1);
|
|
680
|
+
accum.expectChanges({ inserted: [physicalModelEntity(newModelId)] });
|
|
681
|
+
}
|
|
682
|
+
finally {
|
|
683
|
+
removeMetadataListener();
|
|
684
|
+
}
|
|
589
685
|
});
|
|
686
|
+
assert.isTrue(modelMetadataChecked, "model insert did not include metadata");
|
|
590
687
|
EventAccumulator.testModels(roImodel, (accum) => {
|
|
591
688
|
roImodel[_nativeDb].restartDefaultTxn();
|
|
592
689
|
accum.expectChanges({ inserted: [physicalModelEntity(newModelId)] });
|
|
@@ -748,8 +845,11 @@ describe("TxnManager", () => {
|
|
|
748
845
|
await withEditTxn(imodel, "batch-events", async (editTxn) => {
|
|
749
846
|
function entityCount(entities) {
|
|
750
847
|
let count = 0;
|
|
751
|
-
for (const
|
|
848
|
+
for (const entity of entities) {
|
|
849
|
+
expect(entity.metadata.classFullName).to.equal("TestBim:TestPhysicalObject");
|
|
850
|
+
expect(entity.metadata.is("BisCore:Element")).to.be.true;
|
|
752
851
|
++count;
|
|
852
|
+
}
|
|
753
853
|
return count;
|
|
754
854
|
}
|
|
755
855
|
const test = (numChangesExpected, func) => {
|