@itwin/core-backend 5.15.0-dev.9 → 5.15.0
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 +39 -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 +2 -1
- 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/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/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/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/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 +2 -1
- 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/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/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/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/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/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/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 +8 -6
- 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/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":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as 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"}
|