@itwin/core-backend 5.15.0-dev.13 → 5.15.0-dev.15

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.
Files changed (129) hide show
  1. package/lib/cjs/BriefcaseManager.d.ts +2 -1
  2. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  3. package/lib/cjs/BriefcaseManager.js +39 -9
  4. package/lib/cjs/BriefcaseManager.js.map +1 -1
  5. package/lib/cjs/ChangeUnifier.d.ts +82 -0
  6. package/lib/cjs/ChangeUnifier.d.ts.map +1 -0
  7. package/lib/cjs/ChangeUnifier.js +163 -0
  8. package/lib/cjs/ChangeUnifier.js.map +1 -0
  9. package/lib/cjs/ChangesetReader.d.ts +21 -2
  10. package/lib/cjs/ChangesetReader.d.ts.map +1 -1
  11. package/lib/cjs/ChangesetReader.js +37 -1
  12. package/lib/cjs/ChangesetReader.js.map +1 -1
  13. package/lib/cjs/ECDb.d.ts +1 -0
  14. package/lib/cjs/ECDb.d.ts.map +1 -1
  15. package/lib/cjs/ECDb.js +4 -1
  16. package/lib/cjs/ECDb.js.map +1 -1
  17. package/lib/cjs/IModelDb.d.ts +6 -1
  18. package/lib/cjs/IModelDb.d.ts.map +1 -1
  19. package/lib/cjs/IModelDb.js +16 -5
  20. package/lib/cjs/IModelDb.js.map +1 -1
  21. package/lib/cjs/NativeHost.d.ts.map +1 -1
  22. package/lib/cjs/NativeHost.js +5 -1
  23. package/lib/cjs/NativeHost.js.map +1 -1
  24. package/lib/cjs/Relationship.d.ts +28 -0
  25. package/lib/cjs/Relationship.d.ts.map +1 -1
  26. package/lib/cjs/Relationship.js +78 -0
  27. package/lib/cjs/Relationship.js.map +1 -1
  28. package/lib/cjs/SchemaSync.d.ts.map +1 -1
  29. package/lib/cjs/SchemaSync.js +1 -0
  30. package/lib/cjs/SchemaSync.js.map +1 -1
  31. package/lib/cjs/TxnManager.d.ts +126 -89
  32. package/lib/cjs/TxnManager.d.ts.map +1 -1
  33. package/lib/cjs/TxnManager.js +109 -75
  34. package/lib/cjs/TxnManager.js.map +1 -1
  35. package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
  36. package/lib/cjs/annotations/LeaderGeometry.js +3 -0
  37. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  38. package/lib/cjs/core-backend.d.ts +1 -0
  39. package/lib/cjs/core-backend.d.ts.map +1 -1
  40. package/lib/cjs/core-backend.js +1 -0
  41. package/lib/cjs/core-backend.js.map +1 -1
  42. package/lib/cjs/internal/BriefcaseUtils.d.ts +19 -0
  43. package/lib/cjs/internal/BriefcaseUtils.d.ts.map +1 -0
  44. package/lib/cjs/internal/BriefcaseUtils.js +65 -0
  45. package/lib/cjs/internal/BriefcaseUtils.js.map +1 -0
  46. package/lib/cjs/internal/QueryMetadataCache.d.ts +44 -0
  47. package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -0
  48. package/lib/cjs/internal/QueryMetadataCache.js +107 -0
  49. package/lib/cjs/internal/QueryMetadataCache.js.map +1 -0
  50. package/lib/cjs/internal/Symbols.d.ts +6 -0
  51. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  52. package/lib/cjs/internal/Symbols.js +7 -1
  53. package/lib/cjs/internal/Symbols.js.map +1 -1
  54. package/lib/esm/BriefcaseManager.d.ts +2 -1
  55. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  56. package/lib/esm/BriefcaseManager.js +40 -10
  57. package/lib/esm/BriefcaseManager.js.map +1 -1
  58. package/lib/esm/ChangeUnifier.d.ts +82 -0
  59. package/lib/esm/ChangeUnifier.d.ts.map +1 -0
  60. package/lib/esm/ChangeUnifier.js +159 -0
  61. package/lib/esm/ChangeUnifier.js.map +1 -0
  62. package/lib/esm/ChangesetReader.d.ts +21 -2
  63. package/lib/esm/ChangesetReader.d.ts.map +1 -1
  64. package/lib/esm/ChangesetReader.js +38 -2
  65. package/lib/esm/ChangesetReader.js.map +1 -1
  66. package/lib/esm/ECDb.d.ts +1 -0
  67. package/lib/esm/ECDb.d.ts.map +1 -1
  68. package/lib/esm/ECDb.js +4 -1
  69. package/lib/esm/ECDb.js.map +1 -1
  70. package/lib/esm/IModelDb.d.ts +6 -1
  71. package/lib/esm/IModelDb.d.ts.map +1 -1
  72. package/lib/esm/IModelDb.js +17 -6
  73. package/lib/esm/IModelDb.js.map +1 -1
  74. package/lib/esm/NativeHost.d.ts.map +1 -1
  75. package/lib/esm/NativeHost.js +5 -1
  76. package/lib/esm/NativeHost.js.map +1 -1
  77. package/lib/esm/Relationship.d.ts +28 -0
  78. package/lib/esm/Relationship.d.ts.map +1 -1
  79. package/lib/esm/Relationship.js +78 -0
  80. package/lib/esm/Relationship.js.map +1 -1
  81. package/lib/esm/SchemaSync.d.ts.map +1 -1
  82. package/lib/esm/SchemaSync.js +1 -0
  83. package/lib/esm/SchemaSync.js.map +1 -1
  84. package/lib/esm/TxnManager.d.ts +126 -89
  85. package/lib/esm/TxnManager.d.ts.map +1 -1
  86. package/lib/esm/TxnManager.js +110 -76
  87. package/lib/esm/TxnManager.js.map +1 -1
  88. package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
  89. package/lib/esm/annotations/LeaderGeometry.js +3 -0
  90. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  91. package/lib/esm/core-backend.d.ts +1 -0
  92. package/lib/esm/core-backend.d.ts.map +1 -1
  93. package/lib/esm/core-backend.js +1 -0
  94. package/lib/esm/core-backend.js.map +1 -1
  95. package/lib/esm/internal/BriefcaseUtils.d.ts +19 -0
  96. package/lib/esm/internal/BriefcaseUtils.d.ts.map +1 -0
  97. package/lib/esm/internal/BriefcaseUtils.js +61 -0
  98. package/lib/esm/internal/BriefcaseUtils.js.map +1 -0
  99. package/lib/esm/internal/QueryMetadataCache.d.ts +44 -0
  100. package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -0
  101. package/lib/esm/internal/QueryMetadataCache.js +103 -0
  102. package/lib/esm/internal/QueryMetadataCache.js.map +1 -0
  103. package/lib/esm/internal/Symbols.d.ts +6 -0
  104. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  105. package/lib/esm/internal/Symbols.js +6 -0
  106. package/lib/esm/internal/Symbols.js.map +1 -1
  107. package/lib/esm/test/annotations/LeaderGeometry.test.js +15 -1
  108. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  109. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +35 -16
  110. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  111. package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts +2 -0
  112. package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts.map +1 -0
  113. package/lib/esm/test/ecdb/QueryMetadataCache.test.js +630 -0
  114. package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -0
  115. package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts +2 -0
  116. package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts.map +1 -0
  117. package/lib/esm/test/element/RelationshipBatchLookup.test.js +202 -0
  118. package/lib/esm/test/element/RelationshipBatchLookup.test.js.map +1 -0
  119. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +187 -1
  120. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  121. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts +2 -0
  122. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts.map +1 -0
  123. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js +159 -0
  124. package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js.map +1 -0
  125. package/lib/esm/test/standalone/ChangeUnifier.test.d.ts +2 -0
  126. package/lib/esm/test/standalone/ChangeUnifier.test.d.ts.map +1 -0
  127. package/lib/esm/test/standalone/ChangeUnifier.test.js +732 -0
  128. package/lib/esm/test/standalone/ChangeUnifier.test.js.map +1 -0
  129. package/package.json +17 -17
