diff --git a/extensions/integration-tests/extensionInstallers/azuredatastudio-postgresql-0.2.0.vsix b/extensions/integration-tests/extensionInstallers/azuredatastudio-postgresql-0.2.0.vsix new file mode 100644 index 0000000000..e2cf3a1f39 Binary files /dev/null and b/extensions/integration-tests/extensionInstallers/azuredatastudio-postgresql-0.2.0.vsix differ diff --git a/extensions/integration-tests/src/main.ts b/extensions/integration-tests/src/main.ts index 7a08af1984..74c7a125d4 100644 --- a/extensions/integration-tests/src/main.ts +++ b/extensions/integration-tests/src/main.ts @@ -25,6 +25,7 @@ export function activate(context: vscode.ExtensionContext) { let installerFullPath = join(extensionInstallersFolder, installers[i]); console.info(`installing extension at ${installerFullPath}`); await azdata.extensions.install(installerFullPath); + console.info(`extension has been installed successfully. vsix: ${installers[i]}`); } } await setConfiguration('workbench.enablePreviewFeatures', true); @@ -34,26 +35,71 @@ export function activate(context: vscode.ExtensionContext) { }); vscode.commands.registerCommand('test.waitForExtensionsToLoad', async () => { - let expectedExtensions = ['Microsoft.agent', 'Microsoft.import', 'Microsoft.mssql', 'Microsoft.profiler']; + const expectedExtensions = ['Microsoft.agent', 'Microsoft.import', 'Microsoft.mssql', 'Microsoft.profiler', 'Microsoft.azuredatastudio-postgresql']; + const commonFeatures: azdata.DataProviderType[] = [ + azdata.DataProviderType.AdminServicesProvider, + azdata.DataProviderType.BackupProvider, + azdata.DataProviderType.CapabilitiesProvider, + azdata.DataProviderType.ConnectionProvider, + azdata.DataProviderType.FileBrowserProvider, + azdata.DataProviderType.MetadataProvider, + azdata.DataProviderType.ObjectExplorerProvider, + azdata.DataProviderType.ProfilerProvider, + azdata.DataProviderType.QueryProvider, + azdata.DataProviderType.RestoreProvider, + azdata.DataProviderType.ScriptingProvider, + azdata.DataProviderType.TaskServicesProvider]; + + const features_mssql: azdata.DataProviderType[] = [ + azdata.DataProviderType.AgentServicesProvider, + azdata.DataProviderType.DacFxServicesProvider, + azdata.DataProviderType.IconProvider, + azdata.DataProviderType.SchemaCompareServicesProvider + ]; + + features_mssql.push(...commonFeatures); + + const providerFeatureMapping: { providerId: string, features: azdata.DataProviderType[] }[] = [ + { + providerId: 'MSSQL', + features: features_mssql + }, { + providerId: 'PGSQL', + features: commonFeatures + }]; + do { let extensions = vscode.extensions.all.filter(ext => { return expectedExtensions.indexOf(ext.id) !== -1; }); - let isReady = true; - for (let i = 0; i < extensions.length; i++) { - let extension = extensions[i]; - isReady = isReady && extension.isActive; - if (!isReady) { - break; + const extensionsNotInReadyState: string[] = []; + + extensions.forEach(extension => { + if (!extension.isActive) { + extensionsNotInReadyState.push(extension.id); } + }); + + const providerTypesNotInReadyState: string[] = []; + if (extensionsNotInReadyState.length === 0) { + providerFeatureMapping.forEach(entry => { + entry.features.forEach(feature => { + const provider = azdata.dataprotocol.getProvider(entry.providerId, feature); + if (!provider) { + providerTypesNotInReadyState.push(`${entry.providerId}:${feature}`); + } + }); + }); } - if (isReady) { + if (extensionsNotInReadyState.length === 0 && providerTypesNotInReadyState.length === 0) { console.info('All extensions are ready'); showStatusBarItem(statusBarItem, ALL_EXTENSION_LOADED_TEXT); break; + } else if (extensionsNotInReadyState.length !== 0) { + console.warn(`the following extensions are not ready: ${extensionsNotInReadyState.join(',')}`); } else { - console.warn(`At least one extension is not ready, waiting one second before recheck.}`); - await new Promise(resolve => { setTimeout(resolve, 1000); }); + console.warn(`the following providers are not ready: ${providerTypesNotInReadyState.join(',')}`); } + await new Promise(resolve => { setTimeout(resolve, 2000); }); } while (true); }); diff --git a/extensions/integration-tests/src/setup.test.ts b/extensions/integration-tests/src/setup.test.ts index 930539d4c8..e309042f3e 100644 --- a/extensions/integration-tests/src/setup.test.ts +++ b/extensions/integration-tests/src/setup.test.ts @@ -25,9 +25,12 @@ assert(getConfigValue(EnvironmentVariable_BDC_SERVER) !== undefined && if (!context.RunTest) { suite('integration test setup', () => { test('test setup', async function () { - //Prepare the environment and make it ready for testing + this.timeout(5 * 60 * 1000); + // Prepare the environment and make it ready for testing await vscode.commands.executeCommand('test.setupIntegrationTest'); - //Reload the window, this is required for some changes made by the 'test.setupIntegrationTest' to work + // Wait for the extensions to load + await vscode.commands.executeCommand('test.waitForExtensionsToLoad'); + // Reload the window, this is required for some changes made by the 'test.setupIntegrationTest' to work await vscode.commands.executeCommand('workbench.action.reloadWindow'); }); }); diff --git a/src/sql/workbench/api/node/mainThreadExtensionManagement.ts b/src/sql/workbench/api/node/mainThreadExtensionManagement.ts index 2345c0eb14..3500d98f72 100644 --- a/src/sql/workbench/api/node/mainThreadExtensionManagement.ts +++ b/src/sql/workbench/api/node/mainThreadExtensionManagement.ts @@ -27,6 +27,6 @@ export class MainThreadExtensionManagement implements MainThreadExtensionManagem } public $install(vsixPath: string): Thenable { - return this._extensionService.install(URI.parse(vsixPath)).then((value: IExtensionIdentifier) => { return undefined; }, (reason: any) => { return reason ? reason.toString() : undefined; }); + return this._extensionService.install(URI.file(vsixPath)).then((value: IExtensionIdentifier) => { return undefined; }, (reason: any) => { return reason ? reason.toString() : undefined; }); } }