@itwin/core-backend 5.14.0-dev.11 → 5.14.0-dev.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlTestRunner.test.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestRunner.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport { DbResult } from \"@itwin/core-bentley\";\r\nimport { ECSqlRowArg, ECSqlStatement, ECSqlSyncReader, SnapshotDb } from \"../../../core-backend\";\r\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\r\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { buildBinaryData, ECDbMarkdownTestParser, ECDbTestMode, ECDbTestProps, ECDbTestRowFormat } from \"./ECSqlTestParser\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { ECSqlDatasets } from \"../dataset/ECSqlDatasets\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\n\r\nenum TestDataset {\r\n AllProperties = \"AllProperties.bim\"\r\n}\r\n\r\nconst snapshotDbs: { [key in TestDataset]?: SnapshotDb } = {};\r\n\r\ndescribe(\"Markdown based ECDb test runner\", async () => {\r\n before(async () => {\r\n await ECSqlDatasets.generateFiles();\r\n const datasetFilePath = path.join(KnownTestLocations.outputDir, \"ECSqlTests\", TestDataset.AllProperties);\r\n if (!fs.existsSync(datasetFilePath)) {\r\n throw new Error(`Dataset file ${datasetFilePath} does not exist`);\r\n }\r\n snapshotDbs[TestDataset.AllProperties] = SnapshotDb.openFile(datasetFilePath);\r\n });\r\n\r\n after(() => {\r\n for (const key in snapshotDbs) {\r\n if (snapshotDbs.hasOwnProperty(key)) {\r\n (snapshotDbs[key as keyof typeof snapshotDbs])?.close();\r\n }\r\n }\r\n });\r\n const tests: ECDbTestProps[] = ECDbMarkdownTestParser.parse();\r\n\r\n //TODO: Mechanism to run a single test, put something like it.only into the test md which causes this loop to only run those tests\r\n for (const test of tests) {\r\n if (!test.dataset) {\r\n logWarning(`Skipping test ${test.title} because it does not have a dataset`);\r\n continue;\r\n }\r\n\r\n if (test.dataset.toLowerCase() !== TestDataset.AllProperties.toLowerCase()) {\r\n logWarning(`Skipping test ${test.title} because dataset ${test.dataset} is not recognized`);\r\n continue;\r\n }\r\n const dataset = TestDataset.AllProperties;\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.Statement) {\r\n if (test.skip)\r\n it(`${test.fileName}: ${test.title} (Statement) skipped. Reason: ${test.skip}`);\r\n else if (test.only)\r\n it.only(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n else\r\n it(`${test.fileName}: ${test.title} (Statement)`, () => {\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n }\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.QueryReader) {\r\n if (test.skip) {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);\r\n }\r\n else if (test.only) {\r\n it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n else {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader)`, async () => {\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async () => {\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n }\r\n }\r\n});\r\n\r\nfunction runECSqlStatementTest(test: ECDbTestProps, dataset: TestDataset) {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n let stmt: ECSqlStatement | undefined;\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n try {\r\n // TODO: statement options should be exposed through the markdown\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n stmt = imodel.prepareStatement(test.sql); // TODO: Wire up logic for tests we expect to fail during prepare\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during prepare of Statement: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n try {\r\n if (test.binders !== undefined) {\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n stmt.bindNull(id);\r\n break;\r\n case \"string\":\r\n stmt.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n stmt.bindInteger(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n stmt.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n stmt.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n stmt.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"datetime\":\r\n stmt.bindDateTime(id, binder.value);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n stmt.bindPoint2d(id, { x: parsedVal2d.X, y: parsedVal2d.Y });\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });\r\n break;\r\n case \"range3d\":\r\n const parsedRange3d = JSON.parse(binder.value);\r\n stmt.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n stmt.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"navigation\":\r\n stmt.bindNavigation(id, JSON.parse(binder.value));\r\n break;\r\n case \"array\":\r\n stmt.bindArray(id, JSON.parse(binder.value));\r\n break;\r\n case \"struct\":\r\n stmt.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n } // if test.binders\r\n\r\n let resultCount = 0;\r\n let stepResult: DbResult;\r\n while ((stepResult = stmt.step()) === DbResult.BE_SQLITE_ROW) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n const colCount = stmt.getColumnCount();\r\n assert.strictEqual(colCount, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colCount}`);\r\n for (let i = 0; i < colCount; i++) {\r\n const colInfo = stmt.getValue(i).columnInfo;\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.getPropertyName(), expectedColInfo.name, `Expected property name ${expectedColInfo.name} but got ${colInfo.getPropertyName()} for column index ${i}`);\r\n //if (expectedColInfo.isDynamicProp !== undefined) TODO: Is this not exposed?\r\n // assert.strictEqual(colInfo..isDynamicProperty, expectedColInfo.isDynamicProp, `Expected dynamic property ${expectedColInfo.isDynamicProp} but got ${colInfo.isDynamicProperty} for column index ${i}`);\r\n // TODO: Extended type name not exposed??\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.isGeneratedProperty(), expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.isGeneratedProperty()} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.getAccessString(), expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.getAccessString()} for column index ${i}`);\r\n if (expectedColInfo.type !== undefined)\r\n assert.strictEqual(ECSqlValueType[colInfo.getType()], expectedColInfo.type, `Expected type ${expectedColInfo.type} but got ${ECSqlValueType[colInfo.getType()]} for column index ${i}`);\r\n if (expectedColInfo.originPropertyName !== undefined)\r\n assert.strictEqual(colInfo.getOriginPropertyName(), expectedColInfo.originPropertyName, `Expected Origin PropertyName ${expectedColInfo.originPropertyName} but got ${colInfo.getOriginPropertyName()} for column index ${i}`);\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n expectedResult = buildBinaryData(expectedResult);\r\n const rowArgs: ECSqlRowArg = { rowFormat: getRowFormat(test.rowFormat), classIdsToClassNames: test.convertClassIdsToClassNames };\r\n const actualResult = stmt.getRow(rowArgs);\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n stmt[Symbol.dispose]();\r\n stmt = undefined;\r\n\r\n if (resultCount === 0 && test.stepStatus) {\r\n const stepResultString = DbResult[stepResult];\r\n assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n } finally {\r\n if (stmt !== undefined)\r\n stmt[Symbol.dispose]();\r\n }\r\n}\r\n\r\nfunction getRowFormat(rowFormat: ECDbTestRowFormat): QueryRowFormat {\r\n switch (rowFormat) {\r\n case ECDbTestRowFormat.ECSqlNames:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n case ECDbTestRowFormat.ECSqlIndexes:\r\n return QueryRowFormat.UseECSqlPropertyIndexes;\r\n case ECDbTestRowFormat.JsNames:\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return QueryRowFormat.UseJsPropertyNames;\r\n default:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n }\r\n}\r\n\r\n/** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */\r\nfunction buildQueryBinder(test: ECDbTestProps): QueryBinder | undefined {\r\n if (test.binders === undefined)\r\n return undefined;\r\n\r\n const params = new QueryBinder();\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n params.bindNull(id);\r\n break;\r\n case \"string\":\r\n params.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n params.bindInt(id, Number.parseInt(binder.value));\r\n break;\r\n case \"long\":\r\n // eslint-disable-next-line radix\r\n params.bindLong(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n params.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n params.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n params.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));\r\n break;\r\n case \"range3d\":\r\n const parsedRange3d = JSON.parse(binder.value);\r\n params.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n params.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"struct\":\r\n params.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n return params;\r\n}\r\n\r\n/** Builds the common query options object from the test configuration. */\r\nfunction buildReaderQueryOptions(test: ECDbTestProps): QueryOptions {\r\n const queryOptions: QueryOptions = {};\r\n queryOptions.rowFormat = getRowFormat(test.rowFormat);\r\n if (test.abbreviateBlobs)\r\n queryOptions.abbreviateBlobs = true;\r\n if (test.convertClassIdsToClassNames) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n queryOptions.convertClassIdsToClassNames = true;\r\n }\r\n return queryOptions;\r\n}\r\n\r\n/**\r\n * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.\r\n * Used by both ECSqlReader and ECSqlSyncReader test paths.\r\n */\r\nfunction runResultAssertions(test: ECDbTestProps, rows: any, colMetaData: QueryPropertyMetaData[]) {\r\n let resultCount = 0;\r\n while (resultCount < rows.length) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n assert.strictEqual(colMetaData.length, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colMetaData.length}`);\r\n for (let i = 0; i < colMetaData.length; i++) {\r\n const colInfo = colMetaData[i];\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.name, expectedColInfo.name, `Expected name ${expectedColInfo.name} but got ${colInfo.name} for column index ${i}`);\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.generated, expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.generated} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.accessString, expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.accessString} for column index ${i}`);\r\n if (expectedColInfo.typeName !== undefined)\r\n assert.strictEqual(colInfo.typeName, expectedColInfo.typeName, `Expected type name ${expectedColInfo.typeName} but got ${colInfo.typeName} for column index ${i}`);\r\n if (expectedColInfo.className !== undefined)\r\n assert.strictEqual(colInfo.className, expectedColInfo.className, `Expected class name ${expectedColInfo.className} but got ${colInfo.className} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendedType, expectedColInfo.extendedType, `Expected extended type ${expectedColInfo.extendedType} but got ${colInfo.extendedType} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendType, expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType, `Expected extend type ${expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType} but got ${colInfo.extendType} for column index ${i}`); // eslint-disable-line @typescript-eslint/no-deprecated\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n // replace props in expected result, TODO: optimize this\r\n expectedResult = buildBinaryData(expectedResult);\r\n\r\n const actualResult = rows[resultCount]; // TODO: should we test getValue() as well?\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlReader test paths.\r\n */\r\nasync function runAssertionsOnReader(test: ECDbTestProps, reader: ECSqlReader, label: string): Promise<void> {\r\n let rows;\r\n try {\r\n rows = await reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = await reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlSyncReader test paths.\r\n */\r\nfunction runAssertionsOnSyncReader(test: ECDbTestProps, reader: ECSqlSyncReader, label: string): void {\r\n let rows;\r\n try {\r\n rows = reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\nasync function runECSqlReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n let reader: ECSqlReader;\r\n try {\r\n const params = buildQueryBinder(test);\r\n reader = imodel.createQueryReader(test.sql, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlReader: ${error.message}`);\r\n }\r\n\r\n await runAssertionsOnReader(test, reader, \"ECSqlReader\");\r\n}\r\n\r\nasync function runECSqlSyncReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n try {\r\n const params = buildQueryBinder(test);\r\n imodel.withQueryReader(test.sql, reader => {\r\n runAssertionsOnSyncReader(test, reader, \"ECSqlSyncReader\");\r\n }, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);\r\n }\r\n}\r\n\r\nfunction checkingExpectedResults(rowFormat: ECDbTestRowFormat, actualResult: any, expectedResult: any, indexesToInclude?: number[]) {\r\n if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {\r\n let i: any = 0;\r\n for (const key of Object.keys(expectedResult)) {\r\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\r\n const actual = typeof actualResult[indexesToInclude[i]] === \"string\" ? actualResult[indexesToInclude[i]].trim() : actualResult[indexesToInclude[i]];\r\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);\r\n i++;\r\n }\r\n }\r\n else {\r\n for (const key of Object.keys(expectedResult)) {\r\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\r\n const actual = typeof actualResult[key] === \"string\" ? actualResult[key].trim() : actualResult[key];\r\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);\r\n }\r\n }\r\n}\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}\r\n"]}
1
+ {"version":3,"file":"ECSqlTestRunner.test.js","sourceRoot":"","sources":["../../../../../src/test/ecsql/src/ECSqlTestRunner.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\nimport { assert } from \"chai\";\r\nimport { DbResult } from \"@itwin/core-bentley\";\r\nimport { ECSqlRowArg, ECSqlStatement, ECSqlSyncReader, SnapshotDb } from \"../../../core-backend\";\r\nimport { KnownTestLocations } from \"../../KnownTestLocations\";\r\nimport { ECSqlReader, ECSqlValueType, QueryBinder, QueryOptions, QueryPropertyMetaData, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { buildBinaryData, ECDbMarkdownTestParser, ECDbTestMode, ECDbTestProps, ECDbTestRowFormat } from \"./ECSqlTestParser\";\r\nimport * as path from \"path\";\r\nimport * as fs from \"fs\";\r\nimport { ECSqlDatasets } from \"../dataset/ECSqlDatasets\";\r\nimport { Point2d, Point3d } from \"@itwin/core-geometry\";\r\n\r\nenum TestDataset {\r\n AllProperties = \"AllProperties.bim\"\r\n}\r\n\r\nconst snapshotDbs: { [key in TestDataset]?: SnapshotDb } = {};\r\nlet supportsRelations = false;\r\n\r\ndescribe(\"Markdown based ECDb test runner\", async () => {\r\n before(async () => {\r\n await ECSqlDatasets.generateFiles();\r\n const datasetFilePath = path.join(KnownTestLocations.outputDir, \"ECSqlTests\", TestDataset.AllProperties);\r\n if (!fs.existsSync(datasetFilePath)) {\r\n throw new Error(`Dataset file ${datasetFilePath} does not exist`);\r\n }\r\n const snapshotDb = SnapshotDb.openFile(datasetFilePath);\r\n snapshotDbs[TestDataset.AllProperties] = snapshotDb;\r\n\r\n supportsRelations = snapshotDb.withSqliteStatement(\r\n \"SELECT 1 FROM pragma_module_list WHERE name='relations'\",\r\n (statement) => statement.step() === DbResult.BE_SQLITE_ROW,\r\n );\r\n if (supportsRelations) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n using _statement = snapshotDb.prepareStatement(\r\n \"SELECT RelatedECInstanceId FROM ECVLib.Relations(1, 1) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\",\r\n false,\r\n );\r\n }\r\n });\r\n\r\n after(() => {\r\n for (const key in snapshotDbs) {\r\n if (snapshotDbs.hasOwnProperty(key)) {\r\n (snapshotDbs[key as keyof typeof snapshotDbs])?.close();\r\n }\r\n }\r\n });\r\n const tests: ECDbTestProps[] = ECDbMarkdownTestParser.parse();\r\n\r\n //TODO: Mechanism to run a single test, put something like it.only into the test md which causes this loop to only run those tests\r\n for (const test of tests) {\r\n if (!test.dataset) {\r\n logWarning(`Skipping test ${test.title} because it does not have a dataset`);\r\n continue;\r\n }\r\n\r\n if (test.dataset.toLowerCase() !== TestDataset.AllProperties.toLowerCase()) {\r\n logWarning(`Skipping test ${test.title} because dataset ${test.dataset} is not recognized`);\r\n continue;\r\n }\r\n const dataset = TestDataset.AllProperties;\r\n const skipIfUnsupported = function (this: Mocha.Context) {\r\n if (\"RelationsVTTests.ecsql.md\" === test.fileName && !supportsRelations)\r\n this.skip();\r\n };\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.Statement) {\r\n if (test.skip)\r\n it(`${test.fileName}: ${test.title} (Statement) skipped. Reason: ${test.skip}`);\r\n else if (test.only)\r\n it.only(`${test.fileName}: ${test.title} (Statement)`, function () {\r\n skipIfUnsupported.call(this);\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n else\r\n it(`${test.fileName}: ${test.title} (Statement)`, function () {\r\n skipIfUnsupported.call(this);\r\n runECSqlStatementTest(test, dataset);\r\n });\r\n }\r\n\r\n if (test.mode === ECDbTestMode.Both || test.mode === ECDbTestMode.QueryReader) {\r\n if (test.skip) {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader) skipped. Reason: ${test.skip}`);\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader) skipped. Reason: ${test.skip}`);\r\n }\r\n else if (test.only) {\r\n it.only(`${test.fileName}: ${test.title} (ECSqlReader)`, async function () {\r\n skipIfUnsupported.call(this);\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it.only(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async function () {\r\n skipIfUnsupported.call(this);\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n else {\r\n it(`${test.fileName}: ${test.title} (ECSqlReader)`, async function () {\r\n skipIfUnsupported.call(this);\r\n await runECSqlReaderTest(test, dataset);\r\n });\r\n it(`${test.fileName}: ${test.title} (ECSqlSyncReader)`, async function () {\r\n skipIfUnsupported.call(this);\r\n await runECSqlSyncReaderTest(test, dataset);\r\n });\r\n }\r\n }\r\n }\r\n});\r\n\r\nfunction runECSqlStatementTest(test: ECDbTestProps, dataset: TestDataset) {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n let stmt: ECSqlStatement | undefined;\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n try {\r\n // TODO: statement options should be exposed through the markdown\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n stmt = imodel.prepareStatement(test.sql); // TODO: Wire up logic for tests we expect to fail during prepare\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during prepare of Statement: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n try {\r\n if (test.binders !== undefined) {\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n stmt.bindNull(id);\r\n break;\r\n case \"string\":\r\n stmt.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n stmt.bindInteger(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n stmt.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n stmt.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n stmt.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"datetime\":\r\n stmt.bindDateTime(id, binder.value);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n stmt.bindPoint2d(id, { x: parsedVal2d.X, y: parsedVal2d.Y });\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n stmt.bindPoint3d(id, { x: parsedVal3d.X, y: parsedVal3d.Y, z: parsedVal3d.Z });\r\n break;\r\n case \"range3d\":\r\n const parsedRange3d = JSON.parse(binder.value);\r\n stmt.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n stmt.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"navigation\":\r\n stmt.bindNavigation(id, JSON.parse(binder.value));\r\n break;\r\n case \"array\":\r\n stmt.bindArray(id, JSON.parse(binder.value));\r\n break;\r\n case \"struct\":\r\n stmt.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n } // if test.binders\r\n\r\n let resultCount = 0;\r\n let stepResult: DbResult;\r\n while ((stepResult = stmt.step()) === DbResult.BE_SQLITE_ROW) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n const colCount = stmt.getColumnCount();\r\n assert.strictEqual(colCount, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colCount}`);\r\n for (let i = 0; i < colCount; i++) {\r\n const colInfo = stmt.getValue(i).columnInfo;\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.getPropertyName(), expectedColInfo.name, `Expected property name ${expectedColInfo.name} but got ${colInfo.getPropertyName()} for column index ${i}`);\r\n //if (expectedColInfo.isDynamicProp !== undefined) TODO: Is this not exposed?\r\n // assert.strictEqual(colInfo..isDynamicProperty, expectedColInfo.isDynamicProp, `Expected dynamic property ${expectedColInfo.isDynamicProp} but got ${colInfo.isDynamicProperty} for column index ${i}`);\r\n // TODO: Extended type name not exposed??\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.isGeneratedProperty(), expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.isGeneratedProperty()} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.getAccessString(), expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.getAccessString()} for column index ${i}`);\r\n if (expectedColInfo.type !== undefined)\r\n assert.strictEqual(ECSqlValueType[colInfo.getType()], expectedColInfo.type, `Expected type ${expectedColInfo.type} but got ${ECSqlValueType[colInfo.getType()]} for column index ${i}`);\r\n if (expectedColInfo.originPropertyName !== undefined)\r\n assert.strictEqual(colInfo.getOriginPropertyName(), expectedColInfo.originPropertyName, `Expected Origin PropertyName ${expectedColInfo.originPropertyName} but got ${colInfo.getOriginPropertyName()} for column index ${i}`);\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n expectedResult = buildBinaryData(expectedResult);\r\n const rowArgs: ECSqlRowArg = { rowFormat: getRowFormat(test.rowFormat), classIdsToClassNames: test.convertClassIdsToClassNames };\r\n const actualResult = stmt.getRow(rowArgs);\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n stmt[Symbol.dispose]();\r\n stmt = undefined;\r\n\r\n if (resultCount === 0 && test.stepStatus) {\r\n const stepResultString = DbResult[stepResult];\r\n assert.strictEqual(stepResultString, test.stepStatus, `Expected step status ${test.stepStatus} but got ${stepResultString}`);\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n } finally {\r\n if (stmt !== undefined)\r\n stmt[Symbol.dispose]();\r\n }\r\n}\r\n\r\nfunction getRowFormat(rowFormat: ECDbTestRowFormat): QueryRowFormat {\r\n switch (rowFormat) {\r\n case ECDbTestRowFormat.ECSqlNames:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n case ECDbTestRowFormat.ECSqlIndexes:\r\n return QueryRowFormat.UseECSqlPropertyIndexes;\r\n case ECDbTestRowFormat.JsNames:\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return QueryRowFormat.UseJsPropertyNames;\r\n default:\r\n return QueryRowFormat.UseECSqlPropertyNames;\r\n }\r\n}\r\n\r\n/** Builds a QueryBinder from the test's binder definitions. Returns undefined when the test has no binders. */\r\nfunction buildQueryBinder(test: ECDbTestProps): QueryBinder | undefined {\r\n if (test.binders === undefined)\r\n return undefined;\r\n\r\n const params = new QueryBinder();\r\n for (const binder of test.binders) {\r\n // eslint-disable-next-line radix\r\n let id: number | string = Number.parseInt(binder.indexOrName);\r\n if (isNaN(id))\r\n id = binder.indexOrName;\r\n\r\n switch (binder.type.toLowerCase()) { // TODO: replace props variables in binder.value\r\n case \"null\":\r\n params.bindNull(id);\r\n break;\r\n case \"string\":\r\n params.bindString(id, binder.value);\r\n break;\r\n case \"int\":\r\n // eslint-disable-next-line radix\r\n params.bindInt(id, Number.parseInt(binder.value));\r\n break;\r\n case \"long\":\r\n // eslint-disable-next-line radix\r\n params.bindLong(id, Number.parseInt(binder.value));\r\n break;\r\n case \"double\":\r\n params.bindDouble(id, Number.parseFloat(binder.value));\r\n break;\r\n case \"id\":\r\n params.bindId(id, binder.value);\r\n break;\r\n case \"idset\":\r\n const values: string[] = binder.value.slice(1, -1).split(\",\");\r\n const trimmedValues = values.map((value: string) =>\r\n value.trim()\r\n );\r\n params.bindIdSet(id, trimmedValues);\r\n break;\r\n case \"point2d\":\r\n const parsedVal2d = JSON.parse(binder.value);\r\n params.bindPoint2d(id, new Point2d(parsedVal2d.X, parsedVal2d.Y));\r\n break;\r\n case \"point3d\":\r\n const parsedVal3d = JSON.parse(binder.value);\r\n params.bindPoint3d(id, new Point3d(parsedVal3d.X, parsedVal3d.Y, parsedVal3d.Z));\r\n break;\r\n case \"range3d\":\r\n const parsedRange3d = JSON.parse(binder.value);\r\n params.bindRange3d(id, { low: { x: parsedRange3d.low.x, y: parsedRange3d.low.y, z: parsedRange3d.low.z }, high: { x: parsedRange3d.high.x, y: parsedRange3d.high.y, z: parsedRange3d.high.z } });\r\n break;\r\n case \"blob\":\r\n const arrayValues: string[] = binder.value.slice(1, -1).split(\",\");\r\n const numbers = arrayValues.map((value: string) =>\r\n // eslint-disable-next-line radix\r\n parseInt(value.trim())\r\n );\r\n params.bindBlob(id, Uint8Array.of(...numbers));\r\n break;\r\n case \"struct\":\r\n params.bindStruct(id, JSON.parse(binder.value));\r\n break;\r\n default:\r\n assert.fail(`Unsupported binder type ${binder.type}`);\r\n } // switch binder.type\r\n } // for binder\r\n return params;\r\n}\r\n\r\n/** Builds the common query options object from the test configuration. */\r\nfunction buildReaderQueryOptions(test: ECDbTestProps): QueryOptions {\r\n const queryOptions: QueryOptions = {};\r\n queryOptions.rowFormat = getRowFormat(test.rowFormat);\r\n if (test.abbreviateBlobs)\r\n queryOptions.abbreviateBlobs = true;\r\n if (test.convertClassIdsToClassNames) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n queryOptions.convertClassIdsToClassNames = true;\r\n }\r\n return queryOptions;\r\n}\r\n\r\n/**\r\n * Shared assertion logic for QueryReader tests that operates on the result rows and column metadata.\r\n * Used by both ECSqlReader and ECSqlSyncReader test paths.\r\n */\r\nfunction runResultAssertions(test: ECDbTestProps, rows: any, colMetaData: QueryPropertyMetaData[]) {\r\n let resultCount = 0;\r\n while (resultCount < rows.length) {\r\n if (resultCount === 0 && test.columnInfo) {\r\n // Verify the columns on the first result row (TODO: for dynamic columns we have to do this every item)\r\n assert.strictEqual(colMetaData.length, test.columnInfo.length, `Expected ${test.columnInfo.length} columns but got ${colMetaData.length}`);\r\n for (let i = 0; i < colMetaData.length; i++) {\r\n const colInfo = colMetaData[i];\r\n const expectedColInfo = test.columnInfo[i];\r\n // cannot directly compare against colInfo because it has methods instead of getters\r\n assert.strictEqual(colInfo.name, expectedColInfo.name, `Expected name ${expectedColInfo.name} but got ${colInfo.name} for column index ${i}`);\r\n if (expectedColInfo.generated !== undefined)\r\n assert.strictEqual(colInfo.generated, expectedColInfo.generated, `Expected generated property ${expectedColInfo.generated} but got ${colInfo.generated} for column index ${i}`);\r\n if (expectedColInfo.accessString !== undefined)\r\n assert.strictEqual(colInfo.accessString, expectedColInfo.accessString, `Expected access string ${expectedColInfo.accessString} but got ${colInfo.accessString} for column index ${i}`);\r\n if (expectedColInfo.typeName !== undefined)\r\n assert.strictEqual(colInfo.typeName, expectedColInfo.typeName, `Expected type name ${expectedColInfo.typeName} but got ${colInfo.typeName} for column index ${i}`);\r\n if (expectedColInfo.className !== undefined)\r\n assert.strictEqual(colInfo.className, expectedColInfo.className, `Expected class name ${expectedColInfo.className} but got ${colInfo.className} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendedType, expectedColInfo.extendedType, `Expected extended type ${expectedColInfo.extendedType} but got ${colInfo.extendedType} for column index ${i}`);\r\n assert.strictEqual(colInfo.extendType, expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType, `Expected extend type ${expectedColInfo.extendedType === undefined ? \"\" : expectedColInfo.extendedType} but got ${colInfo.extendType} for column index ${i}`); // eslint-disable-line @typescript-eslint/no-deprecated\r\n }\r\n }\r\n\r\n if (test.expectedResults !== undefined && test.expectedResults.length > resultCount) {\r\n let expectedResult = test.expectedResults[resultCount];\r\n // replace props in expected result, TODO: optimize this\r\n expectedResult = buildBinaryData(expectedResult);\r\n\r\n const actualResult = rows[resultCount]; // TODO: should we test getValue() as well?\r\n checkingExpectedResults(test.rowFormat, actualResult, expectedResult, test.indexesToIncludeInResults);\r\n }\r\n resultCount++;\r\n }\r\n\r\n if (test.expectedResults && test.expectedResults.length !== resultCount) {\r\n assert.fail(`Expected ${test.expectedResults.length} rows but got ${resultCount}`);\r\n }\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlReader test paths.\r\n */\r\nasync function runAssertionsOnReader(test: ECDbTestProps, reader: ECSqlReader, label: string): Promise<void> {\r\n let rows;\r\n try {\r\n rows = await reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = await reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\n/**\r\n * Shared assertion logic that operates on an already-created ECSqlReader.\r\n * Used by ECSqlSyncReader test paths.\r\n */\r\nfunction runAssertionsOnSyncReader(test: ECDbTestProps, reader: ECSqlSyncReader, label: string): void {\r\n let rows;\r\n try {\r\n rows = reader.toArray();\r\n }\r\n catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during execution of ${label}: ${error.message}`);\r\n }\r\n\r\n if (test.errorDuringPrepare)\r\n assert.fail(`Statement is expected to fail during prepare`);\r\n\r\n const colMetaData = reader.getMetaData();\r\n runResultAssertions(test, rows, colMetaData);\r\n}\r\n\r\nasync function runECSqlReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n let reader: ECSqlReader;\r\n try {\r\n const params = buildQueryBinder(test);\r\n reader = imodel.createQueryReader(test.sql, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlReader: ${error.message}`);\r\n }\r\n\r\n await runAssertionsOnReader(test, reader, \"ECSqlReader\");\r\n}\r\n\r\nasync function runECSqlSyncReaderTest(test: ECDbTestProps, dataset: TestDataset): Promise<void> {\r\n const imodel = snapshotDbs[dataset];\r\n if (!imodel) {\r\n assert.fail(`Dataset ${dataset} is not loaded`);\r\n }\r\n\r\n if (test.sql === undefined) {\r\n assert.fail(\"Test does not have an ECSql statement\");\r\n }\r\n\r\n const queryOptions = buildReaderQueryOptions(test);\r\n\r\n try {\r\n const params = buildQueryBinder(test);\r\n imodel.withQueryReader(test.sql, reader => {\r\n runAssertionsOnSyncReader(test, reader, \"ECSqlSyncReader\");\r\n }, params, queryOptions);\r\n } catch (error: any) {\r\n if (test.errorDuringPrepare)\r\n return;\r\n else\r\n assert.fail(`Error during creating ECSqlSyncReader: ${error.message}`);\r\n }\r\n}\r\n\r\nfunction checkingExpectedResults(rowFormat: ECDbTestRowFormat, actualResult: any, expectedResult: any, indexesToInclude?: number[]) {\r\n if (rowFormat === ECDbTestRowFormat.ECSqlIndexes && indexesToInclude) {\r\n let i: any = 0;\r\n for (const key of Object.keys(expectedResult)) {\r\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\r\n const actual = typeof actualResult[indexesToInclude[i]] === \"string\" ? actualResult[indexesToInclude[i]].trim() : actualResult[indexesToInclude[i]];\r\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[indexesToInclude[i]])}`);\r\n i++;\r\n }\r\n }\r\n else {\r\n for (const key of Object.keys(expectedResult)) {\r\n const expected = typeof expectedResult[key] === \"string\" ? expectedResult[key].trim() : expectedResult[key];\r\n const actual = typeof actualResult[key] === \"string\" ? actualResult[key].trim() : actualResult[key];\r\n assert.deepEqual(actual, expected, `Expected ${JSON.stringify(expectedResult[key])} but got ${JSON.stringify(actualResult[key])}`);\r\n }\r\n }\r\n}\r\nfunction logWarning(message: string) {\r\n // eslint-disable-next-line no-console\r\n console.log(`\\x1b[33m${message}\\x1b[0m`);\r\n}\r\n"]}
@@ -52,6 +52,12 @@ describe("dgn_Domain merge conflict", () => {
52
52
  });
