@itwin/core-backend 5.0.0-dev.97 → 5.0.0-dev.99

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 (173) hide show
  1. package/lib/cjs/BackendHubAccess.d.ts +2 -8
  2. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  3. package/lib/cjs/BackendHubAccess.js.map +1 -1
  4. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  5. package/lib/cjs/ChangeSummaryManager.js +12 -5
  6. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  7. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  8. package/lib/cjs/ChangesetECAdaptor.js +1 -0
  9. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  10. package/lib/cjs/CheckpointManager.d.ts +8 -15
  11. package/lib/cjs/CheckpointManager.d.ts.map +1 -1
  12. package/lib/cjs/CheckpointManager.js +23 -54
  13. package/lib/cjs/CheckpointManager.js.map +1 -1
  14. package/lib/cjs/ECDb.d.ts +37 -1
  15. package/lib/cjs/ECDb.d.ts.map +1 -1
  16. package/lib/cjs/ECDb.js +81 -0
  17. package/lib/cjs/ECDb.js.map +1 -1
  18. package/lib/cjs/ECSqlStatement.d.ts +181 -2
  19. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  20. package/lib/cjs/ECSqlStatement.js +224 -5
  21. package/lib/cjs/ECSqlStatement.js.map +1 -1
  22. package/lib/cjs/Element.d.ts +16 -4
  23. package/lib/cjs/Element.d.ts.map +1 -1
  24. package/lib/cjs/Element.js +40 -2
  25. package/lib/cjs/Element.js.map +1 -1
  26. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  27. package/lib/cjs/ElementAspect.js +1 -0
  28. package/lib/cjs/ElementAspect.js.map +1 -1
  29. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  30. package/lib/cjs/ElementTreeWalker.js +4 -0
  31. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  32. package/lib/cjs/HubMock.d.ts +1 -1
  33. package/lib/cjs/HubMock.d.ts.map +1 -1
  34. package/lib/cjs/HubMock.js +13 -2
  35. package/lib/cjs/HubMock.js.map +1 -1
  36. package/lib/cjs/IModelDb.d.ts +4 -0
  37. package/lib/cjs/IModelDb.d.ts.map +1 -1
  38. package/lib/cjs/IModelDb.js +33 -3
  39. package/lib/cjs/IModelDb.js.map +1 -1
  40. package/lib/cjs/Relationship.d.ts.map +1 -1
  41. package/lib/cjs/Relationship.js +2 -0
  42. package/lib/cjs/Relationship.js.map +1 -1
  43. package/lib/cjs/ViewStore.d.ts.map +1 -1
  44. package/lib/cjs/ViewStore.js +2 -1
  45. package/lib/cjs/ViewStore.js.map +1 -1
  46. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  47. package/lib/cjs/internal/ChannelAdmin.js +2 -0
  48. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  49. package/lib/cjs/internal/Symbols.d.ts +2 -0
  50. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  51. package/lib/cjs/internal/Symbols.js +3 -1
  52. package/lib/cjs/internal/Symbols.js.map +1 -1
  53. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  54. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +1 -0
  55. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  56. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  57. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +11 -22
  58. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  59. package/lib/esm/BackendHubAccess.d.ts +2 -8
  60. package/lib/esm/BackendHubAccess.d.ts.map +1 -1
  61. package/lib/esm/BackendHubAccess.js.map +1 -1
  62. package/lib/esm/ChangeSummaryManager.d.ts.map +1 -1
  63. package/lib/esm/ChangeSummaryManager.js +12 -5
  64. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  65. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  66. package/lib/esm/ChangesetECAdaptor.js +1 -0
  67. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  68. package/lib/esm/CheckpointManager.d.ts +8 -15
  69. package/lib/esm/CheckpointManager.d.ts.map +1 -1
  70. package/lib/esm/CheckpointManager.js +22 -52
  71. package/lib/esm/CheckpointManager.js.map +1 -1
  72. package/lib/esm/ECDb.d.ts +37 -1
  73. package/lib/esm/ECDb.d.ts.map +1 -1
  74. package/lib/esm/ECDb.js +82 -1
  75. package/lib/esm/ECDb.js.map +1 -1
  76. package/lib/esm/ECSqlStatement.d.ts +181 -2
  77. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  78. package/lib/esm/ECSqlStatement.js +222 -4
  79. package/lib/esm/ECSqlStatement.js.map +1 -1
  80. package/lib/esm/Element.d.ts +16 -4
  81. package/lib/esm/Element.d.ts.map +1 -1
  82. package/lib/esm/Element.js +40 -2
  83. package/lib/esm/Element.js.map +1 -1
  84. package/lib/esm/ElementAspect.d.ts.map +1 -1
  85. package/lib/esm/ElementAspect.js +1 -0
  86. package/lib/esm/ElementAspect.js.map +1 -1
  87. package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
  88. package/lib/esm/ElementTreeWalker.js +4 -0
  89. package/lib/esm/ElementTreeWalker.js.map +1 -1
  90. package/lib/esm/HubMock.d.ts +1 -1
  91. package/lib/esm/HubMock.d.ts.map +1 -1
  92. package/lib/esm/HubMock.js +13 -2
  93. package/lib/esm/HubMock.js.map +1 -1
  94. package/lib/esm/IModelDb.d.ts +4 -0
  95. package/lib/esm/IModelDb.d.ts.map +1 -1
  96. package/lib/esm/IModelDb.js +33 -3
  97. package/lib/esm/IModelDb.js.map +1 -1
  98. package/lib/esm/Relationship.d.ts.map +1 -1
  99. package/lib/esm/Relationship.js +2 -0
  100. package/lib/esm/Relationship.js.map +1 -1
  101. package/lib/esm/ViewStore.d.ts.map +1 -1
  102. package/lib/esm/ViewStore.js +2 -1
  103. package/lib/esm/ViewStore.js.map +1 -1
  104. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  105. package/lib/esm/internal/ChannelAdmin.js +2 -0
  106. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  107. package/lib/esm/internal/Symbols.d.ts +2 -0
  108. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  109. package/lib/esm/internal/Symbols.js +2 -0
  110. package/lib/esm/internal/Symbols.js.map +1 -1
  111. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  112. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +1 -0
  113. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  114. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  115. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js +13 -24
  116. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  117. package/lib/esm/test/CloudSqliteMock.d.ts +37 -0
  118. package/lib/esm/test/CloudSqliteMock.d.ts.map +1 -0
  119. package/lib/esm/test/CloudSqliteMock.js +117 -0
  120. package/lib/esm/test/CloudSqliteMock.js.map +1 -0
  121. package/lib/esm/test/IModelTestUtils.d.ts +1 -1
  122. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  123. package/lib/esm/test/IModelTestUtils.js +16 -4
  124. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  125. package/lib/esm/test/PrintElementTree.js +1 -0
  126. package/lib/esm/test/PrintElementTree.js.map +1 -1
  127. package/lib/esm/test/SchemaUtils.test.js +2 -0
  128. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  129. package/lib/esm/test/ecdb/ECDb.test.js +12 -1
  130. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  131. package/lib/esm/test/ecdb/ECSqlAst.test.js +1 -0
  132. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  133. package/lib/esm/test/ecdb/ECSqlQuery.test.js +6 -0
  134. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  135. package/lib/esm/test/ecdb/ECSqlReader.test.js +1 -1
  136. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  137. package/lib/esm/test/ecdb/ECSqlStatement.test.js +253 -163
  138. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  139. package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -0
  140. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  141. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +1 -0
  142. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  143. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +5 -1
  144. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  145. package/lib/esm/test/element/ElementRoundTrip.test.js +10 -0
  146. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  147. package/lib/esm/test/font/IModelDbFonts.test.js +3 -1
  148. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  149. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +18 -7
  150. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  151. package/lib/esm/test/hubaccess/CheckpointManager.test.js +5 -91
  152. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  153. package/lib/esm/test/imodel/ElementTreeWalker.test.js +1 -0
  154. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  155. package/lib/esm/test/imodel/IModel.test.js +14 -0
  156. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  157. package/lib/esm/test/schema/GenericDomain.test.js +1 -0
  158. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  159. package/lib/esm/test/standalone/ChangeMerge.test.js +0 -4
  160. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  161. package/lib/esm/test/standalone/ChangesetReader.test.js +1 -0
  162. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  163. package/lib/esm/test/standalone/Drawing.test.d.ts +2 -0
  164. package/lib/esm/test/standalone/Drawing.test.d.ts.map +1 -0
  165. package/lib/esm/test/standalone/Drawing.test.js +120 -0
  166. package/lib/esm/test/standalone/Drawing.test.js.map +1 -0
  167. package/lib/esm/test/standalone/IModelWrite.test.js +22 -6
  168. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  169. package/lib/esm/test/standalone/RenderMaterialElement.test.js +1 -0
  170. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  171. package/lib/esm/test/standalone/SnapshotDb.test.js +4 -3
  172. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  173. package/package.json +13 -12
@@ -86,7 +86,7 @@ describe("IModelWriteTest", () => {
86
86
  fsWatcher.callback = fn;
87
87
  return fsWatcher;
88
88
  };
89
- sinon.stub(fs, "watch").callsFake(watchStub);
89
+ const watchStubResult = sinon.stub(fs, "watch").callsFake(watchStub);
90
90
  const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
91
91
  bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);
92
92
  const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });
@@ -103,7 +103,10 @@ describe("IModelWriteTest", () => {
103
103
  roBC.close();
104
104
  expect(nClosed).equal(1);
105
105
  bc.close();
106
- sinon.restore();
106
+ // NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT
107
+ // call sinon.restore() here. This is because sinon.restore() will restore the stubs for
108
+ // CloudSqlite that HubMock.startup() put in place.
109
+ watchStubResult.restore();
107
110
  });
108
111
  function expectEqualChangesets(a, b) {
109
112
  expect(a.id).to.equal(b.id);
@@ -126,7 +129,7 @@ describe("IModelWriteTest", () => {
126
129
  fsWatcher.callback = fn;
127
130
  return fsWatcher;
128
131
  };
129
- sinon.stub(fs, "watch").callsFake(watchStub);
132
+ const watchStubResult = sinon.stub(fs, "watch").callsFake(watchStub);
130
133
  const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
131
134
  bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);
132
135
  const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });
@@ -159,7 +162,10 @@ describe("IModelWriteTest", () => {
159
162
  roBC.close();
160
163
  expect(nClosed).equal(1);
161
164
  bc.close();
162
- sinon.restore();
165
+ // NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT
166
+ // call sinon.restore() here. This is because sinon.restore() will restore the stubs for
167
+ // CloudSqlite that HubMock.startup() put in place.
168
+ watchStubResult.restore();
163
169
  });
