@itwin/core-backend 5.10.0-dev.5 → 5.10.0-dev.6
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 +28 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +14 -62
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +29 -162
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.d.ts +4 -4
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +6 -6
- package/lib/cjs/ChangesetECAdaptor.js +252 -252
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChangesetReader.js.map +1 -1
- package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +3 -3
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +2 -2
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +10 -10
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +2 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts +5 -5
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.d.ts +2 -2
- package/lib/cjs/ExternalSource.d.ts.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +22 -22
- package/lib/cjs/IModelDb.js +28 -28
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.d.ts +2 -0
- package/lib/cjs/IModelJsFs.d.ts.map +1 -1
- package/lib/cjs/IModelJsFs.js +14 -0
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -6
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.d.ts +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +6 -6
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PartialChangeUnifier.js +7 -7
- package/lib/cjs/PartialChangeUnifier.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +10 -10
- package/lib/cjs/Relationship.js +6 -6
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.d.ts +4 -4
- package/lib/cjs/SheetIndex.d.ts.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.d.ts +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +3 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +95 -13
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +6 -6
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.d.ts +2 -2
- package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.d.ts +2 -2
- package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +33 -33
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +14 -62
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +30 -163
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.d.ts +4 -4
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.d.ts +6 -6
- package/lib/esm/ChangesetECAdaptor.js +252 -252
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChangesetReader.js.map +1 -1
- package/lib/esm/ChangesetReaderTypes.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.d.ts +3 -3
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.d.ts +2 -2
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +10 -10
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +2 -2
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.d.ts +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.d.ts +5 -5
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.d.ts +2 -2
- package/lib/esm/ExternalSource.d.ts.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +22 -22
- package/lib/esm/IModelDb.js +28 -28
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.d.ts +2 -0
- package/lib/esm/IModelJsFs.d.ts.map +1 -1
- package/lib/esm/IModelJsFs.js +14 -0
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -6
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.js +1 -1
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.d.ts +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.d.ts +6 -6
- package/lib/esm/Model.d.ts.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PartialChangeUnifier.js +7 -7
- package/lib/esm/PartialChangeUnifier.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.d.ts +10 -10
- package/lib/esm/Relationship.js +6 -6
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.d.ts +4 -4
- package/lib/esm/SheetIndex.d.ts.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.d.ts +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +3 -0
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +96 -14
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.d.ts +6 -6
- package/lib/esm/ViewDefinition.d.ts.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts +1 -1
- package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.d.ts +2 -2
- package/lib/esm/domains/GenericElements.d.ts.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.d.ts +2 -2
- package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js +33 -33
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestEditTxn.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +2387 -213
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +44 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +246 -246
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
- package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.js.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerBasedLocks.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ServerBasedLocks.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport * as chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { match as sinonMatch, restore as sinonRestore, spy as sinonSpy, stub as sinonStub } from \"sinon\";\nimport { AccessToken, Guid, GuidString, Id64, Id64Arg, IModelStatus } from \"@itwin/core-bentley\";\nimport { Code, IModel, IModelError, LocalBriefcaseProps, LockState, PhysicalElementProps, RequestNewBriefcaseProps } from \"@itwin/core-common\";\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\nimport { PhysicalObject } from \"../../domains/GenericElements\";\nimport { PhysicalElement } from \"../../Element\";\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { ElementOwnsChildElements } from \"../../NavigationRelationship\";\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { ChannelControl, LockConflict, LockMap } from \"../../core-backend\";\nimport { _hubAccess, _releaseAllLocks } from \"../../internal/Symbols\";\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\n\nconst expect = chai.expect;\nconst assert = chai.assert;\nchai.use(chaiAsPromised);\n\ndescribe(\"Server-based locks\", () => {\n const createVersion0 = async () => {\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\n assert.isFalse(sourceDb.locks.isServerBased);\n await ExtensiveTestScenario.prepareDb(sourceDb);\n await ExtensiveTestScenario.populateDb(sourceDb);\n sourceDb.close();\n return dbName;\n };\n\n let iModelId: GuidString;\n let accessToken1: AccessToken;\n let accessToken2: AccessToken;\n let briefcase1Props: LocalBriefcaseProps;\n let briefcase2Props: LocalBriefcaseProps;\n\n afterEach(() => sinonRestore());\n before(async () => {\n HubMock.startup(\"ServerBasedLocks\", KnownTestLocations.outputDir);\n\n const iModelProps = {\n iModelName: \"server locks test\",\n iTwinId: HubMock.iTwinId,\n version0: await createVersion0(),\n };\n\n iModelId = await HubMock.createNewIModel(iModelProps);\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", ...args });\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token2\", ...args });\n });\n after(() => {\n HubMock.shutdown();\n });\n\n const assertSharedLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertExclusiveLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n assertSharedLocks(locks, ids);\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertLockCounts = (locks: ServerBasedLocks, shared: number, exclusive: number) => {\n assert.equal(locks.getLockCount(LockState.Shared), shared);\n assert.equal(locks.getLockCount(LockState.Exclusive), exclusive);\n };\n\n it(\"Acquiring locks\", async () => {\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\n let bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n assert.isTrue(bc1.locks.isServerBased);\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n let bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n assert.isTrue(bc2.locks.isServerBased);\n\n let bc1Locks = bc1.locks as ServerBasedLocks;\n let bc2Locks = bc2.locks as ServerBasedLocks;\n const child1 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\n const child2 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\n const childEl = bc1.elements.getElement<PhysicalElement>(child1);\n const parentId = childEl.parent!.id;\n const modelId = childEl.model;\n const modelProps = bc1.elements.getElementProps(modelId);\n const subjectId = modelProps.parent!.id;\n\n const sharedLockError = \"shared lock is held\";\n const exclusiveLockError = \"lock is already held\";\n\n await bc1.acquireSchemaLock();\n assert.equal(lockSpy.callCount, 1);\n assert.isTrue(bc1.holdsSchemaLock);\n assertLockCounts(bc1Locks, 0, 1);\n assertExclusiveLocks(bc1Locks, [IModel.dictionaryId, child1, parentId]); // even though we only hold 1 lock (the \"schema\" lock), every element should say it's locked\n\n await bc1Locks.acquireLocks({ exclusive: child1 }); // attempting to acquire exclusive lock on any element when schema lock is held shouldn't need a server request\n assert.equal(lockSpy.callCount, 1);\n\n assert.isFalse(bc2.holdsSchemaLock);\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, exclusiveLockError, \"acquire schema exclusive\");\n await expect(bc2Locks.acquireLocks({ shared: childEl.model })).rejectedWith(IModelError, exclusiveLockError);\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: parentId, shared: parentId });\n assertLockCounts(bc1Locks, 3, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [parentId, child1, child2]); // acquiring exclusive lock on parent implicitly holds exclusive lock on children\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: modelId });\n assertLockCounts(bc1Locks, 2, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [modelId, parentId, child1, child2]); // acquiring exclusive lock on model implicitly holds exclusive lock on members\n\n await bc1Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n await bc1Locks.acquireLocks({ shared: child1 });\n assert.equal(lockSpy.callCount, 1);\n assert.equal(lockSpy.getCall(0).args[1].size, 5);\n assertSharedLocks(bc1Locks, [child1, parentId, modelId, subjectId, IModel.rootSubjectId]);\n assertLockCounts(bc1Locks, 5, 0);\n await bc1Locks.acquireLocks({ exclusive: child1 }); // upgrade lock from shared to exclusive\n assert.equal(lockSpy.callCount, 2);\n assertLockCounts(bc1Locks, 4, 1);\n\n assertExclusiveLocks(bc1Locks, child1);\n assert.equal(lockSpy.callCount, 2); // should not need to call server on a lock already held\n\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 3);\n await expect(bc2Locks.acquireLocks({ exclusive: parentId })).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 4);\n await bc2Locks.acquireLocks({ shared: parentId });\n assert.equal(lockSpy.callCount, 5);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId]);\n await bc2Locks.acquireLocks({ shared: IModel.dictionaryId });\n assert.equal(lockSpy.callCount, 6);\n assertSharedLocks(bc2Locks, IModel.dictionaryId);\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n const childElJson = childEl.toJSON();\n // if we close and reopen the briefcase, the local locks database should still be intact\n bc1.close();\n bc2.close();\n\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n bc1Locks = bc1.locks as ServerBasedLocks;\n bc2Locks = bc2.locks as ServerBasedLocks;\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n assertSharedLocks(bc1Locks, [parentId, childEl.model, IModel.rootSubjectId]);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId, IModel.dictionaryId]);\n assertExclusiveLocks(bc1Locks, child1);\n assert.isFalse(bc2Locks.holdsExclusiveLock(child1));\n\n await bc2Locks[_releaseAllLocks](); // release all locks from bc2 so we can test expected failures below\n assertLockCounts(bc2Locks, 0, 0);\n\n await expect(bc2Locks.acquireLocks({ exclusive: [IModel.dictionaryId, parentId] })).rejectedWith(IModelError, sharedLockError);\n assertLockCounts(bc2Locks, 0, 0); // exclusive lock is available on dictionary, but not on parent - should get neither\n await bc2Locks.acquireLocks({ exclusive: IModel.dictionaryId }); // now attempt to get only dictionary\n assertExclusiveLocks(bc2Locks, IModel.dictionaryId); // that should work\n assertSharedLocks(bc2Locks, IModel.rootSubjectId); // it should also acquire the shared lock on the rootSubject\n assertLockCounts(bc2Locks, 1, 1);\n\n await bc1Locks[_releaseAllLocks]();\n await bc2Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n\n const physicalProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n parent: new ElementOwnsChildElements(parentId),\n category: childElJson.category,\n code: Code.createEmpty(),\n };\n assert.throws(() => withEditTxn(bc1, (txn) => txn.insertElement(physicalProps)), IModelError, \"shared lock\"); // insert requires shared lock on model\n await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model\n const newElId = withEditTxn(bc1, (txn) => txn.insertElement(physicalProps));\n assertExclusiveLocks(bc1Locks, newElId);\n\n childElJson.userLabel = \"new user label\";\n assert.throws(() => withEditTxn(bc1, (txn) => txn.updateElement(childElJson)), \"exclusive lock\");\n await bc1Locks.acquireLocks({ exclusive: child1 });\n withEditTxn(bc1, (txn) => txn.updateElement(childElJson));\n\n {\n const txn = new EditTxn(bc1, \"verify delete lock behavior\");\n txn.start();\n txn.deleteElement(child1); // make sure delete now works\n txn.end(\"abandon\");\n }\n\n assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n await bc1.pushChanges({ accessToken: accessToken1, description: \"my changes\" });\n\n assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n assert.throws(() => withEditTxn(bc2, (txn) => txn.deleteElement(child1)), \"exclusive lock\"); // bc2 can't delete because it doesn't hold lock\n await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, \"pull is required\"); // can't get lock since other briefcase changed it\n\n await bc2.pullChanges({ accessToken: accessToken2 });\n await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });\n const child2El = bc2.elements.getElement<PhysicalElement>(child1);\n\n assert.equal(child2El.userLabel, childElJson.userLabel);\n await bc1.locks.releaseAllLocks();\n await bc2.locks.releaseAllLocks();\n bc1.close();\n bc2.close();\n });\n\n describe(\"releaseAllLocks\", () => {\n let bc: BriefcaseDb;\n let locks: ServerBasedLocks;\n let elemId: string;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n elemId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n expect(elemId).not.to.equal(\"0\");\n });\n\n afterEach(() => bc.close());\n\n function expectLocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).least(1);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function expectUnlocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function write(txn: EditTxn): void {\n const elem = bc.elements.getElement(elemId);\n elem.jsonProperties.testProp = Guid.createValue();\n elem.update(txn);\n }\n\n async function push(retainLocks?: true): Promise<void> {\n return bc.pushChanges({ retainLocks, accessToken: \"token\", description: \"changes\" });\n }\n\n it(\"releases all locks\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is called when pushChanges is called with no local changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push();\n expectUnlocked();\n });\n\n it(\"is called when pushing changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n withEditTxn(bc, (txn) => write(txn));\n await push();\n expectUnlocked();\n });\n\n it(\"is not called when pushChanges is called with no local changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is not called when pushing changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n withEditTxn(bc, (txn) => write(txn));\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unpushed changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n withEditTxn(bc, (txn) => write(txn));\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n await push();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unsaved changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n const txn = new EditTxn(bc, \"releaseAllLocks unsaved changes\");\n txn.start();\n write(txn);\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n expectLocked();\n txn.end(\"abandon\");\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n });\n\n describe(\"abandonLocksForReversedTxn\", () => {\n let bc: BriefcaseDb;\n let bc2: BriefcaseDb | undefined;\n let locks: ServerBasedLocks;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n });\n\n afterEach(async () => {\n sinonRestore();\n\n await locks[_releaseAllLocks]();\n bc.close();\n\n if (bc2 !== undefined) {\n await bc2.locks.releaseAllLocks();\n bc2.close();\n bc2 = undefined;\n }\n });\n\n it(\"abandons locks acquired in the current, unsaved txn\", async () => {\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"abandonLocks\");\n\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: childId });\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(1);\n expect(locks.getLockCount(LockState.Shared)).to.be.greaterThan(0);\n\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n\n expect(lockSpy.callCount).to.equal(1);\n const releasedLocks = lockSpy.getCall(0).args[1] as Map<string, LockState>;\n expect(releasedLocks.size).to.be.greaterThan(0);\n for (const state of releasedLocks.values())\n expect(state).to.equal(LockState.None);\n\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n });\n\n it(\"abandons locks acquired in the most recent saved txn\", async () => {\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"abandonLocks\");\n\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnId = bc.txns.getCurrentTxnId();\n\n await withEditTxn(bc, async txn => {\n await locks.acquireLocks({ exclusive: childId });\n const element = bc.elements.getElement<PhysicalElement>(childId);\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(1);\n expect(locks.getLockCount(LockState.Shared)).to.be.greaterThan(0);\n\n bc.txns.reverseSingleTxn();\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n\n expect(lockSpy.callCount).to.equal(1);\n const releasedLocks = lockSpy.getCall(0).args[1] as Map<string, LockState>;\n expect(releasedLocks.size).to.be.greaterThan(0);\n for (const state of releasedLocks.values())\n expect(state).to.equal(LockState.None);\n\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n });\n\n it(\"does not release locks acquired by a different txn\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const txn1 = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId1 });\n\n await withEditTxn(bc, async txn => {\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n const txn2 = bc.txns.getCurrentTxnId();\n expect(txn2).not.to.equal(txn1);\n\n await withEditTxn(bc, async txn => {\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n bc.txns.reverseTxns(1);\n expect(await locks.abandonLocksForReversedTxn(txn2)).to.be.true;\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n });\n\n it(\"invalidates discovered locks\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const ownerModeltId = bc.elements.getElementProps(elementId).model;\n const ownersOwnerModelId = bc.elements.getElementProps(ownerModeltId).model;\n\n await locks.acquireLocks({ exclusive: ownersOwnerModelId });\n expect(locks.holdsExclusiveLock(ownerModeltId)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n\n const txnId = bc.txns.getCurrentTxnId();\n bc.txns.reverseTxns(1);\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n\n expect(locks.holdsExclusiveLock(ownerModeltId)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n });\n\n it(\"restores lock to its previous state if it was upgraded by the reversed txn\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const firstTxnId = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId1, shared: elementId2 });\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // We must actually edit something in order to start a new Txn.\n await withEditTxn(bc, async txn => {\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\n element.setUserProperties(\"foo\", { test: true });\n element.update(txn);\n });\n\n const secondTxnId = bc.txns.getCurrentTxnId();\n expect(firstTxnId).not.to.equal(secondTxnId);\n\n await locks.acquireLocks({ exclusive: elementId2 }); // upgrade lock from shared to exclusive\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n expect(await locks.abandonLocksForReversedTxn(secondTxnId)).to.be.true;\n\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n });\n\n it(\"does not update changesetid when releasing locks\", async () => {\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n expect(bc2.locks.isServerBased).to.be.true;\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Make sure both briefcase initially have all changes.\n await bc.pullChanges({ accessToken: \"token\" });\n await bc2.pullChanges({ accessToken: \"token\" });\n\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n // Edit an element in the first briefcase and push the change. This will\n // create a new changeset.\n await locks.acquireLocks({ exclusive: elementId1 });\n\n await withEditTxn(bc, async txn => {\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\n element.setUserProperties(\"foo\", { test: true });\n element.update(txn);\n });\n\n await bc.pushChanges({ accessToken: \"token\", description: \"changes\" });\n\n const secondTxnId = bc.txns.getCurrentTxnId();\n\n // In that same briefcase, lock and edit a different element, but then reverse\n // the change and release the lock.\n await bc.locks.acquireLocks({ exclusive: elementId2 });\n await withEditTxn(bc, async txn => {\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n element2.setUserProperties(\"bar\", { test: true });\n element2.update(txn);\n });\n\n bc.txns.reverseTxns(1);\n expect(await locks.abandonLocksForReversedTxn(secondTxnId)).to.be.true;\n\n // Now, in a separate briefcase, which has not yet pulled the changes pushed by the first,\n // attempt to lock the same element whose lock was just released. This should work because\n // the lock release by releaseLocksForReversedTxn should not have updated the changeset\n // associated with that lock.\n await bc2.locks.acquireLocks({ exclusive: elementId2 });\n });\n\n it(\"does not release on the server an implicit lock held for a new element\", async () => {\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const childElement = bc.elements.getElement<PhysicalElement>(childId);\n const parentId = childElement.parent!.id;\n const modelId = childElement.model;\n\n const physicalProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n parent: new ElementOwnsChildElements(parentId),\n category: childElement.category,\n code: Code.createEmpty(),\n };\n\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ shared: [modelId, parentId] });\n const newElementId = await withEditTxn(bc, async txn => {\n return txn.insertElement(physicalProps);\n });\n\n expect(locks.holdsExclusiveLock(newElementId)).to.be.true;\n\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\n\n bc.txns.reverseTxns(1);\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n\n expect(lockSpy.calledWithMatch(sinonMatch.any, sinonMatch((lockMap: LockMap) => lockMap.has(newElementId)))).to.be.false;\n });\n\n it(\"releases locks for later txns, too\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const txn1 = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId1 });\n\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n const txn2 = bc.txns.getCurrentTxnId();\n expect(txn2).not.to.equal(txn1);\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n // Reverse both txns, then abandon locks starting from the earlier one.\n // This will release locks for the later one, too.\n bc.txns.reverseTxns(2);\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n });\n\n it(\"throws if asked to abandon locks for a txn that has not been reversed\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const txnId = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n // The txn has not been reversed, so abandonLocksForReversedTxn should throw.\n await expect(locks.abandonLocksForReversedTxn(txnId)).to.eventually.be.rejectedWith(\"has not been reversed\");\n\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n });\n\n it(\"throws if asked to abandon locks for the current txn and there are unsaved changes\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n\n // The current txn has unsaved changes, so abandonLocksForReversedTxn should throw.\n const txnId = bc.txns.getCurrentTxnId();\n await expect(locks.abandonLocksForReversedTxn(txnId)).to.eventually.be.rejectedWith(\"unsaved changes\");\n\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n });\n });\n\n it(\"throws if asked to abandon locks for a nonexistent txn\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n bc.txns.reverseSingleTxn();\n\n // Use an ID that is not a valid txn.\n await expect(locks.abandonLocksForReversedTxn(\"0xffffffffffff\")).to.eventually.be.rejectedWith(\"does not exist\");\n\n // The lock should still be held.\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n });\n\n it(\"returns false when called a second time for an already-abandoned txn\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n bc.txns.reverseSingleTxn();\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Calling again should be a no-op and return false because the locks are already abandoned.\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n });\n });\n\n describe(\"acquireLocksForReinstatingTxn\", () => {\n let bc: BriefcaseDb;\n let bc2: BriefcaseDb | undefined;\n let locks: ServerBasedLocks;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n });\n\n afterEach(async () => {\n await locks[_releaseAllLocks]();\n bc.close();\n\n if (bc2 !== undefined) {\n await (bc2.locks as ServerBasedLocks)[_releaseAllLocks]();\n bc2.close();\n bc2 = undefined;\n }\n });\n\n it(\"reacquires locks for reinstating a txn\", async () => {\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: childId });\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\n\n // We must actually edit something in order to start a new Txn.\n const element = bc.elements.getElement<PhysicalElement>(childId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", { test: true });\n element.update(txn);\n });\n\n bc.txns.reverseTxns(1);\n await locks.abandonLocksForReversedTxn(txnId);\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\n\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.true;\n bc.txns.reinstateTxn();\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\n });\n\n it(\"reupgrades a shared lock to exclusive\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const firstTxnId = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId1, shared: elementId2 });\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // We must actually edit something in order to start a new Txn.\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", { test: true });\n element.update(txn);\n });\n\n const secondTxnId = bc.txns.getCurrentTxnId();\n expect(firstTxnId).not.to.equal(secondTxnId);\n\n await locks.acquireLocks({ exclusive: elementId2 }); // upgrade lock from shared to exclusive\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", { test: true });\n element2.update(txn);\n });\n\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n bc.txns.reverseSingleTxn();\n await locks.abandonLocksForReversedTxn(secondTxnId);\n\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n expect(await locks.acquireLocksForReinstatingTxn(secondTxnId)).to.be.true;\n bc.txns.reinstateTxn();\n\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n });\n\n it(\"does not acquire on the server an implicit lock originally held for a new element\", async () => {\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const childElement = bc.elements.getElement<PhysicalElement>(childId);\n const parentId = childElement.parent!.id;\n const modelId = childElement.model;\n\n const physicalProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n parent: new ElementOwnsChildElements(parentId),\n category: childElement.category,\n code: Code.createEmpty(),\n };\n\n await locks.acquireLocks({ shared: [modelId, parentId] });\n const txnId = bc.txns.getCurrentTxnId();\n const newElementId = await withEditTxn(bc, async txn => {\n return txn.insertElement(physicalProps);\n });\n\n bc.txns.reverseTxns(1);\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.true;\n bc.txns.reinstateTxn();\n expect(locks.holdsExclusiveLock(newElementId)).to.be.true;\n });\n\n it(\"acquires locks for earlier txns, too\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const txn1 = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId1 });\n\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n const txn2 = bc.txns.getCurrentTxnId();\n expect(txn2).not.to.equal(txn1);\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n // Reverse both txns and abandon locks starting from the earlier one.\n bc.txns.reverseTxns(2);\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Acquire locks for the later txn. This should also acquire locks for the earlier one.\n expect(await locks.acquireLocksForReinstatingTxn(txn2)).to.be.true;\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n });\n\n it(\"cannot acquire locks for a reversed txn after new changes are made\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const txn1 = bc.txns.getCurrentTxnId();\n await locks.acquireLocks({ exclusive: elementId1 });\n\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n bc.txns.reverseTxns(1);\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\n\n // Make other changes, making the reversed txn inaccessible.\n const txn2 = bc.txns.getCurrentTxnId();\n expect(txn1).to.equal(txn2);\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n // Attempting to reinstate the txn should not acquire any locks.\n expect(await locks.acquireLocksForReinstatingTxn(txn1)).to.be.false;\n\n // We should still not have a lock on elementId1, because txn1 is now a different txn after the original\n // was reversed and we started making further changes under the reused txn id.\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n });\n\n it(\"throws if another briefcase holds a conflicting lock\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n // Reverse and abandon the lock so it's released on the server.\n bc.txns.reverseSingleTxn();\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Have a second briefcase acquire the same lock.\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await bc2.pullChanges();\n await bc2.locks.acquireLocks({ exclusive: elementId });\n\n // Attempting to reacquire the lock for reinstatement should fail because bc2 holds it.\n await expect(locks.acquireLocksForReinstatingTxn(txnId)).to.eventually.be.rejectedWith(\"lock is already held\");\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n });\n\n it(\"is a no-op when locks were never abandoned\", async () => {\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: childId });\n\n const element = bc.elements.getElement<PhysicalElement>(childId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n // Reverse the txn but do NOT abandon locks.\n bc.txns.reverseSingleTxn();\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\n\n // acquireLocksForReinstatingTxn should be a harmless no-op since locks were never abandoned.\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.false;\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\n });\n\n it(\"throws for an invalid txnId\", async () => {\n await expect(locks.acquireLocksForReinstatingTxn(\"0xffffffffffff\")).to.eventually.be.rejectedWith(\"does not exist\");\n });\n });\n\n describe(\"TxnManager integration\", () => {\n let bc: BriefcaseDb;\n let locks: ServerBasedLocks;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n });\n\n afterEach(async () => {\n await locks[_releaseAllLocks]();\n bc.close();\n });\n\n describe(\"reverseTxnsAsync\", () => {\n it(\"reverses a single txn and abandons its locks\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n const originalProps = element.getUserProperties(\"foo\");\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Verify the element change was actually reversed.\n const revertedElement = bc.elements.getElement<PhysicalElement>(elementId);\n expect(revertedElement.getUserProperties(\"foo\")).to.deep.equal(originalProps);\n });\n\n it(\"reverses multiple txns and abandons all their locks\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n await bc.txns.reverseTxnsAsync(2);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Verify the element changes were actually reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\n });\n\n it(\"when an earlier txn is reversed using reverseTxns, and a later one with reverseTxnsAsync, the latter call abandons the earlier locks, too\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n // Reverse the later txn using reverseTxns (no lock abandonment).\n bc.txns.reverseTxns(1);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n // Reverse the earlier txn using reverseTxnsAsync.\n // This should also abandon locks for the already-reversed later txn.\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n });\n });\n\n describe(\"reverseSingleTxnAsync\", () => {\n it(\"reverses a single txn and abandons its locks\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n const originalProps = element.getUserProperties(\"foo\");\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n\n await bc.txns.reverseSingleTxnAsync();\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Verify the element change was actually reversed.\n const revertedElement = bc.elements.getElement<PhysicalElement>(elementId);\n expect(revertedElement.getUserProperties(\"foo\")).to.deep.equal(originalProps);\n });\n });\n\n describe(\"reverseAllTxnsAsync\", () => {\n it(\"reverses all txns and abandons all their locks\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n await bc.txns.reverseAllTxnsAsync();\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Verify the element changes were actually reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\n });\n });\n\n describe(\"reverseToTxnAsync\", () => {\n it(\"reverses to a specific txn and abandons locks for all reversed txns\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const origProps2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n const txnAfterFirst = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n await bc.txns.reverseToTxnAsync(txnAfterFirst);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Verify only the second element's changes were reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(origProps2);\n });\n });\n\n describe(\"cancelToTxnAsync\", () => {\n it(\"cancels to a specific txn and abandons locks for all cancelled txns\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const origProps2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n const txnAfterFirst = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n await bc.txns.cancelToTxnAsync(txnAfterFirst);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Verify the second element's changes were cancelled.\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(origProps2);\n\n // cancelTo should not allow redo\n expect(bc.txns.isRedoPossible).to.be.false;\n });\n\n it(\"after regular cancelTo, locks can be abandoned, but not re-acquired\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n\n const txnId = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n // Use the regular cancelTo which does not abandon locks.\n bc.txns.cancelTo(txnId);\n\n // Now try to abandon the locks, which should work.\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n\n // However, it doesn't make sense to reacquire these locks because the Txn no longer exists.\n await expect(locks.acquireLocksForReinstatingTxn(txnId)).to.eventually.be.rejectedWith(\"does not exist\");\n });\n\n it(\"canceling a txn prevents subsequent reacquisition of that txn's locks\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const txnBefore = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId });\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n await bc.txns.cancelToTxnAsync(txnBefore);\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Attempting to acquire locks for the cancelled transaction should fail\n // because the transaction itself no longer exists and its lock records have been cleared.\n await expect(locks.acquireLocksForReinstatingTxn(txnBefore)).to.eventually.be.rejectedWith(\"does not exist\");\n });\n\n it(\"reverses but does not cancel if lock abandonment fails\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n const txnBefore = bc.txns.getCurrentTxnId();\n\n await locks.acquireLocks({ exclusive: elementId });\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", Guid.createValue());\n element.update(txn);\n });\n\n const error = new IModelError(IModelStatus.BadRequest, \"Lock abandonment failed\");\n sinonStub(locks, \"abandonLocksForReversedTxn\").rejects(error);\n\n await expect(bc.txns.cancelToTxnAsync(txnBefore)).to.eventually.be.rejectedWith(IModelError, \"Lock abandonment failed\");\n\n // The txn was reversed but not canceled, so we can reinstate. Locks are still held.\n expect(bc.txns.isRedoPossible).to.be.true;\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n\n // And now we can try releasing the locks again.\n sinonRestore();\n await bc.locks.abandonLocksForReversedTxn(txnBefore);\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // And cancel the already-reversed txn.\n expect(bc.txns.cancelTo(txnBefore)).to.equal(IModelStatus.NothingToUndo);\n expect(bc.txns.isRedoPossible).to.be.false;\n });\n });\n\n describe(\"reinstateTxnAndAcquireLocks\", () => {\n it(\"reinstates a reversed txn and reacquires its locks\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n await locks.acquireLocks({ exclusive: elementId });\n\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n const originalProps = element.getUserProperties(\"foo\");\n const newValue = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", newValue);\n element.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Verify the element change was reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\n\n await bc.txns.reinstateTxnAsync();\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n\n // Verify the element change was reinstated.\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.equal(newValue);\n });\n\n it(\"multiple txns reversed together are reinstated as one\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\n\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n const newValue1 = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", newValue1);\n element1.update(txn);\n });\n\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n const newValue2 = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", newValue2);\n element2.update(txn);\n });\n\n await bc.txns.reverseTxnsAsync(2);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Verify both element changes were reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\n\n // A single reinstate should bring back both txns and reacquire all locks.\n await bc.txns.reinstateTxnAsync();\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n\n // Verify both element changes are reinstated.\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.equal(newValue2);\n });\n\n it(\"abandons unsaved changes before reinstatement\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n // Make a change, save it, and reverse it.\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n const originalProps1 = element1.getUserProperties(\"foo\");\n const newValue1 = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", newValue1);\n element1.update(txn);\n });\n\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n\n // Verify the element change was reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(originalProps1);\n\n // Now make an unsaved change to a different element.\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n const originalProps2 = element2.getUserProperties(\"bar\");\n const newValue2 = Guid.createValue();\n\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", newValue2);\n element2.update(txn);\n\n // Verify the unsaved change is present and lock is held.\n expect(bc.txns.hasUnsavedChanges).to.be.true;\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.equal(newValue2);\n\n // Reinstate the first txn. This should:\n // 1. Abandon the unsaved change to element2\n // 2. Abandon the lock on element2\n // 3. Reinstate the change to element1\n // 4. Reacquire the lock on element1\n await bc.txns.reinstateTxnAsync();\n\n // Verify the unsaved change was abandoned.\n expect(bc.txns.hasUnsavedChanges).to.be.false;\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(originalProps2);\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\n\n // Verify the first change was reinstated and its lock reacquired.\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n });\n });\n\n describe(\"throws and leaves locks acquired if reinstateTxn fails\", async () => {\n let elementId: string | undefined;\n let fooValue: string | undefined;\n\n beforeEach(async () => {\n elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n await locks.acquireLocks({ exclusive: elementId });\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n fooValue = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", fooValue);\n element.update(txn);\n });\n\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n sinonStub(bc.txns, \"reinstateTxn\").returns(IModelStatus.BadRequest);\n\n await expect(bc.txns.reinstateTxnAsync()).to.eventually.be.rejectedWith(IModelError, \"Bad Request\");\n\n // Even though it failed to reinstate, it obtained the lock and did not release it.\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\n });\n\n it(\"and we can try reinstating again, without any problems caused by the locks already being acquired\", async () => {\n sinonRestore();\n await bc.txns.reinstateTxnAsync();\n expect(locks.holdsExclusiveLock(elementId!)).to.be.true;\n expect(bc.elements.getElement<PhysicalElement>(elementId!).getUserProperties(\"foo\")).to.equal(fooValue);\n });\n\n it(\"and we can then release the locks\", async () => {\n await locks.abandonLocksForReversedTxn(bc.txns.getCurrentTxnId());\n expect(locks.holdsExclusiveLock(elementId!)).to.be.false;\n });\n });\n\n it(\"throws and does not reinstate if acquireLocksForReinstatingTxn fails\", async () => {\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n await locks.acquireLocks({ exclusive: elementId });\n const element = bc.elements.getElement<PhysicalElement>(elementId);\n const originalProps = element.getUserProperties(\"foo\");\n const newValue = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element.setUserProperties(\"foo\", newValue);\n element.update(txn);\n });\n\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\n\n // Verify the element change was reversed.\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\n\n // Simulate acquireLocksForReinstatingTxn failing (e.g. because another briefcase holds the lock)\n const error = new LockConflict(0x12345, \"other briefcase alias\", \"exclusive lock is already held\");\n sinonStub(locks, \"acquireLocksForReinstatingTxn\").rejects(error);\n\n await expect(bc.txns.reinstateTxnAsync()).to.eventually.be.rejectedWith(\"exclusive lock is already held\");\n\n // Verify it was NOT reinstated\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\n });\n\n it(\"new changes after reversal truncate the redo stack and clear reversible lock records\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n // 1. Make a change to element 1 and save it.\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", Guid.createValue());\n element1.update(txn);\n });\n\n const txn1Id = bc.txns.getCurrentTxnId();\n\n // 2. Reverse the txn and abandon locks.\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(bc.txns.isRedoPossible).to.be.true;\n\n // 3. Make a change to element 2 and save it. This truncates the redo stack.\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n });\n\n // The redo stack should now be truncated.\n expect(bc.txns.isRedoPossible).to.be.false;\n\n // 4. Try to reacquire locks for the truncated transaction.\n await expect(locks.acquireLocksForReinstatingTxn(txn1Id)).to.eventually.be.rejectedWith(\"does not exist\");\n });\n\n it(\"abandoned changes after reversal do not prevent reinstatement\", async () => {\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n\n // 1. Make a change to element 1 and save it.\n await locks.acquireLocks({ exclusive: elementId1 });\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\n const newValue1 = Guid.createValue();\n await withEditTxn(bc, async txn => {\n element1.setUserProperties(\"foo\", newValue1);\n element1.update(txn);\n });\n\n // 2. Reverse the txn and abandon locks.\n await bc.txns.reverseTxnsAsync(1);\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\n expect(bc.txns.isRedoPossible).to.be.true;\n\n // 3. Make a change to element 2 and abandon it.\n await locks.acquireLocks({ exclusive: elementId2 });\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\n await withEditTxn(bc, async txn => {\n element2.setUserProperties(\"bar\", Guid.createValue());\n element2.update(txn);\n txn.abandonChanges();\n });\n\n expect(bc.txns.isRedoPossible).to.be.true;\n\n // 4. Reinstate should still work.\n await bc.txns.reinstateTxnAsync();\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"ServerBasedLocks.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ServerBasedLocks.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 * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport { match as sinonMatch, restore as sinonRestore, spy as sinonSpy, stub as sinonStub } from \"sinon\";\r\nimport { AccessToken, Guid, GuidString, Id64, Id64Arg, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { Code, IModel, IModelError, LocalBriefcaseProps, LockState, PhysicalElementProps, RequestNewBriefcaseProps } from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { PhysicalObject } from \"../../domains/GenericElements\";\r\nimport { PhysicalElement } from \"../../Element\";\r\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { ElementOwnsChildElements } from \"../../NavigationRelationship\";\r\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { ChannelControl, LockConflict, LockMap } from \"../../core-backend\";\r\nimport { _hubAccess, _releaseAllLocks } from \"../../internal/Symbols\";\r\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\r\n\r\nconst expect = chai.expect;\r\nconst assert = chai.assert;\r\nchai.use(chaiAsPromised);\r\n\r\ndescribe(\"Server-based locks\", () => {\r\n const createVersion0 = async () => {\r\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\r\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\r\n assert.isFalse(sourceDb.locks.isServerBased);\r\n await ExtensiveTestScenario.prepareDb(sourceDb);\r\n await ExtensiveTestScenario.populateDb(sourceDb);\r\n sourceDb.close();\r\n return dbName;\r\n };\r\n\r\n let iModelId: GuidString;\r\n let accessToken1: AccessToken;\r\n let accessToken2: AccessToken;\r\n let briefcase1Props: LocalBriefcaseProps;\r\n let briefcase2Props: LocalBriefcaseProps;\r\n\r\n afterEach(() => sinonRestore());\r\n before(async () => {\r\n HubMock.startup(\"ServerBasedLocks\", KnownTestLocations.outputDir);\r\n\r\n const iModelProps = {\r\n iModelName: \"server locks test\",\r\n iTwinId: HubMock.iTwinId,\r\n version0: await createVersion0(),\r\n };\r\n\r\n iModelId = await HubMock.createNewIModel(iModelProps);\r\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\r\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", ...args });\r\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token2\", ...args });\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n const assertSharedLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\r\n for (const id of Id64.iterable(ids))\r\n assert.isTrue(locks.holdsSharedLock(id));\r\n };\r\n const assertExclusiveLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\r\n assertSharedLocks(locks, ids);\r\n for (const id of Id64.iterable(ids))\r\n assert.isTrue(locks.holdsSharedLock(id));\r\n };\r\n const assertLockCounts = (locks: ServerBasedLocks, shared: number, exclusive: number) => {\r\n assert.equal(locks.getLockCount(LockState.Shared), shared);\r\n assert.equal(locks.getLockCount(LockState.Exclusive), exclusive);\r\n };\r\n\r\n it(\"Acquiring locks\", async () => {\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\r\n let bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n assert.isTrue(bc1.locks.isServerBased);\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n let bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n assert.isTrue(bc2.locks.isServerBased);\r\n\r\n let bc1Locks = bc1.locks as ServerBasedLocks;\r\n let bc2Locks = bc2.locks as ServerBasedLocks;\r\n const child1 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\r\n const child2 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n const childEl = bc1.elements.getElement<PhysicalElement>(child1);\r\n const parentId = childEl.parent!.id;\r\n const modelId = childEl.model;\r\n const modelProps = bc1.elements.getElementProps(modelId);\r\n const subjectId = modelProps.parent!.id;\r\n\r\n const sharedLockError = \"shared lock is held\";\r\n const exclusiveLockError = \"lock is already held\";\r\n\r\n await bc1.acquireSchemaLock();\r\n assert.equal(lockSpy.callCount, 1);\r\n assert.isTrue(bc1.holdsSchemaLock);\r\n assertLockCounts(bc1Locks, 0, 1);\r\n assertExclusiveLocks(bc1Locks, [IModel.dictionaryId, child1, parentId]); // even though we only hold 1 lock (the \"schema\" lock), every element should say it's locked\r\n\r\n await bc1Locks.acquireLocks({ exclusive: child1 }); // attempting to acquire exclusive lock on any element when schema lock is held shouldn't need a server request\r\n assert.equal(lockSpy.callCount, 1);\r\n\r\n assert.isFalse(bc2.holdsSchemaLock);\r\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, exclusiveLockError, \"acquire schema exclusive\");\r\n await expect(bc2Locks.acquireLocks({ shared: childEl.model })).rejectedWith(IModelError, exclusiveLockError);\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n await bc1Locks.acquireLocks({ exclusive: parentId, shared: parentId });\r\n assertLockCounts(bc1Locks, 3, 1);\r\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\r\n assertExclusiveLocks(bc1Locks, [parentId, child1, child2]); // acquiring exclusive lock on parent implicitly holds exclusive lock on children\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n await bc1Locks.acquireLocks({ exclusive: modelId });\r\n assertLockCounts(bc1Locks, 2, 1);\r\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\r\n assertExclusiveLocks(bc1Locks, [modelId, parentId, child1, child2]); // acquiring exclusive lock on model implicitly holds exclusive lock on members\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n lockSpy.resetHistory();\r\n await bc1Locks.acquireLocks({ shared: child1 });\r\n assert.equal(lockSpy.callCount, 1);\r\n assert.equal(lockSpy.getCall(0).args[1].size, 5);\r\n assertSharedLocks(bc1Locks, [child1, parentId, modelId, subjectId, IModel.rootSubjectId]);\r\n assertLockCounts(bc1Locks, 5, 0);\r\n await bc1Locks.acquireLocks({ exclusive: child1 }); // upgrade lock from shared to exclusive\r\n assert.equal(lockSpy.callCount, 2);\r\n assertLockCounts(bc1Locks, 4, 1);\r\n\r\n assertExclusiveLocks(bc1Locks, child1);\r\n assert.equal(lockSpy.callCount, 2); // should not need to call server on a lock already held\r\n\r\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, sharedLockError);\r\n assert.equal(lockSpy.callCount, 3);\r\n await expect(bc2Locks.acquireLocks({ exclusive: parentId })).rejectedWith(IModelError, sharedLockError);\r\n assert.equal(lockSpy.callCount, 4);\r\n await bc2Locks.acquireLocks({ shared: parentId });\r\n assert.equal(lockSpy.callCount, 5);\r\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId]);\r\n await bc2Locks.acquireLocks({ shared: IModel.dictionaryId });\r\n assert.equal(lockSpy.callCount, 6);\r\n assertSharedLocks(bc2Locks, IModel.dictionaryId);\r\n\r\n assertLockCounts(bc1Locks, 4, 1);\r\n assertLockCounts(bc2Locks, 5, 0);\r\n\r\n const childElJson = childEl.toJSON();\r\n // if we close and reopen the briefcase, the local locks database should still be intact\r\n bc1.close();\r\n bc2.close();\r\n\r\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n bc1Locks = bc1.locks as ServerBasedLocks;\r\n bc2Locks = bc2.locks as ServerBasedLocks;\r\n\r\n assertLockCounts(bc1Locks, 4, 1);\r\n assertLockCounts(bc2Locks, 5, 0);\r\n\r\n assertSharedLocks(bc1Locks, [parentId, childEl.model, IModel.rootSubjectId]);\r\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId, IModel.dictionaryId]);\r\n assertExclusiveLocks(bc1Locks, child1);\r\n assert.isFalse(bc2Locks.holdsExclusiveLock(child1));\r\n\r\n await bc2Locks[_releaseAllLocks](); // release all locks from bc2 so we can test expected failures below\r\n assertLockCounts(bc2Locks, 0, 0);\r\n\r\n await expect(bc2Locks.acquireLocks({ exclusive: [IModel.dictionaryId, parentId] })).rejectedWith(IModelError, sharedLockError);\r\n assertLockCounts(bc2Locks, 0, 0); // exclusive lock is available on dictionary, but not on parent - should get neither\r\n await bc2Locks.acquireLocks({ exclusive: IModel.dictionaryId }); // now attempt to get only dictionary\r\n assertExclusiveLocks(bc2Locks, IModel.dictionaryId); // that should work\r\n assertSharedLocks(bc2Locks, IModel.rootSubjectId); // it should also acquire the shared lock on the rootSubject\r\n assertLockCounts(bc2Locks, 1, 1);\r\n\r\n await bc1Locks[_releaseAllLocks]();\r\n await bc2Locks[_releaseAllLocks]();\r\n lockSpy.resetHistory();\r\n\r\n const physicalProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n parent: new ElementOwnsChildElements(parentId),\r\n category: childElJson.category,\r\n code: Code.createEmpty(),\r\n };\r\n assert.throws(() => withEditTxn(bc1, (txn) => txn.insertElement(physicalProps)), IModelError, \"shared lock\"); // insert requires shared lock on model\r\n await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model\r\n const newElId = withEditTxn(bc1, (txn) => txn.insertElement(physicalProps));\r\n assertExclusiveLocks(bc1Locks, newElId);\r\n\r\n childElJson.userLabel = \"new user label\";\r\n assert.throws(() => withEditTxn(bc1, (txn) => txn.updateElement(childElJson)), \"exclusive lock\");\r\n await bc1Locks.acquireLocks({ exclusive: child1 });\r\n withEditTxn(bc1, (txn) => txn.updateElement(childElJson));\r\n\r\n {\r\n const txn = new EditTxn(bc1, \"verify delete lock behavior\");\r\n txn.start();\r\n txn.deleteElement(child1); // make sure delete now works\r\n txn.end(\"abandon\");\r\n }\r\n\r\n assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\r\n\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"my changes\" });\r\n\r\n assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\r\n\r\n assert.throws(() => withEditTxn(bc2, (txn) => txn.deleteElement(child1)), \"exclusive lock\"); // bc2 can't delete because it doesn't hold lock\r\n await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, \"pull is required\"); // can't get lock since other briefcase changed it\r\n\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });\r\n const child2El = bc2.elements.getElement<PhysicalElement>(child1);\r\n\r\n assert.equal(child2El.userLabel, childElJson.userLabel);\r\n await bc1.locks.releaseAllLocks();\r\n await bc2.locks.releaseAllLocks();\r\n bc1.close();\r\n bc2.close();\r\n });\r\n\r\n describe(\"releaseAllLocks\", () => {\r\n let bc: BriefcaseDb;\r\n let locks: ServerBasedLocks;\r\n let elemId: string;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n elemId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n expect(elemId).not.to.equal(\"0\");\r\n });\r\n\r\n afterEach(() => bc.close());\r\n\r\n function expectLocked(): void {\r\n expect(locks.getLockCount(LockState.Exclusive)).least(1);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n }\r\n\r\n function expectUnlocked(): void {\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n }\r\n\r\n function write(txn: EditTxn): void {\r\n const elem = bc.elements.getElement(elemId);\r\n elem.jsonProperties.testProp = Guid.createValue();\r\n elem.update(txn);\r\n }\r\n\r\n async function push(retainLocks?: true): Promise<void> {\r\n return bc.pushChanges({ retainLocks, accessToken: \"token\", description: \"changes\" });\r\n }\r\n\r\n it(\"releases all locks\", async () => {\r\n expectUnlocked();\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is called when pushChanges is called with no local changes\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n await push();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is called when pushing changes\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n withEditTxn(bc, (txn) => write(txn));\r\n await push();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is not called when pushChanges is called with no local changes if retainLocks is specified\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n await push(true);\r\n expectLocked();\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"is not called when pushing changes if retainLocks is specified\", async () => {\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n withEditTxn(bc, (txn) => write(txn));\r\n await push(true);\r\n expectLocked();\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"throws if briefcase has unpushed changes\", async () => {\r\n expectUnlocked();\r\n await bc.acquireSchemaLock();\r\n expectLocked();\r\n withEditTxn(bc, (txn) => write(txn));\r\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\r\n await push();\r\n expectUnlocked();\r\n });\r\n\r\n it(\"throws if briefcase has unsaved changes\", async () => {\r\n expectUnlocked();\r\n await bc.acquireSchemaLock();\r\n const txn = new EditTxn(bc, \"releaseAllLocks unsaved changes\");\r\n txn.start();\r\n write(txn);\r\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\r\n expectLocked();\r\n txn.end(\"abandon\");\r\n await locks.releaseAllLocks();\r\n expectUnlocked();\r\n });\r\n });\r\n\r\n describe(\"abandonLocksForReversedTxn\", () => {\r\n let bc: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n let locks: ServerBasedLocks;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(async () => {\r\n sinonRestore();\r\n\r\n await locks[_releaseAllLocks]();\r\n bc.close();\r\n\r\n if (bc2 !== undefined) {\r\n await bc2.locks.releaseAllLocks();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"abandons locks acquired in the current, unsaved txn\", async () => {\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"abandonLocks\");\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: childId });\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(1);\r\n expect(locks.getLockCount(LockState.Shared)).to.be.greaterThan(0);\r\n\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(lockSpy.callCount).to.equal(1);\r\n const releasedLocks = lockSpy.getCall(0).args[1] as Map<string, LockState>;\r\n expect(releasedLocks.size).to.be.greaterThan(0);\r\n for (const state of releasedLocks.values())\r\n expect(state).to.equal(LockState.None);\r\n\r\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n });\r\n\r\n it(\"abandons locks acquired in the most recent saved txn\", async () => {\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"abandonLocks\");\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await withEditTxn(bc, async txn => {\r\n await locks.acquireLocks({ exclusive: childId });\r\n const element = bc.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(1);\r\n expect(locks.getLockCount(LockState.Shared)).to.be.greaterThan(0);\r\n\r\n bc.txns.reverseSingleTxn();\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(lockSpy.callCount).to.equal(1);\r\n const releasedLocks = lockSpy.getCall(0).args[1] as Map<string, LockState>;\r\n expect(releasedLocks.size).to.be.greaterThan(0);\r\n for (const state of releasedLocks.values())\r\n expect(state).to.equal(LockState.None);\r\n\r\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\r\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\r\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\r\n });\r\n\r\n it(\"does not release locks acquired by a different txn\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n await withEditTxn(bc, async txn => {\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn2).not.to.equal(txn1);\r\n\r\n await withEditTxn(bc, async txn => {\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txn2)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n\r\n it(\"invalidates discovered locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const ownerModeltId = bc.elements.getElementProps(elementId).model;\r\n const ownersOwnerModelId = bc.elements.getElementProps(ownerModeltId).model;\r\n\r\n await locks.acquireLocks({ exclusive: ownersOwnerModelId });\r\n expect(locks.holdsExclusiveLock(ownerModeltId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(ownerModeltId)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n });\r\n\r\n it(\"restores lock to its previous state if it was upgraded by the reversed txn\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const firstTxnId = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1, shared: elementId2 });\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // We must actually edit something in order to start a new Txn.\r\n await withEditTxn(bc, async txn => {\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n const secondTxnId = bc.txns.getCurrentTxnId();\r\n expect(firstTxnId).not.to.equal(secondTxnId);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 }); // upgrade lock from shared to exclusive\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n expect(await locks.abandonLocksForReversedTxn(secondTxnId)).to.be.true;\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n\r\n it(\"does not update changesetid when releasing locks\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // Make sure both briefcase initially have all changes.\r\n await bc.pullChanges({ accessToken: \"token\" });\r\n await bc2.pullChanges({ accessToken: \"token\" });\r\n\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // Edit an element in the first briefcase and push the change. This will\r\n // create a new changeset.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n await withEditTxn(bc, async txn => {\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n await bc.pushChanges({ accessToken: \"token\", description: \"changes\" });\r\n\r\n const secondTxnId = bc.txns.getCurrentTxnId();\r\n\r\n // In that same briefcase, lock and edit a different element, but then reverse\r\n // the change and release the lock.\r\n await bc.locks.acquireLocks({ exclusive: elementId2 });\r\n await withEditTxn(bc, async txn => {\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n element2.setUserProperties(\"bar\", { test: true });\r\n element2.update(txn);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(secondTxnId)).to.be.true;\r\n\r\n // Now, in a separate briefcase, which has not yet pulled the changes pushed by the first,\r\n // attempt to lock the same element whose lock was just released. This should work because\r\n // the lock release by releaseLocksForReversedTxn should not have updated the changeset\r\n // associated with that lock.\r\n await bc2.locks.acquireLocks({ exclusive: elementId2 });\r\n });\r\n\r\n it(\"does not release on the server an implicit lock held for a new element\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const childElement = bc.elements.getElement<PhysicalElement>(childId);\r\n const parentId = childElement.parent!.id;\r\n const modelId = childElement.model;\r\n\r\n const physicalProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n parent: new ElementOwnsChildElements(parentId),\r\n category: childElement.category,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ shared: [modelId, parentId] });\r\n const newElementId = await withEditTxn(bc, async txn => {\r\n return txn.insertElement(physicalProps);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(newElementId)).to.be.true;\r\n\r\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(lockSpy.calledWithMatch(sinonMatch.any, sinonMatch((lockMap: LockMap) => lockMap.has(newElementId)))).to.be.false;\r\n });\r\n\r\n it(\"releases locks for later txns, too\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn2).not.to.equal(txn1);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse both txns, then abandon locks starting from the earlier one.\r\n // This will release locks for the later one, too.\r\n bc.txns.reverseTxns(2);\r\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n\r\n it(\"throws if asked to abandon locks for a txn that has not been reversed\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n // The txn has not been reversed, so abandonLocksForReversedTxn should throw.\r\n await expect(locks.abandonLocksForReversedTxn(txnId)).to.eventually.be.rejectedWith(\"has not been reversed\");\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n\r\n it(\"throws if asked to abandon locks for the current txn and there are unsaved changes\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n\r\n // The current txn has unsaved changes, so abandonLocksForReversedTxn should throw.\r\n const txnId = bc.txns.getCurrentTxnId();\r\n await expect(locks.abandonLocksForReversedTxn(txnId)).to.eventually.be.rejectedWith(\"unsaved changes\");\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n });\r\n\r\n it(\"throws if asked to abandon locks for a nonexistent txn\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n bc.txns.reverseSingleTxn();\r\n\r\n // Use an ID that is not a valid txn.\r\n await expect(locks.abandonLocksForReversedTxn(\"0xffffffffffff\")).to.eventually.be.rejectedWith(\"does not exist\");\r\n\r\n // The lock should still be held.\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n\r\n it(\"returns false when called a second time for an already-abandoned txn\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n bc.txns.reverseSingleTxn();\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Calling again should be a no-op and return false because the locks are already abandoned.\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"acquireLocksForReinstatingTxn\", () => {\r\n let bc: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n let locks: ServerBasedLocks;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(async () => {\r\n await locks[_releaseAllLocks]();\r\n bc.close();\r\n\r\n if (bc2 !== undefined) {\r\n await (bc2.locks as ServerBasedLocks)[_releaseAllLocks]();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"reacquires locks for reinstating a txn\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: childId });\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n\r\n // We must actually edit something in order to start a new Txn.\r\n const element = bc.elements.getElement<PhysicalElement>(childId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n await locks.abandonLocksForReversedTxn(txnId);\r\n expect(locks.holdsExclusiveLock(childId)).to.be.false;\r\n\r\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.true;\r\n bc.txns.reinstateTxn();\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n });\r\n\r\n it(\"reupgrades a shared lock to exclusive\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const firstTxnId = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1, shared: elementId2 });\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // We must actually edit something in order to start a new Txn.\r\n const element = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", { test: true });\r\n element.update(txn);\r\n });\r\n\r\n const secondTxnId = bc.txns.getCurrentTxnId();\r\n expect(firstTxnId).not.to.equal(secondTxnId);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 }); // upgrade lock from shared to exclusive\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", { test: true });\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n bc.txns.reverseSingleTxn();\r\n await locks.abandonLocksForReversedTxn(secondTxnId);\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n expect(await locks.acquireLocksForReinstatingTxn(secondTxnId)).to.be.true;\r\n bc.txns.reinstateTxn();\r\n\r\n expect(locks.holdsSharedLock(elementId2)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n });\r\n\r\n it(\"does not acquire on the server an implicit lock originally held for a new element\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const childElement = bc.elements.getElement<PhysicalElement>(childId);\r\n const parentId = childElement.parent!.id;\r\n const modelId = childElement.model;\r\n\r\n const physicalProps: PhysicalElementProps = {\r\n classFullName: PhysicalObject.classFullName,\r\n model: modelId,\r\n parent: new ElementOwnsChildElements(parentId),\r\n category: childElement.category,\r\n code: Code.createEmpty(),\r\n };\r\n\r\n await locks.acquireLocks({ shared: [modelId, parentId] });\r\n const txnId = bc.txns.getCurrentTxnId();\r\n const newElementId = await withEditTxn(bc, async txn => {\r\n return txn.insertElement(physicalProps);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n\r\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.true;\r\n bc.txns.reinstateTxn();\r\n expect(locks.holdsExclusiveLock(newElementId)).to.be.true;\r\n });\r\n\r\n it(\"acquires locks for earlier txns, too\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn2).not.to.equal(txn1);\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse both txns and abandon locks starting from the earlier one.\r\n bc.txns.reverseTxns(2);\r\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Acquire locks for the later txn. This should also acquire locks for the earlier one.\r\n expect(await locks.acquireLocksForReinstatingTxn(txn2)).to.be.true;\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n });\r\n\r\n it(\"cannot acquire locks for a reversed txn after new changes are made\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txn1 = bc.txns.getCurrentTxnId();\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n bc.txns.reverseTxns(1);\r\n expect(await locks.abandonLocksForReversedTxn(txn1)).to.be.true;\r\n\r\n // Make other changes, making the reversed txn inaccessible.\r\n const txn2 = bc.txns.getCurrentTxnId();\r\n expect(txn1).to.equal(txn2);\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n // Attempting to reinstate the txn should not acquire any locks.\r\n expect(await locks.acquireLocksForReinstatingTxn(txn1)).to.be.false;\r\n\r\n // We should still not have a lock on elementId1, because txn1 is now a different txn after the original\r\n // was reversed and we started making further changes under the reused txn id.\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n });\r\n\r\n it(\"throws if another briefcase holds a conflicting lock\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n // Reverse and abandon the lock so it's released on the server.\r\n bc.txns.reverseSingleTxn();\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Have a second briefcase acquire the same lock.\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n await bc2.locks.acquireLocks({ exclusive: elementId });\r\n\r\n // Attempting to reacquire the lock for reinstatement should fail because bc2 holds it.\r\n await expect(locks.acquireLocksForReinstatingTxn(txnId)).to.eventually.be.rejectedWith(\"lock is already held\");\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n });\r\n\r\n it(\"is a no-op when locks were never abandoned\", async () => {\r\n const childId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: childId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(childId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n // Reverse the txn but do NOT abandon locks.\r\n bc.txns.reverseSingleTxn();\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n\r\n // acquireLocksForReinstatingTxn should be a harmless no-op since locks were never abandoned.\r\n expect(await locks.acquireLocksForReinstatingTxn(txnId)).to.be.false;\r\n expect(locks.holdsExclusiveLock(childId)).to.be.true;\r\n });\r\n\r\n it(\"throws for an invalid txnId\", async () => {\r\n await expect(locks.acquireLocksForReinstatingTxn(\"0xffffffffffff\")).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n });\r\n\r\n describe(\"TxnManager integration\", () => {\r\n let bc: BriefcaseDb;\r\n let locks: ServerBasedLocks;\r\n\r\n beforeEach(async () => {\r\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc.locks.isServerBased).to.be.true;\r\n locks = bc.locks as ServerBasedLocks;\r\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n });\r\n\r\n afterEach(async () => {\r\n await locks[_releaseAllLocks]();\r\n bc.close();\r\n });\r\n\r\n describe(\"reverseTxnsAsync\", () => {\r\n it(\"reverses a single txn and abandons its locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was actually reversed.\r\n const revertedElement = bc.elements.getElement<PhysicalElement>(elementId);\r\n expect(revertedElement.getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n });\r\n\r\n it(\"reverses multiple txns and abandons all their locks\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\r\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(2);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the element changes were actually reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\r\n });\r\n\r\n it(\"when an earlier txn is reversed using reverseTxns, and a later one with reverseTxnsAsync, the latter call abandons the earlier locks, too\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse the later txn using reverseTxns (no lock abandonment).\r\n bc.txns.reverseTxns(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Reverse the earlier txn using reverseTxnsAsync.\r\n // This should also abandon locks for the already-reversed later txn.\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"reverseSingleTxnAsync\", () => {\r\n it(\"reverses a single txn and abandons its locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n await bc.txns.reverseSingleTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was actually reversed.\r\n const revertedElement = bc.elements.getElement<PhysicalElement>(elementId);\r\n expect(revertedElement.getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n });\r\n });\r\n\r\n describe(\"reverseAllTxnsAsync\", () => {\r\n it(\"reverses all txns and abandons all their locks\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\r\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.reverseAllTxnsAsync();\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the element changes were actually reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\r\n });\r\n });\r\n\r\n describe(\"reverseToTxnAsync\", () => {\r\n it(\"reverses to a specific txn and abandons locks for all reversed txns\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const origProps2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txnAfterFirst = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.reverseToTxnAsync(txnAfterFirst);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify only the second element's changes were reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(origProps2);\r\n });\r\n });\r\n\r\n describe(\"cancelToTxnAsync\", () => {\r\n it(\"cancels to a specific txn and abandons locks for all cancelled txns\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const origProps2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txnAfterFirst = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n await bc.txns.cancelToTxnAsync(txnAfterFirst);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the second element's changes were cancelled.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(origProps2);\r\n\r\n // cancelTo should not allow redo\r\n expect(bc.txns.isRedoPossible).to.be.false;\r\n });\r\n\r\n it(\"after regular cancelTo, locks can be abandoned, but not re-acquired\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n\r\n const txnId = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n // Use the regular cancelTo which does not abandon locks.\r\n bc.txns.cancelTo(txnId);\r\n\r\n // Now try to abandon the locks, which should work.\r\n expect(await locks.abandonLocksForReversedTxn(txnId)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n\r\n // However, it doesn't make sense to reacquire these locks because the Txn no longer exists.\r\n await expect(locks.acquireLocksForReinstatingTxn(txnId)).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n\r\n it(\"canceling a txn prevents subsequent reacquisition of that txn's locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const txnBefore = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n await bc.txns.cancelToTxnAsync(txnBefore);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Attempting to acquire locks for the cancelled transaction should fail\r\n // because the transaction itself no longer exists and its lock records have been cleared.\r\n await expect(locks.acquireLocksForReinstatingTxn(txnBefore)).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n\r\n it(\"reverses but does not cancel if lock abandonment fails\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n const txnBefore = bc.txns.getCurrentTxnId();\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update(txn);\r\n });\r\n\r\n const error = new IModelError(IModelStatus.BadRequest, \"Lock abandonment failed\");\r\n sinonStub(locks, \"abandonLocksForReversedTxn\").rejects(error);\r\n\r\n await expect(bc.txns.cancelToTxnAsync(txnBefore)).to.eventually.be.rejectedWith(IModelError, \"Lock abandonment failed\");\r\n\r\n // The txn was reversed but not canceled, so we can reinstate. Locks are still held.\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n // And now we can try releasing the locks again.\r\n sinonRestore();\r\n await bc.locks.abandonLocksForReversedTxn(txnBefore);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // And cancel the already-reversed txn.\r\n expect(bc.txns.cancelTo(txnBefore)).to.equal(IModelStatus.NothingToUndo);\r\n expect(bc.txns.isRedoPossible).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"reinstateTxnAndAcquireLocks\", () => {\r\n it(\"reinstates a reversed txn and reacquires its locks\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n await locks.acquireLocks({ exclusive: elementId });\r\n\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n const newValue = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", newValue);\r\n element.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n\r\n // Verify the element change was reinstated.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.equal(newValue);\r\n });\r\n\r\n it(\"multiple txns reversed together are reinstated as one\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n const orig1 = bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\");\r\n const orig2 = bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n const newValue1 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", newValue1);\r\n element1.update(txn);\r\n });\r\n\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n const newValue2 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", newValue2);\r\n element2.update(txn);\r\n });\r\n\r\n await bc.txns.reverseTxnsAsync(2);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify both element changes were reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(orig1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(orig2);\r\n\r\n // A single reinstate should bring back both txns and reacquire all locks.\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n\r\n // Verify both element changes are reinstated.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.equal(newValue2);\r\n });\r\n\r\n it(\"abandons unsaved changes before reinstatement\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // Make a change, save it, and reverse it.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n const originalProps1 = element1.getUserProperties(\"foo\");\r\n const newValue1 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", newValue1);\r\n element1.update(txn);\r\n });\r\n\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n\r\n // Verify the element change was reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.deep.equal(originalProps1);\r\n\r\n // Now make an unsaved change to a different element.\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n const originalProps2 = element2.getUserProperties(\"bar\");\r\n const newValue2 = Guid.createValue();\r\n\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", newValue2);\r\n element2.update(txn);\r\n\r\n // Verify the unsaved change is present and lock is held.\r\n expect(bc.txns.hasUnsavedChanges).to.be.true;\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.true;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.equal(newValue2);\r\n\r\n // Reinstate the first txn. This should:\r\n // 1. Abandon the unsaved change to element2\r\n // 2. Abandon the lock on element2\r\n // 3. Reinstate the change to element1\r\n // 4. Reacquire the lock on element1\r\n await bc.txns.reinstateTxnAsync();\r\n\r\n // Verify the unsaved change was abandoned.\r\n expect(bc.txns.hasUnsavedChanges).to.be.false;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId2).getUserProperties(\"bar\")).to.deep.equal(originalProps2);\r\n expect(locks.holdsExclusiveLock(elementId2)).to.be.false;\r\n\r\n // Verify the first change was reinstated and its lock reacquired.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n });\r\n });\r\n\r\n describe(\"throws and leaves locks acquired if reinstateTxn fails\", async () => {\r\n let elementId: string | undefined;\r\n let fooValue: string | undefined;\r\n\r\n beforeEach(async () => {\r\n elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n fooValue = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", fooValue);\r\n element.update(txn);\r\n });\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n sinonStub(bc.txns, \"reinstateTxn\").returns(IModelStatus.BadRequest);\r\n\r\n await expect(bc.txns.reinstateTxnAsync()).to.eventually.be.rejectedWith(IModelError, \"Bad Request\");\r\n\r\n // Even though it failed to reinstate, it obtained the lock and did not release it.\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.true;\r\n });\r\n\r\n it(\"and we can try reinstating again, without any problems caused by the locks already being acquired\", async () => {\r\n sinonRestore();\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId!)).to.be.true;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId!).getUserProperties(\"foo\")).to.equal(fooValue);\r\n });\r\n\r\n it(\"and we can then release the locks\", async () => {\r\n await locks.abandonLocksForReversedTxn(bc.txns.getCurrentTxnId());\r\n expect(locks.holdsExclusiveLock(elementId!)).to.be.false;\r\n });\r\n });\r\n\r\n it(\"throws and does not reinstate if acquireLocksForReinstatingTxn fails\", async () => {\r\n const elementId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n await locks.acquireLocks({ exclusive: elementId });\r\n const element = bc.elements.getElement<PhysicalElement>(elementId);\r\n const originalProps = element.getUserProperties(\"foo\");\r\n const newValue = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element.setUserProperties(\"foo\", newValue);\r\n element.update(txn);\r\n });\r\n\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId)).to.be.false;\r\n\r\n // Verify the element change was reversed.\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n\r\n // Simulate acquireLocksForReinstatingTxn failing (e.g. because another briefcase holds the lock)\r\n const error = new LockConflict(0x12345, \"other briefcase alias\", \"exclusive lock is already held\");\r\n sinonStub(locks, \"acquireLocksForReinstatingTxn\").rejects(error);\r\n\r\n await expect(bc.txns.reinstateTxnAsync()).to.eventually.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Verify it was NOT reinstated\r\n expect(bc.elements.getElement<PhysicalElement>(elementId).getUserProperties(\"foo\")).to.deep.equal(originalProps);\r\n });\r\n\r\n it(\"new changes after reversal truncate the redo stack and clear reversible lock records\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // 1. Make a change to element 1 and save it.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", Guid.createValue());\r\n element1.update(txn);\r\n });\r\n\r\n const txn1Id = bc.txns.getCurrentTxnId();\r\n\r\n // 2. Reverse the txn and abandon locks.\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n\r\n // 3. Make a change to element 2 and save it. This truncates the redo stack.\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n });\r\n\r\n // The redo stack should now be truncated.\r\n expect(bc.txns.isRedoPossible).to.be.false;\r\n\r\n // 4. Try to reacquire locks for the truncated transaction.\r\n await expect(locks.acquireLocksForReinstatingTxn(txn1Id)).to.eventually.be.rejectedWith(\"does not exist\");\r\n });\r\n\r\n it(\"abandoned changes after reversal do not prevent reinstatement\", async () => {\r\n const elementId1 = IModelTestUtils.queryByUserLabel(bc, \"PhysicalObject2\");\r\n const elementId2 = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\r\n\r\n // 1. Make a change to element 1 and save it.\r\n await locks.acquireLocks({ exclusive: elementId1 });\r\n const element1 = bc.elements.getElement<PhysicalElement>(elementId1);\r\n const newValue1 = Guid.createValue();\r\n await withEditTxn(bc, async txn => {\r\n element1.setUserProperties(\"foo\", newValue1);\r\n element1.update(txn);\r\n });\r\n\r\n // 2. Reverse the txn and abandon locks.\r\n await bc.txns.reverseTxnsAsync(1);\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.false;\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n\r\n // 3. Make a change to element 2 and abandon it.\r\n await locks.acquireLocks({ exclusive: elementId2 });\r\n const element2 = bc.elements.getElement<PhysicalElement>(elementId2);\r\n await withEditTxn(bc, async txn => {\r\n element2.setUserProperties(\"bar\", Guid.createValue());\r\n element2.update(txn);\r\n txn.abandonChanges();\r\n });\r\n\r\n expect(bc.txns.isRedoPossible).to.be.true;\r\n\r\n // 4. Reinstate should still work.\r\n await bc.txns.reinstateTxnAsync();\r\n expect(locks.holdsExclusiveLock(elementId1)).to.be.true;\r\n expect(bc.elements.getElement<PhysicalElement>(elementId1).getUserProperties(\"foo\")).to.equal(newValue1);\r\n });\r\n });\r\n });\r\n});\r\n"]}
|