@itwin/core-backend 5.15.0-dev.2 → 5.15.0-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -1
- package/lib/cjs/BlobContainerService.d.ts +2 -0
- package/lib/cjs/BlobContainerService.d.ts.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +4 -3
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +39 -9
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangeUnifier.d.ts +82 -0
- package/lib/cjs/ChangeUnifier.d.ts.map +1 -0
- package/lib/cjs/ChangeUnifier.js +163 -0
- package/lib/cjs/ChangeUnifier.js.map +1 -0
- package/lib/cjs/ChangesetReader.d.ts +21 -2
- package/lib/cjs/ChangesetReader.d.ts.map +1 -1
- package/lib/cjs/ChangesetReader.js +37 -1
- package/lib/cjs/ChangesetReader.js.map +1 -1
- package/lib/cjs/ChangesetReaderTypes.d.ts +1 -1
- package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +15 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +1 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +4 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.d.ts +3 -3
- package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js +2 -2
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +5 -0
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +15 -2
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js +2 -2
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +61 -19
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +84 -29
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/Element.d.ts +29 -2
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +38 -2
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.d.ts +1 -0
- package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
- package/lib/cjs/GeoCoordConfig.js +12 -8
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.d.ts +50 -2
- package/lib/cjs/GeographicCRSServices.d.ts.map +1 -1
- package/lib/cjs/GeographicCRSServices.js +11 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +22 -9
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +54 -12
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/NativeHost.d.ts.map +1 -1
- package/lib/cjs/NativeHost.js +5 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +28 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +78 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +1 -0
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +126 -89
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +114 -76
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.d.ts.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.d.ts.map +1 -1
- package/lib/cjs/ViewStore.js +62 -19
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +3 -0
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/BriefcaseUtils.d.ts +19 -0
- package/lib/cjs/internal/BriefcaseUtils.d.ts.map +1 -0
- package/lib/cjs/internal/BriefcaseUtils.js +65 -0
- package/lib/cjs/internal/BriefcaseUtils.js.map +1 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts +44 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -0
- package/lib/cjs/internal/QueryMetadataCache.js +107 -0
- package/lib/cjs/internal/QueryMetadataCache.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +9 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +10 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +20 -6
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +4 -3
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +7 -5
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/BlobContainerService.d.ts +2 -0
- package/lib/esm/BlobContainerService.d.ts.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +4 -3
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +40 -10
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/ChangeUnifier.d.ts +82 -0
- package/lib/esm/ChangeUnifier.d.ts.map +1 -0
- package/lib/esm/ChangeUnifier.js +159 -0
- package/lib/esm/ChangeUnifier.js.map +1 -0
- package/lib/esm/ChangesetReader.d.ts +21 -2
- package/lib/esm/ChangesetReader.d.ts.map +1 -1
- package/lib/esm/ChangesetReader.js +38 -2
- package/lib/esm/ChangesetReader.js.map +1 -1
- package/lib/esm/ChangesetReaderTypes.d.ts +1 -1
- package/lib/esm/ChangesetReaderTypes.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +15 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/ECDb.d.ts +1 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +4 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.d.ts +3 -3
- package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js +2 -2
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.d.ts +5 -0
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +15 -2
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/esm/ECSqlSyncReader.js +3 -3
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +61 -19
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +85 -30
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/Element.d.ts +29 -2
- package/lib/esm/Element.d.ts.map +1 -1
- package/lib/esm/Element.js +41 -5
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/GeoCoordConfig.d.ts +1 -0
- package/lib/esm/GeoCoordConfig.d.ts.map +1 -1
- package/lib/esm/GeoCoordConfig.js +12 -8
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.d.ts +50 -2
- package/lib/esm/GeographicCRSServices.d.ts.map +1 -1
- package/lib/esm/GeographicCRSServices.js +10 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +22 -9
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +56 -14
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/NativeHost.d.ts.map +1 -1
- package/lib/esm/NativeHost.js +5 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/Relationship.d.ts +28 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +78 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +1 -0
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +126 -89
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +116 -78
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewStateHydrator.d.ts.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.d.ts.map +1 -1
- package/lib/esm/ViewStore.js +62 -19
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +3 -0
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/BriefcaseUtils.d.ts +19 -0
- package/lib/esm/internal/BriefcaseUtils.d.ts.map +1 -0
- package/lib/esm/internal/BriefcaseUtils.js +61 -0
- package/lib/esm/internal/BriefcaseUtils.js.map +1 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts +44 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -0
- package/lib/esm/internal/QueryMetadataCache.js +103 -0
- package/lib/esm/internal/QueryMetadataCache.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +9 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +9 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +20 -6
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +15 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +144 -30
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +140 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts +2 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js +630 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -0
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +403 -249
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementSubModelInsert.test.d.ts +2 -0
- package/lib/esm/test/element/ElementSubModelInsert.test.d.ts.map +1 -0
- package/lib/esm/test/element/ElementSubModelInsert.test.js +183 -0
- package/lib/esm/test/element/ElementSubModelInsert.test.js.map +1 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts +2 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts.map +1 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.js +202 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.js.map +1 -0
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +187 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js +142 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js +13 -11
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelProps.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelProps.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelProps.test.js +411 -0
- package/lib/esm/test/imodel/IModelProps.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js +240 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.js +2 -8
- package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts +2 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js +159 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js.map +1 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.d.ts +2 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.js +732 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.js.map +1 -0
- package/lib/esm/test/standalone/DeleteElements.test.js +962 -83
- package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.js +72 -1
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
- package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts +2 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.js +158 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.js.map +1 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts +2 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.js +211 -0
- package/lib/esm/test/standalone/SessionApplyIndirect.test.js.map +1 -0
- package/lib/esm/test/standalone/ViewStoreDb.test.js +53 -0
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsContainers.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsContainers.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsContainers.test.js +95 -0
- package/lib/esm/test/workspace/SettingsContainers.test.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +4 -3
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +7 -5
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/package.json +18 -18
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { expect } from "chai";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
import * as sinon from "sinon";
|
|
8
|
+
import { Guid, IModelStatus, OpenMode } from "@itwin/core-bentley";
|
|
9
|
+
import { IModelError } from "@itwin/core-common";
|
|
10
|
+
import { BriefcaseManager } from "../../BriefcaseManager";
|
|
11
|
+
import { StandaloneDb } from "../../IModelDb";
|
|
12
|
+
import { IModelJsFs } from "../../IModelJsFs";
|
|
13
|
+
import { checkFrontendBriefcaseDelete, isBriefcaseSidecar } from "../../internal/BriefcaseUtils";
|
|
14
|
+
import { IModelNative } from "../../internal/NativePlatform";
|
|
15
|
+
import { KnownTestLocations } from "../KnownTestLocations";
|
|
16
|
+
describe("Deleting briefcase files", () => {
|
|
17
|
+
let outsideDir;
|
|
18
|
+
let insideDir;
|
|
19
|
+
const writeFile = (fileName, content = "test content") => {
|
|
20
|
+
IModelJsFs.writeFileSync(fileName, content);
|
|
21
|
+
return fileName;
|
|
22
|
+
};
|
|
23
|
+
const createIModel = (fileName) => {
|
|
24
|
+
const db = StandaloneDb.createEmpty(fileName, { rootSubject: { name: "DeleteBriefcaseFiles" } });
|
|
25
|
+
const pathName = db.pathName; // native appends ".bim" if fileName has no extension
|
|
26
|
+
db.close();
|
|
27
|
+
return pathName;
|
|
28
|
+
};
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
outsideDir = path.join(KnownTestLocations.outputDir, "DeleteBriefcaseFiles", Guid.createValue());
|
|
31
|
+
insideDir = path.join(BriefcaseManager.cacheDir, Guid.createValue(), "briefcases");
|
|
32
|
+
IModelJsFs.recursiveMkDirSync(outsideDir);
|
|
33
|
+
IModelJsFs.recursiveMkDirSync(insideDir);
|
|
34
|
+
const cacheRoot = path.resolve(BriefcaseManager.cacheDir) + path.sep;
|
|
35
|
+
expect(path.resolve(outsideDir).startsWith(cacheRoot)).to.be.false;
|
|
36
|
+
expect(path.resolve(insideDir).startsWith(cacheRoot)).to.be.true;
|
|
37
|
+
});
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
sinon.restore();
|
|
40
|
+
IModelJsFs.removeSync(outsideDir);
|
|
41
|
+
IModelJsFs.removeSync(path.dirname(insideDir));
|
|
42
|
+
});
|
|
43
|
+
describe("BriefcaseManager.deleteBriefcaseFiles", () => {
|
|
44
|
+
/** Create an iModel with an assigned (valid) briefcaseId, so deleteBriefcaseFiles tries to clean up rebase folders and release it. */
|
|
45
|
+
const createAssignedBriefcase = (fileName) => {
|
|
46
|
+
const pathName = createIModel(fileName);
|
|
47
|
+
const nativeDb = new IModelNative.platform.DgnDb();
|
|
48
|
+
nativeDb.openIModel(pathName, OpenMode.ReadWrite);
|
|
49
|
+
nativeDb.resetBriefcaseId(2);
|
|
50
|
+
nativeDb.saveChanges();
|
|
51
|
+
nativeDb.closeFile();
|
|
52
|
+
return pathName;
|
|
53
|
+
};
|
|
54
|
+
it("releases the briefcaseId and deletes the file even if cleaning up rebase folders fails", async () => {
|
|
55
|
+
const bim = createAssignedBriefcase(path.join(insideDir, "5.bim"));
|
|
56
|
+
sinon.stub(BriefcaseManager, "cleanupRebaseFolders").throws(new Error("EBUSY"));
|
|
57
|
+
const release = sinon.stub(BriefcaseManager, "releaseBriefcase").resolves();
|
|
58
|
+
await BriefcaseManager.deleteBriefcaseFiles(bim, "access token");
|
|
59
|
+
expect(release.calledOnce).to.be.true;
|
|
60
|
+
expect(release.firstCall.args[1].briefcaseId).equal(2);
|
|
61
|
+
expect(IModelJsFs.existsSync(bim)).to.be.false;
|
|
62
|
+
});
|
|
63
|
+
it("cleans up rebase folders and deletes the file even if releasing the briefcaseId fails", async () => {
|
|
64
|
+
const bim = createAssignedBriefcase(path.join(insideDir, "6.bim"));
|
|
65
|
+
const rebaseDir = path.join(insideDir, ".rebasing", "2");
|
|
66
|
+
IModelJsFs.recursiveMkDirSync(rebaseDir);
|
|
67
|
+
sinon.stub(BriefcaseManager, "releaseBriefcase").rejects(new Error("hub unavailable"));
|
|
68
|
+
await BriefcaseManager.deleteBriefcaseFiles(bim, "access token");
|
|
69
|
+
expect(IModelJsFs.existsSync(rebaseDir)).to.be.false;
|
|
70
|
+
expect(IModelJsFs.existsSync(bim)).to.be.false;
|
|
71
|
+
});
|
|
72
|
+
it("deletes a briefcase along with its associated files, but not other files", async () => {
|
|
73
|
+
const bim = createIModel(path.join(insideDir, "1.bim"));
|
|
74
|
+
const sidecars = ["-wal", "-shm", "-journal", "-locks", "-locks-wal", "-locks-shm", ".Tiles", ".Tiles-journal", "-hierarchies", ".HierarchyCache.db", ".keep.txt"]
|
|
75
|
+
.map((suffix) => writeFile(`${bim}${suffix}`));
|
|
76
|
+
const unrelated = [writeFile(path.join(insideDir, "1.bim2")), writeFile(path.join(insideDir, "1.bimx.txt")), writeFile(path.join(insideDir, "x1.bim-wal"))];
|
|
77
|
+
const sidecarDir = path.join(insideDir, "1.bim.dir");
|
|
78
|
+
IModelJsFs.recursiveMkDirSync(sidecarDir);
|
|
79
|
+
await BriefcaseManager.deleteBriefcaseFiles(bim);
|
|
80
|
+
expect(IModelJsFs.existsSync(bim)).to.be.false;
|
|
81
|
+
for (const sidecar of sidecars)
|
|
82
|
+
expect(IModelJsFs.existsSync(sidecar), sidecar).to.be.false;
|
|
83
|
+
for (const file of unrelated)
|
|
84
|
+
expect(IModelJsFs.existsSync(file), file).to.be.true;
|
|
85
|
+
expect(IModelJsFs.existsSync(sidecarDir), "directories are not deleted").to.be.true;
|
|
86
|
+
});
|
|
87
|
+
it("deletes a corrupt file at any location, but not files that merely share a prefix", async () => {
|
|
88
|
+
const a = writeFile(path.join(outsideDir, "a"), "this is not an iModel");
|
|
89
|
+
const wal = writeFile(`${a}-wal`);
|
|
90
|
+
const unrelated = [writeFile(path.join(outsideDir, "abc.txt")), writeFile(path.join(outsideDir, "ab-c.txt"))];
|
|
91
|
+
await BriefcaseManager.deleteBriefcaseFiles(a);
|
|
92
|
+
expect(IModelJsFs.existsSync(a)).to.be.false;
|
|
93
|
+
expect(IModelJsFs.existsSync(wal)).to.be.false;
|
|
94
|
+
for (const file of unrelated)
|
|
95
|
+
expect(IModelJsFs.existsSync(file), file).to.be.true;
|
|
96
|
+
});
|
|
97
|
+
it("deletes stale associated files when the briefcase file is missing", async () => {
|
|
98
|
+
const bim = path.join(insideDir, "3.bim");
|
|
99
|
+
const wal = writeFile(`${bim}-wal`);
|
|
100
|
+
const locks = writeFile(`${bim}-locks`);
|
|
101
|
+
await BriefcaseManager.deleteBriefcaseFiles(bim);
|
|
102
|
+
expect(IModelJsFs.existsSync(wal)).to.be.false;
|
|
103
|
+
expect(IModelJsFs.existsSync(locks)).to.be.false;
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe("isBriefcaseSidecar", () => {
|
|
107
|
+
it("matches only <name>-* and <name>.*", () => {
|
|
108
|
+
for (const file of ["a.bim-wal", "a.bim-locks-shm", "a.bim.Tiles", "a.bim.HierarchyCache.db", "a.bim-hierarchies"])
|
|
109
|
+
expect(isBriefcaseSidecar(file, "a.bim"), file).to.be.true;
|
|
110
|
+
for (const file of ["a.bim", "a.bim-", "a.bim.", "a.bim2", "a.bimx.txt", "a.bim_wal", "xa.bim-wal", "b.bim-wal"])
|
|
111
|
+
expect(isBriefcaseSidecar(file, "a.bim"), file).to.be.false;
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe("checkFrontendBriefcaseDelete", () => {
|
|
115
|
+
const expectBadRequest = (filePath) => {
|
|
116
|
+
let error;
|
|
117
|
+
try {
|
|
118
|
+
checkFrontendBriefcaseDelete(filePath, BriefcaseManager.cacheDir);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
error = err;
|
|
122
|
+
}
|
|
123
|
+
expect(error).instanceOf(IModelError);
|
|
124
|
+
expect(error.errorNumber).equal(IModelStatus.BadRequest);
|
|
125
|
+
};
|
|
126
|
+
it("rejects a file outside the cache that is not an iModel", () => {
|
|
127
|
+
const notes = writeFile(path.join(outsideDir, "notes.txt"));
|
|
128
|
+
expectBadRequest(notes);
|
|
129
|
+
expect(IModelJsFs.existsSync(notes)).to.be.true;
|
|
130
|
+
});
|
|
131
|
+
it("rejects paths that use '..' to escape the cache", () => {
|
|
132
|
+
const notes = writeFile(path.join(outsideDir, "notes.txt"));
|
|
133
|
+
const escapingPath = `${insideDir}${path.sep}${path.relative(insideDir, notes)}`;
|
|
134
|
+
expect(escapingPath.startsWith(insideDir)).to.be.true;
|
|
135
|
+
expectBadRequest(escapingPath);
|
|
136
|
+
});
|
|
137
|
+
it("returns undefined for a missing file outside the cache, so its associated files are not deleted", () => {
|
|
138
|
+
writeFile(path.join(outsideDir, "a.docx"));
|
|
139
|
+
expect(checkFrontendBriefcaseDelete(path.join(outsideDir, "a"), BriefcaseManager.cacheDir)).to.be.undefined;
|
|
140
|
+
});
|
|
141
|
+
it("allows a valid iModel outside the cache", () => {
|
|
142
|
+
const bim = createIModel(path.join(outsideDir, "valid.bim"));
|
|
143
|
+
expect(checkFrontendBriefcaseDelete(bim, BriefcaseManager.cacheDir)).equal(path.resolve(bim));
|
|
144
|
+
});
|
|
145
|
+
it("allows any file, or missing file, inside the cache", () => {
|
|
146
|
+
const corrupt = writeFile(path.join(insideDir, "2.bim"), "this is not an iModel");
|
|
147
|
+
expect(checkFrontendBriefcaseDelete(corrupt, BriefcaseManager.cacheDir)).equal(path.resolve(corrupt));
|
|
148
|
+
const missing = path.join(insideDir, "3.bim");
|
|
149
|
+
expect(checkFrontendBriefcaseDelete(missing, BriefcaseManager.cacheDir)).equal(path.resolve(missing));
|
|
150
|
+
});
|
|
151
|
+
it("treats the cache directory case-insensitively on Windows", function () {
|
|
152
|
+
if (process.platform !== "win32")
|
|
153
|
+
this.skip();
|
|
154
|
+
const corrupt = writeFile(path.join(insideDir, "4.bim"), "this is not an iModel");
|
|
155
|
+
expect(checkFrontendBriefcaseDelete(corrupt.toUpperCase(), BriefcaseManager.cacheDir)).equal(path.resolve(corrupt.toUpperCase()));
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=BriefcaseManagerDelete.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BriefcaseManagerDelete.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/BriefcaseManagerDelete.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,UAAkB,CAAC;IACvB,IAAI,SAAiB,CAAC;IAEtB,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,OAAO,GAAG,cAAc,EAAE,EAAE;QAC/D,UAAU,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,EAAE;QACxC,MAAM,EAAE,GAAG,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACjG,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,qDAAqD;QACnF,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,sBAAsB,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACjG,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;QACnF,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC1C,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACrD,sIAAsI;QACtI,MAAM,uBAAuB,GAAG,CAAC,QAAgB,EAAE,EAAE;YACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnD,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YAClD,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC7B,QAAQ,CAAC,WAAW,EAAE,CAAC;YACvB,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QAEF,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;YACtG,MAAM,GAAG,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,gBAAuB,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YACvF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC;YAE5E,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAEjE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;YACrG,MAAM,GAAG,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;YACzD,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAEvF,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAEjE,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YACrD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,oBAAoB,EAAE,WAAW,CAAC;iBAC/J,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5J,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACrD,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAE1C,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAEjD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC/C,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAC5B,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC9D,KAAK,MAAM,IAAI,IAAI,SAAS;gBAC1B,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YACvD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,6BAA6B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kFAAkF,EAAE,KAAK,IAAI,EAAE;YAChG,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,uBAAuB,CAAC,CAAC;YACzE,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YAE9G,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAE/C,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC7C,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,SAAS;gBAC1B,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;YAExC,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAEjD,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;YAC/C,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,yBAAyB,EAAE,mBAAmB,CAAC;gBAChH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAC7D,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC;gBAC9G,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE;YAC5C,IAAI,KAAc,CAAC;YACnB,IAAI,CAAC;gBACH,4BAA4B,CAAC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,GAAG,GAAG,CAAC;YACd,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACtC,MAAM,CAAE,KAAqB,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC5E,CAAC,CAAC;QAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YAC5D,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YACtD,gBAAgB,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iGAAiG,EAAE,GAAG,EAAE;YACzG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;QAC9G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,4BAA4B,CAAC,GAAG,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC;YAClF,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAEtG,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE;YAC7D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YAEd,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,uBAAuB,CAAC,CAAC;YAClF,MAAM,CAAC,4BAA4B,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACpI,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as path from \"node:path\";\r\nimport * as sinon from \"sinon\";\r\nimport { Guid, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelError } from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { checkFrontendBriefcaseDelete, isBriefcaseSidecar } from \"../../internal/BriefcaseUtils\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\n\r\ndescribe(\"Deleting briefcase files\", () => {\r\n let outsideDir: string;\r\n let insideDir: string;\r\n\r\n const writeFile = (fileName: string, content = \"test content\") => {\r\n IModelJsFs.writeFileSync(fileName, content);\r\n return fileName;\r\n };\r\n\r\n const createIModel = (fileName: string) => {\r\n const db = StandaloneDb.createEmpty(fileName, { rootSubject: { name: \"DeleteBriefcaseFiles\" } });\r\n const pathName = db.pathName; // native appends \".bim\" if fileName has no extension\r\n db.close();\r\n return pathName;\r\n };\r\n\r\n beforeEach(() => {\r\n outsideDir = path.join(KnownTestLocations.outputDir, \"DeleteBriefcaseFiles\", Guid.createValue());\r\n insideDir = path.join(BriefcaseManager.cacheDir, Guid.createValue(), \"briefcases\");\r\n IModelJsFs.recursiveMkDirSync(outsideDir);\r\n IModelJsFs.recursiveMkDirSync(insideDir);\r\n\r\n const cacheRoot = path.resolve(BriefcaseManager.cacheDir) + path.sep;\r\n expect(path.resolve(outsideDir).startsWith(cacheRoot)).to.be.false;\r\n expect(path.resolve(insideDir).startsWith(cacheRoot)).to.be.true;\r\n });\r\n\r\n afterEach(() => {\r\n sinon.restore();\r\n IModelJsFs.removeSync(outsideDir);\r\n IModelJsFs.removeSync(path.dirname(insideDir));\r\n });\r\n\r\n describe(\"BriefcaseManager.deleteBriefcaseFiles\", () => {\r\n /** Create an iModel with an assigned (valid) briefcaseId, so deleteBriefcaseFiles tries to clean up rebase folders and release it. */\r\n const createAssignedBriefcase = (fileName: string) => {\r\n const pathName = createIModel(fileName);\r\n const nativeDb = new IModelNative.platform.DgnDb();\r\n nativeDb.openIModel(pathName, OpenMode.ReadWrite);\r\n nativeDb.resetBriefcaseId(2);\r\n nativeDb.saveChanges();\r\n nativeDb.closeFile();\r\n return pathName;\r\n };\r\n\r\n it(\"releases the briefcaseId and deletes the file even if cleaning up rebase folders fails\", async () => {\r\n const bim = createAssignedBriefcase(path.join(insideDir, \"5.bim\"));\r\n sinon.stub(BriefcaseManager as any, \"cleanupRebaseFolders\").throws(new Error(\"EBUSY\"));\r\n const release = sinon.stub(BriefcaseManager, \"releaseBriefcase\").resolves();\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim, \"access token\");\r\n\r\n expect(release.calledOnce).to.be.true;\r\n expect(release.firstCall.args[1].briefcaseId).equal(2);\r\n expect(IModelJsFs.existsSync(bim)).to.be.false;\r\n });\r\n\r\n it(\"cleans up rebase folders and deletes the file even if releasing the briefcaseId fails\", async () => {\r\n const bim = createAssignedBriefcase(path.join(insideDir, \"6.bim\"));\r\n const rebaseDir = path.join(insideDir, \".rebasing\", \"2\");\r\n IModelJsFs.recursiveMkDirSync(rebaseDir);\r\n sinon.stub(BriefcaseManager, \"releaseBriefcase\").rejects(new Error(\"hub unavailable\"));\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim, \"access token\");\r\n\r\n expect(IModelJsFs.existsSync(rebaseDir)).to.be.false;\r\n expect(IModelJsFs.existsSync(bim)).to.be.false;\r\n });\r\n it(\"deletes a briefcase along with its associated files, but not other files\", async () => {\r\n const bim = createIModel(path.join(insideDir, \"1.bim\"));\r\n const sidecars = [\"-wal\", \"-shm\", \"-journal\", \"-locks\", \"-locks-wal\", \"-locks-shm\", \".Tiles\", \".Tiles-journal\", \"-hierarchies\", \".HierarchyCache.db\", \".keep.txt\"]\r\n .map((suffix) => writeFile(`${bim}${suffix}`));\r\n const unrelated = [writeFile(path.join(insideDir, \"1.bim2\")), writeFile(path.join(insideDir, \"1.bimx.txt\")), writeFile(path.join(insideDir, \"x1.bim-wal\"))];\r\n const sidecarDir = path.join(insideDir, \"1.bim.dir\");\r\n IModelJsFs.recursiveMkDirSync(sidecarDir);\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim);\r\n\r\n expect(IModelJsFs.existsSync(bim)).to.be.false;\r\n for (const sidecar of sidecars)\r\n expect(IModelJsFs.existsSync(sidecar), sidecar).to.be.false;\r\n for (const file of unrelated)\r\n expect(IModelJsFs.existsSync(file), file).to.be.true;\r\n expect(IModelJsFs.existsSync(sidecarDir), \"directories are not deleted\").to.be.true;\r\n });\r\n\r\n it(\"deletes a corrupt file at any location, but not files that merely share a prefix\", async () => {\r\n const a = writeFile(path.join(outsideDir, \"a\"), \"this is not an iModel\");\r\n const wal = writeFile(`${a}-wal`);\r\n const unrelated = [writeFile(path.join(outsideDir, \"abc.txt\")), writeFile(path.join(outsideDir, \"ab-c.txt\"))];\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(a);\r\n\r\n expect(IModelJsFs.existsSync(a)).to.be.false;\r\n expect(IModelJsFs.existsSync(wal)).to.be.false;\r\n for (const file of unrelated)\r\n expect(IModelJsFs.existsSync(file), file).to.be.true;\r\n });\r\n\r\n it(\"deletes stale associated files when the briefcase file is missing\", async () => {\r\n const bim = path.join(insideDir, \"3.bim\");\r\n const wal = writeFile(`${bim}-wal`);\r\n const locks = writeFile(`${bim}-locks`);\r\n\r\n await BriefcaseManager.deleteBriefcaseFiles(bim);\r\n\r\n expect(IModelJsFs.existsSync(wal)).to.be.false;\r\n expect(IModelJsFs.existsSync(locks)).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"isBriefcaseSidecar\", () => {\r\n it(\"matches only <name>-* and <name>.*\", () => {\r\n for (const file of [\"a.bim-wal\", \"a.bim-locks-shm\", \"a.bim.Tiles\", \"a.bim.HierarchyCache.db\", \"a.bim-hierarchies\"])\r\n expect(isBriefcaseSidecar(file, \"a.bim\"), file).to.be.true;\r\n for (const file of [\"a.bim\", \"a.bim-\", \"a.bim.\", \"a.bim2\", \"a.bimx.txt\", \"a.bim_wal\", \"xa.bim-wal\", \"b.bim-wal\"])\r\n expect(isBriefcaseSidecar(file, \"a.bim\"), file).to.be.false;\r\n });\r\n });\r\n\r\n describe(\"checkFrontendBriefcaseDelete\", () => {\r\n const expectBadRequest = (filePath: string) => {\r\n let error: unknown;\r\n try {\r\n checkFrontendBriefcaseDelete(filePath, BriefcaseManager.cacheDir);\r\n } catch (err) {\r\n error = err;\r\n }\r\n expect(error).instanceOf(IModelError);\r\n expect((error as IModelError).errorNumber).equal(IModelStatus.BadRequest);\r\n };\r\n\r\n it(\"rejects a file outside the cache that is not an iModel\", () => {\r\n const notes = writeFile(path.join(outsideDir, \"notes.txt\"));\r\n expectBadRequest(notes);\r\n expect(IModelJsFs.existsSync(notes)).to.be.true;\r\n });\r\n\r\n it(\"rejects paths that use '..' to escape the cache\", () => {\r\n const notes = writeFile(path.join(outsideDir, \"notes.txt\"));\r\n const escapingPath = `${insideDir}${path.sep}${path.relative(insideDir, notes)}`;\r\n expect(escapingPath.startsWith(insideDir)).to.be.true;\r\n expectBadRequest(escapingPath);\r\n });\r\n\r\n it(\"returns undefined for a missing file outside the cache, so its associated files are not deleted\", () => {\r\n writeFile(path.join(outsideDir, \"a.docx\"));\r\n expect(checkFrontendBriefcaseDelete(path.join(outsideDir, \"a\"), BriefcaseManager.cacheDir)).to.be.undefined;\r\n });\r\n\r\n it(\"allows a valid iModel outside the cache\", () => {\r\n const bim = createIModel(path.join(outsideDir, \"valid.bim\"));\r\n expect(checkFrontendBriefcaseDelete(bim, BriefcaseManager.cacheDir)).equal(path.resolve(bim));\r\n });\r\n\r\n it(\"allows any file, or missing file, inside the cache\", () => {\r\n const corrupt = writeFile(path.join(insideDir, \"2.bim\"), \"this is not an iModel\");\r\n expect(checkFrontendBriefcaseDelete(corrupt, BriefcaseManager.cacheDir)).equal(path.resolve(corrupt));\r\n\r\n const missing = path.join(insideDir, \"3.bim\");\r\n expect(checkFrontendBriefcaseDelete(missing, BriefcaseManager.cacheDir)).equal(path.resolve(missing));\r\n });\r\n\r\n it(\"treats the cache directory case-insensitively on Windows\", function () {\r\n if (process.platform !== \"win32\")\r\n this.skip();\r\n\r\n const corrupt = writeFile(path.join(insideDir, \"4.bim\"), \"this is not an iModel\");\r\n expect(checkFrontendBriefcaseDelete(corrupt.toUpperCase(), BriefcaseManager.cacheDir)).equal(path.resolve(corrupt.toUpperCase()));\r\n });\r\n });\r\n});\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeUnifier.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/ChangeUnifier.test.ts"],"names":[],"mappings":"AAsBA,OAAO,cAAc,CAAC"}
|