diff --git a/extensions/integration-tests/src/dacpac.test.ts b/extensions/integration-tests/src/dacpac.test.ts index e7f72e37ec..22930fe006 100644 --- a/extensions/integration-tests/src/dacpac.test.ts +++ b/extensions/integration-tests/src/dacpac.test.ts @@ -59,7 +59,7 @@ if (context.RunTest) { assert(extractResult.success === true && extractResult.errorMessage === '', `Extract dacpac should succeed. Expected: there should be no error. Actual Error message: "${extractResult.errorMessage}"`); } finally { - await utils.deleteDB(databaseName, ownerUri); + await utils.deleteDB(server, databaseName, ownerUri); } }); @@ -94,7 +94,7 @@ if (context.RunTest) { await utils.assertFileGenerationResult(packageFilePath, retryCount); assert(exportResult.success === true && exportResult.errorMessage === '', `Expected: Export bacpac should succeed and there should be no error. Actual Error message: "${exportResult.errorMessage}"`); } finally { - await utils.deleteDB(databaseName, ownerUri); + await utils.deleteDB(server, databaseName, ownerUri); } }); }); diff --git a/extensions/integration-tests/src/objectExplorer.test.ts b/extensions/integration-tests/src/objectExplorer.test.ts index f25d108bd5..65854e778c 100644 --- a/extensions/integration-tests/src/objectExplorer.test.ts +++ b/extensions/integration-tests/src/objectExplorer.test.ts @@ -160,7 +160,7 @@ class ObjectExplorerTester { assert(expectedActions.length === actions.length && expectedString === actualString, `Expected actions: "${expectedString}", Actual actions: "${actualString}"`); } finally { - await deleteDB(dbName, ownerUri); + await deleteDB(server, dbName, ownerUri); } } } diff --git a/extensions/integration-tests/src/schemaCompare.test.ts b/extensions/integration-tests/src/schemaCompare.test.ts index 4058eb3f85..d966e9bef0 100644 --- a/extensions/integration-tests/src/schemaCompare.test.ts +++ b/extensions/integration-tests/src/schemaCompare.test.ts @@ -179,8 +179,8 @@ class SchemaCompareTester { fs.unlinkSync(filepath); } finally { - await utils.deleteDB(sourceDB, ownerUri); - await utils.deleteDB(targetDB, ownerUri); + await utils.deleteDB(server, sourceDB, ownerUri); + await utils.deleteDB(server, targetDB, ownerUri); } } @@ -249,7 +249,7 @@ class SchemaCompareTester { assert(openScmpResult.targetEndpointInfo.databaseName === target.databaseName, `Expected: target database to be ${target.databaseName}, Actual: ${openScmpResult.targetEndpointInfo.databaseName}`); } finally { - await utils.deleteDB(targetDB, ownerUri); + await utils.deleteDB(server, targetDB, ownerUri); } } diff --git a/extensions/integration-tests/src/utils.ts b/extensions/integration-tests/src/utils.ts index d8f9e9d76c..91d0f41ca0 100644 --- a/extensions/integration-tests/src/utils.ts +++ b/extensions/integration-tests/src/utils.ts @@ -8,6 +8,7 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import * as fs from 'fs'; import { TestServerProfile } from './testConfig'; +import { isNullOrUndefined } from 'util'; // default server connection timeout export const DefaultConnectTimeoutInMs: number = 10000; @@ -79,7 +80,6 @@ export async function sleep(ms: number): Promise<{}> { } export async function createDB(dbName: string, ownerUri: string): Promise { - let queryProvider = azdata.dataprotocol.getProvider('MSSQL', azdata.DataProviderType.QueryProvider); let query = `BEGIN TRY CREATE DATABASE ${dbName} SELECT 1 AS NoError @@ -88,12 +88,11 @@ export async function createDB(dbName: string, ownerUri: string): Promise SELECT ERROR_MESSAGE() AS ErrorMessage; END CATCH`; - let dbcreatedResult = await queryProvider.runQueryAndReturn(ownerUri, query); - assert(dbcreatedResult.columnInfo[0].columnName !== 'ErrorMessage', 'DB creation threw error'); + let dbCreatedResult = await this.runQuery(query, ownerUri); + assert(dbCreatedResult.columnInfo[0].columnName !== 'ErrorMessage', 'DB creation threw error'); } -export async function deleteDB(dbName: string, ownerUri: string): Promise { - let queryProvider = azdata.dataprotocol.getProvider('MSSQL', azdata.DataProviderType.QueryProvider); +export async function deleteDB(server: TestServerProfile, dbName: string, ownerUri: string): Promise { let query = `BEGIN TRY ALTER DATABASE ${dbName} SET OFFLINE @@ -105,13 +104,41 @@ export async function deleteDB(dbName: string, ownerUri: string): Promise SELECT ERROR_MESSAGE() AS ErrorMessage; END CATCH`; - await queryProvider.runQueryAndReturn(ownerUri, query); + ownerUri = await ensureServerConnected(server, ownerUri); + let dbDeleteResult = await this.runQuery(query, ownerUri); + assert(dbDeleteResult.columnInfo[0].columnName !== 'ErrorMessage', 'DB deletion threw error'); } +async function ensureServerConnected(server: TestServerProfile, ownerUri: string): Promise { + try { + // The queries might fail if connection is removed + // Check if connection is present - if not create new connection and use OwnerUri from there + let connection = await azdata.connection.getConnection(ownerUri); + if (isNullOrUndefined(connection)) { + let connectionId = await connectToServer(server); + return azdata.connection.getUriForConnection(connectionId); + } + } + catch (ex) { + console.error('utils.ensureServerConnected : Failed to get or create connection'); + console.error(ex); // not throwing here because it is a safety net and actual query will throw if failed. + } + return ownerUri; +} + + export async function runQuery(query: string, ownerUri: string): Promise { - let queryProvider = azdata.dataprotocol.getProvider('MSSQL', azdata.DataProviderType.QueryProvider); - let result = await queryProvider.runQueryAndReturn(ownerUri, query); - return result; + try { + let queryProvider = azdata.dataprotocol.getProvider('MSSQL', azdata.DataProviderType.QueryProvider); + let result = await queryProvider.runQueryAndReturn(ownerUri, query); + return result; + } + catch (ex) { + console.error('utils.runQuery : Failed to run query'); + console.error(ex); + throw ex; + } + } export async function assertThrowsAsync(fn: () => Promise, msg: string): Promise {