@itwin/core-backend 5.8.0-dev.9 → 5.8.1

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 (133) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/lib/cjs/IModelDb.d.ts.map +1 -1
  3. package/lib/cjs/IModelDb.js +0 -3
  4. package/lib/cjs/IModelDb.js.map +1 -1
  5. package/lib/cjs/IpcHost.d.ts.map +1 -1
  6. package/lib/cjs/IpcHost.js +28 -4
  7. package/lib/cjs/IpcHost.js.map +1 -1
  8. package/lib/cjs/LineStyle.d.ts +6 -0
  9. package/lib/cjs/LineStyle.d.ts.map +1 -1
  10. package/lib/cjs/LineStyle.js +41 -32
  11. package/lib/cjs/LineStyle.js.map +1 -1
  12. package/lib/cjs/LocalHub.d.ts +17 -10
  13. package/lib/cjs/LocalHub.d.ts.map +1 -1
  14. package/lib/cjs/LocalHub.js +126 -28
  15. package/lib/cjs/LocalHub.js.map +1 -1
  16. package/lib/cjs/core-backend.d.ts +2 -0
  17. package/lib/cjs/core-backend.d.ts.map +1 -1
  18. package/lib/cjs/core-backend.js +2 -0
  19. package/lib/cjs/core-backend.js.map +1 -1
  20. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
  21. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  22. package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
  23. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
  24. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  25. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  26. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  27. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  28. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
  29. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  30. package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
  31. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  32. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  33. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  34. package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
  35. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
  36. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
  37. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  38. package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
  39. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  40. package/lib/cjs/workspace/Settings.d.ts +8 -0
  41. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  42. package/lib/cjs/workspace/Settings.js.map +1 -1
  43. package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
  44. package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
  45. package/lib/cjs/workspace/SettingsDb.js +19 -0
  46. package/lib/cjs/workspace/SettingsDb.js.map +1 -0
  47. package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
  48. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
  49. package/lib/cjs/workspace/SettingsEditor.js +53 -0
  50. package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
  51. package/lib/cjs/workspace/Workspace.d.ts +42 -19
  52. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  53. package/lib/cjs/workspace/Workspace.js.map +1 -1
  54. package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
  55. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  56. package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
  57. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  58. package/lib/esm/IModelDb.d.ts.map +1 -1
  59. package/lib/esm/IModelDb.js +0 -3
  60. package/lib/esm/IModelDb.js.map +1 -1
  61. package/lib/esm/IpcHost.d.ts.map +1 -1
  62. package/lib/esm/IpcHost.js +28 -4
  63. package/lib/esm/IpcHost.js.map +1 -1
  64. package/lib/esm/LineStyle.d.ts +6 -0
  65. package/lib/esm/LineStyle.d.ts.map +1 -1
  66. package/lib/esm/LineStyle.js +41 -32
  67. package/lib/esm/LineStyle.js.map +1 -1
  68. package/lib/esm/LocalHub.d.ts +17 -10
  69. package/lib/esm/LocalHub.d.ts.map +1 -1
  70. package/lib/esm/LocalHub.js +127 -29
  71. package/lib/esm/LocalHub.js.map +1 -1
  72. package/lib/esm/core-backend.d.ts +2 -0
  73. package/lib/esm/core-backend.d.ts.map +1 -1
  74. package/lib/esm/core-backend.js +2 -0
  75. package/lib/esm/core-backend.js.map +1 -1
  76. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
  77. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  78. package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
  79. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
  80. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  81. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  82. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  83. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  84. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
  85. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  86. package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
  87. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  88. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  89. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  90. package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
  91. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
  92. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
  93. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  94. package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
  95. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  96. package/lib/esm/test/IpcHost.test.js +64 -13
  97. package/lib/esm/test/IpcHost.test.js.map +1 -1
  98. package/lib/esm/test/ecdb/QueryReaders.test.js +35 -0
  99. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  100. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  101. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
  102. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  103. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +8 -0
  104. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  105. package/lib/esm/test/standalone/HubMock.test.js +177 -7
  106. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  107. package/lib/esm/test/standalone/Settings.test.js +18 -0
  108. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  109. package/lib/esm/test/standalone/Workspace.test.js +160 -0
  110. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  111. package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
  112. package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
  113. package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
  114. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
  115. package/lib/esm/workspace/Settings.d.ts +8 -0
  116. package/lib/esm/workspace/Settings.d.ts.map +1 -1
  117. package/lib/esm/workspace/Settings.js.map +1 -1
  118. package/lib/esm/workspace/SettingsDb.d.ts +109 -0
  119. package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
  120. package/lib/esm/workspace/SettingsDb.js +16 -0
  121. package/lib/esm/workspace/SettingsDb.js.map +1 -0
  122. package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
  123. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
  124. package/lib/esm/workspace/SettingsEditor.js +50 -0
  125. package/lib/esm/workspace/SettingsEditor.js.map +1 -0
  126. package/lib/esm/workspace/Workspace.d.ts +42 -19
  127. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  128. package/lib/esm/workspace/Workspace.js.map +1 -1
  129. package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
  130. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  131. package/lib/esm/workspace/WorkspaceEditor.js +19 -0
  132. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  133. package/package.json +15 -15