164
170
  it("WatchForChanges - pull", async () => {
165
171
  const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);
@@ -192,7 +198,7 @@ describe("IModelWriteTest", () => {
192
198
  fsWatcher.callback = fn;
193
199
  return fsWatcher;
194
200
  };
195
- sinon.stub(fs, "watch").callsFake(watchStub);
201
+ const watchStubResult = sinon.stub(fs, "watch").callsFake(watchStub);
196
202
  const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
197
203
  bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);
198
204
  const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });
@@ -214,7 +220,10 @@ describe("IModelWriteTest", () => {
214
220
  roBC.close();
215
221
  expect(nClosed).equal(1);
216
222
  bc.close();
217
- sinon.restore();
223
+ // NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT
224
+ // call sinon.restore() here. This is because sinon.restore() will restore the stubs for
225
+ // CloudSqlite that HubMock.startup() put in place.
226
+ watchStubResult.restore();
218
227
  });
219
228
  it("should handle undo/redo", async () => {
220
229
  const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);
@@ -396,6 +405,7 @@ describe("IModelWriteTest", () => {
396
405
  const briefcaseDb = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });
397
406
  briefcaseDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);
398
407
  let firstNonRootElement = { id: undefined, codeValue: "test" };
408
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
399
409
  briefcaseDb.withPreparedStatement("SELECT * from Bis.Element LIMIT 1 OFFSET 1", (stmt) => {
400
410
  if (stmt.step() === DbResult.BE_SQLITE_ROW) {
401
411
  firstNonRootElement = stmt.getRow();
@@ -516,6 +526,7 @@ describe("IModelWriteTest", () => {
516
526
  assert.equal(changesets.length, 2);
517
527
  }
518
528
  let rows = [];
529
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
519
530
  rwIModel.withPreparedStatement("SELECT * FROM TestDomain.Test2dElement", (stmt) => {
520
531
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
521
532
  rows.push(stmt.getRow());
@@ -533,6 +544,7 @@ describe("IModelWriteTest", () => {
533
544
  // pull and merge changes
534
545
  await rwIModel2.pullChanges({ accessToken: userToken });
535
546
  rows = [];
547
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
536
548
  rwIModel2.withPreparedStatement("SELECT * FROM TestDomain.Test2dElement", (stmt) => {
537
549
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
538
550
  rows.push(stmt.getRow());
@@ -619,6 +631,7 @@ describe("IModelWriteTest", () => {
619
631
  assert.equal(changesets.length, 5);
620
632
  }
621
633
  rows = [];
634
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
622
635
  rwIModel.withPreparedStatement("SELECT * FROM TestDomain.Test2dElement", (stmt) => {
623
636
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
624
637
  rows.push(stmt.getRow());
@@ -635,6 +648,7 @@ describe("IModelWriteTest", () => {
635
648
  assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);
636
649
  assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);
637
650
  rows = [];
651
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
638
652
  rwIModel.withPreparedStatement("SELECT * FROM TestDomain.Test2dElement2nd", (stmt) => {
639
653
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
640
654
  rows.push(stmt.getRow());
@@ -655,6 +669,7 @@ describe("IModelWriteTest", () => {
655
669
  await rwIModel2.pullChanges({ accessToken: userToken });
656
670
  rows = [];
657
671
  // Following fail without the fix in briefcase manager where we clear statement cache on schema changeset apply
672
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
658
673
  rwIModel2.withPreparedStatement("SELECT * FROM TestDomain.Test2dElement", (stmt) => {
659
674
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
660
675
  rows.push(stmt.getRow());
@@ -688,6 +703,7 @@ describe("IModelWriteTest", () => {
688
703
  }
689
704
  }
690
705
  rows = [];
706
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
691
707
  rwIModel2.withPreparedStatement("SELECT * FROM TestDomain.Test2dElement2nd", (stmt) => {
692
708
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
693
709
  rows.push(stmt.getRow());
@@ -1 +1 @@
1
- {"version":3,"file":"IModelWrite.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/IModelWrite.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { AccessToken, DbResult, GuidString, Id64, Id64String } from \"@itwin/core-bentley\";\nimport {\n ChangesetIdWithIndex, Code, ColorDef,\n GeometricElement2dProps, GeometryStreamProps, IModel, IModelVersion, LockState, QueryRowFormat, RequestNewBriefcaseProps, SchemaState, SubCategoryAppearance,\n} from \"@itwin/core-common\";\nimport { Arc3d, IModelJson, Point2d, Point3d } from \"@itwin/core-geometry\";\nimport * as chai from \"chai\";\nimport { assert, expect } from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport * as fs from \"fs\";\nimport * as semver from \"semver\";\nimport * as sinon from \"sinon\";\nimport { HubWrappers, KnownTestLocations } from \"../\";\nimport { DrawingCategory } from \"../../Category\";\nimport { ECSqlStatement } from \"../../ECSqlStatement\";\nimport { HubMock } from \"../../HubMock\";\nimport {\n _nativeDb,\n BriefcaseDb,\n BriefcaseManager,\n ChannelControl,\n CodeService, DefinitionModel, DictionaryModel, DocumentListModel, Drawing, DrawingGraphic, OpenBriefcaseArgs, SpatialCategory, Subject,\n} from \"../../core-backend\";\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\n\nchai.use(chaiAsPromised);\n\nexport async function createNewModelAndCategory(rwIModel: BriefcaseDb, parent?: Id64String) {\n // Create a new physical model.\n const [, modelId] = await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(rwIModel, IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel\"), true, parent);\n\n // Find or create a SpatialCategory.\n const dictionary: DictionaryModel = rwIModel.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n const category = SpatialCategory.create(rwIModel, IModel.dictionaryId, newCategoryCode.value);\n const spatialCategoryId = rwIModel.elements.insertElement(category.toJSON());\n category.setDefaultAppearance(new SubCategoryAppearance({ color: 0xff0000 }));\n // const spatialCategoryId: Id64String = SpatialCategory.insert(rwIModel, IModel.dictionaryId, newCategoryCode.value!, new SubCategoryAppearance({ color: 0xff0000 }));\n\n return { modelId, spatialCategoryId };\n}\n\ndescribe(\"IModelWriteTest\", () => {\n let managerAccessToken: AccessToken;\n let superAccessToken: AccessToken;\n let iTwinId: GuidString;\n\n before(() => {\n HubMock.startup(\"IModelWriteTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n after(() => HubMock.shutdown());\n\n it(\"Check busyTimeout option\", async () => {\n const iModelProps = {\n iModelName: \"ReadWriteTest\",\n iTwinId,\n };\n\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", iTwinId, iModelId });\n\n const tryOpen = async (args: OpenBriefcaseArgs) => {\n const start = performance.now();\n let didThrow = false;\n try {\n await BriefcaseDb.open(args);\n\n } catch (e: any) {\n assert.strictEqual(e.errorNumber, DbResult.BE_SQLITE_BUSY, \"Expect error 'Db is busy'\");\n didThrow = true;\n }\n assert.isTrue(didThrow);\n return performance.now() - start;\n };\n const seconds = (s: number) => s * 1000;\n\n const db = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n db.saveChanges();\n // lock db so another connection cannot write to it.\n db.saveFileProperty({ name: \"test\", namespace: \"test\" }, \"\");\n\n assert.isAtMost(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(0) }), seconds(1), \"open should fail with busy error instantly\");\n assert.isAtLeast(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(1) }), seconds(1), \"open should fail with atleast 1 sec delay due to retry\");\n assert.isAtLeast(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(2) }), seconds(2), \"open should fail with atleast 2 sec delay due to retry\");\n assert.isAtLeast(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(3) }), seconds(3), \"open should fail with atleast 3 sec delay due to retry\");\n\n db.abandonChanges();\n db.close();\n });\n\n it(\"WatchForChanges\", async () => {\n const iModelProps = {\n iModelName: \"ReadWriteTest\",\n iTwinId,\n };\n\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", iTwinId, iModelId });\n\n let nClosed = 0;\n const fsWatcher = {\n callback: () => { },\n close: () => ++nClosed,\n };\n const watchStub: any = (_filename: fs.PathLike, _opts: fs.WatchOptions, fn: () => void) => {\n fsWatcher.callback = fn;\n return fsWatcher;\n };\n sinon.stub(fs, \"watch\").callsFake(watchStub);\n\n const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });\n\n const code1 = IModelTestUtils.getUniqueModelCode(bc, \"newPhysicalModel1\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(bc, code1, true);\n bc.saveChanges();\n\n // immediately after save changes the current txnId in the writeable briefcase changes, but it isn't reflected\n // in the readonly briefcase until the file watcher fires.\n expect(bc[_nativeDb].getCurrentTxnId()).not.equal(roBC[_nativeDb].getCurrentTxnId());\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n // now they should match because restartDefaultTxn in the readonly briefcase reads the changes from the writeable connection\n expect(bc[_nativeDb].getCurrentTxnId()).equal(roBC[_nativeDb].getCurrentTxnId());\n\n roBC.close();\n expect(nClosed).equal(1);\n\n bc.close();\n sinon.restore();\n });\n\n function expectEqualChangesets(a: ChangesetIdWithIndex, b: ChangesetIdWithIndex): void {\n expect(a.id).to.equal(b.id);\n expect(a.index).to.equal(b.index);\n }\n\n it(\"WatchForChanges - push\", async () => {\n const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const iModelProps = {\n iModelName: \"ReadWriteTest\",\n iTwinId,\n };\n\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: adminAccessToken, iTwinId, iModelId });\n\n let nClosed = 0;\n const fsWatcher = {\n callback: () => { },\n close: () => ++nClosed,\n };\n const watchStub: any = (_filename: fs.PathLike, _opts: fs.WatchOptions, fn: () => void) => {\n fsWatcher.callback = fn;\n return fsWatcher;\n };\n sinon.stub(fs, \"watch\").callsFake(watchStub);\n\n const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });\n\n const code1 = IModelTestUtils.getUniqueModelCode(bc, \"newPhysicalModel1\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(bc, code1, true);\n bc.saveChanges();\n\n // immediately after save changes the current txnId in the writeable briefcase changes, but it isn't reflected\n // in the readonly briefcase until the file watcher fires.\n expect(bc[_nativeDb].getCurrentTxnId()).not.equal(roBC[_nativeDb].getCurrentTxnId());\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n // now they should match because restartDefaultTxn in the readonly briefcase reads the changes from the writeable connection\n expect(bc[_nativeDb].getCurrentTxnId()).equal(roBC[_nativeDb].getCurrentTxnId());\n\n // Push the changes to the hub\n\n const prePushChangeset = bc.changeset;\n let eventRaised = false;\n roBC.onChangesetChanged.addOnce((prevCS) => {\n expectEqualChangesets(prevCS, prePushChangeset);\n eventRaised = true;\n });\n\n await bc.pushChanges({ accessToken: adminAccessToken, description: \"test\" });\n const postPushChangeset = bc.changeset;\n assert(!!postPushChangeset);\n expect(prePushChangeset !== postPushChangeset, \"changes should be pushed\");\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n expectEqualChangesets(roBC.changeset, postPushChangeset);\n expect(roBC[_nativeDb].getCurrentTxnId(), \"txn should be updated\").equal(bc[_nativeDb].getCurrentTxnId());\n expect(eventRaised).to.be.true;\n\n roBC.close();\n expect(nClosed).equal(1);\n\n bc.close();\n sinon.restore();\n });\n\n it(\"WatchForChanges - pull\", async () => {\n const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n\n const pathname = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const hubName = \"CompatibilityTest\";\n const iModelId = await HubWrappers.pushIModel(managerAccessToken, iTwinId, pathname, hubName, true);\n\n // Download two copies of the briefcase - manager and super\n const args: RequestNewBriefcaseProps = { iTwinId, iModelId };\n const initialDb = await BriefcaseManager.downloadBriefcase({ accessToken: adminAccessToken, ...args });\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: adminAccessToken, ...args });\n\n // Push some changes - prep for pull workflow.\n const bc1 = await BriefcaseDb.open({ fileName: initialDb.fileName });\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const code2 = IModelTestUtils.getUniqueModelCode(bc1, \"newPhysicalModel2\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(bc1, code2, true);\n const prePushChangeset = bc1.changeset;\n bc1.saveChanges();\n await bc1.pushChanges({ accessToken: adminAccessToken, description: \"test\" });\n const postPushChangeset = bc1.changeset;\n assert(!!prePushChangeset);\n expect(prePushChangeset !== postPushChangeset, \"changes should be pushed\");\n\n bc1.close();\n\n // Writer that pulls + watcher.\n let nClosed = 0;\n const fsWatcher = {\n callback: () => { },\n close: () => ++nClosed,\n };\n const watchStub: any = (_filename: fs.PathLike, _opts: fs.WatchOptions, fn: () => void) => {\n fsWatcher.callback = fn;\n return fsWatcher;\n };\n sinon.stub(fs, \"watch\").callsFake(watchStub);\n\n const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });\n\n const prePullChangeset = bc.changeset;\n let eventRaised = false;\n roBC.onChangesetChanged.addOnce((prevCS) => {\n expectEqualChangesets(prevCS, prePushChangeset);\n eventRaised = true;\n });\n\n await bc.pullChanges();\n\n const postPullChangeset = bc.changeset;\n assert(!!postPullChangeset);\n expect(prePullChangeset !== postPullChangeset, \"changes should be pulled\");\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n expectEqualChangesets(roBC.changeset, postPullChangeset);\n expect(roBC[_nativeDb].getCurrentTxnId(), \"txn should be updated\").equal(bc[_nativeDb].getCurrentTxnId());\n expect(eventRaised).to.be.true;\n\n roBC.close();\n expect(nClosed).equal(1);\n\n bc.close();\n sinon.restore();\n });\n\n it(\"should handle undo/redo\", async () => {\n const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n // Delete any existing iModels with the same name as the read-write test iModel\n const iModelName = \"CodesUndoRedoPushTest\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ accessToken: adminAccessToken, iTwinId, iModelName, description: \"TestSubject\" });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ accessToken: adminAccessToken, iTwinId, iModelId: rwIModelId });\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // create and insert a new model with code1\n const code1 = IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel1\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(rwIModel, code1, true);\n assert.isTrue(rwIModel.elements.getElement(code1) !== undefined); // throws if element is not found\n\n // create a local txn with that change\n rwIModel.saveChanges(\"inserted newPhysicalModel\");\n\n // Reverse that local txn\n rwIModel.txns.reverseSingleTxn();\n\n try {\n // The model that I just created with code1 should no longer be there.\n const theNewModel = rwIModel.elements.getElement(code1); // throws if element is not found\n assert.isTrue(theNewModel === undefined); // really should not be here.\n assert.fail(); // should not be here.\n } catch {\n // this is what I expect\n }\n\n // Create and insert a model with code2\n const code2 = IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel2\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(rwIModel, code2, true);\n rwIModel.saveChanges(\"inserted generic objects\");\n\n // The iModel should have a model with code1 and not code2\n assert.isTrue(rwIModel.elements.getElement(code2) !== undefined); // throws if element is not found\n\n // Push the changes to the hub\n const prePushChangeset = rwIModel.changeset;\n await rwIModel.pushChanges({ accessToken: adminAccessToken, description: \"test\" });\n const postPushChangeset = rwIModel.changeset;\n assert(!!postPushChangeset);\n expect(prePushChangeset !== postPushChangeset);\n\n rwIModel.close();\n });\n\n it(\"should be able to upgrade a briefcase with an older schema\", async () => {\n /**\n * Test validates that -\n * - User \"manager\" upgrades the BisCore schema in the briefcase from version 1.0.0 to 1.0.10+\n * - User \"super\" can get the upgrade \"manager\" made\n */\n\n /* Setup test - Push an iModel with an old BisCore schema up to the Hub */\n const pathname = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const hubName = \"CompatibilityTest\";\n const iModelId = await HubWrappers.pushIModel(managerAccessToken, iTwinId, pathname, hubName, true);\n\n // Download two copies of the briefcase - manager and super\n const args: RequestNewBriefcaseProps = { iTwinId, iModelId };\n const managerBriefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: managerAccessToken, ...args });\n const superBriefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: superAccessToken, ...args });\n\n /* User \"manager\" upgrades the briefcase */\n\n // Validate the original state of the BisCore schema in the briefcase\n let iModel = await BriefcaseDb.open({ fileName: managerBriefcaseProps.fileName });\n const beforeVersion = iModel.querySchemaVersion(\"BisCore\");\n assert.isTrue(semver.satisfies(beforeVersion!, \"= 1.0.0\"));\n assert.isFalse(iModel[_nativeDb].hasPendingTxns());\n iModel.close();\n\n // Validate that the BisCore schema is recognized as a recommended upgrade\n let schemaState = BriefcaseDb.validateSchemas(managerBriefcaseProps.fileName, true);\n assert.strictEqual(schemaState, SchemaState.UpgradeRecommended);\n\n // Upgrade the schemas\n await BriefcaseDb.upgradeSchemas(managerBriefcaseProps);\n\n // Validate state after upgrade\n iModel = await BriefcaseDb.open({ fileName: managerBriefcaseProps.fileName });\n const afterVersion = iModel.querySchemaVersion(\"BisCore\");\n assert.isTrue(semver.satisfies(afterVersion!, \">= 1.0.10\"));\n assert.isFalse(iModel[_nativeDb].hasPendingTxns());\n assert.isFalse(iModel.holdsSchemaLock);\n assert.isFalse(iModel[_nativeDb].hasUnsavedChanges());\n iModel.close();\n\n /* User \"super\" can get the upgrade \"manager\" made */\n\n // Validate that the BisCore schema is recognized as a recommended upgrade\n schemaState = BriefcaseDb.validateSchemas(superBriefcaseProps.fileName, true);\n assert.strictEqual(schemaState, SchemaState.UpgradeRecommended);\n\n // Open briefcase and pull change sets to upgrade\n const superIModel = await BriefcaseDb.open({ fileName: superBriefcaseProps.fileName });\n (superBriefcaseProps.changeset as any) = await superIModel.pullChanges({ accessToken: superAccessToken });\n const superVersion = superIModel.querySchemaVersion(\"BisCore\");\n assert.isTrue(semver.satisfies(superVersion!, \">= 1.0.10\"));\n assert.isFalse(superIModel[_nativeDb].hasUnsavedChanges()); // Validate no changes were made\n assert.isFalse(superIModel[_nativeDb].hasPendingTxns()); // Validate no changes were made\n superIModel.close();\n\n // Validate that there are no upgrades required\n schemaState = BriefcaseDb.validateSchemas(superBriefcaseProps.fileName, true);\n assert.strictEqual(schemaState, SchemaState.UpToDate);\n\n // Upgrade the schemas - ensure this is a no-op\n await BriefcaseDb.upgradeSchemas(superBriefcaseProps);\n await HubMock.deleteIModel({ accessToken: managerAccessToken, iTwinId, iModelId });\n });\n\n it(\"changeset size and ec schema version change\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"changeset_size\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n assert.equal(rwIModel[_nativeDb].enableChangesetSizeStats(true), DbResult.BE_SQLITE_OK);\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n rwIModel.saveChanges(\"user 1: schema changeset\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"push schema changeset\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 1);\n }\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n let totalEl = 0;\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n const insertElements = (imodel: BriefcaseDb, className: string = \"Test2dElement\", noOfElements: number = 10, userProp: (n: number) => object) => {\n for (let m = 0; m < noOfElements; ++m) {\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const prop = userProp(++totalEl);\n // Create props\n const geomElement = {\n classFullName: `TestDomain:${className}`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...prop,\n };\n const id = imodel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n }\n };\n const str = new Array(1024).join(\"x\");\n insertElements(rwIModel, \"Test2dElement\", 1024, () => {\n return { s: str };\n });\n assert.equal(1357648, rwIModel[_nativeDb].getChangesetSize());\n\n rwIModel.saveChanges(\"user 1: data\");\n assert.equal(0, rwIModel[_nativeDb].getChangesetSize());\n await rwIModel.pushChanges({ description: \"schema changeset\", accessToken: adminToken });\n rwIModel.close();\n });\n\n it(\"should set a fake verifyCode for codeService that throws error for operations that affect code, if failed to open codeService \", async () => {\n const iModelProps = {\n iModelName: \"codeServiceTest\",\n iTwinId,\n };\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"codeServiceTest\", iTwinId, iModelId });\n const originalCreateForIModel = CodeService.createForIModel;\n // can be any errors except 'NoCodeIndex'\n CodeService.createForIModel = async () => {\n throw new CodeService.Error(\"MissingCode\", 0x10000 + 1, \" \");\n };\n const briefcaseDb = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n briefcaseDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n let firstNonRootElement = { id: undefined, codeValue: \"test\" };\n briefcaseDb.withPreparedStatement(\"SELECT * from Bis.Element LIMIT 1 OFFSET 1\", (stmt: ECSqlStatement) => {\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n firstNonRootElement = stmt.getRow();\n }\n });\n // make change to the briefcaseDb that does not affect code, e.g., save file property\n // expect no error from verifyCode\n expect(() => briefcaseDb.saveFileProperty({ name: \"codeServiceProp\", namespace: \"codeService\", id: 1, subId: 1 }, \"codeService test\")).to.not.throw();\n // make change to the briefcaseDb that affects code that will invoke verifyCode, e.g., update an element with a non-null code\n // expect error from verifyCode\n let newProps = { id: firstNonRootElement.id, code: { ...Code.createEmpty(), value: firstNonRootElement.codeValue }, classFullName: undefined, model: undefined };\n await briefcaseDb.locks.acquireLocks({ exclusive: firstNonRootElement.id });\n expect(() => briefcaseDb.elements.updateElement(newProps)).to.throw(CodeService.Error);\n // make change to the briefcaseDb that will invoke verifyCode with a null(empty) code, e.g., update an element with a null(empty) code\n // expect no error from verifyCode\n newProps = { id: firstNonRootElement.id, code: Code.createEmpty(), classFullName: undefined, model: undefined };\n expect(() => briefcaseDb.elements.updateElement(newProps)).to.not.throw();\n briefcaseDb.close();\n // throw \"NoCodeIndex\", this error should get ignored because it means the iModel isn't enforcing codes. updating an element with an empty code and a non empty code should work without issue.\n CodeService.createForIModel = async () => {\n throw new CodeService.Error(\"NoCodeIndex\", 0x10000 + 1, \" \");\n };\n const briefcaseDb2 = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n briefcaseDb2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await briefcaseDb2.locks.acquireLocks({ exclusive: firstNonRootElement.id });\n // expect no error from verifyCode for empty code\n expect(() => briefcaseDb2.elements.updateElement(newProps)).to.not.throw();\n newProps = { id: firstNonRootElement.id, code: { ...Code.createEmpty(), value: firstNonRootElement.codeValue }, classFullName: undefined, model: undefined };\n // make change to the briefcaseDb that affects code that will invoke verifyCode, e.g., update an element with a non-null code\n // expect no error from verifyCode\n expect(() => briefcaseDb2.elements.updateElement(newProps)).to.not.throw();\n // clean up\n CodeService.createForIModel = originalCreateForIModel;\n briefcaseDb2.close();\n });\n\n it(\"clear cache on schema changes\", async () => {\n const adminToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const userToken = await HubWrappers.getAccessToken(TestUserType.Super);\n // Delete any existing iModels with the same name as the OptimisticConcurrencyTest iModel\n const iModelName = \"SchemaChanges\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\" });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n\n const rwIModel2 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: userToken });\n\n // enable change tracking\n assert.equal(rwIModel[_nativeDb].enableChangesetSizeStats(true), DbResult.BE_SQLITE_OK);\n assert.equal(rwIModel2[_nativeDb].enableChangesetSizeStats(true), DbResult.BE_SQLITE_OK);\n\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n rwIModel2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n rwIModel.saveChanges(\"user 1: schema changeset\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"schema changeset\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 1);\n }\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n let totalEl = 0;\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n const insertElements = (imodel: BriefcaseDb, className: string = \"Test2dElement\", noOfElements: number = 10, userProp: (n: number) => object) => {\n for (let m = 0; m < noOfElements; ++m) {\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const prop = userProp(++totalEl);\n // Create props\n const geomElement = {\n classFullName: `TestDomain:${className}`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...prop,\n };\n const id = imodel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n }\n };\n\n insertElements(rwIModel, \"Test2dElement\", 10, (n: number) => {\n return { s: `s-${n}` };\n });\n\n assert.equal(3889, rwIModel[_nativeDb].getChangesetSize());\n rwIModel.saveChanges(\"user 1: data changeset\");\n\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"10 instances of test2dElement\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 2);\n }\n let rows: any[] = [];\n rwIModel.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n if (true || \"user pull/merge\") {\n // pull and merge changes\n await rwIModel2.pullChanges({ accessToken: userToken });\n rows = [];\n rwIModel2.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel2.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n // create some element and push those changes\n await rwIModel2.locks.acquireLocks({ shared: drawingModelId });\n insertElements(rwIModel2, \"Test2dElement\", 10, (n: number) => {\n return { s: `s-${n}` };\n });\n assert.equal(0, rwIModel[_nativeDb].getChangesetSize());\n rwIModel2.saveChanges(\"user 2: data changeset\");\n\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel2.changeset.id;\n await rwIModel2.pushChanges({ accessToken: userToken, description: \"10 instances of test2dElement\" });\n const postPushChangeSetId = rwIModel2.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: userToken });\n assert.equal(changesets.length, 3);\n }\n }\n await rwIModel.pullChanges({ accessToken: adminToken });\n // second schema import ==============================================================\n const schemaV2 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n <ECProperty propertyName=\"v\" typeName=\"string\"/>\n </ECEntityClass>\n <ECEntityClass typeName=\"Test2dElement2nd\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"t\" typeName=\"string\"/>\n <ECProperty propertyName=\"r\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schemaV2]);\n assert.equal(0, rwIModel[_nativeDb].getChangesetSize());\n rwIModel.saveChanges(\"user 1: schema changeset2\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ accessToken: adminToken, description: \"schema changeset\" });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 4);\n }\n // create some element and push those changes\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n insertElements(rwIModel, \"Test2dElement\", 10, (n: number) => {\n return {\n s: `s-${n}`, v: `v-${n}`,\n };\n });\n\n // create some element and push those changes\n insertElements(rwIModel, \"Test2dElement2nd\", 10, (n: number) => {\n return {\n t: `t-${n}`, r: `r-${n}`,\n };\n });\n assert.equal(6266, rwIModel[_nativeDb].getChangesetSize());\n rwIModel.saveChanges(\"user 1: data changeset\");\n\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ accessToken: adminToken, description: \"10 instances of test2dElement\" });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 5);\n }\n rows = [];\n rwIModel.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n\n rows = [];\n rwIModel.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement2nd\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement2nd\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n\n if (true || \"user pull/merge\") {\n // pull and merge changes\n await rwIModel2.pullChanges({ accessToken: userToken });\n rows = [];\n // Following fail without the fix in briefcase manager where we clear statement cache on schema changeset apply\n rwIModel2.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n rows = [];\n // Following fail without native side fix where we clear concurrent query cache on schema changeset apply\n for await (const queryRow of rwIModel2.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n for (const row of rows) {\n const el: any = rwIModel2.elements.getElementProps(row.id);\n assert.isDefined(el);\n if (row.s) {\n assert.equal(row.s, el.s);\n } else {\n assert.isUndefined(el.s);\n }\n if (row.v) {\n assert.equal(row.v, el.v);\n } else {\n assert.isUndefined(el.v);\n }\n }\n rows = [];\n rwIModel2.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement2nd\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n for (const row of rows) {\n const el: any = rwIModel2.elements.getElementProps(row.id);\n assert.isDefined(el);\n if (row.s) {\n assert.equal(row.s, el.s);\n } else {\n assert.isUndefined(el.s);\n }\n if (row.v) {\n assert.equal(row.v, el.v);\n } else {\n assert.isUndefined(el.v);\n }\n }\n rows = [];\n for await (const queryRow of rwIModel2.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement2nd\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n for (const row of rows) {\n const el: any = rwIModel2.elements.getElementProps(row.id);\n assert.isDefined(el);\n if (row.t) {\n assert.equal(row.t, el.t);\n } else {\n assert.isUndefined(el.t);\n }\n if (row.r) {\n assert.equal(row.r, el.r);\n } else {\n assert.isUndefined(el.r);\n }\n }\n }\n rwIModel.close();\n rwIModel2.close();\n });\n\n it(\"pulling a changeset with extents changes should update the extents of the opened imodel\", async () => {\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\n const version0 = IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\");\n const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: \"projectExtentsTest\", version0 });\n const iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId });\n const changesetIdBeforeExtentsChange = iModel.changeset.id;\n const extents = iModel.projectExtents;\n const newExtents = extents.clone();\n newExtents.low.x += 100;\n newExtents.low.y += 100;\n newExtents.high.x += 100;\n newExtents.high.y += 100;\n iModel.updateProjectExtents(newExtents);\n iModel.saveChanges(\"update project extents\");\n await iModel.pushChanges({ description: \"update project extents\" });\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel);\n const iModelBeforeExtentsChange = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: IModelVersion.asOfChangeSet(changesetIdBeforeExtentsChange).toJSON() });\n const extentsBeforePull = iModelBeforeExtentsChange.projectExtents;\n // Read the extents fileProperty.\n const extentsStrBeforePull = iModelBeforeExtentsChange.queryFilePropertyString({name: \"Extents\", namespace: \"dgn_Db\"});\n const ecefLocationBeforeExtentsChange = iModelBeforeExtentsChange.ecefLocation;\n await iModelBeforeExtentsChange.pullChanges(); // Pulls the extents change.\n const extentsAfterPull = iModelBeforeExtentsChange.projectExtents;\n const extentsStrAfterPull = iModelBeforeExtentsChange.queryFilePropertyString({name: \"Extents\", namespace: \"dgn_Db\"});\n const ecefLocationAfterExtentsChange = iModelBeforeExtentsChange.ecefLocation;\n\n expect(ecefLocationBeforeExtentsChange).to.not.be.undefined;\n expect(ecefLocationAfterExtentsChange).to.not.be.undefined;\n expect(ecefLocationBeforeExtentsChange?.isAlmostEqual(ecefLocationAfterExtentsChange!)).to.be.false;\n expect(extentsStrAfterPull).to.not.equal(extentsStrBeforePull);\n expect(extentsAfterPull.isAlmostEqual(extentsBeforePull)).to.be.false;\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModelBeforeExtentsChange);\n });\n\n it(\"parent lock should suffice when inserting into deeply nested sub-model\", async () => {\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\n const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: \"subModelCoveredByParentLockTest\", version0 });\n let iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId });\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n /*\n Job Subject\n +- DefinitionPartition -- [DefinitionModel]\n */\n\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\n const jobSubjectId = IModelTestUtils.createJobSubjectElement(iModel, \"JobSubject\").insert();\n const definitionModelId = DefinitionModel.insert(iModel, jobSubjectId, \"Definition\");\n\n iModel.saveChanges();\n const locks = iModel.locks;\n expect(locks.isServerBased).true;\n await iModel.pushChanges({ description: \"create model\" });\n expect(iModel.locks).equal(locks); // pushing should not change your locks\n\n /*\n Job Subject <--- Lock this\n +- DefinitionPartition -- [DefinitionModel]\n SpatialCategory <=== insert this\n DrawingCategory \"\n */\n assert.isFalse(iModel.locks.holdsExclusiveLock(jobSubjectId));\n assert.isFalse(iModel.locks.holdsExclusiveLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(definitionModelId));\n await iModel.locks.acquireLocks({ exclusive: jobSubjectId });\n iModel.locks.checkExclusiveLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(definitionModelId, \"\", \"\");\n iModel.locks.checkExclusiveLock(definitionModelId, \"\", \"\");\n\n const spatialCategoryId = SpatialCategory.insert(iModel, definitionModelId, \"SpatialCategory\", new SubCategoryAppearance()); // throws if we get locking error\n const drawingCategoryId = DrawingCategory.insert(iModel, definitionModelId, \"DrawingCategory\", new SubCategoryAppearance());\n\n assert.isTrue(iModel.elements.getElement(spatialCategoryId).model === definitionModelId);\n assert.isTrue(iModel.elements.getElement(drawingCategoryId).model === definitionModelId);\n\n iModel.saveChanges();\n await iModel.pushChanges({ description: \"insert category\" });\n\n /*\n Create some more nesting.\n\n Job Subject <--- Lock this\n +- DefinitionPartition -- [DefinitionModel]\n | SpatialCategory\n +- Child Subject <== Insert\n +- DocumentList -- [DocumentListModel] \"\n Drawing -- [DrawingModel] \"\n */\n assert.isFalse(iModel.locks.holdsExclusiveLock(jobSubjectId));\n assert.isFalse(iModel.locks.holdsExclusiveLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(definitionModelId));\n await iModel.locks.acquireLocks({ exclusive: jobSubjectId });\n iModel.locks.checkExclusiveLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(IModel.repositoryModelId, \"\", \"\");\n\n const childSubjectId = Subject.insert(iModel, jobSubjectId, \"Child Subject\");\n\n const documentListModelId = DocumentListModel.insert(iModel, childSubjectId, \"Document\"); // creates DocumentList and DocumentListModel\n assert.isTrue(Id64.isValidId64(documentListModelId));\n const drawingModelId = Drawing.insert(iModel, documentListModelId, \"Drawing\"); // creates Drawing and DrawingModel\n\n assert.isTrue(iModel.elements.getElement(childSubjectId).parent?.id === jobSubjectId);\n assert.isTrue(iModel.elements.getElement(childSubjectId).model === IModel.repositoryModelId);\n assert.isTrue(iModel.elements.getElement(documentListModelId).parent?.id === childSubjectId);\n assert.isTrue(iModel.elements.getElement(documentListModelId).model === IModel.repositoryModelId);\n assert.isTrue(iModel.elements.getElement(drawingModelId).model === documentListModelId);\n\n iModel.saveChanges();\n await iModel.pushChanges({ description: \"insert doc list with nested drawing model\" });\n\n /*\n Verify that even a deeply nested insertion is covered by the exclusive lock on the top-level parent.\n\n Job Subject <--- Lock this\n +- DefinitionPartition -- DefinitionModel\n | SpatialCategory\n +- Child Subject\n +- DocumentList -- [DocumentListModel]\n Drawing -- [DrawingModel]\n DrawingGraphic <== Insert this\n */\n assert.isFalse(iModel.locks.holdsExclusiveLock(jobSubjectId));\n assert.isFalse(iModel.locks.holdsExclusiveLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(documentListModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(drawingModelId));\n await iModel.locks.acquireLocks({ exclusive: jobSubjectId });\n iModel.locks.checkExclusiveLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(IModel.repositoryModelId, \"\", \"\");\n iModel.locks.checkSharedLock(documentListModelId, \"\", \"\");\n iModel.locks.checkSharedLock(drawingModelId, \"\", \"\");\n\n const drawingGraphicProps1: GeometricElement2dProps = {\n classFullName: DrawingGraphic.classFullName,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n userLabel: \"DrawingGraphic1\",\n geom: IModelTestUtils.createRectangle(Point2d.create(1, 1)),\n placement: { origin: Point2d.create(2, 2), angle: 0 },\n };\n const drawingGraphicId1 = iModel.elements.insertElement(drawingGraphicProps1);\n\n assert.isTrue(iModel.elements.getElement(drawingGraphicId1).model === drawingModelId);\n iModel.saveChanges();\n expect(iModel.locks.holdsExclusiveLock(drawingModelId)).true;\n\n const fileName = iModel[_nativeDb].getFilePath();\n iModel.close(); // close rw\n iModel = await BriefcaseDb.open({ fileName, readonly: true }); // reopen readonly\n expect(iModel.locks.isServerBased).false; // readonly sessions should not have server based locks\n\n // verify we can push changes from a readonly briefcase\n await iModel.pushChanges({ description: \"insert graphic into nested sub-model\" });\n\n // try it again to verify we can get the ServerBasedLocks again\n await iModel.pushChanges({ description: \"should do nothing\" });\n iModel.close();\n\n // reopen readwrite to verify we released all locks from readonly briefcase\n iModel = await BriefcaseDb.open({ fileName });\n expect(iModel.locks.isServerBased).true;\n const serverLocks = iModel.locks as ServerBasedLocks;\n expect(serverLocks.holdsExclusiveLock(drawingModelId)).false;\n expect(serverLocks.getLockCount(LockState.Shared)).equal(0);\n expect(serverLocks.getLockCount(LockState.Exclusive)).equal(0);\n iModel.close();\n\n });\n\n});\n"]}
1
+ {"version":3,"file":"IModelWrite.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/IModelWrite.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { AccessToken, DbResult, GuidString, Id64, Id64String } from \"@itwin/core-bentley\";\nimport {\n ChangesetIdWithIndex, Code, ColorDef,\n GeometricElement2dProps, GeometryStreamProps, IModel, IModelVersion, LockState, QueryRowFormat, RequestNewBriefcaseProps, SchemaState, SubCategoryAppearance,\n} from \"@itwin/core-common\";\nimport { Arc3d, IModelJson, Point2d, Point3d } from \"@itwin/core-geometry\";\nimport * as chai from \"chai\";\nimport { assert, expect } from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport * as fs from \"fs\";\nimport * as semver from \"semver\";\nimport * as sinon from \"sinon\";\nimport { HubWrappers, KnownTestLocations } from \"../\";\nimport { DrawingCategory } from \"../../Category\";\nimport { ECSqlStatement } from \"../../ECSqlStatement\";\nimport { HubMock } from \"../../HubMock\";\nimport {\n _nativeDb,\n BriefcaseDb,\n BriefcaseManager,\n ChannelControl,\n CodeService, DefinitionModel, DictionaryModel, DocumentListModel, Drawing, DrawingGraphic, OpenBriefcaseArgs, SpatialCategory, Subject,\n} from \"../../core-backend\";\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\n\nchai.use(chaiAsPromised);\n\nexport async function createNewModelAndCategory(rwIModel: BriefcaseDb, parent?: Id64String) {\n // Create a new physical model.\n const [, modelId] = await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(rwIModel, IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel\"), true, parent);\n\n // Find or create a SpatialCategory.\n const dictionary: DictionaryModel = rwIModel.models.getModel<DictionaryModel>(IModel.dictionaryId);\n const newCategoryCode = IModelTestUtils.getUniqueSpatialCategoryCode(dictionary, \"ThisTestSpatialCategory\");\n const category = SpatialCategory.create(rwIModel, IModel.dictionaryId, newCategoryCode.value);\n const spatialCategoryId = rwIModel.elements.insertElement(category.toJSON());\n category.setDefaultAppearance(new SubCategoryAppearance({ color: 0xff0000 }));\n // const spatialCategoryId: Id64String = SpatialCategory.insert(rwIModel, IModel.dictionaryId, newCategoryCode.value!, new SubCategoryAppearance({ color: 0xff0000 }));\n\n return { modelId, spatialCategoryId };\n}\n\ndescribe(\"IModelWriteTest\", () => {\n let managerAccessToken: AccessToken;\n let superAccessToken: AccessToken;\n let iTwinId: GuidString;\n\n before(() => {\n HubMock.startup(\"IModelWriteTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n after(() => HubMock.shutdown());\n\n it(\"Check busyTimeout option\", async () => {\n const iModelProps = {\n iModelName: \"ReadWriteTest\",\n iTwinId,\n };\n\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", iTwinId, iModelId });\n\n const tryOpen = async (args: OpenBriefcaseArgs) => {\n const start = performance.now();\n let didThrow = false;\n try {\n await BriefcaseDb.open(args);\n\n } catch (e: any) {\n assert.strictEqual(e.errorNumber, DbResult.BE_SQLITE_BUSY, \"Expect error 'Db is busy'\");\n didThrow = true;\n }\n assert.isTrue(didThrow);\n return performance.now() - start;\n };\n const seconds = (s: number) => s * 1000;\n\n const db = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n db.saveChanges();\n // lock db so another connection cannot write to it.\n db.saveFileProperty({ name: \"test\", namespace: \"test\" }, \"\");\n\n assert.isAtMost(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(0) }), seconds(1), \"open should fail with busy error instantly\");\n assert.isAtLeast(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(1) }), seconds(1), \"open should fail with atleast 1 sec delay due to retry\");\n assert.isAtLeast(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(2) }), seconds(2), \"open should fail with atleast 2 sec delay due to retry\");\n assert.isAtLeast(await tryOpen({ fileName: briefcaseProps.fileName, busyTimeout: seconds(3) }), seconds(3), \"open should fail with atleast 3 sec delay due to retry\");\n\n db.abandonChanges();\n db.close();\n });\n\n it(\"WatchForChanges\", async () => {\n const iModelProps = {\n iModelName: \"ReadWriteTest\",\n iTwinId,\n };\n\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", iTwinId, iModelId });\n\n let nClosed = 0;\n const fsWatcher = {\n callback: () => { },\n close: () => ++nClosed,\n };\n const watchStub: any = (_filename: fs.PathLike, _opts: fs.WatchOptions, fn: () => void) => {\n fsWatcher.callback = fn;\n return fsWatcher;\n };\n const watchStubResult = sinon.stub(fs, \"watch\").callsFake(watchStub);\n\n const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });\n\n const code1 = IModelTestUtils.getUniqueModelCode(bc, \"newPhysicalModel1\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(bc, code1, true);\n bc.saveChanges();\n\n // immediately after save changes the current txnId in the writeable briefcase changes, but it isn't reflected\n // in the readonly briefcase until the file watcher fires.\n expect(bc[_nativeDb].getCurrentTxnId()).not.equal(roBC[_nativeDb].getCurrentTxnId());\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n // now they should match because restartDefaultTxn in the readonly briefcase reads the changes from the writeable connection\n expect(bc[_nativeDb].getCurrentTxnId()).equal(roBC[_nativeDb].getCurrentTxnId());\n\n roBC.close();\n expect(nClosed).equal(1);\n\n bc.close();\n // NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT\n // call sinon.restore() here. This is because sinon.restore() will restore the stubs for\n // CloudSqlite that HubMock.startup() put in place.\n watchStubResult.restore();\n });\n\n function expectEqualChangesets(a: ChangesetIdWithIndex, b: ChangesetIdWithIndex): void {\n expect(a.id).to.equal(b.id);\n expect(a.index).to.equal(b.index);\n }\n\n it(\"WatchForChanges - push\", async () => {\n const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const iModelProps = {\n iModelName: \"ReadWriteTest\",\n iTwinId,\n };\n\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: adminAccessToken, iTwinId, iModelId });\n\n let nClosed = 0;\n const fsWatcher = {\n callback: () => { },\n close: () => ++nClosed,\n };\n const watchStub: any = (_filename: fs.PathLike, _opts: fs.WatchOptions, fn: () => void) => {\n fsWatcher.callback = fn;\n return fsWatcher;\n };\n const watchStubResult = sinon.stub(fs, \"watch\").callsFake(watchStub);\n\n const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });\n\n const code1 = IModelTestUtils.getUniqueModelCode(bc, \"newPhysicalModel1\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(bc, code1, true);\n bc.saveChanges();\n\n // immediately after save changes the current txnId in the writeable briefcase changes, but it isn't reflected\n // in the readonly briefcase until the file watcher fires.\n expect(bc[_nativeDb].getCurrentTxnId()).not.equal(roBC[_nativeDb].getCurrentTxnId());\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n // now they should match because restartDefaultTxn in the readonly briefcase reads the changes from the writeable connection\n expect(bc[_nativeDb].getCurrentTxnId()).equal(roBC[_nativeDb].getCurrentTxnId());\n\n // Push the changes to the hub\n\n const prePushChangeset = bc.changeset;\n let eventRaised = false;\n roBC.onChangesetChanged.addOnce((prevCS) => {\n expectEqualChangesets(prevCS, prePushChangeset);\n eventRaised = true;\n });\n\n await bc.pushChanges({ accessToken: adminAccessToken, description: \"test\" });\n const postPushChangeset = bc.changeset;\n assert(!!postPushChangeset);\n expect(prePushChangeset !== postPushChangeset, \"changes should be pushed\");\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n expectEqualChangesets(roBC.changeset, postPushChangeset);\n expect(roBC[_nativeDb].getCurrentTxnId(), \"txn should be updated\").equal(bc[_nativeDb].getCurrentTxnId());\n expect(eventRaised).to.be.true;\n\n roBC.close();\n expect(nClosed).equal(1);\n\n bc.close();\n // NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT\n // call sinon.restore() here. This is because sinon.restore() will restore the stubs for\n // CloudSqlite that HubMock.startup() put in place.\n watchStubResult.restore();\n });\n\n it(\"WatchForChanges - pull\", async () => {\n const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n\n const pathname = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const hubName = \"CompatibilityTest\";\n const iModelId = await HubWrappers.pushIModel(managerAccessToken, iTwinId, pathname, hubName, true);\n\n // Download two copies of the briefcase - manager and super\n const args: RequestNewBriefcaseProps = { iTwinId, iModelId };\n const initialDb = await BriefcaseManager.downloadBriefcase({ accessToken: adminAccessToken, ...args });\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: adminAccessToken, ...args });\n\n // Push some changes - prep for pull workflow.\n const bc1 = await BriefcaseDb.open({ fileName: initialDb.fileName });\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const code2 = IModelTestUtils.getUniqueModelCode(bc1, \"newPhysicalModel2\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(bc1, code2, true);\n const prePushChangeset = bc1.changeset;\n bc1.saveChanges();\n await bc1.pushChanges({ accessToken: adminAccessToken, description: \"test\" });\n const postPushChangeset = bc1.changeset;\n assert(!!prePushChangeset);\n expect(prePushChangeset !== postPushChangeset, \"changes should be pushed\");\n\n bc1.close();\n\n // Writer that pulls + watcher.\n let nClosed = 0;\n const fsWatcher = {\n callback: () => { },\n close: () => ++nClosed,\n };\n const watchStub: any = (_filename: fs.PathLike, _opts: fs.WatchOptions, fn: () => void) => {\n fsWatcher.callback = fn;\n return fsWatcher;\n };\n const watchStubResult = sinon.stub(fs, \"watch\").callsFake(watchStub);\n\n const bc = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n const roBC = await BriefcaseDb.open({ fileName: briefcaseProps.fileName, watchForChanges: true });\n\n const prePullChangeset = bc.changeset;\n let eventRaised = false;\n roBC.onChangesetChanged.addOnce((prevCS) => {\n expectEqualChangesets(prevCS, prePushChangeset);\n eventRaised = true;\n });\n\n await bc.pullChanges();\n\n const postPullChangeset = bc.changeset;\n assert(!!postPullChangeset);\n expect(prePullChangeset !== postPullChangeset, \"changes should be pulled\");\n\n // trigger watcher via stub\n fsWatcher.callback();\n\n expectEqualChangesets(roBC.changeset, postPullChangeset);\n expect(roBC[_nativeDb].getCurrentTxnId(), \"txn should be updated\").equal(bc[_nativeDb].getCurrentTxnId());\n expect(eventRaised).to.be.true;\n\n roBC.close();\n expect(nClosed).equal(1);\n\n bc.close();\n // NOTE: Since HubMock.startup() is called in the before() block and not beforeEach(), we CANNOT\n // call sinon.restore() here. This is because sinon.restore() will restore the stubs for\n // CloudSqlite that HubMock.startup() put in place.\n watchStubResult.restore();\n });\n\n it(\"should handle undo/redo\", async () => {\n const adminAccessToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n // Delete any existing iModels with the same name as the read-write test iModel\n const iModelName = \"CodesUndoRedoPushTest\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ accessToken: adminAccessToken, iTwinId, iModelName, description: \"TestSubject\" });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ accessToken: adminAccessToken, iTwinId, iModelId: rwIModelId });\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // create and insert a new model with code1\n const code1 = IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel1\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(rwIModel, code1, true);\n assert.isTrue(rwIModel.elements.getElement(code1) !== undefined); // throws if element is not found\n\n // create a local txn with that change\n rwIModel.saveChanges(\"inserted newPhysicalModel\");\n\n // Reverse that local txn\n rwIModel.txns.reverseSingleTxn();\n\n try {\n // The model that I just created with code1 should no longer be there.\n const theNewModel = rwIModel.elements.getElement(code1); // throws if element is not found\n assert.isTrue(theNewModel === undefined); // really should not be here.\n assert.fail(); // should not be here.\n } catch {\n // this is what I expect\n }\n\n // Create and insert a model with code2\n const code2 = IModelTestUtils.getUniqueModelCode(rwIModel, \"newPhysicalModel2\");\n await IModelTestUtils.createAndInsertPhysicalPartitionAndModelAsync(rwIModel, code2, true);\n rwIModel.saveChanges(\"inserted generic objects\");\n\n // The iModel should have a model with code1 and not code2\n assert.isTrue(rwIModel.elements.getElement(code2) !== undefined); // throws if element is not found\n\n // Push the changes to the hub\n const prePushChangeset = rwIModel.changeset;\n await rwIModel.pushChanges({ accessToken: adminAccessToken, description: \"test\" });\n const postPushChangeset = rwIModel.changeset;\n assert(!!postPushChangeset);\n expect(prePushChangeset !== postPushChangeset);\n\n rwIModel.close();\n });\n\n it(\"should be able to upgrade a briefcase with an older schema\", async () => {\n /**\n * Test validates that -\n * - User \"manager\" upgrades the BisCore schema in the briefcase from version 1.0.0 to 1.0.10+\n * - User \"super\" can get the upgrade \"manager\" made\n */\n\n /* Setup test - Push an iModel with an old BisCore schema up to the Hub */\n const pathname = IModelTestUtils.resolveAssetFile(\"CompatibilityTestSeed.bim\");\n const hubName = \"CompatibilityTest\";\n const iModelId = await HubWrappers.pushIModel(managerAccessToken, iTwinId, pathname, hubName, true);\n\n // Download two copies of the briefcase - manager and super\n const args: RequestNewBriefcaseProps = { iTwinId, iModelId };\n const managerBriefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: managerAccessToken, ...args });\n const superBriefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: superAccessToken, ...args });\n\n /* User \"manager\" upgrades the briefcase */\n\n // Validate the original state of the BisCore schema in the briefcase\n let iModel = await BriefcaseDb.open({ fileName: managerBriefcaseProps.fileName });\n const beforeVersion = iModel.querySchemaVersion(\"BisCore\");\n assert.isTrue(semver.satisfies(beforeVersion!, \"= 1.0.0\"));\n assert.isFalse(iModel[_nativeDb].hasPendingTxns());\n iModel.close();\n\n // Validate that the BisCore schema is recognized as a recommended upgrade\n let schemaState = BriefcaseDb.validateSchemas(managerBriefcaseProps.fileName, true);\n assert.strictEqual(schemaState, SchemaState.UpgradeRecommended);\n\n // Upgrade the schemas\n await BriefcaseDb.upgradeSchemas(managerBriefcaseProps);\n\n // Validate state after upgrade\n iModel = await BriefcaseDb.open({ fileName: managerBriefcaseProps.fileName });\n const afterVersion = iModel.querySchemaVersion(\"BisCore\");\n assert.isTrue(semver.satisfies(afterVersion!, \">= 1.0.10\"));\n assert.isFalse(iModel[_nativeDb].hasPendingTxns());\n assert.isFalse(iModel.holdsSchemaLock);\n assert.isFalse(iModel[_nativeDb].hasUnsavedChanges());\n iModel.close();\n\n /* User \"super\" can get the upgrade \"manager\" made */\n\n // Validate that the BisCore schema is recognized as a recommended upgrade\n schemaState = BriefcaseDb.validateSchemas(superBriefcaseProps.fileName, true);\n assert.strictEqual(schemaState, SchemaState.UpgradeRecommended);\n\n // Open briefcase and pull change sets to upgrade\n const superIModel = await BriefcaseDb.open({ fileName: superBriefcaseProps.fileName });\n (superBriefcaseProps.changeset as any) = await superIModel.pullChanges({ accessToken: superAccessToken });\n const superVersion = superIModel.querySchemaVersion(\"BisCore\");\n assert.isTrue(semver.satisfies(superVersion!, \">= 1.0.10\"));\n assert.isFalse(superIModel[_nativeDb].hasUnsavedChanges()); // Validate no changes were made\n assert.isFalse(superIModel[_nativeDb].hasPendingTxns()); // Validate no changes were made\n superIModel.close();\n\n // Validate that there are no upgrades required\n schemaState = BriefcaseDb.validateSchemas(superBriefcaseProps.fileName, true);\n assert.strictEqual(schemaState, SchemaState.UpToDate);\n\n // Upgrade the schemas - ensure this is a no-op\n await BriefcaseDb.upgradeSchemas(superBriefcaseProps);\n await HubMock.deleteIModel({ accessToken: managerAccessToken, iTwinId, iModelId });\n });\n\n it(\"changeset size and ec schema version change\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"changeset_size\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n assert.equal(rwIModel[_nativeDb].enableChangesetSizeStats(true), DbResult.BE_SQLITE_OK);\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n rwIModel.saveChanges(\"user 1: schema changeset\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"push schema changeset\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 1);\n }\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n let totalEl = 0;\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n const insertElements = (imodel: BriefcaseDb, className: string = \"Test2dElement\", noOfElements: number = 10, userProp: (n: number) => object) => {\n for (let m = 0; m < noOfElements; ++m) {\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const prop = userProp(++totalEl);\n // Create props\n const geomElement = {\n classFullName: `TestDomain:${className}`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...prop,\n };\n const id = imodel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n }\n };\n const str = new Array(1024).join(\"x\");\n insertElements(rwIModel, \"Test2dElement\", 1024, () => {\n return { s: str };\n });\n assert.equal(1357648, rwIModel[_nativeDb].getChangesetSize());\n\n rwIModel.saveChanges(\"user 1: data\");\n assert.equal(0, rwIModel[_nativeDb].getChangesetSize());\n await rwIModel.pushChanges({ description: \"schema changeset\", accessToken: adminToken });\n rwIModel.close();\n });\n\n it(\"should set a fake verifyCode for codeService that throws error for operations that affect code, if failed to open codeService \", async () => {\n const iModelProps = {\n iModelName: \"codeServiceTest\",\n iTwinId,\n };\n const iModelId = await HubMock.createNewIModel(iModelProps);\n const briefcaseProps = await BriefcaseManager.downloadBriefcase({ accessToken: \"codeServiceTest\", iTwinId, iModelId });\n const originalCreateForIModel = CodeService.createForIModel;\n // can be any errors except 'NoCodeIndex'\n CodeService.createForIModel = async () => {\n throw new CodeService.Error(\"MissingCode\", 0x10000 + 1, \" \");\n };\n const briefcaseDb = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n briefcaseDb.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n let firstNonRootElement = { id: undefined, codeValue: \"test\" };\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n briefcaseDb.withPreparedStatement(\"SELECT * from Bis.Element LIMIT 1 OFFSET 1\", (stmt: ECSqlStatement) => {\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\n firstNonRootElement = stmt.getRow();\n }\n });\n // make change to the briefcaseDb that does not affect code, e.g., save file property\n // expect no error from verifyCode\n expect(() => briefcaseDb.saveFileProperty({ name: \"codeServiceProp\", namespace: \"codeService\", id: 1, subId: 1 }, \"codeService test\")).to.not.throw();\n // make change to the briefcaseDb that affects code that will invoke verifyCode, e.g., update an element with a non-null code\n // expect error from verifyCode\n let newProps = { id: firstNonRootElement.id, code: { ...Code.createEmpty(), value: firstNonRootElement.codeValue }, classFullName: undefined, model: undefined };\n await briefcaseDb.locks.acquireLocks({ exclusive: firstNonRootElement.id });\n expect(() => briefcaseDb.elements.updateElement(newProps)).to.throw(CodeService.Error);\n // make change to the briefcaseDb that will invoke verifyCode with a null(empty) code, e.g., update an element with a null(empty) code\n // expect no error from verifyCode\n newProps = { id: firstNonRootElement.id, code: Code.createEmpty(), classFullName: undefined, model: undefined };\n expect(() => briefcaseDb.elements.updateElement(newProps)).to.not.throw();\n briefcaseDb.close();\n // throw \"NoCodeIndex\", this error should get ignored because it means the iModel isn't enforcing codes. updating an element with an empty code and a non empty code should work without issue.\n CodeService.createForIModel = async () => {\n throw new CodeService.Error(\"NoCodeIndex\", 0x10000 + 1, \" \");\n };\n const briefcaseDb2 = await BriefcaseDb.open({ fileName: briefcaseProps.fileName });\n briefcaseDb2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n await briefcaseDb2.locks.acquireLocks({ exclusive: firstNonRootElement.id });\n // expect no error from verifyCode for empty code\n expect(() => briefcaseDb2.elements.updateElement(newProps)).to.not.throw();\n newProps = { id: firstNonRootElement.id, code: { ...Code.createEmpty(), value: firstNonRootElement.codeValue }, classFullName: undefined, model: undefined };\n // make change to the briefcaseDb that affects code that will invoke verifyCode, e.g., update an element with a non-null code\n // expect no error from verifyCode\n expect(() => briefcaseDb2.elements.updateElement(newProps)).to.not.throw();\n // clean up\n CodeService.createForIModel = originalCreateForIModel;\n briefcaseDb2.close();\n });\n\n it(\"clear cache on schema changes\", async () => {\n const adminToken = await HubWrappers.getAccessToken(TestUserType.SuperManager);\n const userToken = await HubWrappers.getAccessToken(TestUserType.Super);\n // Delete any existing iModels with the same name as the OptimisticConcurrencyTest iModel\n const iModelName = \"SchemaChanges\";\n\n // Create a new empty iModel on the Hub & obtain a briefcase\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\" });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n\n const rwIModel2 = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: userToken });\n\n // enable change tracking\n assert.equal(rwIModel[_nativeDb].enableChangesetSizeStats(true), DbResult.BE_SQLITE_OK);\n assert.equal(rwIModel2[_nativeDb].enableChangesetSizeStats(true), DbResult.BE_SQLITE_OK);\n\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n rwIModel2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n rwIModel.saveChanges(\"user 1: schema changeset\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"schema changeset\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 1);\n }\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n let totalEl = 0;\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n const insertElements = (imodel: BriefcaseDb, className: string = \"Test2dElement\", noOfElements: number = 10, userProp: (n: number) => object) => {\n for (let m = 0; m < noOfElements; ++m) {\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const prop = userProp(++totalEl);\n // Create props\n const geomElement = {\n classFullName: `TestDomain:${className}`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...prop,\n };\n const id = imodel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n }\n };\n\n insertElements(rwIModel, \"Test2dElement\", 10, (n: number) => {\n return { s: `s-${n}` };\n });\n\n assert.equal(3889, rwIModel[_nativeDb].getChangesetSize());\n rwIModel.saveChanges(\"user 1: data changeset\");\n\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"10 instances of test2dElement\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 2);\n }\n let rows: any[] = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rwIModel.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n if (true || \"user pull/merge\") {\n // pull and merge changes\n await rwIModel2.pullChanges({ accessToken: userToken });\n rows = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rwIModel2.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel2.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 10);\n // create some element and push those changes\n await rwIModel2.locks.acquireLocks({ shared: drawingModelId });\n insertElements(rwIModel2, \"Test2dElement\", 10, (n: number) => {\n return { s: `s-${n}` };\n });\n assert.equal(0, rwIModel[_nativeDb].getChangesetSize());\n rwIModel2.saveChanges(\"user 2: data changeset\");\n\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel2.changeset.id;\n await rwIModel2.pushChanges({ accessToken: userToken, description: \"10 instances of test2dElement\" });\n const postPushChangeSetId = rwIModel2.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: userToken });\n assert.equal(changesets.length, 3);\n }\n }\n await rwIModel.pullChanges({ accessToken: adminToken });\n // second schema import ==============================================================\n const schemaV2 = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.01\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n <ECProperty propertyName=\"v\" typeName=\"string\"/>\n </ECEntityClass>\n <ECEntityClass typeName=\"Test2dElement2nd\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"t\" typeName=\"string\"/>\n <ECProperty propertyName=\"r\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schemaV2]);\n assert.equal(0, rwIModel[_nativeDb].getChangesetSize());\n rwIModel.saveChanges(\"user 1: schema changeset2\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ accessToken: adminToken, description: \"schema changeset\" });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 4);\n }\n // create some element and push those changes\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n insertElements(rwIModel, \"Test2dElement\", 10, (n: number) => {\n return {\n s: `s-${n}`, v: `v-${n}`,\n };\n });\n\n // create some element and push those changes\n insertElements(rwIModel, \"Test2dElement2nd\", 10, (n: number) => {\n return {\n t: `t-${n}`, r: `r-${n}`,\n };\n });\n assert.equal(6266, rwIModel[_nativeDb].getChangesetSize());\n rwIModel.saveChanges(\"user 1: data changeset\");\n\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ accessToken: adminToken, description: \"10 instances of test2dElement\" });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n const changesets = await HubMock.queryChangesets({ iModelId: rwIModelId, accessToken: superAccessToken });\n assert.equal(changesets.length, 5);\n }\n rows = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rwIModel.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n\n rows = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rwIModel.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement2nd\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n rows = [];\n for await (const queryRow of rwIModel.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement2nd\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n\n if (true || \"user pull/merge\") {\n // pull and merge changes\n await rwIModel2.pullChanges({ accessToken: userToken });\n rows = [];\n // Following fail without the fix in briefcase manager where we clear statement cache on schema changeset apply\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rwIModel2.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n rows = [];\n // Following fail without native side fix where we clear concurrent query cache on schema changeset apply\n for await (const queryRow of rwIModel2.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 30);\n assert.equal(rows.map((r) => r.s).filter((v) => v).length, 30);\n assert.equal(rows.map((r) => r.v).filter((v) => v).length, 10);\n for (const row of rows) {\n const el: any = rwIModel2.elements.getElementProps(row.id);\n assert.isDefined(el);\n if (row.s) {\n assert.equal(row.s, el.s);\n } else {\n assert.isUndefined(el.s);\n }\n if (row.v) {\n assert.equal(row.v, el.v);\n } else {\n assert.isUndefined(el.v);\n }\n }\n rows = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n rwIModel2.withPreparedStatement(\"SELECT * FROM TestDomain.Test2dElement2nd\", (stmt: ECSqlStatement) => {\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rows.push(stmt.getRow());\n }\n });\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n for (const row of rows) {\n const el: any = rwIModel2.elements.getElementProps(row.id);\n assert.isDefined(el);\n if (row.s) {\n assert.equal(row.s, el.s);\n } else {\n assert.isUndefined(el.s);\n }\n if (row.v) {\n assert.equal(row.v, el.v);\n } else {\n assert.isUndefined(el.v);\n }\n }\n rows = [];\n for await (const queryRow of rwIModel2.createQueryReader(\"SELECT * FROM TestDomain.Test2dElement2nd\", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {\n rows.push(queryRow.toRow());\n }\n assert.equal(rows.length, 10);\n assert.equal(rows.map((r) => r.t).filter((v) => v).length, 10);\n assert.equal(rows.map((r) => r.r).filter((v) => v).length, 10);\n for (const row of rows) {\n const el: any = rwIModel2.elements.getElementProps(row.id);\n assert.isDefined(el);\n if (row.t) {\n assert.equal(row.t, el.t);\n } else {\n assert.isUndefined(el.t);\n }\n if (row.r) {\n assert.equal(row.r, el.r);\n } else {\n assert.isUndefined(el.r);\n }\n }\n }\n rwIModel.close();\n rwIModel2.close();\n });\n\n it(\"pulling a changeset with extents changes should update the extents of the opened imodel\", async () => {\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\n const version0 = IModelTestUtils.resolveAssetFile(\"mirukuru.ibim\");\n const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: \"projectExtentsTest\", version0 });\n const iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId });\n const changesetIdBeforeExtentsChange = iModel.changeset.id;\n const extents = iModel.projectExtents;\n const newExtents = extents.clone();\n newExtents.low.x += 100;\n newExtents.low.y += 100;\n newExtents.high.x += 100;\n newExtents.high.y += 100;\n iModel.updateProjectExtents(newExtents);\n iModel.saveChanges(\"update project extents\");\n await iModel.pushChanges({ description: \"update project extents\" });\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModel);\n const iModelBeforeExtentsChange = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: IModelVersion.asOfChangeSet(changesetIdBeforeExtentsChange).toJSON() });\n const extentsBeforePull = iModelBeforeExtentsChange.projectExtents;\n // Read the extents fileProperty.\n const extentsStrBeforePull = iModelBeforeExtentsChange.queryFilePropertyString({name: \"Extents\", namespace: \"dgn_Db\"});\n const ecefLocationBeforeExtentsChange = iModelBeforeExtentsChange.ecefLocation;\n await iModelBeforeExtentsChange.pullChanges(); // Pulls the extents change.\n const extentsAfterPull = iModelBeforeExtentsChange.projectExtents;\n const extentsStrAfterPull = iModelBeforeExtentsChange.queryFilePropertyString({name: \"Extents\", namespace: \"dgn_Db\"});\n const ecefLocationAfterExtentsChange = iModelBeforeExtentsChange.ecefLocation;\n\n expect(ecefLocationBeforeExtentsChange).to.not.be.undefined;\n expect(ecefLocationAfterExtentsChange).to.not.be.undefined;\n expect(ecefLocationBeforeExtentsChange?.isAlmostEqual(ecefLocationAfterExtentsChange!)).to.be.false;\n expect(extentsStrAfterPull).to.not.equal(extentsStrBeforePull);\n expect(extentsAfterPull.isAlmostEqual(extentsBeforePull)).to.be.false;\n await HubWrappers.closeAndDeleteBriefcaseDb(accessToken, iModelBeforeExtentsChange);\n });\n\n it(\"parent lock should suffice when inserting into deeply nested sub-model\", async () => {\n const version0 = IModelTestUtils.resolveAssetFile(\"test.bim\");\n const iModelId = await HubMock.createNewIModel({ iTwinId, iModelName: \"subModelCoveredByParentLockTest\", version0 });\n let iModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId });\n iModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n /*\n Job Subject\n +- DefinitionPartition -- [DefinitionModel]\n */\n\n await iModel.locks.acquireLocks({ shared: IModel.repositoryModelId });\n const jobSubjectId = IModelTestUtils.createJobSubjectElement(iModel, \"JobSubject\").insert();\n const definitionModelId = DefinitionModel.insert(iModel, jobSubjectId, \"Definition\");\n\n iModel.saveChanges();\n const locks = iModel.locks;\n expect(locks.isServerBased).true;\n await iModel.pushChanges({ description: \"create model\" });\n expect(iModel.locks).equal(locks); // pushing should not change your locks\n\n /*\n Job Subject <--- Lock this\n +- DefinitionPartition -- [DefinitionModel]\n SpatialCategory <=== insert this\n DrawingCategory \"\n */\n assert.isFalse(iModel.locks.holdsExclusiveLock(jobSubjectId));\n assert.isFalse(iModel.locks.holdsExclusiveLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(definitionModelId));\n await iModel.locks.acquireLocks({ exclusive: jobSubjectId });\n iModel.locks.checkExclusiveLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(definitionModelId, \"\", \"\");\n iModel.locks.checkExclusiveLock(definitionModelId, \"\", \"\");\n\n const spatialCategoryId = SpatialCategory.insert(iModel, definitionModelId, \"SpatialCategory\", new SubCategoryAppearance()); // throws if we get locking error\n const drawingCategoryId = DrawingCategory.insert(iModel, definitionModelId, \"DrawingCategory\", new SubCategoryAppearance());\n\n assert.isTrue(iModel.elements.getElement(spatialCategoryId).model === definitionModelId);\n assert.isTrue(iModel.elements.getElement(drawingCategoryId).model === definitionModelId);\n\n iModel.saveChanges();\n await iModel.pushChanges({ description: \"insert category\" });\n\n /*\n Create some more nesting.\n\n Job Subject <--- Lock this\n +- DefinitionPartition -- [DefinitionModel]\n | SpatialCategory\n +- Child Subject <== Insert\n +- DocumentList -- [DocumentListModel] \"\n Drawing -- [DrawingModel] \"\n */\n assert.isFalse(iModel.locks.holdsExclusiveLock(jobSubjectId));\n assert.isFalse(iModel.locks.holdsExclusiveLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(definitionModelId));\n await iModel.locks.acquireLocks({ exclusive: jobSubjectId });\n iModel.locks.checkExclusiveLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(IModel.repositoryModelId, \"\", \"\");\n\n const childSubjectId = Subject.insert(iModel, jobSubjectId, \"Child Subject\");\n\n const documentListModelId = DocumentListModel.insert(iModel, childSubjectId, \"Document\"); // creates DocumentList and DocumentListModel\n assert.isTrue(Id64.isValidId64(documentListModelId));\n const drawingModelId = Drawing.insert(iModel, documentListModelId, \"Drawing\"); // creates Drawing and DrawingModel\n\n assert.isTrue(iModel.elements.getElement(childSubjectId).parent?.id === jobSubjectId);\n assert.isTrue(iModel.elements.getElement(childSubjectId).model === IModel.repositoryModelId);\n assert.isTrue(iModel.elements.getElement(documentListModelId).parent?.id === childSubjectId);\n assert.isTrue(iModel.elements.getElement(documentListModelId).model === IModel.repositoryModelId);\n assert.isTrue(iModel.elements.getElement(drawingModelId).model === documentListModelId);\n\n iModel.saveChanges();\n await iModel.pushChanges({ description: \"insert doc list with nested drawing model\" });\n\n /*\n Verify that even a deeply nested insertion is covered by the exclusive lock on the top-level parent.\n\n Job Subject <--- Lock this\n +- DefinitionPartition -- DefinitionModel\n | SpatialCategory\n +- Child Subject\n +- DocumentList -- [DocumentListModel]\n Drawing -- [DrawingModel]\n DrawingGraphic <== Insert this\n */\n assert.isFalse(iModel.locks.holdsExclusiveLock(jobSubjectId));\n assert.isFalse(iModel.locks.holdsExclusiveLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(definitionModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(documentListModelId));\n assert.isFalse(iModel.locks.holdsSharedLock(drawingModelId));\n await iModel.locks.acquireLocks({ exclusive: jobSubjectId });\n iModel.locks.checkExclusiveLock(jobSubjectId, \"\", \"\");\n iModel.locks.checkSharedLock(IModel.repositoryModelId, \"\", \"\");\n iModel.locks.checkSharedLock(documentListModelId, \"\", \"\");\n iModel.locks.checkSharedLock(drawingModelId, \"\", \"\");\n\n const drawingGraphicProps1: GeometricElement2dProps = {\n classFullName: DrawingGraphic.classFullName,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n userLabel: \"DrawingGraphic1\",\n geom: IModelTestUtils.createRectangle(Point2d.create(1, 1)),\n placement: { origin: Point2d.create(2, 2), angle: 0 },\n };\n const drawingGraphicId1 = iModel.elements.insertElement(drawingGraphicProps1);\n\n assert.isTrue(iModel.elements.getElement(drawingGraphicId1).model === drawingModelId);\n iModel.saveChanges();\n expect(iModel.locks.holdsExclusiveLock(drawingModelId)).true;\n\n const fileName = iModel[_nativeDb].getFilePath();\n iModel.close(); // close rw\n iModel = await BriefcaseDb.open({ fileName, readonly: true }); // reopen readonly\n expect(iModel.locks.isServerBased).false; // readonly sessions should not have server based locks\n\n // verify we can push changes from a readonly briefcase\n await iModel.pushChanges({ description: \"insert graphic into nested sub-model\" });\n\n // try it again to verify we can get the ServerBasedLocks again\n await iModel.pushChanges({ description: \"should do nothing\" });\n iModel.close();\n\n // reopen readwrite to verify we released all locks from readonly briefcase\n iModel = await BriefcaseDb.open({ fileName });\n expect(iModel.locks.isServerBased).true;\n const serverLocks = iModel.locks as ServerBasedLocks;\n expect(serverLocks.holdsExclusiveLock(drawingModelId)).false;\n expect(serverLocks.getLockCount(LockState.Shared)).equal(0);\n expect(serverLocks.getLockCount(LockState.Exclusive)).equal(0);\n iModel.close();\n\n });\n\n});\n"]}
@@ -80,6 +80,7 @@ describe("RenderMaterialElement", () => {
80
80
  const seedFileName = IModelTestUtils.resolveAssetFile("LargeNumericRenderMaterialTextureId.bim");
81
81
  const db = SnapshotDb.openFile(seedFileName);
82
82
  let id;
83
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
83
84
  db.withStatement(`SELECT ECInstanceId from Bis.RenderMaterial`, (stmt) => {
84
85
  expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);
85
86
  id = stmt.getRow().id;