@@ -1 +1 @@
1
- {"version":3,"file":"BriefcaseManager.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/BriefcaseManager.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 { assert } from \"chai\";\r\nimport { Guid } from \"@itwin/core-bentley\";\r\nimport { BriefcaseIdValue } from \"@itwin/core-common\";\r\nimport { Element } from \"../../Element\";\r\nimport { HubWrappers, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { TestChangeSetUtility } from \"../TestChangeSetUtility\";\r\nimport { _nativeDb, ChannelControl, ProgressStatus } from \"../../core-backend\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\ndescribe(\"BriefcaseManager\", async () => {\r\n const testITwinId: string = Guid.createValue();\r\n const managerAccessToken = \"manager mock token\";\r\n const accessToken = \"access token\";\r\n\r\n // contested version0 files can cause errors that cause tests to not call shutdown, so always do it here\r\n afterEach(() => HubMock.shutdown());\r\n\r\n it(\"Open iModels with various names causing potential issues on Windows/Unix\", async () => {\r\n HubMock.startup(\"bad names\", KnownTestLocations.outputDir);\r\n let iModelName = \"iModel Name With Spaces\";\r\n let iModelId = await HubWrappers.createIModel(managerAccessToken, testITwinId, iModelName);\r\n const args = { accessToken, iTwinId: testITwinId, iModelId };\r\n assert.isDefined(iModelId);\r\n let iModel = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.isDefined(iModel);\r\n\r\n iModelName = \"iModel Name With :\\/<>?* Characters\";\r\n iModelId = await HubWrappers.createIModel(managerAccessToken, testITwinId, iModelName);\r\n assert.isDefined(iModelId);\r\n iModel = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.isDefined(iModel);\r\n\r\n iModelName = \"iModel Name Thats Excessively Long \" +\r\n \"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\" +\r\n \"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\" +\r\n \"01234567890123456789\"; // 35 + 2*100 + 20 = 255\r\n // Note: iModelHub does not accept a name that's longer than 255 characters.\r\n assert.equal(255, iModelName.length);\r\n iModelId = await HubWrappers.createIModel(managerAccessToken, testITwinId, iModelName);\r\n assert.isDefined(iModelId);\r\n iModel = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.isDefined(iModel);\r\n iModel.close();\r\n });\r\n\r\n it(\"should set appropriate briefcase ids for FixedVersion, PullOnly and PullAndPush workflows\", async () => {\r\n HubMock.startup(\"briefcaseIds\", KnownTestLocations.outputDir);\r\n const iModelId = await HubWrappers.createIModel(accessToken, testITwinId, \"imodel1\");\r\n const args = { accessToken, iTwinId: testITwinId, iModelId, deleteFirst: true };\r\n const iModel1 = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.equal(BriefcaseIdValue.Unassigned, iModel1.getBriefcaseId(), \"checkpoint should be 0\");\r\n\r\n try {\r\n const iModelFailure = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModelFailure);\r\n assert.fail(\"iModelFailure should fail due to iModel1 already being open as a SnapshotDb\");\r\n } catch (err: any) {\r\n assert.isTrue(err.message.includes(\"iModel is already open as a SnapshotDb\"), \"iModelFailure failure must be due to db being open as a SnapshotDb\");\r\n }\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel1);\r\n const iModel2 = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n assert.equal(BriefcaseIdValue.Unassigned, iModel2.briefcaseId, \"pullOnly should be 0\");\r\n\r\n const iModel2Dup = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n\r\n const iModel3 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n assert.isTrue(iModel3.briefcaseId >= BriefcaseIdValue.FirstValid && iModel3.briefcaseId <= BriefcaseIdValue.LastValid, \"valid briefcaseId\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel2);\r\n try {\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel2Dup);\r\n assert.fail(\"iModel2Dup failure should fail due to already being closed when iModel2 closed\");\r\n } catch (err: any) {\r\n assert.isTrue(err.message.includes(\"db not open\"), \"iModel2Dup failure must be due to db not being open\");\r\n }\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel3);\r\n });\r\n\r\n it(\"should reuse a briefcaseId when re-opening iModels for pullAndPush workflows\", async () => {\r\n HubMock.startup(\"briefcaseIdsReopen\", KnownTestLocations.outputDir);\r\n const iModelId = await HubWrappers.createIModel(accessToken, testITwinId, \"imodel1\");\r\n\r\n const args = { accessToken, iTwinId: testITwinId, iModelId, deleteFirst: false };\r\n const iModel1 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseId1 = iModel1.briefcaseId;\r\n iModel1.close(); // Keeps the briefcase by default\r\n\r\n const iModel3 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseId3 = iModel3.briefcaseId;\r\n assert.strictEqual(briefcaseId3, briefcaseId1);\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel3);\r\n });\r\n\r\n it(\"should reuse a briefcaseId when re-opening iModels of different versions for pullAndPush and pullOnly workflows\", async () => {\r\n HubMock.startup(\"workflow\", KnownTestLocations.outputDir);\r\n const userToken1 = \"manager token\";\r\n const userToken2 = \"super manager token\";\r\n\r\n // User1 creates an iModel on the Hub\r\n const testUtility = new TestChangeSetUtility(userToken1, IModelTestUtils.generateUniqueName(\"BriefcaseReuseTest\"));\r\n await testUtility.createTestIModel();\r\n\r\n // User2 opens and then closes the iModel pullOnly/pullPush, keeping the briefcase\r\n const args = { accessToken: userToken2, iTwinId: testUtility.iTwinId, iModelId: testUtility.iModelId };\r\n const iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseIdPullAndPush: number = iModelPullAndPush.briefcaseId;\r\n const changesetPullAndPush = iModelPullAndPush.changeset;\r\n iModelPullAndPush.close();\r\n\r\n const iModelPullOnly = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n const briefcaseIdPullOnly: number = iModelPullOnly.briefcaseId;\r\n const changesetPullOnly = iModelPullOnly.changeset;\r\n iModelPullOnly.close();\r\n\r\n // User1 pushes a change set\r\n await testUtility.pushTestChangeSet();\r\n\r\n // User 2 reopens the iModel pullOnly/pullPush => Expect the same briefcase to be re-used, but the changeset should have been updated!!\r\n const iModelPullAndPush2 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseIdPullAndPush2: number = iModelPullAndPush2.briefcaseId;\r\n assert.strictEqual(briefcaseIdPullAndPush2, briefcaseIdPullAndPush);\r\n const changesetPullAndPush2 = iModelPullAndPush2.changeset;\r\n assert.notStrictEqual(changesetPullAndPush2, changesetPullAndPush);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(userToken2, iModelPullAndPush2);\r\n\r\n const iModelPullOnly2 = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n const briefcaseIdPullOnly2: number = iModelPullOnly2.briefcaseId;\r\n assert.strictEqual(briefcaseIdPullOnly2, briefcaseIdPullOnly);\r\n const changesetPullOnly2 = iModelPullOnly2.changeset;\r\n assert.notStrictEqual(changesetPullOnly2, changesetPullOnly);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(userToken2, iModelPullOnly2);\r\n\r\n // Delete iModel from the Hub and disk\r\n await testUtility.deleteTestIModel();\r\n });\r\n\r\n it(\"should be able to edit a PullAndPush briefcase, reopen it as of a new version, and then push changes\", async () => {\r\n HubMock.startup(\"pullPush\", KnownTestLocations.outputDir);\r\n const userToken1 = \"manager token\"; // User1 is just used to create and update the iModel\r\n const userToken2 = \"super manager token\"; // User2 is used for the test\r\n\r\n // User1 creates an iModel on the Hub\r\n const testUtility = new TestChangeSetUtility(userToken1, \"PullAndPushTest\");\r\n await testUtility.createTestIModel();\r\n\r\n // User2 opens the iModel pullAndPush and is able to edit and save changes\r\n const args = { accessToken: userToken2, iTwinId: testUtility.iTwinId, iModelId: testUtility.iModelId };\r\n let iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n assert.exists(iModelPullAndPush);\r\n const briefcaseId = iModelPullAndPush.briefcaseId;\r\n const pathname = iModelPullAndPush.pathName;\r\n\r\n iModelPullAndPush.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const rootEl: Element = iModelPullAndPush.elements.getRootSubject();\r\n rootEl.userLabel = `${rootEl.userLabel}changed`;\r\n withEditTxn(iModelPullAndPush, (txn) => txn.updateElement(rootEl.toJSON()));\r\n\r\n assert.isFalse(iModelPullAndPush[_nativeDb].hasUnsavedChanges());\r\n assert.isTrue(iModelPullAndPush[_nativeDb].hasPendingTxns());\r\n\r\n iModelPullAndPush.close();\r\n\r\n // User2 should be able to re-open the iModel pullAndPush again\r\n // - the changes will still be there\r\n iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const changesetPullAndPush = iModelPullAndPush.changeset;\r\n assert.strictEqual(iModelPullAndPush.briefcaseId, briefcaseId);\r\n assert.strictEqual(iModelPullAndPush.pathName, pathname);\r\n assert.isFalse(iModelPullAndPush[_nativeDb].hasUnsavedChanges());\r\n assert.isTrue(iModelPullAndPush[_nativeDb].hasPendingTxns());\r\n\r\n // User1 pushes a change set\r\n await testUtility.pushTestChangeSet();\r\n\r\n // User2 should be able to re-open the iModel\r\n await HubWrappers.openBriefcaseUsingRpc(args);\r\n\r\n // User2 closes and reopens the iModel pullAndPush as of the newer version\r\n // - the changes will still be there, AND\r\n // - the briefcase will be upgraded to the newer version since it was closed and re-opened.\r\n iModelPullAndPush.close();\r\n iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const changesetPullAndPush3 = iModelPullAndPush.changeset;\r\n assert.notStrictEqual(changesetPullAndPush3, changesetPullAndPush);\r\n assert.strictEqual(iModelPullAndPush.briefcaseId, briefcaseId);\r\n assert.strictEqual(iModelPullAndPush.pathName, pathname);\r\n assert.isFalse(iModelPullAndPush[_nativeDb].hasUnsavedChanges());\r\n assert.isTrue(iModelPullAndPush[_nativeDb].hasPendingTxns());\r\n\r\n // User2 should be able to push the changes now\r\n await iModelPullAndPush.pushChanges({ accessToken: userToken2, description: \"test change\" });\r\n const changesetPullAndPush4 = iModelPullAndPush.changeset;\r\n assert.notStrictEqual(changesetPullAndPush4, changesetPullAndPush3);\r\n\r\n // Delete iModel from the Hub and disk\r\n await HubWrappers.closeAndDeleteBriefcaseDb(userToken2, iModelPullAndPush);\r\n await testUtility.deleteTestIModel();\r\n });\r\n\r\n describe(\"pushChanges download progress\", () => {\r\n const user1 = \"user1 mock token\";\r\n const user2 = \"user2 mock token\";\r\n\r\n /** Creates an iModel owned by user1, opens a briefcase for user2, then pushes another changeset as user1 so\r\n * that user2's briefcase is behind by one changeset and must pull-and-merge before it can push.\r\n */\r\n async function setupOutdatedBriefcase(testName: string) {\r\n HubMock.startup(testName, KnownTestLocations.outputDir);\r\n\r\n const testUtility = new TestChangeSetUtility(user1, testName);\r\n await testUtility.createTestIModel();\r\n\r\n const briefcase = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user2, iTwinId: testUtility.iTwinId, iModelId: testUtility.iModelId });\r\n briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n await testUtility.pushTestChangeSet();\r\n\r\n // Make a local change so that this briefcase actually has something to push.\r\n const rootEl: Element = briefcase.elements.getRootSubject();\r\n rootEl.userLabel = `${rootEl.userLabel} changed`;\r\n withEditTxn(briefcase, (txn) => txn.updateElement(rootEl.toJSON()));\r\n\r\n return { testUtility, briefcase };\r\n }\r\n\r\n it(\"reports download progress for the changesets pulled before pushing\", async () => {\r\n const { testUtility, briefcase } = await setupOutdatedBriefcase(\"pushProgress\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n const progress: { loaded: number, total: number }[] = [];\r\n await briefcase.pushChanges({\r\n accessToken: user2,\r\n description: \"push with progress\",\r\n onDownloadProgress: (loaded, total) => {\r\n progress.push({ loaded, total });\r\n return ProgressStatus.Continue;\r\n },\r\n });\r\n\r\n assert.isTrue(progress.every((p) => p.loaded <= p.total), \"loaded should never exceed total\");\r\n\r\n // A push performs more than one pull, and the later ones have nothing left to download. Only the first\r\n // sequence actually transfers bytes.\r\n const downloaded = progress.filter((p) => p.total > 0);\r\n assert.isNotEmpty(downloaded, \"expected progress to be reported while pulling changesets\");\r\n for (let i = 1; i < downloaded.length; ++i)\r\n assert.isAtLeast(downloaded[i].loaded, downloaded[i - 1].loaded, \"loaded should be monotonically increasing\");\r\n assert.strictEqual(downloaded[downloaded.length - 1].loaded, downloaded[downloaded.length - 1].total, \"the last report should indicate the download completed\");\r\n\r\n assert.notStrictEqual(briefcase.changeset.id, changesetBeforePush, \"briefcase should have pulled and pushed\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n await testUtility.deleteTestIModel();\r\n });\r\n\r\n it(\"aborts the push when the download progress callback requests it\", async () => {\r\n const { testUtility, briefcase } = await setupOutdatedBriefcase(\"pushProgressAbort\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n let error: Error | undefined;\r\n try {\r\n await briefcase.pushChanges({\r\n accessToken: user2,\r\n description: \"push that gets aborted\",\r\n onDownloadProgress: () => ProgressStatus.Abort,\r\n });\r\n } catch (err) {\r\n error = err as Error;\r\n }\r\n\r\n assert.isDefined(error, \"aborting the download should cause pushChanges to throw\");\r\n assert.strictEqual(briefcase.changeset.id, changesetBeforePush, \"briefcase should not have advanced\");\r\n assert.isTrue(briefcase[_nativeDb].hasPendingTxns(), \"local changes should still be pending\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n await testUtility.deleteTestIModel();\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"BriefcaseManager.test.js","sourceRoot":"","sources":["../../../../src/test/hubaccess/BriefcaseManager.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 { Guid } from \"@itwin/core-bentley\";\r\nimport { BriefcaseIdValue } from \"@itwin/core-common\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Element } from \"../../Element\";\r\nimport { HubWrappers, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { TestChangeSetUtility } from \"../TestChangeSetUtility\";\r\nimport { _nativeDb, ChannelControl, ProgressStatus } from \"../../core-backend\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\n\r\nchai.use(chaiAsPromised);\r\nconst assert = chai.assert;\r\n\r\ndescribe(\"BriefcaseManager\", async () => {\r\n const testITwinId: string = Guid.createValue();\r\n const managerAccessToken = \"manager mock token\";\r\n const accessToken = \"access token\";\r\n\r\n // contested version0 files can cause errors that cause tests to not call shutdown, so always do it here\r\n afterEach(() => HubMock.shutdown());\r\n\r\n it(\"Open iModels with various names causing potential issues on Windows/Unix\", async () => {\r\n HubMock.startup(\"bad names\", KnownTestLocations.outputDir);\r\n let iModelName = \"iModel Name With Spaces\";\r\n let iModelId = await HubWrappers.createIModel(managerAccessToken, testITwinId, iModelName);\r\n const args = { accessToken, iTwinId: testITwinId, iModelId };\r\n assert.isDefined(iModelId);\r\n let iModel = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.isDefined(iModel);\r\n\r\n iModelName = \"iModel Name With :\\/<>?* Characters\";\r\n iModelId = await HubWrappers.createIModel(managerAccessToken, testITwinId, iModelName);\r\n assert.isDefined(iModelId);\r\n iModel = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.isDefined(iModel);\r\n\r\n iModelName = \"iModel Name Thats Excessively Long \" +\r\n \"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\" +\r\n \"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\" +\r\n \"01234567890123456789\"; // 35 + 2*100 + 20 = 255\r\n // Note: iModelHub does not accept a name that's longer than 255 characters.\r\n assert.equal(255, iModelName.length);\r\n iModelId = await HubWrappers.createIModel(managerAccessToken, testITwinId, iModelName);\r\n assert.isDefined(iModelId);\r\n iModel = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.isDefined(iModel);\r\n iModel.close();\r\n });\r\n\r\n it(\"should set appropriate briefcase ids for FixedVersion, PullOnly and PullAndPush workflows\", async () => {\r\n HubMock.startup(\"briefcaseIds\", KnownTestLocations.outputDir);\r\n const iModelId = await HubWrappers.createIModel(accessToken, testITwinId, \"imodel1\");\r\n const args = { accessToken, iTwinId: testITwinId, iModelId, deleteFirst: true };\r\n const iModel1 = await HubWrappers.openCheckpointUsingRpc(args);\r\n assert.equal(BriefcaseIdValue.Unassigned, iModel1.getBriefcaseId(), \"checkpoint should be 0\");\r\n\r\n try {\r\n const iModelFailure = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModelFailure);\r\n assert.fail(\"iModelFailure should fail due to iModel1 already being open as a SnapshotDb\");\r\n } catch (err: any) {\r\n assert.isTrue(err.message.includes(\"iModel is already open as a SnapshotDb\"), \"iModelFailure failure must be due to db being open as a SnapshotDb\");\r\n }\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel1);\r\n const iModel2 = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n assert.equal(BriefcaseIdValue.Unassigned, iModel2.briefcaseId, \"pullOnly should be 0\");\r\n\r\n const iModel2Dup = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n\r\n const iModel3 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n assert.isTrue(iModel3.briefcaseId >= BriefcaseIdValue.FirstValid && iModel3.briefcaseId <= BriefcaseIdValue.LastValid, \"valid briefcaseId\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel2);\r\n try {\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel2Dup);\r\n assert.fail(\"iModel2Dup failure should fail due to already being closed when iModel2 closed\");\r\n } catch (err: any) {\r\n assert.isTrue(err.message.includes(\"db not open\"), \"iModel2Dup failure must be due to db not being open\");\r\n }\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel3);\r\n });\r\n\r\n it(\"should reuse a briefcaseId when re-opening iModels for pullAndPush workflows\", async () => {\r\n HubMock.startup(\"briefcaseIdsReopen\", KnownTestLocations.outputDir);\r\n const iModelId = await HubWrappers.createIModel(accessToken, testITwinId, \"imodel1\");\r\n\r\n const args = { accessToken, iTwinId: testITwinId, iModelId, deleteFirst: false };\r\n const iModel1 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseId1 = iModel1.briefcaseId;\r\n iModel1.close(); // Keeps the briefcase by default\r\n\r\n const iModel3 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseId3 = iModel3.briefcaseId;\r\n assert.strictEqual(briefcaseId3, briefcaseId1);\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel3);\r\n });\r\n\r\n it(\"should reuse a briefcaseId when re-opening iModels of different versions for pullAndPush and pullOnly workflows\", async () => {\r\n HubMock.startup(\"workflow\", KnownTestLocations.outputDir);\r\n const userToken1 = \"manager token\";\r\n const userToken2 = \"super manager token\";\r\n\r\n // User1 creates an iModel on the Hub\r\n const testUtility = new TestChangeSetUtility(userToken1, IModelTestUtils.generateUniqueName(\"BriefcaseReuseTest\"));\r\n await testUtility.createTestIModel();\r\n\r\n // User2 opens and then closes the iModel pullOnly/pullPush, keeping the briefcase\r\n const args = { accessToken: userToken2, iTwinId: testUtility.iTwinId, iModelId: testUtility.iModelId };\r\n const iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseIdPullAndPush: number = iModelPullAndPush.briefcaseId;\r\n const changesetPullAndPush = iModelPullAndPush.changeset;\r\n iModelPullAndPush.close();\r\n\r\n const iModelPullOnly = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n const briefcaseIdPullOnly: number = iModelPullOnly.briefcaseId;\r\n const changesetPullOnly = iModelPullOnly.changeset;\r\n iModelPullOnly.close();\r\n\r\n // User1 pushes a change set\r\n await testUtility.pushTestChangeSet();\r\n\r\n // User 2 reopens the iModel pullOnly/pullPush => Expect the same briefcase to be re-used, but the changeset should have been updated!!\r\n const iModelPullAndPush2 = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const briefcaseIdPullAndPush2: number = iModelPullAndPush2.briefcaseId;\r\n assert.strictEqual(briefcaseIdPullAndPush2, briefcaseIdPullAndPush);\r\n const changesetPullAndPush2 = iModelPullAndPush2.changeset;\r\n assert.notStrictEqual(changesetPullAndPush2, changesetPullAndPush);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(userToken2, iModelPullAndPush2);\r\n\r\n const iModelPullOnly2 = await HubWrappers.openBriefcaseUsingRpc({ ...args, briefcaseId: 0 });\r\n const briefcaseIdPullOnly2: number = iModelPullOnly2.briefcaseId;\r\n assert.strictEqual(briefcaseIdPullOnly2, briefcaseIdPullOnly);\r\n const changesetPullOnly2 = iModelPullOnly2.changeset;\r\n assert.notStrictEqual(changesetPullOnly2, changesetPullOnly);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(userToken2, iModelPullOnly2);\r\n\r\n // Delete iModel from the Hub and disk\r\n await testUtility.deleteTestIModel();\r\n });\r\n\r\n it(\"should be able to edit a PullAndPush briefcase, reopen it as of a new version, and then push changes\", async () => {\r\n HubMock.startup(\"pullPush\", KnownTestLocations.outputDir);\r\n const userToken1 = \"manager token\"; // User1 is just used to create and update the iModel\r\n const userToken2 = \"super manager token\"; // User2 is used for the test\r\n\r\n // User1 creates an iModel on the Hub\r\n const testUtility = new TestChangeSetUtility(userToken1, \"PullAndPushTest\");\r\n await testUtility.createTestIModel();\r\n\r\n // User2 opens the iModel pullAndPush and is able to edit and save changes\r\n const args = { accessToken: userToken2, iTwinId: testUtility.iTwinId, iModelId: testUtility.iModelId };\r\n let iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n assert.exists(iModelPullAndPush);\r\n const briefcaseId = iModelPullAndPush.briefcaseId;\r\n const pathname = iModelPullAndPush.pathName;\r\n\r\n iModelPullAndPush.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const rootEl: Element = iModelPullAndPush.elements.getRootSubject();\r\n rootEl.userLabel = `${rootEl.userLabel}changed`;\r\n withEditTxn(iModelPullAndPush, (txn) => txn.updateElement(rootEl.toJSON()));\r\n\r\n assert.isFalse(iModelPullAndPush[_nativeDb].hasUnsavedChanges());\r\n assert.isTrue(iModelPullAndPush[_nativeDb].hasPendingTxns());\r\n\r\n iModelPullAndPush.close();\r\n\r\n // User2 should be able to re-open the iModel pullAndPush again\r\n // - the changes will still be there\r\n iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const changesetPullAndPush = iModelPullAndPush.changeset;\r\n assert.strictEqual(iModelPullAndPush.briefcaseId, briefcaseId);\r\n assert.strictEqual(iModelPullAndPush.pathName, pathname);\r\n assert.isFalse(iModelPullAndPush[_nativeDb].hasUnsavedChanges());\r\n assert.isTrue(iModelPullAndPush[_nativeDb].hasPendingTxns());\r\n\r\n // User1 pushes a change set\r\n await testUtility.pushTestChangeSet();\r\n\r\n // User2 should be able to re-open the iModel\r\n await HubWrappers.openBriefcaseUsingRpc(args);\r\n\r\n // User2 closes and reopens the iModel pullAndPush as of the newer version\r\n // - the changes will still be there, AND\r\n // - the briefcase will be upgraded to the newer version since it was closed and re-opened.\r\n iModelPullAndPush.close();\r\n iModelPullAndPush = await HubWrappers.openBriefcaseUsingRpc(args);\r\n const changesetPullAndPush3 = iModelPullAndPush.changeset;\r\n assert.notStrictEqual(changesetPullAndPush3, changesetPullAndPush);\r\n assert.strictEqual(iModelPullAndPush.briefcaseId, briefcaseId);\r\n assert.strictEqual(iModelPullAndPush.pathName, pathname);\r\n assert.isFalse(iModelPullAndPush[_nativeDb].hasUnsavedChanges());\r\n assert.isTrue(iModelPullAndPush[_nativeDb].hasPendingTxns());\r\n\r\n // User2 should be able to push the changes now\r\n await iModelPullAndPush.pushChanges({ accessToken: userToken2, description: \"test change\" });\r\n const changesetPullAndPush4 = iModelPullAndPush.changeset;\r\n assert.notStrictEqual(changesetPullAndPush4, changesetPullAndPush3);\r\n\r\n // Delete iModel from the Hub and disk\r\n await HubWrappers.closeAndDeleteBriefcaseDb(userToken2, iModelPullAndPush);\r\n await testUtility.deleteTestIModel();\r\n });\r\n\r\n describe(\"pushChanges download progress\", () => {\r\n const user1 = \"user1 mock token\";\r\n const user2 = \"user2 mock token\";\r\n\r\n /** Creates an iModel owned by user1, opens a briefcase for user2, then pushes another changeset as user1 so\r\n * that user2's briefcase is behind by one changeset and must pull-and-merge before it can push.\r\n */\r\n async function setupOutdatedBriefcase(testName: string) {\r\n HubMock.startup(testName, KnownTestLocations.outputDir);\r\n\r\n const testUtility = new TestChangeSetUtility(user1, testName);\r\n await testUtility.createTestIModel();\r\n\r\n const briefcase = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user2, iTwinId: testUtility.iTwinId, iModelId: testUtility.iModelId });\r\n briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n await testUtility.pushTestChangeSet();\r\n\r\n // Make a local change so that this briefcase actually has something to push.\r\n const rootEl: Element = briefcase.elements.getRootSubject();\r\n rootEl.userLabel = `${rootEl.userLabel} changed`;\r\n withEditTxn(briefcase, (txn) => txn.updateElement(rootEl.toJSON()));\r\n\r\n return { testUtility, briefcase };\r\n }\r\n\r\n it(\"reports download progress for the changesets pulled before pushing\", async () => {\r\n const { testUtility, briefcase } = await setupOutdatedBriefcase(\"pushProgress\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n const progress: { loaded: number, total: number }[] = [];\r\n await briefcase.pushChanges({\r\n accessToken: user2,\r\n description: \"push with progress\",\r\n onDownloadProgress: (loaded, total) => {\r\n progress.push({ loaded, total });\r\n return ProgressStatus.Continue;\r\n },\r\n });\r\n\r\n assert.isTrue(progress.every((p) => p.loaded <= p.total), \"loaded should never exceed total\");\r\n\r\n // A push performs more than one pull, and the later ones have nothing left to download. Only the first\r\n // sequence actually transfers bytes.\r\n const downloaded = progress.filter((p) => p.total > 0);\r\n assert.isNotEmpty(downloaded, \"expected progress to be reported while pulling changesets\");\r\n for (let i = 1; i < downloaded.length; ++i)\r\n assert.isAtLeast(downloaded[i].loaded, downloaded[i - 1].loaded, \"loaded should be monotonically increasing\");\r\n assert.strictEqual(downloaded[downloaded.length - 1].loaded, downloaded[downloaded.length - 1].total, \"the last report should indicate the download completed\");\r\n\r\n assert.notStrictEqual(briefcase.changeset.id, changesetBeforePush, \"briefcase should have pulled and pushed\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n await testUtility.deleteTestIModel();\r\n });\r\n\r\n it(\"aborts the push when the download progress callback requests it\", async () => {\r\n const { testUtility, briefcase } = await setupOutdatedBriefcase(\"pushProgressAbort\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n let error: Error | undefined;\r\n try {\r\n await briefcase.pushChanges({\r\n accessToken: user2,\r\n description: \"push that gets aborted\",\r\n onDownloadProgress: () => ProgressStatus.Abort,\r\n });\r\n } catch (err) {\r\n error = err as Error;\r\n }\r\n\r\n assert.isDefined(error, \"aborting the download should cause pushChanges to throw\");\r\n assert.strictEqual(briefcase.changeset.id, changesetBeforePush, \"briefcase should not have advanced\");\r\n assert.isTrue(briefcase[_nativeDb].hasPendingTxns(), \"local changes should still be pending\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n await testUtility.deleteTestIModel();\r\n });\r\n });\r\n\r\n describe(\"TxnManager.onPrePushValidation\", () => {\r\n const user2 = \"user2 mock token\";\r\n const user3 = \"user3 mock token\";\r\n\r\n /** Creates an empty iModel and opens a briefcase with one local, unpushed change to the root subject's user label. */\r\n async function setupBriefcaseWithLocalChange(testName: string) {\r\n HubMock.startup(testName, KnownTestLocations.outputDir);\r\n\r\n const iTwinId = HubMock.iTwinId;\r\n const iModelId = await HubWrappers.recreateIModel({ accessToken: user2, iTwinId, iModelName: testName, noLocks: true });\r\n\r\n const briefcase = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user2, iTwinId, iModelId });\r\n briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const rootEl = briefcase.elements.getRootSubject();\r\n rootEl.userLabel = \"local change\";\r\n withEditTxn(briefcase, (txn) => txn.updateElement(rootEl.toJSON()));\r\n assert.isTrue(briefcase.txns.hasPendingTxns);\r\n\r\n return { iTwinId, iModelId, briefcase };\r\n }\r\n\r\n it(\"delays the push until the listener's promise resolves\", async () => {\r\n const { briefcase } = await setupBriefcaseWithLocalChange(\"prePushDelay\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n const events: string[] = [];\r\n let changesetWhenListenerFinished: string | undefined;\r\n let releaseListener!: () => void;\r\n const gate = new Promise<void>((resolve) => { releaseListener = resolve; });\r\n let listenerStarted!: () => void;\r\n const started = new Promise<void>((resolve) => { listenerStarted = resolve; });\r\n\r\n const removeListener = briefcase.txns.onPrePushValidation.addListener(async () => {\r\n events.push(\"listener started\");\r\n listenerStarted();\r\n await gate;\r\n changesetWhenListenerFinished = briefcase.changeset.id;\r\n events.push(\"listener finished\");\r\n });\r\n\r\n try {\r\n const pushPromise = briefcase.pushChanges({ accessToken: user2, description: \"delayed push\" }).then(() => { events.push(\"push settled\"); });\r\n\r\n await started;\r\n events.push(\"listener released\");\r\n releaseListener();\r\n await pushPromise;\r\n\r\n assert.deepEqual(events, [\"listener started\", \"listener released\", \"listener finished\", \"push settled\"]);\r\n assert.strictEqual(changesetWhenListenerFinished, changesetBeforePush, \"nothing should be pushed before the listener resolves\");\r\n assert.notStrictEqual(briefcase.changeset.id, changesetBeforePush, \"push should complete once the listener resolves\");\r\n assert.isFalse(briefcase.txns.hasPendingTxns);\r\n } finally {\r\n releaseListener();\r\n removeListener();\r\n }\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n });\r\n\r\n it(\"includes a Txn written by the listener in the pushed changeset\", async () => {\r\n const { iTwinId, iModelId, briefcase } = await setupBriefcaseWithLocalChange(\"prePushWriteTxn\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n const txnCountBeforePush = Array.from(briefcase.txns.queryTxns()).length;\r\n let txnCountInListener = 0;\r\n\r\n const removeListener = briefcase.txns.onPrePushValidation.addListener(async () => {\r\n const rootEl = briefcase.elements.getRootSubject();\r\n rootEl.description = \"written during pre-push validation\";\r\n withEditTxn(briefcase, (txn) => txn.updateElement(rootEl.toJSON()));\r\n txnCountInListener = Array.from(briefcase.txns.queryTxns()).length;\r\n });\r\n\r\n try {\r\n await briefcase.pushChanges({ accessToken: user2, description: \"push with pre-push txn\" });\r\n } finally {\r\n removeListener();\r\n }\r\n\r\n assert.isAbove(txnCountInListener, txnCountBeforePush, \"listener should have written a new Txn\");\r\n assert.notStrictEqual(briefcase.changeset.id, changesetBeforePush);\r\n assert.isFalse(briefcase.txns.hasPendingTxns, \"the listener's Txn should have been pushed, not left pending\");\r\n\r\n // A fresh briefcase at the tip only sees the listener's change if it was part of the pushed changeset.\r\n const verifier = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user3, iTwinId, iModelId });\r\n const pushedRoot = verifier.elements.getRootSubject();\r\n assert.strictEqual(pushedRoot.userLabel, \"local change\");\r\n assert.strictEqual(pushedRoot.description, \"written during pre-push validation\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user3, verifier);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n });\r\n\r\n it(\"aborts the push when the listener rejects\", async () => {\r\n const { briefcase } = await setupBriefcaseWithLocalChange(\"prePushReject\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n const removeListener = briefcase.txns.onPrePushValidation.addListener(async () => {\r\n throw new Error(\"validation failed\");\r\n });\r\n\r\n try {\r\n await assert.isRejected(briefcase.pushChanges({ accessToken: user2, description: \"rejected push\" }), \"validation failed\");\r\n } finally {\r\n removeListener();\r\n }\r\n\r\n assert.strictEqual(briefcase.changeset.id, changesetBeforePush, \"briefcase should not have advanced\");\r\n assert.isTrue(briefcase.txns.hasPendingTxns, \"local changes should still be pending\");\r\n\r\n // With the listener removed, the same changes can still be pushed.\r\n await briefcase.pushChanges({ accessToken: user2, description: \"retry push\" });\r\n assert.notStrictEqual(briefcase.changeset.id, changesetBeforePush);\r\n assert.isFalse(briefcase.txns.hasPendingTxns);\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n });\r\n\r\n it(\"handles a listener that calls pushChanges, recursing asynchronously\", async () => {\r\n const { briefcase } = await setupBriefcaseWithLocalChange(\"prePushRecursion\");\r\n const changesetBeforePush = briefcase.changeset.id;\r\n\r\n let listenerCalls = 0;\r\n let changesetAfterNestedPush: string | undefined;\r\n // addOnce removes the listener before invoking it, so the nested push does not re-enter it endlessly.\r\n const removeListener = briefcase.txns.onPrePushValidation.addOnce(async () => {\r\n ++listenerCalls;\r\n await briefcase.pushChanges({ accessToken: user2, description: \"nested push\" });\r\n changesetAfterNestedPush = briefcase.changeset.id;\r\n });\r\n\r\n try {\r\n // The nested push consumes all pending Txns, so the outer push has nothing left to push and completes quietly.\r\n await briefcase.pushChanges({ accessToken: user2, description: \"outer push\" });\r\n } finally {\r\n removeListener();\r\n }\r\n\r\n assert.strictEqual(listenerCalls, 1, \"listener should only run for the outer push\");\r\n assert.isDefined(changesetAfterNestedPush);\r\n assert.notStrictEqual(changesetAfterNestedPush, changesetBeforePush, \"nested push should have pushed the changes\");\r\n assert.strictEqual(briefcase.changeset.id, changesetAfterNestedPush);\r\n assert.isFalse(briefcase.txns.hasPendingTxns);\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, briefcase);\r\n });\r\n\r\n describe(\"after pull/merge\", () => {\r\n const incomingExtents = new Range3d(-100, -200, -300, 400, 500, 600);\r\n\r\n // Note: only project extents are covered. The native getIModelProps(\"pullMerge\") does not reload geolocation (ECEF location, global origin) after a merge.\r\n /** user2 has a local unpushed change; user3 then pushes new project extents that user2 has not yet pulled. */\r\n async function setup(testName: string) {\r\n HubMock.startup(testName, KnownTestLocations.outputDir);\r\n const iTwinId = HubMock.iTwinId;\r\n const iModelId = await HubWrappers.recreateIModel({ accessToken: user2, iTwinId, iModelName: testName, noLocks: true });\r\n\r\n const local = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user2, iTwinId, iModelId });\r\n local.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n const rootEl = local.elements.getRootSubject();\r\n rootEl.userLabel = \"local change\";\r\n withEditTxn(local, (txn) => txn.updateElement(rootEl.toJSON()));\r\n\r\n const remote = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user3, iTwinId, iModelId });\r\n remote.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n withEditTxn(remote, (txn) => txn.updateProjectExtents(incomingExtents));\r\n await remote.pushChanges({ accessToken: user3, description: \"project extents\" });\r\n\r\n return { iTwinId, iModelId, local, remote };\r\n }\r\n\r\n it(\"exposes the merged project extents to listeners\", async () => {\r\n const { local, remote } = await setup(\"prePushMergedProps\");\r\n\r\n let seenExtents: Range3d | undefined;\r\n const removeListener = local.txns.onPrePushValidation.addListener(async () => {\r\n seenExtents = local.projectExtents.clone();\r\n });\r\n\r\n try {\r\n await local.pushChanges({ accessToken: user2, description: \"push after merge\" });\r\n } finally {\r\n removeListener();\r\n }\r\n\r\n assert.isDefined(seenExtents);\r\n assert.isTrue(seenExtents!.isAlmostEqual(incomingExtents), \"listener should see the merged project extents\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user3, remote);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, local);\r\n });\r\n\r\n it(\"lets a listener extend the merged project extents\", async () => {\r\n const { iTwinId, iModelId, local, remote } = await setup(\"prePushExtendExtents\");\r\n\r\n const extra = new Range3d(500, 600, 700, 800, 900, 1000);\r\n const expected = incomingExtents.clone();\r\n expected.extendRange(extra);\r\n const removeListener = local.txns.onPrePushValidation.addListener(async () => {\r\n const extended = local.projectExtents.clone();\r\n extended.extendRange(extra);\r\n withEditTxn(local, (txn) => txn.updateProjectExtents(extended));\r\n });\r\n\r\n try {\r\n await local.pushChanges({ accessToken: user2, description: \"push after merge\" });\r\n } finally {\r\n removeListener();\r\n }\r\n\r\n const verifier = await HubWrappers.downloadAndOpenBriefcase({ accessToken: user3, iTwinId, iModelId, briefcaseId: BriefcaseIdValue.Unassigned });\r\n assert.isTrue(verifier.projectExtents.isAlmostEqual(expected), \"pushed extents should extend the merged extents, not the stale pre-merge extents\");\r\n\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user3, verifier);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user3, remote);\r\n await HubWrappers.closeAndDeleteBriefcaseDb(user2, local);\r\n });\r\n });\r\n });\r\n});\r\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BriefcaseManagerDelete.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BriefcaseManagerDelete.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/BriefcaseManagerDelete.test.ts"],"names":[],"mappings":""}
@@ -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,2 @@
1
+ import "../TestUtils";
2
+ //# sourceMappingURL=ChangeUnifier.test.d.ts.map
@@ -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"}