@@ -1 +1 @@
1
- {"version":3,"file":"HubMock.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/HubMock.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, expect } from \"chai\";\r\nimport { join } from \"path\";\r\nimport { AccessToken, Guid, Mutable } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps, ChangesetType, LockState } from \"@itwin/core-common\";\r\nimport { LockProps } from \"../../BackendHubAccess\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { LockStatusExclusive, LockStatusShared } from \"../../LocalHub\";\r\nimport { ProgressFunction, ProgressStatus } from \"../../CheckpointManager\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\n\r\ndescribe(\"HubMock\", () => {\r\n const tmpDir = join(KnownTestLocations.outputDir, \"HubMockTest\");\r\n const iTwinId = Guid.createValue();\r\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const accessToken: AccessToken = \"fake token\";\r\n\r\n before(() => {\r\n HubMock.startup(\"HubMockTest\", KnownTestLocations.outputDir);\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n it(\"should be able to create HubMock\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n let checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 1);\r\n assert.equal(checkpoints[0], 0);\r\n\r\n const cp1 = join(tmpDir, \"cp-1.bim\");\r\n localHub.downloadCheckpoint({ changeset: { index: 0 }, targetFile: cp1 });\r\n const stat1 = IModelJsFs.lstatSync(cp1);\r\n const statRev0 = IModelJsFs.lstatSync(version0);\r\n assert.equal(stat1?.size, statRev0?.size);\r\n\r\n assert.equal(2, localHub.acquireNewBriefcaseId(\"user1\", \"user1 briefcase 1\"));\r\n assert.equal(3, localHub.acquireNewBriefcaseId(\"user2\", \"user2 briefcase 1\"));\r\n assert.equal(4, localHub.acquireNewBriefcaseId(\"user3\", \"user3 briefcase 1\"));\r\n\r\n let briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n // releasing a briefcaseId should mark it as unassigned\r\n localHub.releaseBriefcaseId(2);\r\n briefcases = localHub.getBriefcases(false);\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: false });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n localHub.releaseBriefcaseId(4);\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 1);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n\r\n assert.equal(5, localHub.acquireNewBriefcaseId(\"user4\"));\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 2);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 5, user: \"user4\", alias: \"user4 (5)\", assigned: true });\r\n\r\n let pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n let fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n // try pushing changesets\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user1\", pathname, size: fileSize,\r\n };\r\n cs1.index = localHub.addChangeset(cs1); // first changeset\r\n const changesets1 = localHub.queryChangesets();\r\n assert.equal(changesets1.length, 1);\r\n assert.equal(changesets1[0].id, cs1.id);\r\n assert.equal(changesets1[0].description, cs1.description);\r\n assert.equal(changesets1[0].changesType, cs1.changesType);\r\n assert.equal(changesets1[0].index, 1);\r\n assert.equal(changesets1[0].briefcaseId, 5);\r\n assert.isAtLeast(changesets1[0].size, 1);\r\n assert.equal(changesets1[0].parentId, \"\");\r\n assert.isDefined(changesets1[0].pushDate);\r\n assert.equal(cs1.id, localHub.getLatestChangeset().id);\r\n\r\n pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\");\r\n fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n size: fileSize,\r\n };\r\n cs2.index = localHub.addChangeset(cs2); // second changeset, parent = cs1\r\n const changesets2 = localHub.queryChangesets();\r\n assert.equal(changesets2.length, 2);\r\n assert.deepEqual(changesets1[0], changesets2[0]);\r\n assert.equal(changesets2[1].id, cs2.id);\r\n assert.equal(changesets2[1].parentId, cs2.parentId);\r\n assert.equal(changesets2[1].description, cs2.description);\r\n assert.equal(changesets2[1].changesType, cs2.changesType);\r\n assert.equal(changesets2[1].index, 2);\r\n assert.equal(changesets2[1].briefcaseId, 5);\r\n assert.isAtLeast(changesets2[1].size, 1);\r\n assert.isDefined(changesets2[1].pushDate);\r\n assert.equal(cs2.id, localHub.getLatestChangeset().id);\r\n\r\n localHub.uploadCheckpoint({ changesetIndex: cs2.index, localFile: version0 });\r\n checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 2);\r\n assert.equal(checkpoints[1], 2);\r\n\r\n // test named versions\r\n const version1 = \"release 1\";\r\n const version2 = \"release 2\";\r\n localHub.addNamedVersion({ versionName: version1, csIndex: cs1.index });\r\n localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index });\r\n assert.equal(localHub.findNamedVersion(version1).index, cs1.index);\r\n expect(() => localHub.findNamedVersion(\"not there\")).throws(\"not found\");\r\n expect(() => localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index })).throws(\"insert\");\r\n localHub.deleteNamedVersion(version1);\r\n expect(() => localHub.findNamedVersion(version1)).throws(\"not found\");\r\n\r\n // test for duplicate changeset id fails\r\n const cs3: ChangesetFileProps = {\r\n id: \"changeset0\", parentId: \"changeset1\",\r\n description: \"third changeset\", changesType: ChangesetType.Regular, pathname: cs1.pathname, briefcaseId: 500, userCreated: \"\", pushDate: \"\", index: 0,\r\n size: fileSize,\r\n };\r\n expect(() => localHub.addChangeset(cs3)).throws(\"no briefcase with that id\");\r\n cs3.briefcaseId = 5;\r\n expect(() => localHub.addChangeset(cs3)).throws(\"can't insert\");\r\n // now test for valid changeset id, but bad parentId\r\n const cs4 = { ...cs3, id: \"changeset4\", parentId: \"bad\", description: \"fourth changeset\" };\r\n expect(() => localHub.addChangeset(cs4)).throws(\"bad not found\");\r\n\r\n cs3.id = \"changeset3\";\r\n cs3.parentId = cs2.id;\r\n cs3.index = localHub.addChangeset(cs3);\r\n assert.equal(0, localHub.queryPreviousCheckpoint(0));\r\n assert.equal(0, localHub.queryPreviousCheckpoint(cs1.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs2.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs3.index));\r\n\r\n // downloading changesets\r\n const cSets = localHub.downloadChangesets({ range: { first: cs1.index, end: cs2.index }, targetDir: tmpDir });\r\n assert.equal(cSets.length, 2);\r\n assert.equal(cSets[0].id, cs1.id);\r\n assert.equal(cSets[0].changesType, cs1.changesType);\r\n assert.equal(cSets[0].userCreated, cs1.userCreated);\r\n assert.equal(cSets[0].parentId, cs1.parentId);\r\n assert.equal(cSets[0].description, cs1.description);\r\n\r\n assert.equal(cSets[1].id, cs2.id);\r\n assert.equal(cSets[1].changesType, cs2.changesType);\r\n assert.equal(cSets[1].userCreated, cs2.userCreated);\r\n assert.equal(cSets[1].parentId, cs2.parentId);\r\n assert.equal(cSets[1].description, cs2.description);\r\n\r\n const orig1 = IModelJsFs.readFileSync(cs1.pathname);\r\n const downloaded1 = IModelJsFs.readFileSync(cSets[0].pathname);\r\n assert.deepEqual(orig1, downloaded1);\r\n\r\n const orig2 = IModelJsFs.readFileSync(cs2.pathname);\r\n const downloaded2 = IModelJsFs.readFileSync(cSets[1].pathname);\r\n assert.deepEqual(orig2, downloaded2);\r\n assert.notDeepEqual(orig1, orig2);\r\n\r\n const latest = await BriefcaseManager.getLatestChangeset({ iModelId });\r\n expect(latest.index).to.equal(cs3.index);\r\n expect(latest.id).to.equal(cs3.id);\r\n expect(latest.parentId).to.equal(cs3.parentId);\r\n\r\n const cs1q = await BriefcaseManager.queryChangeset({ changeset: { index: cs1.index }, iModelId });\r\n expect(cs1q.description).to.equal(cs1.description);\r\n\r\n const changes = await BriefcaseManager.queryChangesets({ range: { first: cs1.index }, iModelId });\r\n expect(changes.length).to.equal(3);\r\n\r\n // test locks\r\n const lock1: Mutable<LockProps> = {\r\n state: LockState.Shared,\r\n id: \"0x12\",\r\n };\r\n // get a new briefcaseId for some locks\r\n assert.equal(6, localHub.acquireNewBriefcaseId(\"user5\", \"alias for 5\"));\r\n\r\n localHub.acquireLock(lock1, { briefcaseId: 3, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n let lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Shared);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n\r\n assert.isUndefined(lockStat.lastCsIndex);\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 2);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 2);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(5));\r\n\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Exclusive }, { briefcaseId: 6, changeset: { id: \"cs1\" } })).to.throw(\"shared lock is held\").include({ briefcaseId: 3, briefcaseAlias: \"user2 briefcase 1\" });\r\n expect(() => localHub.releaseLocks([lock1], { briefcaseId: 9, changesetIndex: cs1.index })).to.throw(\"shared lock not held\");\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 3, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 5, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n\r\n lock1.state = LockState.Exclusive;\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Shared }, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n localHub.releaseLocks([lock1], { briefcaseId: 6, changesetIndex: cs2.index });\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n assert.equal(lockStat.lastCsIndex, cs2.index);\r\n\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"pull is required\");\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.equal(lockStat.lastCsIndex, cs2.index);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x22\" }, { briefcaseId: 5, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.isUndefined(lockStat.lastCsIndex);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x23\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 5, changeset: cs1 });\r\n\r\n let locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 3);\r\n\r\n localHub.releaseBriefcaseId(5); // releasing a briefcaseId with held locks should release them\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 0);\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n\r\n localHub.releaseAllLocks({ briefcaseId: 6, changesetIndex: 3 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 4);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x23\");\r\n assert.equal(lockStat.lastCsIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x24\");\r\n assert.equal(lockStat.lastCsIndex, undefined);\r\n assert.equal(lockStat.state, 0);\r\n\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n it(\"HubMock report progress of changesets 'downloads'\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n const briefcaseId = await HubMock.acquireNewBriefcaseId({ iModelId });\r\n\r\n const pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n const fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user1\", pathname,\r\n };\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n };\r\n cs1.index = localHub.addChangeset(cs1);\r\n cs2.index = localHub.addChangeset(cs2);\r\n\r\n // Progress reporting of single changeset \"download\"\r\n let progressReports: { downloaded: number, total: number }[] = [];\r\n let progressCallback: ProgressFunction = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return ProgressStatus.Continue;\r\n };\r\n let cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n let previousReport = { downloaded: 0, total: 0 };\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, cProps.size);\r\n }\r\n\r\n // Progress reporting of multiple changesets \"download\"\r\n progressReports = [];\r\n let cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n previousReport = { downloaded: 0, total: 0 };\r\n const totalSize = cPropsSet.reduce((sum, props) => sum + (props.size ?? 0), 0);\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, totalSize);\r\n }\r\n\r\n // Cancel single changeset \"download\"\r\n progressReports = [];\r\n progressCallback = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return downloaded > total / 2 ? ProgressStatus.Abort : ProgressStatus.Continue;\r\n };\r\n let errorThrown: boolean = false;\r\n try {\r\n cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n let lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n\r\n // Cancel multiple changesets \"download\"\r\n progressReports = [];\r\n errorThrown = false;\r\n try {\r\n cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n });\r\n\r\n it(\"use HubMock with BriefcaseManager\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const briefcase = await BriefcaseManager.downloadBriefcase({ accessToken, iTwinId, iModelId });\r\n assert.equal(briefcase.briefcaseId, 2);\r\n assert.equal(briefcase.changeset.id, \"\");\r\n assert.equal(briefcase.iModelId, iModelId);\r\n assert.equal(briefcase.iTwinId, iTwinId);\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"HubMock.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/HubMock.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, expect } from \"chai\";\r\nimport { join } from \"path\";\r\nimport { AccessToken, Guid, GuidString, Mutable } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps, ChangesetType, LocalBriefcaseProps, LockState, RequestNewBriefcaseProps } from \"@itwin/core-common\";\r\nimport { LockProps } from \"../../BackendHubAccess\";\r\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { LockStatusExclusive, LockStatusShared } from \"../../LocalHub\";\r\nimport { ProgressFunction, ProgressStatus } from \"../../CheckpointManager\";\r\nimport { _hubAccess } from \"../../internal/Symbols\";\r\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\r\nimport { ChannelControl } from \"../../ChannelControl\";\r\nimport { PhysicalElement } from \"../../Element\";\r\n\r\ndescribe(\"HubMock\", () => {\r\n const tmpDir = join(KnownTestLocations.outputDir, \"HubMockTest\");\r\n const iTwinId = Guid.createValue();\r\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const accessToken: AccessToken = \"fake token\";\r\n\r\n before(() => {\r\n HubMock.startup(\"HubMockTest\", KnownTestLocations.outputDir);\r\n });\r\n after(() => {\r\n HubMock.shutdown();\r\n });\r\n\r\n it(\"should be able to create HubMock\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n let checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 1);\r\n assert.equal(checkpoints[0], 0);\r\n\r\n const cp1 = join(tmpDir, \"cp-1.bim\");\r\n localHub.downloadCheckpoint({ changeset: { index: 0 }, targetFile: cp1 });\r\n const stat1 = IModelJsFs.lstatSync(cp1);\r\n const statRev0 = IModelJsFs.lstatSync(version0);\r\n assert.equal(stat1?.size, statRev0?.size);\r\n\r\n assert.equal(2, localHub.acquireNewBriefcaseId(\"user1\", \"user1 briefcase 1\"));\r\n assert.equal(3, localHub.acquireNewBriefcaseId(\"user2\", \"user2 briefcase 1\"));\r\n assert.equal(4, localHub.acquireNewBriefcaseId(\"user3\", \"user3 briefcase 1\"));\r\n\r\n let briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n // releasing a briefcaseId should mark it as unassigned\r\n localHub.releaseBriefcaseId(2);\r\n briefcases = localHub.getBriefcases(false);\r\n assert.equal(briefcases.length, 3);\r\n assert.deepEqual(briefcases[0], { id: 2, user: \"user1\", alias: \"user1 briefcase 1\", assigned: false });\r\n assert.deepEqual(briefcases[1], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[2], { id: 4, user: \"user3\", alias: \"user3 briefcase 1\", assigned: true });\r\n\r\n localHub.releaseBriefcaseId(4);\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 1);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n\r\n assert.equal(5, localHub.acquireNewBriefcaseId(\"user4\"));\r\n briefcases = localHub.getBriefcases();\r\n assert.equal(briefcases.length, 2);\r\n assert.deepEqual(briefcases[0], { id: 3, user: \"user2\", alias: \"user2 briefcase 1\", assigned: true });\r\n assert.deepEqual(briefcases[1], { id: 5, user: \"user4\", alias: \"user4 (5)\", assigned: true });\r\n\r\n let pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n let fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n // try pushing changesets\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user1\", pathname, size: fileSize,\r\n };\r\n cs1.index = localHub.addChangeset(cs1); // first changeset\r\n const changesets1 = localHub.queryChangesets();\r\n assert.equal(changesets1.length, 1);\r\n assert.equal(changesets1[0].id, cs1.id);\r\n assert.equal(changesets1[0].description, cs1.description);\r\n assert.equal(changesets1[0].changesType, cs1.changesType);\r\n assert.equal(changesets1[0].index, 1);\r\n assert.equal(changesets1[0].briefcaseId, 5);\r\n assert.isAtLeast(changesets1[0].size, 1);\r\n assert.equal(changesets1[0].parentId, \"\");\r\n assert.isDefined(changesets1[0].pushDate);\r\n assert.equal(cs1.id, localHub.getLatestChangeset().id);\r\n\r\n pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\");\r\n fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId: 5, pushDate: \"\", index: 0,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n size: fileSize,\r\n };\r\n cs2.index = localHub.addChangeset(cs2); // second changeset, parent = cs1\r\n const changesets2 = localHub.queryChangesets();\r\n assert.equal(changesets2.length, 2);\r\n assert.deepEqual(changesets1[0], changesets2[0]);\r\n assert.equal(changesets2[1].id, cs2.id);\r\n assert.equal(changesets2[1].parentId, cs2.parentId);\r\n assert.equal(changesets2[1].description, cs2.description);\r\n assert.equal(changesets2[1].changesType, cs2.changesType);\r\n assert.equal(changesets2[1].index, 2);\r\n assert.equal(changesets2[1].briefcaseId, 5);\r\n assert.isAtLeast(changesets2[1].size, 1);\r\n assert.isDefined(changesets2[1].pushDate);\r\n assert.equal(cs2.id, localHub.getLatestChangeset().id);\r\n\r\n localHub.uploadCheckpoint({ changesetIndex: cs2.index, localFile: version0 });\r\n checkpoints = localHub.getCheckpoints();\r\n assert.equal(checkpoints.length, 2);\r\n assert.equal(checkpoints[1], 2);\r\n\r\n // test named versions\r\n const version1 = \"release 1\";\r\n const version2 = \"release 2\";\r\n localHub.addNamedVersion({ versionName: version1, csIndex: cs1.index });\r\n localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index });\r\n assert.equal(localHub.findNamedVersion(version1).index, cs1.index);\r\n expect(() => localHub.findNamedVersion(\"not there\")).throws(\"not found\");\r\n expect(() => localHub.addNamedVersion({ versionName: version2, csIndex: cs2.index })).throws(\"insert\");\r\n localHub.deleteNamedVersion(version1);\r\n expect(() => localHub.findNamedVersion(version1)).throws(\"not found\");\r\n\r\n // test for duplicate changeset id fails\r\n const cs3: ChangesetFileProps = {\r\n id: \"changeset0\", parentId: \"changeset1\",\r\n description: \"third changeset\", changesType: ChangesetType.Regular, pathname: cs1.pathname, briefcaseId: 500, userCreated: \"\", pushDate: \"\", index: 0,\r\n size: fileSize,\r\n };\r\n expect(() => localHub.addChangeset(cs3)).throws(\"no briefcase with that id\");\r\n cs3.briefcaseId = 5;\r\n expect(() => localHub.addChangeset(cs3)).throws(\"can't insert\");\r\n // now test for valid changeset id, but bad parentId\r\n const cs4 = { ...cs3, id: \"changeset4\", parentId: \"bad\", description: \"fourth changeset\" };\r\n expect(() => localHub.addChangeset(cs4)).throws(\"bad not found\");\r\n\r\n cs3.id = \"changeset3\";\r\n cs3.parentId = cs2.id;\r\n cs3.index = localHub.addChangeset(cs3);\r\n assert.equal(0, localHub.queryPreviousCheckpoint(0));\r\n assert.equal(0, localHub.queryPreviousCheckpoint(cs1.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs2.index));\r\n assert.equal(cs2.index, localHub.queryPreviousCheckpoint(cs3.index));\r\n\r\n // downloading changesets\r\n const cSets = localHub.downloadChangesets({ range: { first: cs1.index, end: cs2.index }, targetDir: tmpDir });\r\n assert.equal(cSets.length, 2);\r\n assert.equal(cSets[0].id, cs1.id);\r\n assert.equal(cSets[0].changesType, cs1.changesType);\r\n assert.equal(cSets[0].userCreated, cs1.userCreated);\r\n assert.equal(cSets[0].parentId, cs1.parentId);\r\n assert.equal(cSets[0].description, cs1.description);\r\n\r\n assert.equal(cSets[1].id, cs2.id);\r\n assert.equal(cSets[1].changesType, cs2.changesType);\r\n assert.equal(cSets[1].userCreated, cs2.userCreated);\r\n assert.equal(cSets[1].parentId, cs2.parentId);\r\n assert.equal(cSets[1].description, cs2.description);\r\n\r\n const orig1 = IModelJsFs.readFileSync(cs1.pathname);\r\n const downloaded1 = IModelJsFs.readFileSync(cSets[0].pathname);\r\n assert.deepEqual(orig1, downloaded1);\r\n\r\n const orig2 = IModelJsFs.readFileSync(cs2.pathname);\r\n const downloaded2 = IModelJsFs.readFileSync(cSets[1].pathname);\r\n assert.deepEqual(orig2, downloaded2);\r\n assert.notDeepEqual(orig1, orig2);\r\n\r\n const latest = await BriefcaseManager.getLatestChangeset({ iModelId });\r\n expect(latest.index).to.equal(cs3.index);\r\n expect(latest.id).to.equal(cs3.id);\r\n expect(latest.parentId).to.equal(cs3.parentId);\r\n\r\n const cs1q = await BriefcaseManager.queryChangeset({ changeset: { index: cs1.index }, iModelId });\r\n expect(cs1q.description).to.equal(cs1.description);\r\n\r\n const changes = await BriefcaseManager.queryChangesets({ range: { first: cs1.index }, iModelId });\r\n expect(changes.length).to.equal(3);\r\n\r\n // test locks\r\n const lock1: Mutable<LockProps> = {\r\n state: LockState.Shared,\r\n id: \"0x12\",\r\n };\r\n // get a new briefcaseId for some locks\r\n assert.equal(6, localHub.acquireNewBriefcaseId(\"user5\", \"alias for 5\"));\r\n\r\n localHub.acquireLock(lock1, { briefcaseId: 3, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n let lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Shared);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n\r\n assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);\r\n assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 2);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 2);\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(3));\r\n assert.isTrue((lockStat as LockStatusShared).sharedBy.has(5));\r\n\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Exclusive }, { briefcaseId: 6, changeset: { id: \"cs1\" } })).to.throw(\"shared lock is held\").include({ briefcaseId: 3, briefcaseAlias: \"user2 briefcase 1\" });\r\n expect(() => localHub.releaseLocks([lock1], { briefcaseId: 9, changesetIndex: cs1.index })).to.throw(\"shared lock not held\");\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 3, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n assert.equal(localHub.countLocks(), 1);\r\n\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal((lockStat as LockStatusShared).sharedBy.size, 1);\r\n\r\n localHub.releaseLocks([lock1], { briefcaseId: 5, changesetIndex: cs1.index });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n\r\n lock1.state = LockState.Exclusive;\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n localHub.acquireLock(lock1, { briefcaseId: 6, changeset: cs1 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 1);\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n expect(() => localHub.acquireLock({ ...lock1, state: LockState.Shared }, { briefcaseId: 5, changeset: cs1 })).to.throw(\"exclusive lock is already held\").include({ briefcaseId: 6, briefcaseAlias: \"alias for 5\" });\r\n localHub.releaseLocks([lock1], { briefcaseId: 6, changesetIndex: cs2.index });\r\n assert.equal(localHub.countLocks(), 1);\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.None);\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);\r\n\r\n expect(() => localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs1 })).to.throw(\"pull is required\");\r\n localHub.acquireLock(lock1, { briefcaseId: 5, changeset: cs2 });\r\n lockStat = localHub.queryLockStatus(lock1.id);\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, cs2.index);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x22\" }, { briefcaseId: 5, changeset: cs1 });\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n assert.equal(lockStat.state, LockState.Exclusive);\r\n assert.equal((lockStat as LockStatusExclusive).briefcaseId, 5);\r\n assert.isUndefined(lockStat.lastExclusiveReleaseChangesetIndex);\r\n assert.isUndefined(lockStat.lastSharedReleaseChangesetIndex);\r\n\r\n localHub.acquireLock({ state: LockState.Exclusive, id: \"0x23\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 6, changeset: cs1 });\r\n localHub.acquireLock({ state: LockState.Shared, id: \"0x24\" }, { briefcaseId: 5, changeset: cs1 });\r\n\r\n let locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 3);\r\n\r\n localHub.releaseBriefcaseId(5); // releasing a briefcaseId with held locks should release them\r\n lockStat = localHub.queryLockStatus(\"0x22\");\r\n locks = localHub.queryAllLocks(5);\r\n assert.equal(locks.length, 0);\r\n assert.equal(localHub.countSharedLocks(), 1);\r\n\r\n localHub.releaseAllLocks({ briefcaseId: 6, changesetIndex: 3 });\r\n assert.equal(localHub.countSharedLocks(), 0);\r\n assert.equal(localHub.countLocks(), 4);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x23\");\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n lockStat = localHub.queryLockStatus(\"0x24\");\r\n assert.equal(lockStat.lastExclusiveReleaseChangesetIndex, undefined);\r\n assert.equal(lockStat.lastSharedReleaseChangesetIndex, 3);\r\n assert.equal(lockStat.state, 0);\r\n\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n it(\"HubMock report progress of changesets 'downloads'\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const localHub = HubMock.findLocalHub(iModelId);\r\n const briefcaseId = await HubMock.acquireNewBriefcaseId({ iModelId });\r\n\r\n const pathname = IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.00.ecschema.xml\");\r\n const fileSize = IModelJsFs.lstatSync(pathname)!.size;\r\n\r\n const cs1: ChangesetFileProps = {\r\n id: \"changeset0\", description: \"first changeset\", changesType: ChangesetType.Regular, parentId: \"\", briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user1\", pathname,\r\n };\r\n const cs2: ChangesetFileProps = {\r\n id: \"changeset1\", parentId: cs1.id, description: \"second changeset\", changesType: ChangesetType.Schema, briefcaseId, pushDate: \"\", index: 0,\r\n size: fileSize,\r\n userCreated: \"user2\", pathname: IModelTestUtils.resolveAssetFile(\"CloneTest.01.00.01.ecschema.xml\"),\r\n };\r\n cs1.index = localHub.addChangeset(cs1);\r\n cs2.index = localHub.addChangeset(cs2);\r\n\r\n // Progress reporting of single changeset \"download\"\r\n let progressReports: { downloaded: number, total: number }[] = [];\r\n let progressCallback: ProgressFunction = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return ProgressStatus.Continue;\r\n };\r\n let cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n let previousReport = { downloaded: 0, total: 0 };\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, cProps.size);\r\n }\r\n\r\n // Progress reporting of multiple changesets \"download\"\r\n progressReports = [];\r\n let cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n previousReport = { downloaded: 0, total: 0 };\r\n const totalSize = cPropsSet.reduce((sum, props) => sum + (props.size ?? 0), 0);\r\n for (const report of progressReports) {\r\n assert.isTrue(report.downloaded > previousReport.downloaded);\r\n assert.equal(report.total, totalSize);\r\n }\r\n\r\n // Cancel single changeset \"download\"\r\n progressReports = [];\r\n progressCallback = (downloaded, total) => {\r\n progressReports.push({ downloaded, total });\r\n return downloaded > total / 2 ? ProgressStatus.Abort : ProgressStatus.Continue;\r\n };\r\n let errorThrown: boolean = false;\r\n try {\r\n cProps = await HubMock.downloadChangeset({\r\n iModelId,\r\n changeset: {\r\n index: cs1.index,\r\n },\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n let lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n\r\n // Cancel multiple changesets \"download\"\r\n progressReports = [];\r\n errorThrown = false;\r\n try {\r\n cPropsSet = await HubMock.downloadChangesets({\r\n iModelId,\r\n targetDir: tmpDir,\r\n progressCallback,\r\n });\r\n } catch {\r\n errorThrown = true;\r\n }\r\n assert.isTrue(errorThrown);\r\n lastReport = progressReports[progressReports.length - 1];\r\n assert.isBelow(lastReport.downloaded, lastReport.total);\r\n });\r\n\r\n it(\"use HubMock with BriefcaseManager\", async () => {\r\n const iModelId = await IModelHost[_hubAccess].createNewIModel({ iTwinId, iModelName: \"test imodel\", version0 });\r\n const briefcase = await BriefcaseManager.downloadBriefcase({ accessToken, iTwinId, iModelId });\r\n assert.equal(briefcase.briefcaseId, 2);\r\n assert.equal(briefcase.changeset.id, \"\");\r\n assert.equal(briefcase.iModelId, iModelId);\r\n assert.equal(briefcase.iTwinId, iTwinId);\r\n await IModelHost[_hubAccess].deleteIModel({ iTwinId, iModelId });\r\n });\r\n\r\n describe(\"locking behavior\", () => {\r\n const createVersion0 = async () => {\r\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\r\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\r\n assert.isFalse(sourceDb.locks.isServerBased);\r\n await ExtensiveTestScenario.prepareDb(sourceDb);\r\n await ExtensiveTestScenario.populateDb(sourceDb);\r\n sourceDb.saveChanges();\r\n sourceDb.close();\r\n return dbName;\r\n };\r\n\r\n const accessToken1: AccessToken = \"user1\";\r\n const accessToken2: AccessToken = \"user2\";\r\n let iModelId: GuidString;\r\n let briefcase1Props: LocalBriefcaseProps;\r\n let briefcase2Props: LocalBriefcaseProps;\r\n\r\n //afterEach(() => sinonRestore());\r\n before(async () => {\r\n const iModelProps = {\r\n iModelName: \"HubMock locks test\",\r\n iTwinId: HubMock.iTwinId,\r\n version0: await createVersion0(),\r\n };\r\n\r\n iModelId = await HubMock.createNewIModel(iModelProps);\r\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\r\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken1, ...args });\r\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: accessToken2, ...args });\r\n });\r\n\r\n let bc1: BriefcaseDb;\r\n let bc2: BriefcaseDb | undefined;\r\n\r\n beforeEach(async () => {\r\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\r\n expect(bc1.locks.isServerBased).to.be.true;\r\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc1.pullChanges();\r\n });\r\n\r\n afterEach(async () => {\r\n await bc1.discardChanges();\r\n bc1.close();\r\n\r\n if (bc2 !== undefined) {\r\n await bc2.discardChanges();\r\n bc2.close();\r\n bc2 = undefined;\r\n }\r\n });\r\n\r\n it(\"a pushed change to an element prevents acquiring an exclusive lock on the same element without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: childId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock because bc1 still holds it.\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire it yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: childId });\r\n });\r\n\r\n it(\"parent lock prevents acquiring a child lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const parentId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: parentId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the child because bc1 holds a lock on the parent.\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the child lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: childId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the child lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: childId });\r\n });\r\n\r\n it(\"model lock prevents acquiring a child lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const elementId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const modelId = bc1.elements.getElementProps(elementId).model;\r\n\r\n await bc1.locks.acquireLocks({ exclusive: modelId });\r\n const element = bc1.elements.getElement<PhysicalElement>(elementId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the sub-model because bc1 holds a lock on the model.\r\n await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith(\"exclusive lock is already held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the sub-model lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: elementId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the sub-model lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: elementId });\r\n });\r\n\r\n it(\"a pushed change to sibling element should not prevent acquiring an exclusive lock\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const child1Id = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\r\n const child2Id = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: child1Id });\r\n const element = bc1.elements.getElement<PhysicalElement>(child1Id);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // Pushing bc1's changes will release the lock.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n\r\n // bc2 should be able to acquire an exclusive lock on a sibling element without pulling.\r\n await bc2.locks.acquireLocks({ exclusive: child2Id });\r\n });\r\n\r\n it(\"edited child prevents acquiring parent lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n const parentId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const childId = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\r\n\r\n await bc1.locks.acquireLocks({ exclusive: childId });\r\n const element = bc1.elements.getElement<PhysicalElement>(childId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the parent because bc1 holds a lock on the child.\r\n await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith(\"shared lock is held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the parent lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: parentId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the parent lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: parentId });\r\n });\r\n\r\n it(\"edited sub-model prevents acquiring model lock without pulling first\", async () => {\r\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\r\n expect(bc2.locks.isServerBased).to.be.true;\r\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n await bc2.pullChanges();\r\n\r\n const elementId = IModelTestUtils.queryByUserLabel(bc1, \"PhysicalObject1\");\r\n const modelId = bc1.elements.getElementProps(elementId).model;\r\n\r\n await bc1.locks.acquireLocks({ exclusive: elementId });\r\n const element = bc1.elements.getElement<PhysicalElement>(elementId);\r\n element.setUserProperties(\"foo\", Guid.createValue());\r\n element.update();\r\n bc1.saveChanges();\r\n\r\n // bc2 should not be able to acquire an exclusive lock on the model because bc1 holds a lock on the sub-model.\r\n await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith(\"shared lock is held\");\r\n\r\n // Pushing bc1's changes will release the lock, but bc2 still won't be able to acquire the model lock yet.\r\n await bc1.pushChanges({ accessToken: accessToken1, description: \"test change\" });\r\n await expect(bc2.locks.acquireLocks({ exclusive: modelId })).to.be.rejectedWith(\"pull is required to obtain lock\");\r\n\r\n // Once bc2 pulls, it can successfully acquire the model lock.\r\n await bc2.pullChanges({ accessToken: accessToken2 });\r\n await bc2.locks.acquireLocks({ exclusive: modelId });\r\n });\r\n });\r\n});\r\n"]}
@@ -345,5 +345,23 @@ describe("Settings", () => {
345
345
  expect(IModelHost.appWorkspace.settings.getArray("points/array")).to.deep.equal([{ x: 1, y: 1 }, { x: 1, y: 2 }, { x: 2, y: 1 }, { x: 3, y: 3 }]);
346
346
  });