53
53
  return names;
54
54
  }
55
+ function queryBeLocalStat(db) {
56
+ return db.withPreparedSqliteStatement("SELECT stat FROM sqlite_stat1 WHERE tbl='be_Local' AND idx='sqlite_autoindex_be_Local_1'", (stmt) => {
57
+ expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);
58
+ return stmt.getValueString(0);
59
+ });
60
+ }
55
61
  /**
56
62
  * Creates an iModel whose timeline holds two changesets that each INSERT the same
57
63
  * `dgn_Domain` row, and leaves both authoring briefcases closed.
@@ -165,6 +171,42 @@ describe("dgn_Domain merge conflict", () => {
165
171
  b2.close();
166
172
  }
167
173
  });
174
+ it("pulls sqlite_stat1 changes after ANALYZE runs independently in two briefcases", async () => {
175
+ const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);
176
+ const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Super);
177
+ const iModelId = await HubMock.createNewIModel({
178
+ accessToken: accessToken1,
179
+ iTwinId,
180
+ iModelName: "SqliteStat1ConcurrentAnalyze",
181
+ description: "sqlite_stat1 concurrent ANALYZE",
182
+ noLocks: true,
183
+ });
184
+ const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId, noLock: true });
185
+ const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId, noLock: true });
186
+ try {
187
+ const pushedStat = withEditTxn(b1, "ANALYZE in first briefcase", () => {
188
+ b1[_nativeDb].saveLocalValue("sqlite-stat1-b1", "1");
189
+ expect(b1[_nativeDb].executeSql("ANALYZE be_Local")).to.equal(DbResult.BE_SQLITE_OK);
190
+ return queryBeLocalStat(b1);
191
+ });
192
+ const localStat = withEditTxn(b2, "ANALYZE in second briefcase", () => {
193
+ b2[_nativeDb].saveLocalValue("sqlite-stat1-b2-1", "1");
194
+ b2[_nativeDb].saveLocalValue("sqlite-stat1-b2-2", "1");
195
+ expect(b2[_nativeDb].executeSql("ANALYZE be_Local")).to.equal(DbResult.BE_SQLITE_OK);
196
+ return queryBeLocalStat(b2);
197
+ });
198
+ expect(localStat).not.to.equal(pushedStat);
199
+ await b1.pushChanges({ accessToken: accessToken1, description: "ANALYZE in first briefcase" });
200
+ await b2.pullChanges({ accessToken: accessToken2 });
201
+ expect(b2.changeset.index).to.equal(1);
202
+ expect(b2.txns.hasPendingTxns).to.be.true;
203
+ expect(queryBeLocalStat(b2)).to.equal(localStat);
204
+ }
205
+ finally {
206
+ b1.close();
207
+ b2.close();
208
+ }
209
+ });
168
210
  describe("conflict handler guards", () => {
169
211
  let b2;
170
212
  before(async () => {
@@ -205,6 +247,25 @@ describe("dgn_Domain merge conflict", () => {
205
247
  const args = makeConflictArgs({ tableName: "dgn_Domain", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });
206
248
  expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Skip);
207
249
  });
250
+ for (const conflict of [
251
+ { name: "insert conflict", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert },
252
+ { name: "data mismatch", cause: DbConflictCause.Data, opcode: DbOpcode.Update },
253
+ ]) {
254
+ it(`replaces a sqlite_stat1 ${conflict.name} while local transactions are pending`, () => {
255
+ const args = makeConflictArgs({ tableName: "sqlite_stat1", cause: conflict.cause, opcode: conflict.opcode });
256
+ const pending = sinon.stub(b2.txns, "hasPendingTxns").get(() => true);
257
+ try {
258
+ expect(onMergeConflict(args)).to.equal(DbConflictResolution.Replace);
259
+ }
260
+ finally {
261
+ pending.restore();
262
+ }
263
+ });
264
+ it(`replaces a sqlite_stat1 ${conflict.name} while rebasing`, () => {
265
+ const args = makeConflictArgs({ tableName: "sqlite_stat1", cause: conflict.cause, opcode: conflict.opcode });
266
+ expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Replace);
267
+ });
268
+ }
208
269
  // A `Data` conflict means an UPDATE or DELETE whose "before" values do not match the row in
209
270
  // the briefcase, i.e. the two rows really do differ. Resolving those automatically would
210
271
  // silently discard a genuine change, so they must keep the pre-existing behavior.
@@ -1 +1 @@
1
- {"version":3,"file":"DgnDomainMergeConflict.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/DgnDomainMergeConflict.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as fs from \"fs\";\r\nimport { DbConflictCause, DbConflictResolution, DbOpcode, DbResult, GuidString } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps } from \"@itwin/core-common\";\r\nimport { assert, expect } from \"chai\";\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport * as sinon from \"sinon\";\r\nimport { HubWrappers, KnownTestLocations } from \"../\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { BriefcaseDb, ChannelControl, FunctionalSchema } from \"../../core-backend\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\n/**\r\n * `dgn_Domain` holds one bookkeeping row per BIS domain present in the briefcase, and the row is\r\n * created automatically as soon as the domain's schema is imported. Merging a changeset that\r\n * registers a domain therefore conflicts with the row that was just created locally. The conflict\r\n * is benign - both rows describe the same domain - so it must never fail the pull.\r\n *\r\n * The tests build a timeline where two changesets each insert the same `dgn_Domain` row:\r\n *\r\n * cs1 (b1) - \"Domain schema upgrade\" : INSERT dgn_Domain('Functional')\r\n * cs2 (b3) - duplicate domain rows : INSERT dgn_Domain('Functional') again\r\n *\r\n * b1 and b3 both start at version 0 and perform the same domain upgrade, and cs2 is appended to\r\n * the timeline without rebasing. A normal `pushChanges()` cannot produce this shape because the\r\n * rebase drops the duplicate insert first, but it is observed in the field from connectors.\r\n *\r\n * Merging both changesets in one pull used to abort, while pulling them one at a time succeeded,\r\n * leaving the cached briefcase permanently stuck. All of these must now succeed alike.\r\n */\r\ndescribe(\"dgn_Domain merge conflict\", () => {\r\n let iTwinId: GuidString;\r\n\r\n before(async () => {\r\n await TestUtils.startBackend();\r\n HubMock.startup(\"DgnDomainMergeConflict\", KnownTestLocations.outputDir);\r\n iTwinId = HubMock.iTwinId;\r\n });\r\n after(() => HubMock.shutdown());\r\n\r\n /** The domain names present in the briefcase's `dgn_Domain` table. */\r\n function queryDomains(db: BriefcaseDb): string[] {\r\n const names: string[] = [];\r\n db.withPreparedSqliteStatement(\"SELECT Name FROM dgn_Domain ORDER BY Name\", (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n names.push(stmt.getValueString(0));\r\n });\r\n return names;\r\n }\r\n\r\n /**\r\n * Creates an iModel whose timeline holds two changesets that each INSERT the same\r\n * `dgn_Domain` row, and leaves both authoring briefcases closed.\r\n */\r\n async function createTimelineWithDuplicateDomainRows(iModelName: string) {\r\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n\r\n const iModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: iModelName, noLocks: true });\r\n assert.isNotEmpty(iModelId);\r\n\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId, noLock: true });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n // b3 is downloaded at version 0 as well, so it never learns about cs1.\r\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId, noLock: true });\r\n b3.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // cs1: the \"Domain schema upgrade\" changeset. Importing the Functional *domain* adds a\r\n // `dgn_Domain` row for \"Functional\", and that insert is part of the pushed changeset.\r\n await withEditTxn(b1, \"Domain schema upgrade\", async () => {\r\n await FunctionalSchema.importSchema(b1);\r\n });\r\n await b1.pushChanges({ accessToken: accessToken1, description: \"Domain schema upgrade\" });\r\n expect(queryDomains(b1)).to.include(\"Functional\");\r\n\r\n // cs2: b3 performs the same domain upgrade while unaware of cs1, so its changeset carries a\r\n // second INSERT for the same `dgn_Domain` row. It is appended to the timeline without a\r\n // rebase (a rebase would rewrite the duplicate insert away, which is exactly why this shape\r\n // of changeset cannot be produced by `pushChanges` but is observed in the field).\r\n await withEditTxn(b3, \"Domain schema upgrade\", async () => {\r\n await FunctionalSchema.importSchema(b3);\r\n });\r\n // extra content so cs2 does not hash to the same changeset id as cs1\r\n withEditTxn(b3, \"connector data\", (txn) => {\r\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(txn, IModelTestUtils.getUniqueModelCode(b3, \"ConnectorModel\"), true);\r\n });\r\n\r\n const csProps = b3[_nativeDb].startCreateChangeset() as ChangesetFileProps;\r\n csProps.briefcaseId = b3.briefcaseId;\r\n csProps.description = \"Duplicate dgn_Domain rows\";\r\n csProps.size = fs.statSync(csProps.pathname).size;\r\n csProps.parentId = b1.changeset.id;\r\n csProps.id = IModelNative.platform.DgnDb.computeChangesetId(csProps);\r\n await HubMock.pushChangeset({ accessToken: accessToken3, iModelId, changesetProps: csProps });\r\n b3[_nativeDb].abandonCreateChangeset();\r\n\r\n b1.close();\r\n b3.close();\r\n return { iModelId, tipIndex: 2 };\r\n }\r\n\r\n it(\"resolves the duplicate dgn_Domain insert when the changesets are pulled one at a time\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainOneAtATime\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n // A briefcase parked at version 0, i.e. behind the domain upgrade.\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n expect(b2.txns.hasPendingTxns).to.be.false;\r\n\r\n // Each pull is its own pull-merge session, so no local change is pending when the\r\n // conflicting insert is applied.\r\n await b2.pullChanges({ accessToken, toIndex: 1 });\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"resolves the duplicate dgn_Domain insert when the changesets are merged by a single pullChanges\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainSinglePull\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n expect(b2.txns.hasPendingTxns).to.be.false;\r\n\r\n // Both changesets are merged inside one pull-merge session, so merging cs1 leaves a pending\r\n // change behind while cs2 is merged. That used to turn the benign `dgn_Domain` conflict into\r\n // an abort and leave the briefcase stuck mid-merge. The conflict is now always resolved by\r\n // keeping the incoming row, so batching no longer changes the outcome.\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"succeeds for a briefcase downloaded at the tip\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainFreshBriefcase\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, noLock: true });\r\n try {\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"skips the duplicate local dgn_Domain insert while rebasing local txns\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainRebase\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // b2 imports the same domain locally and keeps the txn pending, so pulling has to merge the\r\n // two incoming inserts and then replay a local txn that inserts the very same\r\n // `dgn_Domain` row over the already merged one.\r\n await withEditTxn(b2, \"Domain schema upgrade\", async () => {\r\n await FunctionalSchema.importSchema(b2);\r\n });\r\n expect(b2.txns.hasPendingTxns).to.be.true;\r\n\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n describe(\"conflict handler guards\", () => {\r\n let b2: BriefcaseDb;\r\n\r\n before(async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainHandlerGuards\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n });\r\n after(() => b2?.close());\r\n\r\n /** A conflict as native code would report it, with just enough behavior for the handlers. */\r\n function makeConflictArgs(overrides: { tableName: string, cause: DbConflictCause, opcode: DbOpcode, indirect?: boolean }) {\r\n return {\r\n indirect: false,\r\n columnCount: 3,\r\n changesetFile: \"test.changeset\",\r\n txn: { id: \"0x1\", type: \"Schema\", descr: \"Domain schema upgrade\" },\r\n getForeignKeyConflicts: () => 0,\r\n dump: () => { },\r\n setLastError: () => { },\r\n getPrimaryKeyColumns: () => [1, 0, 0],\r\n getColumnNames: () => [\"Name\", \"Version\", \"Description\"],\r\n getValueType: () => undefined,\r\n getValueBinary: () => undefined,\r\n getValueId: () => undefined,\r\n getValueText: () => undefined,\r\n getValueInteger: () => undefined,\r\n getValueDouble: () => undefined,\r\n isValueNull: () => undefined,\r\n ...overrides,\r\n } as any;\r\n }\r\n\r\n const onMergeConflict = (args: any): DbConflictResolution | undefined => (b2 as any).onChangesetConflict(args);\r\n const onRebaseConflict = (args: any): DbConflictResolution => (b2.txns as any)._onRebaseLocalTxnConflict(args);\r\n\r\n it(\"keeps the incoming row for a duplicate dgn_Domain insert while merging\", () => {\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });\r\n expect(onMergeConflict(args)).to.equal(DbConflictResolution.Replace);\r\n });\r\n\r\n it(\"skips a duplicate dgn_Domain insert while rebasing\", () => {\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Skip);\r\n });\r\n\r\n // A `Data` conflict means an UPDATE or DELETE whose \"before\" values do not match the row in\r\n // the briefcase, i.e. the two rows really do differ. Resolving those automatically would\r\n // silently discard a genuine change, so they must keep the pre-existing behavior.\r\n for (const opcode of [DbOpcode.Update, DbOpcode.Delete]) {\r\n it(`does not swallow a dgn_Domain ${DbOpcode[opcode]} whose before values differ while merging`, () => {\r\n let lastError: string | undefined;\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Data, opcode });\r\n args.setLastError = (message: string) => lastError = message;\r\n\r\n // With a local change pending, a mismatched UPDATE/DELETE must still abort the merge\r\n // rather than be resolved as a benign duplicate domain registration.\r\n const pending = sinon.stub(b2.txns, \"hasPendingTxns\").get(() => true);\r\n try {\r\n expect(onMergeConflict(args)).to.equal(DbConflictResolution.Abort);\r\n expect(lastError).to.not.be.undefined;\r\n } finally {\r\n pending.restore();\r\n }\r\n });\r\n\r\n it(`does not swallow a dgn_Domain ${DbOpcode[opcode]} whose before values differ while rebasing`, () => {\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Data, opcode });\r\n // The local change wins, as it does for every other non-`ec_` table.\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Replace);\r\n });\r\n }\r\n\r\n it(\"does not resolve conflicts on other tables\", () => {\r\n const args = makeConflictArgs({ tableName: \"bis_Element\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Abort);\r\n });\r\n });\r\n\r\n // TODO: unskip once a `@bentley/imodeljs-native` version containing iTwin/imodel-native#1548 is\r\n // pinned in core/backend/package.json. The default handler lives in the addon, so this case\r\n // cannot pass against 5.13.9.\r\n it.skip(\"resolves the conflict when the TypeScript handler defers to the default handler\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainNativeHandler\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n // `IModelDb.onChangesetConflict` is consulted first and normally resolves this conflict.\r\n // Returning `undefined` hands the decision to the default handler in the addon, which is the\r\n // path taken by hosts that install no JavaScript handler, such as checkpoint creation and\r\n // change history. Both handlers must agree, otherwise the same changeset would apply in an\r\n // iTwin.js backend but be rejected by those services.\r\n const stub = sinon.stub(BriefcaseDb.prototype, \"onChangesetConflict\" as any).returns(undefined);\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(stub.called, \"the default conflict handler should have been reached via the stub\").to.be.true;\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n stub.restore();\r\n b2.close();\r\n }\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"DgnDomainMergeConflict.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/DgnDomainMergeConflict.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport * as fs from \"fs\";\r\nimport { DbConflictCause, DbConflictResolution, DbOpcode, DbResult, GuidString } from \"@itwin/core-bentley\";\r\nimport { ChangesetFileProps } from \"@itwin/core-common\";\r\nimport { assert, expect } from \"chai\";\r\nimport * as chai from \"chai\";\r\nimport * as chaiAsPromised from \"chai-as-promised\";\r\nimport * as sinon from \"sinon\";\r\nimport { HubWrappers, KnownTestLocations } from \"../\";\r\nimport { HubMock } from \"../../internal/HubMock\";\r\nimport { BriefcaseDb, ChannelControl, FunctionalSchema } from \"../../core-backend\";\r\nimport { IModelTestUtils, TestUserType } from \"../IModelTestUtils\";\r\nimport { TestUtils } from \"../TestUtils\";\r\nimport { withEditTxn } from \"../../EditTxn\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { IModelNative } from \"../../internal/NativePlatform\";\r\n\r\nchai.use(chaiAsPromised);\r\n\r\n/**\r\n * `dgn_Domain` holds one bookkeeping row per BIS domain present in the briefcase, and the row is\r\n * created automatically as soon as the domain's schema is imported. Merging a changeset that\r\n * registers a domain therefore conflicts with the row that was just created locally. The conflict\r\n * is benign - both rows describe the same domain - so it must never fail the pull.\r\n *\r\n * The tests build a timeline where two changesets each insert the same `dgn_Domain` row:\r\n *\r\n * cs1 (b1) - \"Domain schema upgrade\" : INSERT dgn_Domain('Functional')\r\n * cs2 (b3) - duplicate domain rows : INSERT dgn_Domain('Functional') again\r\n *\r\n * b1 and b3 both start at version 0 and perform the same domain upgrade, and cs2 is appended to\r\n * the timeline without rebasing. A normal `pushChanges()` cannot produce this shape because the\r\n * rebase drops the duplicate insert first, but it is observed in the field from connectors.\r\n *\r\n * Merging both changesets in one pull used to abort, while pulling them one at a time succeeded,\r\n * leaving the cached briefcase permanently stuck. All of these must now succeed alike.\r\n */\r\ndescribe(\"dgn_Domain merge conflict\", () => {\r\n let iTwinId: GuidString;\r\n\r\n before(async () => {\r\n await TestUtils.startBackend();\r\n HubMock.startup(\"DgnDomainMergeConflict\", KnownTestLocations.outputDir);\r\n iTwinId = HubMock.iTwinId;\r\n });\r\n after(() => HubMock.shutdown());\r\n\r\n /** The domain names present in the briefcase's `dgn_Domain` table. */\r\n function queryDomains(db: BriefcaseDb): string[] {\r\n const names: string[] = [];\r\n db.withPreparedSqliteStatement(\"SELECT Name FROM dgn_Domain ORDER BY Name\", (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n names.push(stmt.getValueString(0));\r\n });\r\n return names;\r\n }\r\n\r\n function queryBeLocalStat(db: BriefcaseDb): string {\r\n return db.withPreparedSqliteStatement(\r\n \"SELECT stat FROM sqlite_stat1 WHERE tbl='be_Local' AND idx='sqlite_autoindex_be_Local_1'\",\r\n (stmt) => {\r\n expect(stmt.step()).to.equal(DbResult.BE_SQLITE_ROW);\r\n return stmt.getValueString(0);\r\n },\r\n );\r\n }\r\n\r\n /**\r\n * Creates an iModel whose timeline holds two changesets that each INSERT the same\r\n * `dgn_Domain` row, and leaves both authoring briefcases closed.\r\n */\r\n async function createTimelineWithDuplicateDomainRows(iModelName: string) {\r\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n const accessToken3 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n\r\n const iModelId = await HubMock.createNewIModel({ accessToken: accessToken1, iTwinId, iModelName, description: iModelName, noLocks: true });\r\n assert.isNotEmpty(iModelId);\r\n\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId, noLock: true });\r\n b1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n // b3 is downloaded at version 0 as well, so it never learns about cs1.\r\n const b3 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken3, iTwinId, iModelId, noLock: true });\r\n b3.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // cs1: the \"Domain schema upgrade\" changeset. Importing the Functional *domain* adds a\r\n // `dgn_Domain` row for \"Functional\", and that insert is part of the pushed changeset.\r\n await withEditTxn(b1, \"Domain schema upgrade\", async () => {\r\n await FunctionalSchema.importSchema(b1);\r\n });\r\n await b1.pushChanges({ accessToken: accessToken1, description: \"Domain schema upgrade\" });\r\n expect(queryDomains(b1)).to.include(\"Functional\");\r\n\r\n // cs2: b3 performs the same domain upgrade while unaware of cs1, so its changeset carries a\r\n // second INSERT for the same `dgn_Domain` row. It is appended to the timeline without a\r\n // rebase (a rebase would rewrite the duplicate insert away, which is exactly why this shape\r\n // of changeset cannot be produced by `pushChanges` but is observed in the field).\r\n await withEditTxn(b3, \"Domain schema upgrade\", async () => {\r\n await FunctionalSchema.importSchema(b3);\r\n });\r\n // extra content so cs2 does not hash to the same changeset id as cs1\r\n withEditTxn(b3, \"connector data\", (txn) => {\r\n IModelTestUtils.createAndInsertPhysicalPartitionAndModel(txn, IModelTestUtils.getUniqueModelCode(b3, \"ConnectorModel\"), true);\r\n });\r\n\r\n const csProps = b3[_nativeDb].startCreateChangeset() as ChangesetFileProps;\r\n csProps.briefcaseId = b3.briefcaseId;\r\n csProps.description = \"Duplicate dgn_Domain rows\";\r\n csProps.size = fs.statSync(csProps.pathname).size;\r\n csProps.parentId = b1.changeset.id;\r\n csProps.id = IModelNative.platform.DgnDb.computeChangesetId(csProps);\r\n await HubMock.pushChangeset({ accessToken: accessToken3, iModelId, changesetProps: csProps });\r\n b3[_nativeDb].abandonCreateChangeset();\r\n\r\n b1.close();\r\n b3.close();\r\n return { iModelId, tipIndex: 2 };\r\n }\r\n\r\n it(\"resolves the duplicate dgn_Domain insert when the changesets are pulled one at a time\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainOneAtATime\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n // A briefcase parked at version 0, i.e. behind the domain upgrade.\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n expect(b2.txns.hasPendingTxns).to.be.false;\r\n\r\n // Each pull is its own pull-merge session, so no local change is pending when the\r\n // conflicting insert is applied.\r\n await b2.pullChanges({ accessToken, toIndex: 1 });\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"resolves the duplicate dgn_Domain insert when the changesets are merged by a single pullChanges\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainSinglePull\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n expect(b2.txns.hasPendingTxns).to.be.false;\r\n\r\n // Both changesets are merged inside one pull-merge session, so merging cs1 leaves a pending\r\n // change behind while cs2 is merged. That used to turn the benign `dgn_Domain` conflict into\r\n // an abort and leave the briefcase stuck mid-merge. The conflict is now always resolved by\r\n // keeping the incoming row, so batching no longer changes the outcome.\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"succeeds for a briefcase downloaded at the tip\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainFreshBriefcase\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, noLock: true });\r\n try {\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"skips the duplicate local dgn_Domain insert while rebasing local txns\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainRebase\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n b2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\r\n\r\n // b2 imports the same domain locally and keeps the txn pending, so pulling has to merge the\r\n // two incoming inserts and then replay a local txn that inserts the very same\r\n // `dgn_Domain` row over the already merged one.\r\n await withEditTxn(b2, \"Domain schema upgrade\", async () => {\r\n await FunctionalSchema.importSchema(b2);\r\n });\r\n expect(b2.txns.hasPendingTxns).to.be.true;\r\n\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n b2.close();\r\n }\r\n });\r\n\r\n it(\"pulls sqlite_stat1 changes after ANALYZE runs independently in two briefcases\", async () => {\r\n const accessToken1 = await HubWrappers.getAccessToken(TestUserType.SuperManager);\r\n const accessToken2 = await HubWrappers.getAccessToken(TestUserType.Super);\r\n const iModelId = await HubMock.createNewIModel({\r\n accessToken: accessToken1,\r\n iTwinId,\r\n iModelName: \"SqliteStat1ConcurrentAnalyze\",\r\n description: \"sqlite_stat1 concurrent ANALYZE\",\r\n noLocks: true,\r\n });\r\n\r\n const b1 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken1, iTwinId, iModelId, noLock: true });\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken: accessToken2, iTwinId, iModelId, noLock: true });\r\n try {\r\n const pushedStat = withEditTxn(b1, \"ANALYZE in first briefcase\", () => {\r\n b1[_nativeDb].saveLocalValue(\"sqlite-stat1-b1\", \"1\");\r\n expect(b1[_nativeDb].executeSql(\"ANALYZE be_Local\")).to.equal(DbResult.BE_SQLITE_OK);\r\n return queryBeLocalStat(b1);\r\n });\r\n\r\n const localStat = withEditTxn(b2, \"ANALYZE in second briefcase\", () => {\r\n b2[_nativeDb].saveLocalValue(\"sqlite-stat1-b2-1\", \"1\");\r\n b2[_nativeDb].saveLocalValue(\"sqlite-stat1-b2-2\", \"1\");\r\n expect(b2[_nativeDb].executeSql(\"ANALYZE be_Local\")).to.equal(DbResult.BE_SQLITE_OK);\r\n return queryBeLocalStat(b2);\r\n });\r\n expect(localStat).not.to.equal(pushedStat);\r\n\r\n await b1.pushChanges({ accessToken: accessToken1, description: \"ANALYZE in first briefcase\" });\r\n await b2.pullChanges({ accessToken: accessToken2 });\r\n\r\n expect(b2.changeset.index).to.equal(1);\r\n expect(b2.txns.hasPendingTxns).to.be.true;\r\n expect(queryBeLocalStat(b2)).to.equal(localStat);\r\n } finally {\r\n b1.close();\r\n b2.close();\r\n }\r\n });\r\n\r\n describe(\"conflict handler guards\", () => {\r\n let b2: BriefcaseDb;\r\n\r\n before(async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainHandlerGuards\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n });\r\n after(() => b2?.close());\r\n\r\n /** A conflict as native code would report it, with just enough behavior for the handlers. */\r\n function makeConflictArgs(overrides: { tableName: string, cause: DbConflictCause, opcode: DbOpcode, indirect?: boolean }) {\r\n return {\r\n indirect: false,\r\n columnCount: 3,\r\n changesetFile: \"test.changeset\",\r\n txn: { id: \"0x1\", type: \"Schema\", descr: \"Domain schema upgrade\" },\r\n getForeignKeyConflicts: () => 0,\r\n dump: () => { },\r\n setLastError: () => { },\r\n getPrimaryKeyColumns: () => [1, 0, 0],\r\n getColumnNames: () => [\"Name\", \"Version\", \"Description\"],\r\n getValueType: () => undefined,\r\n getValueBinary: () => undefined,\r\n getValueId: () => undefined,\r\n getValueText: () => undefined,\r\n getValueInteger: () => undefined,\r\n getValueDouble: () => undefined,\r\n isValueNull: () => undefined,\r\n ...overrides,\r\n } as any;\r\n }\r\n\r\n const onMergeConflict = (args: any): DbConflictResolution | undefined => (b2 as any).onChangesetConflict(args);\r\n const onRebaseConflict = (args: any): DbConflictResolution => (b2.txns as any)._onRebaseLocalTxnConflict(args);\r\n\r\n it(\"keeps the incoming row for a duplicate dgn_Domain insert while merging\", () => {\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });\r\n expect(onMergeConflict(args)).to.equal(DbConflictResolution.Replace);\r\n });\r\n\r\n it(\"skips a duplicate dgn_Domain insert while rebasing\", () => {\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Skip);\r\n });\r\n\r\n for (const conflict of [\r\n { name: \"insert conflict\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert },\r\n { name: \"data mismatch\", cause: DbConflictCause.Data, opcode: DbOpcode.Update },\r\n ]) {\r\n it(`replaces a sqlite_stat1 ${conflict.name} while local transactions are pending`, () => {\r\n const args = makeConflictArgs({ tableName: \"sqlite_stat1\", cause: conflict.cause, opcode: conflict.opcode });\r\n const pending = sinon.stub(b2.txns, \"hasPendingTxns\").get(() => true);\r\n try {\r\n expect(onMergeConflict(args)).to.equal(DbConflictResolution.Replace);\r\n } finally {\r\n pending.restore();\r\n }\r\n });\r\n\r\n it(`replaces a sqlite_stat1 ${conflict.name} while rebasing`, () => {\r\n const args = makeConflictArgs({ tableName: \"sqlite_stat1\", cause: conflict.cause, opcode: conflict.opcode });\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Replace);\r\n });\r\n }\r\n\r\n // A `Data` conflict means an UPDATE or DELETE whose \"before\" values do not match the row in\r\n // the briefcase, i.e. the two rows really do differ. Resolving those automatically would\r\n // silently discard a genuine change, so they must keep the pre-existing behavior.\r\n for (const opcode of [DbOpcode.Update, DbOpcode.Delete]) {\r\n it(`does not swallow a dgn_Domain ${DbOpcode[opcode]} whose before values differ while merging`, () => {\r\n let lastError: string | undefined;\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Data, opcode });\r\n args.setLastError = (message: string) => lastError = message;\r\n\r\n // With a local change pending, a mismatched UPDATE/DELETE must still abort the merge\r\n // rather than be resolved as a benign duplicate domain registration.\r\n const pending = sinon.stub(b2.txns, \"hasPendingTxns\").get(() => true);\r\n try {\r\n expect(onMergeConflict(args)).to.equal(DbConflictResolution.Abort);\r\n expect(lastError).to.not.be.undefined;\r\n } finally {\r\n pending.restore();\r\n }\r\n });\r\n\r\n it(`does not swallow a dgn_Domain ${DbOpcode[opcode]} whose before values differ while rebasing`, () => {\r\n const args = makeConflictArgs({ tableName: \"dgn_Domain\", cause: DbConflictCause.Data, opcode });\r\n // The local change wins, as it does for every other non-`ec_` table.\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Replace);\r\n });\r\n }\r\n\r\n it(\"does not resolve conflicts on other tables\", () => {\r\n const args = makeConflictArgs({ tableName: \"bis_Element\", cause: DbConflictCause.Conflict, opcode: DbOpcode.Insert });\r\n expect(onRebaseConflict(args)).to.equal(DbConflictResolution.Abort);\r\n });\r\n });\r\n\r\n // TODO: unskip once a `@bentley/imodeljs-native` version containing iTwin/imodel-native#1548 is\r\n // pinned in core/backend/package.json. The default handler lives in the addon, so this case\r\n // cannot pass against 5.13.9.\r\n it.skip(\"resolves the conflict when the TypeScript handler defers to the default handler\", async () => {\r\n const { iModelId } = await createTimelineWithDuplicateDomainRows(\"DgnDomainNativeHandler\");\r\n const accessToken = await HubWrappers.getAccessToken(TestUserType.Regular);\r\n\r\n // `IModelDb.onChangesetConflict` is consulted first and normally resolves this conflict.\r\n // Returning `undefined` hands the decision to the default handler in the addon, which is the\r\n // path taken by hosts that install no JavaScript handler, such as checkpoint creation and\r\n // change history. Both handlers must agree, otherwise the same changeset would apply in an\r\n // iTwin.js backend but be rejected by those services.\r\n const stub = sinon.stub(BriefcaseDb.prototype, \"onChangesetConflict\" as any).returns(undefined);\r\n const b2 = await HubWrappers.downloadAndOpenBriefcase({ accessToken, iTwinId, iModelId, asOf: { first: true }, noLock: true });\r\n try {\r\n await b2.pullChanges({ accessToken });\r\n\r\n expect(stub.called, \"the default conflict handler should have been reached via the stub\").to.be.true;\r\n expect(b2.changeset.index).to.equal(2);\r\n expect(queryDomains(b2).filter((name) => name === \"Functional\")).to.have.lengthOf(1);\r\n } finally {\r\n stub.restore();\r\n b2.close();\r\n }\r\n });\r\n});\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "5.14.0-dev.11",
3
+ "version": "5.14.0-dev.14",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "module": "lib/esm/core-backend.js",
@@ -27,10 +27,10 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@opentelemetry/api": "^1.0.4",
30
- "@itwin/core-bentley": "5.14.0-dev.11",
31
- "@itwin/core-common": "5.14.0-dev.11",
32
- "@itwin/core-geometry": "5.14.0-dev.11",
33
- "@itwin/ecschema-metadata": "5.14.0-dev.11"
30
+ "@itwin/core-bentley": "5.14.0-dev.14",
31
+ "@itwin/core-common": "5.14.0-dev.14",
32
+ "@itwin/ecschema-metadata": "5.14.0-dev.14",
33
+ "@itwin/core-geometry": "5.14.0-dev.14"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "@opentelemetry/api": {
@@ -71,17 +71,17 @@
71
71
  "marked": "^14.1.3",
72
72
  "sql-formatter": "^15.4.6",
73
73
  "vite": "^6.4.3",
74
- "@itwin/ecschema-metadata": "5.14.0-dev.11",
75
- "@itwin/core-geometry": "5.14.0-dev.11",
76
- "@itwin/core-common": "5.14.0-dev.11",
77
- "@itwin/build-tools": "5.14.0-dev.11",
78
- "@itwin/core-bentley": "5.14.0-dev.11",
79
- "@itwin/ecsql-common": "5.14.0-dev.11",
80
- "internal-tools": "3.0.0-dev.69",
81
- "@itwin/ecschema-locaters": "5.14.0-dev.11"
74
+ "@itwin/ecschema-locaters": "5.14.0-dev.14",
75
+ "@itwin/core-geometry": "5.14.0-dev.14",
76
+ "@itwin/build-tools": "5.14.0-dev.14",
77
+ "@itwin/core-bentley": "5.14.0-dev.14",
78
+ "@itwin/ecschema-metadata": "5.14.0-dev.14",
79
+ "@itwin/core-common": "5.14.0-dev.14",
80
+ "@itwin/ecsql-common": "5.14.0-dev.14",
81
+ "internal-tools": "3.0.0-dev.69"
82
82
  },
83
83
  "dependencies": {
84
- "@bentley/imodeljs-native": "5.14.25",
84
+ "@bentley/imodeljs-native": "5.14.32",
85
85
  "@itwin/object-storage-azure": "^3.0.4",
86
86
  "@azure/storage-blob": "^12.28.0",
87
87
  "form-data": "^4.0.6",