347
347
  });
348
+ it("toJSON on in-memory SettingsDictionary", () => {
349
+ const settings = IModelHost.appWorkspace.settings;
350
+ settings.addDictionary({ name: "toJsonTest", priority: SettingsPriority.defaults }, {
351
+ "test/string": "hello",
352
+ "test/number": 42,
353
+ "test/nested": { a: [1, 2, 3] },
354
+ });
355
+ const dict = settings.getDictionary({ name: "toJsonTest" });
356
+ expect(dict).to.not.be.undefined;
357
+ const json = dict.toJSON();
358
+ expect(json["test/string"]).to.equal("hello");
359
+ expect(json["test/number"]).to.equal(42);
360
+ expect(json["test/nested"]).to.deep.equal({ a: [1, 2, 3] });
361
+ // Mutating the clone should not affect the dictionary
362
+ json["test/string"] = "modified";
363
+ expect(dict.getSetting("test/string")).to.equal("hello");
364
+ settings.dropDictionary({ name: "toJsonTest" });
365
+ });
348
366
  });
349
367
  //# sourceMappingURL=Settings.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Settings.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Settings.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 { assert, Mutable, OpenMode } from \"@itwin/core-bentley\";\r\nimport { SnapshotDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { Setting, SettingsContainer, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { SettingGroupSchema, SettingSchema } from \"../../workspace/SettingsSchemas\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { GcsDbProps, GeoCoordConfig } from \"../../GeoCoordConfig\";\r\n\r\ndescribe(\"Settings\", () => {\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n IModelHost.settingsSchemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"SettingsTest\", \"SettingsTest.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n iModel.close();\r\n });\r\n\r\n const app1: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix: \"app1\",\r\n settingDefs: {\r\n sub1: {\r\n type: \"string\",\r\n enum: [\"va1\", \"alt1\"],\r\n enumDescriptions: [\r\n \"descr1\",\r\n \"descr2\",\r\n ],\r\n default: \"val1\",\r\n description: \"the first value\",\r\n },\r\n sub2: {\r\n type: \"array\",\r\n description: \"an array\",\r\n items: {\r\n type: \"string\",\r\n },\r\n },\r\n boolVal: {\r\n type: \"boolean\",\r\n default: true,\r\n description: \"boolean defaults to true\",\r\n },\r\n strVal: {\r\n type: \"string\",\r\n default: \"default string val\",\r\n },\r\n intVal: {\r\n type: \"integer\",\r\n default: 22,\r\n },\r\n obj: {\r\n type: \"object\",\r\n properties: {\r\n out: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\", \"m2\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n\r\n },\r\n databases: {\r\n type: \"array\",\r\n items: {\r\n type: \"object\",\r\n required: [\"name\", \"dbName\", \"containerName\"],\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n },\r\n dbName: {\r\n type: \"string\",\r\n },\r\n containerName: {\r\n type: \"string\",\r\n },\r\n b2: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n const app1Settings = {\r\n \"app1/sub1\": \"app1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"app1\", \"app2\"],\r\n },\r\n \"app1/setting2\": 1002,\r\n \"app1/setting3\": \"app setting 3 val\",\r\n \"app1/setting5\": \"app setting 5 val\",\r\n };\r\n\r\n const imodel1Settings = {\r\n \"app1/sub1\": \"imodel1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a1\", \"a2\"],\r\n },\r\n \"app1/setting2\": 2,\r\n \"app1/setting3\": \"setting 3 val\",\r\n };\r\n\r\n const imodel2Settings = {\r\n \"app1/sub1\": \"imodel2 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a21\", \"a22\"],\r\n },\r\n };\r\n\r\n const iTwinSettings = {\r\n \"app1/sub1\": \"val3\",\r\n \"app1/sub2\": {\r\n arr: [\"a31\", \"a32\", \"a33\"],\r\n },\r\n \"app2/setting6\": \"val 6\",\r\n \"app3/obj\": {\r\n member1: \"test2\",\r\n member2: \"test3\",\r\n member3: {\r\n part1: \"p1\",\r\n part2: [\r\n { m1: 0 },\r\n { m1: 2 },\r\n ],\r\n },\r\n },\r\n };\r\n\r\n it(\"settings priorities\", () => {\r\n const settings = iModel.workspace.settings;\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n IModelHost.appWorkspace.settings.addDictionary({ name: \"app1\", priority: SettingsPriority.application }, app1Settings);\r\n\r\n let settingsChanged = 0;\r\n settings.onSettingsChanged.addListener(() => settingsChanged++);\r\n\r\n settings.addDictionary({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel }, imodel1Settings);\r\n expect(settingsChanged).eq(1);\r\n settings.addDictionary({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel }, imodel2Settings);\r\n expect(settingsChanged).eq(2);\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settingsChanged).eq(3);\r\n\r\n expect(() => IModelHost.appWorkspace.settings.addDictionary({ name: \"iModel\", priority: SettingsPriority.iModel }, imodel1Settings)).to.throw(\"Use IModelSettings\");\r\n\r\n expect(settings.getString(\"app1/sub1\")).equals(imodel2Settings[\"app1/sub1\"]);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settings.getString(\"app1/setting5\")).equals(app1Settings[\"app1/setting5\"]); // comes from app settings\r\n expect(settings.getSetting<any>(\"app1/sub2\").arr).deep.equals(imodel2Settings[\"app1/sub2\"].arr);\r\n\r\n const app3obj = settings.getSetting<any>(\"app3/obj\");\r\n expect(app3obj).deep.equals(iTwinSettings[\"app3/obj\"]);\r\n app3obj.member3.part2[0].m1 = \"bad\"; // should modify a copy\r\n expect(iTwinSettings[\"app3/obj\"].member3.part2[0].m1).equal(0);\r\n\r\n expect(settings.getObject(\"app3/obj\")).deep.equals(iTwinSettings[\"app3/obj\"]); // should be original value\r\n expect(settings.getBoolean(\"app1/boolVal\")).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", true)).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", false)).equals(false);\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n expect(settings.getNumber(\"app1/intVal\")).equals(22);\r\n expect(() => settings.getObject(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getArray(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getString(\"app1/intVal\", \"oops\")).throws(\"app1/intVal\");\r\n expect(() => settings.getBoolean(\"app1/intVal\", true)).throws(\"app1/intVal\");\r\n expect(settings.getNumber(\"app1/not there\", 33)).equals(33);\r\n expect(settings.getSetting(\"app1/not there\")).is.undefined;\r\n expect(settings.getString(\"app2/not there\", \"fallback\")).equals(\"fallback\");\r\n\r\n // list of default Gcs databases is in the backend.setting.json5 file loaded on startup\r\n const defaultGcs = settings.getArray<GcsDbProps>(GeoCoordConfig.settingName.defaultDatabases);\r\n assert(undefined !== defaultGcs);\r\n expect(defaultGcs.length).equals(2);\r\n expect(defaultGcs[0].baseUri).equal(\"https://geocoord-workspace.itwinjs.org\");\r\n expect(defaultGcs[1].baseUri).equal(defaultGcs[1].baseUri);\r\n expect(defaultGcs[0].dbName).equal(\"base\");\r\n expect(defaultGcs[1].dbName).equal(\"allEarth\");\r\n expect(defaultGcs[0].priority).equals(10000);\r\n expect(defaultGcs[1].priority).equals(100);\r\n expect(defaultGcs[0].prefetch).true;\r\n expect(defaultGcs[1].prefetch).undefined;\r\n expect(defaultGcs[1].storageType).equals(\"azure\");\r\n\r\n iTwinSettings[\"app2/setting6\"] = \"new value for 6\";\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settingsChanged).eq(4);\r\n\r\n (app1.settingDefs!.strVal as Mutable<SettingSchema>).default = \"new default\";\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n\r\n // after re-registering, the new default should be updated\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n\r\n expect(settings.dictionaries.length).eq(3);\r\n\r\n const inspect = Array.from(settings.getSettingEntries(\"app1/sub1\"));\r\n expect(inspect.length).equals(5);\r\n expect(inspect[0].dictionary.props).to.deep.equal({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[0].value).equal(\"imodel2 value\");\r\n expect(inspect[1].dictionary.props).to.deep.equal({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[1].value).equal(\"imodel1 value\");\r\n expect(inspect[2].dictionary.props).to.deep.equal({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin });\r\n expect(inspect[2].value).equal(\"val3\");\r\n expect(inspect[3].dictionary.props).to.deep.equal({ name: \"app1\", priority: SettingsPriority.application });\r\n expect(inspect[3].value).equal(\"app1 value\");\r\n expect(inspect[4].dictionary.props).to.deep.equal({ name: \"_default_\", priority: 0 });\r\n expect(inspect[4].value).equal(\"val1\");\r\n\r\n settings.dropDictionary({ name: \"iTwin.setting.json\" });\r\n expect(settingsChanged).eq(5);\r\n expect(settings.getString(\"app2/setting6\")).is.undefined;\r\n\r\n // test validation of values vs. setting schemas\r\n const workspace: any = { dbName: \"abc\", containerId: \"123\", baseUri: \"aab.com\" };\r\n const fontListVal: any = [{ workspace, fontName: \"arial\" }, { workspace, fontName: \"helvetica\", fontType: 3 }];\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"required value for \\\"workspaceLimit\\\" is missing\");\r\n workspace.workspaceLimit = 4; // add missing value\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"value for testApp/fontList[1].fontType\");\r\n fontListVal[1].fontType = \"ttf\"; // correct font type to string\r\n expect(IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).equal(fontListVal); // should now pass\r\n });\r\n\r\n it(\"read settings file\", () => {\r\n const appSettings = IModelHost.appWorkspace.settings;\r\n const iModelSettings = iModel.workspace.settings;\r\n const settingFileName = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n expect(() => appSettings.addFile(settingFileName, SettingsPriority.iTwin)).throws(\"Use IModelSettings\");\r\n appSettings.addFile(settingFileName, SettingsPriority.application);\r\n expect(() => iModelSettings.addFile(settingFileName, SettingsPriority.application)).to.throw(\"Use IModelHost.appSettings\");\r\n expect(appSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n expect(iModelSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n const token = appSettings.getSetting<any>(\"editor/tokenColorCustomizations\")!;\r\n expect(token[\"Visual Studio Light\"].textMateRules[0].settings.foreground).equals(\"#d16c6c\");\r\n expect(token[\"Default High Contrast\"].comments).equals(\"#FF0000\");\r\n expect(appSettings.getArray<string>(\"editor/enableFiletypes\")!.length).equals(17);\r\n appSettings.dropDictionary({ name: settingFileName });\r\n });\r\n\r\n it(\"IModel persistent settings \", () => {\r\n const iModelName = IModelTestUtils.prepareOutputFile(\"IModelSetting\", \"test.bim\");\r\n const iModel2 = IModelTestUtils.createSnapshotFromSeed(iModelName, IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n\r\n const setting1: SettingsContainer = {\r\n \"imodel/setting1\": \"this is from setting1\",\r\n };\r\n const setting1changed: SettingsContainer = {\r\n \"imodel/setting1\": \"this is changed setting1\",\r\n };\r\n const gcsDbDict: SettingsContainer = {\r\n \"gcs/databases\": [\"gcs/Usa\", \"gcs/Canada\"],\r\n };\r\n iModel2.saveSettingDictionary(\"gcs-dbs\", gcsDbDict);\r\n iModel2.saveSettingDictionary(\"test1\", setting1);\r\n iModel2.close();\r\n\r\n let iModel3 = StandaloneDb.openFile(iModelName, OpenMode.ReadWrite);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1[\"imodel/setting1\"]);\r\n\r\n iModel3.saveSettingDictionary(\"test1\", setting1changed);\r\n iModel3.close();\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1changed[\"imodel/setting1\"]);\r\n iModel3.deleteSettingDictionary(\"test1\");\r\n iModel3.close();\r\n\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).to.be.undefined;\r\n iModel3.close();\r\n });\r\n\r\n describe(\"combineArray\", () => {\r\n function addGroup(schemaPrefix: string, type: \"number\" | \"object\", combineArray: boolean | undefined): void {\r\n const group: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix,\r\n settingDefs: {\r\n array: {\r\n type: \"array\",\r\n items: { type },\r\n combineArray,\r\n },\r\n },\r\n };\r\n\r\n IModelHost.settingsSchemas.addGroup(group);\r\n }\r\n\r\n function addArray(schemaPrefix: string, name: string, value: Setting[], priority: SettingsPriority | number): void {\r\n const settings: SettingsContainer = { };\r\n settings[`${schemaPrefix}/array`] = value;\r\n\r\n IModelHost.appWorkspace.settings.addDictionary({\r\n name,\r\n priority,\r\n }, settings);\r\n }\r\n\r\n it(\"combines arrays only if the combineArray flag is explicitly set to true\", () => {\r\n addGroup(\"false\", \"number\", false);\r\n addGroup(\"true\", \"number\", true);\r\n addGroup(\"default\", \"number\", undefined);\r\n\r\n let dictNum = 0;\r\n const prefixes = [\"false\", \"true\", \"default\"];\r\n for (const schemaPrefix of prefixes) {\r\n addArray(schemaPrefix, `app${dictNum++}`, [1, 2], SettingsPriority.application);\r\n addArray(schemaPrefix, `def${dictNum++}`, [3, 4], SettingsPriority.defaults);\r\n }\r\n\r\n for (const prefix of prefixes) {\r\n const settingName = `${prefix}/array`;\r\n expect(IModelHost.appWorkspace.settings.getSetting<number[]>(settingName)).to.deep.equal([1, 2]);\r\n\r\n const expected = (\"true\" === prefix ? [1, 2, 3, 4] : [1, 2]);\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(settingName)).to.deep.equal(expected);\r\n }\r\n });\r\n\r\n it(\"orders elements by priority\", () => {\r\n addGroup(\"combine\", \"number\", true);\r\n function addDictionary(priority: number) {\r\n addArray(\"combine\", priority.toString(), [priority], priority);\r\n }\r\n\r\n addDictionary(100);\r\n addDictionary(120);\r\n addDictionary(80);\r\n addDictionary(150);\r\n addDictionary(30);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"combine/array\")).to.deep.equal([150, 120, 100, 80, 30]);\r\n });\r\n\r\n it(\"ignores duplicates with lower priority\", () => {\r\n addGroup(\"numbers\", \"number\", true);\r\n\r\n addArray(\"numbers\", \"a\", [4, 8], 101);\r\n addArray(\"numbers\", \"c\", [3, 6, 9, 12], 99);\r\n addArray(\"numbers\", \"b\", [2, 4, 6, 8, 10, 12], 100);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"numbers/array\")).to.deep.equal([4, 8, 2, 6, 10, 12, 3, 9]);\r\n\r\n interface Point { x: number, y: number };\r\n addGroup(\"points\", \"object\", true);\r\n\r\n addArray(\"points\", \"a\", [{ x: 1, y: 1 }, { x: 1, y: 2 }], 101);\r\n addArray(\"points\", \"b\", [{ x: 2, y: 1 }, { x: 1, y: 2 }], 100);\r\n addArray(\"points\", \"c\", [{ y: 1, x: 1 }, { y: 2, x: 1 }, { x: 3, y: 3 }], 99);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<Point>(\"points/array\")).to.deep.equal([{ x: 1, y: 1 }, { x: 1, y: 2 }, { x: 2, y: 1 }, { x: 3, y: 3 }]);\r\n });\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"Settings.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/Settings.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 { assert, Mutable, OpenMode } from \"@itwin/core-bentley\";\r\nimport { SnapshotDb, StandaloneDb } from \"../../IModelDb\";\r\nimport { IModelHost } from \"../../IModelHost\";\r\nimport { Setting, SettingsContainer, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { SettingGroupSchema, SettingSchema } from \"../../workspace/SettingsSchemas\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { GcsDbProps, GeoCoordConfig } from \"../../GeoCoordConfig\";\r\n\r\ndescribe(\"Settings\", () => {\r\n let iModel: SnapshotDb;\r\n\r\n before(() => {\r\n IModelHost.settingsSchemas.addFile(IModelTestUtils.resolveAssetFile(\"TestSettings.schema.json\"));\r\n const seedFileName = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\r\n const testFileName = IModelTestUtils.prepareOutputFile(\"SettingsTest\", \"SettingsTest.bim\");\r\n iModel = IModelTestUtils.createSnapshotFromSeed(testFileName, seedFileName);\r\n });\r\n\r\n after(() => {\r\n iModel.close();\r\n });\r\n\r\n const app1: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix: \"app1\",\r\n settingDefs: {\r\n sub1: {\r\n type: \"string\",\r\n enum: [\"va1\", \"alt1\"],\r\n enumDescriptions: [\r\n \"descr1\",\r\n \"descr2\",\r\n ],\r\n default: \"val1\",\r\n description: \"the first value\",\r\n },\r\n sub2: {\r\n type: \"array\",\r\n description: \"an array\",\r\n items: {\r\n type: \"string\",\r\n },\r\n },\r\n boolVal: {\r\n type: \"boolean\",\r\n default: true,\r\n description: \"boolean defaults to true\",\r\n },\r\n strVal: {\r\n type: \"string\",\r\n default: \"default string val\",\r\n },\r\n intVal: {\r\n type: \"integer\",\r\n default: 22,\r\n },\r\n obj: {\r\n type: \"object\",\r\n properties: {\r\n out: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\", \"m2\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n\r\n },\r\n databases: {\r\n type: \"array\",\r\n items: {\r\n type: \"object\",\r\n required: [\"name\", \"dbName\", \"containerName\"],\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n },\r\n dbName: {\r\n type: \"string\",\r\n },\r\n containerName: {\r\n type: \"string\",\r\n },\r\n b2: {\r\n type: \"object\",\r\n properties: {\r\n o1: {\r\n type: \"object\",\r\n required: [\"m1\"],\r\n properties: {\r\n m1: {\r\n type: \"string\",\r\n },\r\n m2: {\r\n type: \"number\",\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n };\r\n\r\n const app1Settings = {\r\n \"app1/sub1\": \"app1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"app1\", \"app2\"],\r\n },\r\n \"app1/setting2\": 1002,\r\n \"app1/setting3\": \"app setting 3 val\",\r\n \"app1/setting5\": \"app setting 5 val\",\r\n };\r\n\r\n const imodel1Settings = {\r\n \"app1/sub1\": \"imodel1 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a1\", \"a2\"],\r\n },\r\n \"app1/setting2\": 2,\r\n \"app1/setting3\": \"setting 3 val\",\r\n };\r\n\r\n const imodel2Settings = {\r\n \"app1/sub1\": \"imodel2 value\",\r\n \"app1/sub2\": {\r\n arr: [\"a21\", \"a22\"],\r\n },\r\n };\r\n\r\n const iTwinSettings = {\r\n \"app1/sub1\": \"val3\",\r\n \"app1/sub2\": {\r\n arr: [\"a31\", \"a32\", \"a33\"],\r\n },\r\n \"app2/setting6\": \"val 6\",\r\n \"app3/obj\": {\r\n member1: \"test2\",\r\n member2: \"test3\",\r\n member3: {\r\n part1: \"p1\",\r\n part2: [\r\n { m1: 0 },\r\n { m1: 2 },\r\n ],\r\n },\r\n },\r\n };\r\n\r\n it(\"settings priorities\", () => {\r\n const settings = iModel.workspace.settings;\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n IModelHost.appWorkspace.settings.addDictionary({ name: \"app1\", priority: SettingsPriority.application }, app1Settings);\r\n\r\n let settingsChanged = 0;\r\n settings.onSettingsChanged.addListener(() => settingsChanged++);\r\n\r\n settings.addDictionary({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel }, imodel1Settings);\r\n expect(settingsChanged).eq(1);\r\n settings.addDictionary({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel }, imodel2Settings);\r\n expect(settingsChanged).eq(2);\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settingsChanged).eq(3);\r\n\r\n expect(() => IModelHost.appWorkspace.settings.addDictionary({ name: \"iModel\", priority: SettingsPriority.iModel }, imodel1Settings)).to.throw(\"Use IModelSettings\");\r\n\r\n expect(settings.getString(\"app1/sub1\")).equals(imodel2Settings[\"app1/sub1\"]);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settings.getString(\"app1/setting5\")).equals(app1Settings[\"app1/setting5\"]); // comes from app settings\r\n expect(settings.getSetting<any>(\"app1/sub2\").arr).deep.equals(imodel2Settings[\"app1/sub2\"].arr);\r\n\r\n const app3obj = settings.getSetting<any>(\"app3/obj\");\r\n expect(app3obj).deep.equals(iTwinSettings[\"app3/obj\"]);\r\n app3obj.member3.part2[0].m1 = \"bad\"; // should modify a copy\r\n expect(iTwinSettings[\"app3/obj\"].member3.part2[0].m1).equal(0);\r\n\r\n expect(settings.getObject(\"app3/obj\")).deep.equals(iTwinSettings[\"app3/obj\"]); // should be original value\r\n expect(settings.getBoolean(\"app1/boolVal\")).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", true)).equals(true);\r\n expect(settings.getBoolean(\"app1/not there\", false)).equals(false);\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n expect(settings.getNumber(\"app1/intVal\")).equals(22);\r\n expect(() => settings.getObject(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getArray(\"app1/intVal\")).throws(\"app1/intVal\");\r\n expect(() => settings.getString(\"app1/intVal\", \"oops\")).throws(\"app1/intVal\");\r\n expect(() => settings.getBoolean(\"app1/intVal\", true)).throws(\"app1/intVal\");\r\n expect(settings.getNumber(\"app1/not there\", 33)).equals(33);\r\n expect(settings.getSetting(\"app1/not there\")).is.undefined;\r\n expect(settings.getString(\"app2/not there\", \"fallback\")).equals(\"fallback\");\r\n\r\n // list of default Gcs databases is in the backend.setting.json5 file loaded on startup\r\n const defaultGcs = settings.getArray<GcsDbProps>(GeoCoordConfig.settingName.defaultDatabases);\r\n assert(undefined !== defaultGcs);\r\n expect(defaultGcs.length).equals(2);\r\n expect(defaultGcs[0].baseUri).equal(\"https://geocoord-workspace.itwinjs.org\");\r\n expect(defaultGcs[1].baseUri).equal(defaultGcs[1].baseUri);\r\n expect(defaultGcs[0].dbName).equal(\"base\");\r\n expect(defaultGcs[1].dbName).equal(\"allEarth\");\r\n expect(defaultGcs[0].priority).equals(10000);\r\n expect(defaultGcs[1].priority).equals(100);\r\n expect(defaultGcs[0].prefetch).true;\r\n expect(defaultGcs[1].prefetch).undefined;\r\n expect(defaultGcs[1].storageType).equals(\"azure\");\r\n\r\n iTwinSettings[\"app2/setting6\"] = \"new value for 6\";\r\n settings.addDictionary({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin }, iTwinSettings);\r\n expect(settings.getString(\"app2/setting6\")).equals(iTwinSettings[\"app2/setting6\"]);\r\n expect(settingsChanged).eq(4);\r\n\r\n (app1.settingDefs!.strVal as Mutable<SettingSchema>).default = \"new default\";\r\n IModelHost.settingsSchemas.addGroup(app1);\r\n\r\n // after re-registering, the new default should be updated\r\n expect(settings.getString(\"app1/strVal\")).equals(app1.settingDefs!.strVal!.default);\r\n\r\n expect(settings.dictionaries.length).eq(3);\r\n\r\n const inspect = Array.from(settings.getSettingEntries(\"app1/sub1\"));\r\n expect(inspect.length).equals(5);\r\n expect(inspect[0].dictionary.props).to.deep.equal({ name: \"iModel2.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[0].value).equal(\"imodel2 value\");\r\n expect(inspect[1].dictionary.props).to.deep.equal({ name: \"iModel1.setting.json\", priority: SettingsPriority.iModel });\r\n expect(inspect[1].value).equal(\"imodel1 value\");\r\n expect(inspect[2].dictionary.props).to.deep.equal({ name: \"iTwin.setting.json\", priority: SettingsPriority.iTwin });\r\n expect(inspect[2].value).equal(\"val3\");\r\n expect(inspect[3].dictionary.props).to.deep.equal({ name: \"app1\", priority: SettingsPriority.application });\r\n expect(inspect[3].value).equal(\"app1 value\");\r\n expect(inspect[4].dictionary.props).to.deep.equal({ name: \"_default_\", priority: 0 });\r\n expect(inspect[4].value).equal(\"val1\");\r\n\r\n settings.dropDictionary({ name: \"iTwin.setting.json\" });\r\n expect(settingsChanged).eq(5);\r\n expect(settings.getString(\"app2/setting6\")).is.undefined;\r\n\r\n // test validation of values vs. setting schemas\r\n const workspace: any = { dbName: \"abc\", containerId: \"123\", baseUri: \"aab.com\" };\r\n const fontListVal: any = [{ workspace, fontName: \"arial\" }, { workspace, fontName: \"helvetica\", fontType: 3 }];\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"required value for \\\"workspaceLimit\\\" is missing\");\r\n workspace.workspaceLimit = 4; // add missing value\r\n expect(() => IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).throws(\"value for testApp/fontList[1].fontType\");\r\n fontListVal[1].fontType = \"ttf\"; // correct font type to string\r\n expect(IModelHost.settingsSchemas.validateSetting(fontListVal, \"testApp/fontList\")).equal(fontListVal); // should now pass\r\n });\r\n\r\n it(\"read settings file\", () => {\r\n const appSettings = IModelHost.appWorkspace.settings;\r\n const iModelSettings = iModel.workspace.settings;\r\n const settingFileName = IModelTestUtils.resolveAssetFile(\"test.setting.json5\");\r\n expect(() => appSettings.addFile(settingFileName, SettingsPriority.iTwin)).throws(\"Use IModelSettings\");\r\n appSettings.addFile(settingFileName, SettingsPriority.application);\r\n expect(() => iModelSettings.addFile(settingFileName, SettingsPriority.application)).to.throw(\"Use IModelHost.appSettings\");\r\n expect(appSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n expect(iModelSettings.getString(\"app1/colorTheme\")).equals(\"Light Theme\");\r\n const token = appSettings.getSetting<any>(\"editor/tokenColorCustomizations\")!;\r\n expect(token[\"Visual Studio Light\"].textMateRules[0].settings.foreground).equals(\"#d16c6c\");\r\n expect(token[\"Default High Contrast\"].comments).equals(\"#FF0000\");\r\n expect(appSettings.getArray<string>(\"editor/enableFiletypes\")!.length).equals(17);\r\n appSettings.dropDictionary({ name: settingFileName });\r\n });\r\n\r\n it(\"IModel persistent settings \", () => {\r\n const iModelName = IModelTestUtils.prepareOutputFile(\"IModelSetting\", \"test.bim\");\r\n const iModel2 = IModelTestUtils.createSnapshotFromSeed(iModelName, IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n\r\n const setting1: SettingsContainer = {\r\n \"imodel/setting1\": \"this is from setting1\",\r\n };\r\n const setting1changed: SettingsContainer = {\r\n \"imodel/setting1\": \"this is changed setting1\",\r\n };\r\n const gcsDbDict: SettingsContainer = {\r\n \"gcs/databases\": [\"gcs/Usa\", \"gcs/Canada\"],\r\n };\r\n iModel2.saveSettingDictionary(\"gcs-dbs\", gcsDbDict);\r\n iModel2.saveSettingDictionary(\"test1\", setting1);\r\n iModel2.close();\r\n\r\n let iModel3 = StandaloneDb.openFile(iModelName, OpenMode.ReadWrite);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1[\"imodel/setting1\"]);\r\n\r\n iModel3.saveSettingDictionary(\"test1\", setting1changed);\r\n iModel3.close();\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).equal(setting1changed[\"imodel/setting1\"]);\r\n iModel3.deleteSettingDictionary(\"test1\");\r\n iModel3.close();\r\n\r\n iModel3 = StandaloneDb.openFile(iModelName);\r\n expect(iModel3.workspace.settings.getObject(\"gcs/databases\")).to.deep.equal(gcsDbDict[\"gcs/databases\"]);\r\n expect(iModel3.workspace.settings.getString(\"imodel/setting1\")).to.be.undefined;\r\n iModel3.close();\r\n });\r\n\r\n describe(\"combineArray\", () => {\r\n function addGroup(schemaPrefix: string, type: \"number\" | \"object\", combineArray: boolean | undefined): void {\r\n const group: SettingGroupSchema = {\r\n description: \"\",\r\n schemaPrefix,\r\n settingDefs: {\r\n array: {\r\n type: \"array\",\r\n items: { type },\r\n combineArray,\r\n },\r\n },\r\n };\r\n\r\n IModelHost.settingsSchemas.addGroup(group);\r\n }\r\n\r\n function addArray(schemaPrefix: string, name: string, value: Setting[], priority: SettingsPriority | number): void {\r\n const settings: SettingsContainer = { };\r\n settings[`${schemaPrefix}/array`] = value;\r\n\r\n IModelHost.appWorkspace.settings.addDictionary({\r\n name,\r\n priority,\r\n }, settings);\r\n }\r\n\r\n it(\"combines arrays only if the combineArray flag is explicitly set to true\", () => {\r\n addGroup(\"false\", \"number\", false);\r\n addGroup(\"true\", \"number\", true);\r\n addGroup(\"default\", \"number\", undefined);\r\n\r\n let dictNum = 0;\r\n const prefixes = [\"false\", \"true\", \"default\"];\r\n for (const schemaPrefix of prefixes) {\r\n addArray(schemaPrefix, `app${dictNum++}`, [1, 2], SettingsPriority.application);\r\n addArray(schemaPrefix, `def${dictNum++}`, [3, 4], SettingsPriority.defaults);\r\n }\r\n\r\n for (const prefix of prefixes) {\r\n const settingName = `${prefix}/array`;\r\n expect(IModelHost.appWorkspace.settings.getSetting<number[]>(settingName)).to.deep.equal([1, 2]);\r\n\r\n const expected = (\"true\" === prefix ? [1, 2, 3, 4] : [1, 2]);\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(settingName)).to.deep.equal(expected);\r\n }\r\n });\r\n\r\n it(\"orders elements by priority\", () => {\r\n addGroup(\"combine\", \"number\", true);\r\n function addDictionary(priority: number) {\r\n addArray(\"combine\", priority.toString(), [priority], priority);\r\n }\r\n\r\n addDictionary(100);\r\n addDictionary(120);\r\n addDictionary(80);\r\n addDictionary(150);\r\n addDictionary(30);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"combine/array\")).to.deep.equal([150, 120, 100, 80, 30]);\r\n });\r\n\r\n it(\"ignores duplicates with lower priority\", () => {\r\n addGroup(\"numbers\", \"number\", true);\r\n\r\n addArray(\"numbers\", \"a\", [4, 8], 101);\r\n addArray(\"numbers\", \"c\", [3, 6, 9, 12], 99);\r\n addArray(\"numbers\", \"b\", [2, 4, 6, 8, 10, 12], 100);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<number>(\"numbers/array\")).to.deep.equal([4, 8, 2, 6, 10, 12, 3, 9]);\r\n\r\n interface Point { x: number, y: number };\r\n addGroup(\"points\", \"object\", true);\r\n\r\n addArray(\"points\", \"a\", [{ x: 1, y: 1 }, { x: 1, y: 2 }], 101);\r\n addArray(\"points\", \"b\", [{ x: 2, y: 1 }, { x: 1, y: 2 }], 100);\r\n addArray(\"points\", \"c\", [{ y: 1, x: 1 }, { y: 2, x: 1 }, { x: 3, y: 3 }], 99);\r\n\r\n expect(IModelHost.appWorkspace.settings.getArray<Point>(\"points/array\")).to.deep.equal([{ x: 1, y: 1 }, { x: 1, y: 2 }, { x: 2, y: 1 }, { x: 3, y: 3 }]);\r\n });\r\n });\r\n\r\n it(\"toJSON on in-memory SettingsDictionary\", () => {\r\n const settings = IModelHost.appWorkspace.settings;\r\n settings.addDictionary({ name: \"toJsonTest\", priority: SettingsPriority.defaults }, {\r\n \"test/string\": \"hello\",\r\n \"test/number\": 42,\r\n \"test/nested\": { a: [1, 2, 3] },\r\n });\r\n\r\n const dict = settings.getDictionary({ name: \"toJsonTest\" });\r\n expect(dict).to.not.be.undefined;\r\n\r\n const json = dict!.toJSON();\r\n expect(json[\"test/string\"]).to.equal(\"hello\");\r\n expect(json[\"test/number\"]).to.equal(42);\r\n expect(json[\"test/nested\"]).to.deep.equal({ a: [1, 2, 3] });\r\n\r\n // Mutating the clone should not affect the dictionary\r\n (json as any)[\"test/string\"] = \"modified\";\r\n expect(dict!.getSetting<string>(\"test/string\")).to.equal(\"hello\");\r\n\r\n settings.dropDictionary({ name: \"toJsonTest\" });\r\n });\r\n});\r\n"]}