mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
First version of Stress (#5499)
* First version of Stress - moving over from feat/Stress1 branch * a working version - still issues with stresssified notebook tests * update notebooks to use new message event (#5395) * Latest changes for notebook tests * Stressify objectExplorer tests * formatting changes * removing the tracing added previously and ability to set tsc verbose option in tsconfig.json * addressing review feedback * addressing review feedback * implementing runtime parameter for Stress * addresing review feedback and moved out stress modules to its own project outside of azuredata source tree * referencing adstest from the github location * incorporating review feedback * Review feedbak * removing uncommong entries added to .gitignore * removing unrelated change * replacing debug/trace statements with console.info or cosole.warn statments in integration-tests\main.tx
This commit is contained in:
@@ -49,12 +49,13 @@
|
||||
"postinstall": "node ./node_modules/vscode/bin/install"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.0.43",
|
||||
"@types/chai": "3.4.34",
|
||||
"@types/node": "7.0.43",
|
||||
"adstest": "github:ranasaria/adstest.git#0.0.2",
|
||||
"chai": "3.5.0",
|
||||
"mocha-junit-reporter": "^1.17.0",
|
||||
"mocha-multi-reporters": "^1.1.7",
|
||||
"vscode": "1.1.5",
|
||||
"chai": "3.5.0"
|
||||
"vscode": "1.1.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"azure-keyvault": "^3.0.4",
|
||||
|
||||
@@ -151,13 +151,13 @@ msrestAzure.interactiveLogin().then((credentials) => {
|
||||
console.log('Done reading values from Azure KeyVault!');
|
||||
console.log(`Launching new window: ${LAUNCH_OPTION}...`);
|
||||
if (LAUNCH_OPTION === LAUNCH_VSCODE) {
|
||||
console.warn('Trying to lauch vscode, make sure you have it set properly in the PATH environment variable');
|
||||
console.warn('Trying to launch vscode, make sure you have it set properly in the PATH environment variable');
|
||||
}
|
||||
child_process.execSync(LAUNCH_OPTION);
|
||||
console.log('New window for running test has been opened.');
|
||||
}
|
||||
);
|
||||
}, (err) => {
|
||||
console.error('An error occured while loggin in to Azure portal');
|
||||
console.error('An error occured while logging in to Azure portal');
|
||||
console.error(err);
|
||||
});
|
||||
@@ -4,24 +4,30 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
import * as vscode from 'vscode';
|
||||
import { context } from './testContext';
|
||||
import { getSuiteType, SuiteType } from 'adstest';
|
||||
|
||||
const path = require('path');
|
||||
const testRunner = require('vscode/lib/testrunner');
|
||||
|
||||
const suite = 'Integration Tests';
|
||||
const suite = getSuiteType();
|
||||
|
||||
const options: any = {
|
||||
ui: 'tdd',
|
||||
useColors: true,
|
||||
timeout: 600000
|
||||
timeout: 600000 // 600 seconds
|
||||
};
|
||||
|
||||
if (suite === SuiteType.Stress) {
|
||||
options.timeout = 7200000; // 2 hours
|
||||
}
|
||||
|
||||
if (process.env.BUILD_ARTIFACTSTAGINGDIRECTORY) {
|
||||
console.log(`environment variable BUILD_ARTIFACTSTAGINGDIRECTORY is set to ${process.env.BUILD_ARTIFACTSTAGINGDIRECTORY} so configuring multiple reporters for test results.\n For this to work the ${process.env.BUILD_ARTIFACTSTAGINGDIRECTORY} must be fully qualified directory and must exist`);
|
||||
options.reporter = 'mocha-multi-reporters';
|
||||
options.reporterOptions = {
|
||||
reporterEnabled: 'spec, mocha-junit-reporter',
|
||||
mochaJunitReporterReporterOptions: {
|
||||
testsuitesTitle: `${suite} ${process.platform}`,
|
||||
testsuitesTitle: `${suite} Tests ${process.platform}`,
|
||||
mochaFile: path.join(process.env.BUILD_ARTIFACTSTAGINGDIRECTORY, `test-results/${process.platform}-${suite.toLowerCase().replace(/[^\w]/g, '-')}-results.xml`)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -18,10 +18,12 @@ export function activate(context: vscode.ExtensionContext) {
|
||||
let statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
|
||||
vscode.commands.registerCommand('test.setupIntegrationTest', async () => {
|
||||
let extensionInstallersFolder = normalize(join(__dirname, '../extensionInstallers'));
|
||||
console.info(`extensionInstallersFolder=${extensionInstallersFolder}`);
|
||||
let installers = fs.readdirSync(extensionInstallersFolder);
|
||||
for (let i = 0; i < installers.length; i++) {
|
||||
if (installers[i].endsWith('.vsix')) {
|
||||
let installerFullPath = join(extensionInstallersFolder, installers[i]);
|
||||
console.info(`installing extension at ${installerFullPath}`);
|
||||
await azdata.extensions.install(installerFullPath);
|
||||
}
|
||||
}
|
||||
@@ -35,20 +37,24 @@ export function activate(context: vscode.ExtensionContext) {
|
||||
let expectedExtensions = ['Microsoft.agent', 'Microsoft.import', 'Microsoft.mssql', 'Microsoft.profiler'];
|
||||
do {
|
||||
let extensions = vscode.extensions.all.filter(ext => { return expectedExtensions.indexOf(ext.id) !== -1; });
|
||||
|
||||
console.info(`extensions to load ${JSON.stringify(extensions, undefined, '\t')}`);
|
||||
let isReady = true;
|
||||
for (let i = 0; i < extensions.length; i++) {
|
||||
let extension = extensions[i];
|
||||
console.info(`checking extension:${JSON.stringify(extension, undefined, '\t')} to be ready}`);
|
||||
isReady = isReady && extension.isActive;
|
||||
if (!isReady) {
|
||||
console.warn(`extension:${JSON.stringify(extension, undefined, '\t')} is not yet ready}`);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isReady) {
|
||||
console.info('All extensions are ready');
|
||||
showStatusBarItem(statusBarItem, ALL_EXTENSION_LOADED_TEXT);
|
||||
break;
|
||||
} else {
|
||||
console.warn(`At least one extension is not ready, waiting one second before recheck.}`);
|
||||
await new Promise(resolve => { setTimeout(resolve, 1000); });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,136 +14,181 @@ import { sqlNotebookContent, writeNotebookToFile, sqlKernelMetadata, getFileName
|
||||
import { getBdcServer, getConfigValue, EnvironmentVariable_PYTHON_PATH } from './testConfig';
|
||||
import { connectToServer } from './utils';
|
||||
import * as fs from 'fs';
|
||||
import { stressify } from 'adstest';
|
||||
|
||||
if (context.RunTest) {
|
||||
suite('Notebook integration test suite', function () {
|
||||
setup(function () {
|
||||
setup(async function () {
|
||||
console.log(`Start "${this.currentTest.title}"`);
|
||||
let server = await getBdcServer();
|
||||
assert(server && server.serverName, 'No server could be found');
|
||||
await connectToServer(server, 6000);
|
||||
});
|
||||
teardown(async function () {
|
||||
let testName = this.currentTest.title;
|
||||
try {
|
||||
let fileName = getFileName(testName);
|
||||
if (fs.existsSync(fileName)) {
|
||||
fs.unlinkSync(fileName);
|
||||
console.log(`"${fileName}" is deleted.`);
|
||||
}
|
||||
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
|
||||
}
|
||||
catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
finally {
|
||||
console.log(`"${testName}" is done`);
|
||||
}
|
||||
await (new NotebookTester()).cleanup(this.currentTest.title);
|
||||
});
|
||||
|
||||
test('Sql NB test', async function () {
|
||||
let notebook = await openNotebook(sqlNotebookContent, sqlKernelMetadata, this.test.title);
|
||||
const expectedOutput0 = '(1 row affected)';
|
||||
let cellOutputs = notebook.document.cells[0].contents.outputs;
|
||||
console.log('Got cell outputs ---');
|
||||
if (cellOutputs) {
|
||||
cellOutputs.forEach(o => console.log(o));
|
||||
}
|
||||
assert(cellOutputs.length === 3, `Expected length: 3, Actual: ${cellOutputs.length}`);
|
||||
let actualOutput0 = (<azdata.nb.IDisplayData>cellOutputs[0]).data['text/html'];
|
||||
console.log('Got first output');
|
||||
assert(actualOutput0 === expectedOutput0, `Expected row count: ${expectedOutput0}, Actual: ${actualOutput0}`);
|
||||
let actualOutput2 = (<azdata.nb.IExecuteResult>cellOutputs[2]).data['application/vnd.dataresource+json'].data[0];
|
||||
assert(actualOutput2[0] === '1', `Expected result: 1, Actual: '${actualOutput2[0]}'`);
|
||||
await (new NotebookTester()).sqlNbTest(this.test.title);
|
||||
});
|
||||
|
||||
test('Sql NB multiple cells test', async function () {
|
||||
let notebook = await openNotebook(sqlNotebookMultipleCellsContent, sqlKernelMetadata, this.test.title, true);
|
||||
const expectedOutput0 = '(1 row affected)';
|
||||
for (let i = 0; i < 3; i++) {
|
||||
let cellOutputs = notebook.document.cells[i].contents.outputs;
|
||||
console.log(`Got cell outputs --- ${i}`);
|
||||
if (cellOutputs) {
|
||||
cellOutputs.forEach(o => console.log(o));
|
||||
}
|
||||
assert(cellOutputs.length === 3, `Expected length: 3, Actual: '${cellOutputs.length}'`);
|
||||
let actualOutput0 = (<azdata.nb.IDisplayData>cellOutputs[0]).data['text/html'];
|
||||
console.log('Got first output');
|
||||
assert(actualOutput0 === expectedOutput0, `Expected row count: '${expectedOutput0}', Actual: '${actualOutput0}'`);
|
||||
let actualOutput2 = (<azdata.nb.IExecuteResult>cellOutputs[2]).data['application/vnd.dataresource+json'].data[0];
|
||||
assert(actualOutput2[0] === i.toString(), `Expected result: ${i.toString()}, Actual: '${actualOutput2[0]}'`);
|
||||
console.log('Sql multiple cells NB done');
|
||||
}
|
||||
await (new NotebookTester()).sqlNbMultipleCellsTest(this.test.title);
|
||||
});
|
||||
|
||||
test('Clear all outputs - SQL notebook ', async function () {
|
||||
let notebook = await openNotebook(sqlNotebookContent, sqlKernelMetadata, this.test.title);
|
||||
await verifyClearAllOutputs(notebook);
|
||||
await (new NotebookTester()).sqlNbClearAllOutputs(this.test.title);
|
||||
});
|
||||
|
||||
if (process.env['RUN_PYTHON3_TEST'] === '1') {
|
||||
test('Python3 notebook test', async function () {
|
||||
let notebook = await openNotebook(pySparkNotebookContent, pythonKernelMetadata, this.test.title);
|
||||
let cellOutputs = notebook.document.cells[0].contents.outputs;
|
||||
console.log('Got cell outputs ---');
|
||||
if (cellOutputs) {
|
||||
cellOutputs.forEach(o => console.log(o));
|
||||
}
|
||||
let result = (<azdata.nb.IExecuteResult>cellOutputs[0]).data['text/plain'];
|
||||
assert(result === '2', `Expected python result: 2, Actual: ${result}`);
|
||||
await (new NotebookTester()).python3NbTest(this.test.title);
|
||||
});
|
||||
|
||||
test('Clear all outputs - Python3 notebook ', async function () {
|
||||
let notebook = await openNotebook(pySparkNotebookContent, pythonKernelMetadata, this.test.title);
|
||||
await verifyClearAllOutputs(notebook);
|
||||
await (new NotebookTester()).python3ClearAllOutputs(this.test.title);
|
||||
});
|
||||
}
|
||||
|
||||
if (process.env['RUN_PYSPARK_TEST'] === '1') {
|
||||
test('PySpark3 notebook test', async function () {
|
||||
let notebook = await openNotebook(pySparkNotebookContent, pySpark3KernelMetadata, this.test.title);
|
||||
let cellOutputs = notebook.document.cells[0].contents.outputs;
|
||||
let sparkResult = (<azdata.nb.IStreamResult>cellOutputs[3]).text;
|
||||
assert(sparkResult === '2', `Expected spark result: 2, Actual: ${sparkResult}`);
|
||||
await (new NotebookTester()).pySpark3NbTest(this.test.title);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function openNotebook(content: azdata.nb.INotebookContents, kernelMetadata: any, testName: string, runAllCells?: boolean): Promise<azdata.nb.NotebookEditor> {
|
||||
let notebookConfig = vscode.workspace.getConfiguration('notebook');
|
||||
notebookConfig.update('pythonPath', getConfigValue(EnvironmentVariable_PYTHON_PATH), 1);
|
||||
let server = await getBdcServer();
|
||||
assert(server && server.serverName, 'No server could be found in openNotebook');
|
||||
await connectToServer(server, 6000);
|
||||
let notebookJson = Object.assign({}, content, { metadata: kernelMetadata });
|
||||
let uri = writeNotebookToFile(notebookJson, testName);
|
||||
console.log(uri);
|
||||
let notebook = await azdata.nb.showNotebookDocument(uri);
|
||||
console.log('Notebook is opened');
|
||||
class NotebookTester {
|
||||
private static ParallelCount = 1;
|
||||
|
||||
if (!runAllCells) {
|
||||
assert(notebook.document.cells.length === 1, 'Notebook should have 1 cell');
|
||||
console.log('Before run notebook cell');
|
||||
let ran = await notebook.runCell(notebook.document.cells[0]);
|
||||
console.log('After run notebook cell');
|
||||
assert(ran, 'Notebook runCell should succeed');
|
||||
} else {
|
||||
console.log('Before run all notebook cells');
|
||||
let ran = await notebook.runAllCells();
|
||||
assert(ran, 'Notebook runCell should succeed');
|
||||
assert(notebook !== undefined && notebook !== null, 'Expected notebook object is defined');
|
||||
invocationCount: number = 0;
|
||||
|
||||
@stressify({ dop: NotebookTester.ParallelCount })
|
||||
async pySpark3NbTest(title: string): Promise<void> {
|
||||
let notebook = await this.openNotebook(pySparkNotebookContent, pySpark3KernelMetadata, title + this.invocationCount++);
|
||||
let cellOutputs = notebook.document.cells[0].contents.outputs;
|
||||
let sparkResult = (<azdata.nb.IStreamResult>cellOutputs[3]).text;
|
||||
assert(sparkResult === '2', `Expected spark result: 2, Actual: ${sparkResult}`);
|
||||
}
|
||||
|
||||
return notebook;
|
||||
}
|
||||
async function verifyClearAllOutputs(notebook: azdata.nb.NotebookEditor) {
|
||||
let cellWithOutputs = notebook.document.cells.find(cell => cell.contents && cell.contents.outputs && cell.contents.outputs.length > 0);
|
||||
assert(cellWithOutputs !== undefined, 'Could not find notebook cells with outputs');
|
||||
console.log('Before clearing cell outputs');
|
||||
let clearedOutputs = await notebook.clearAllOutputs();
|
||||
let cells = notebook.document.cells;
|
||||
cells.forEach(cell => {
|
||||
assert(cell.contents && cell.contents.outputs && cell.contents.outputs.length === 0, `Expected Output: 0, Actual: '${cell.contents.outputs.length}'`);
|
||||
});
|
||||
assert(clearedOutputs, 'Outputs of all the code cells from Python notebook should be cleared');
|
||||
console.log('After clearing cell outputs');
|
||||
@stressify({ dop: NotebookTester.ParallelCount })
|
||||
async python3ClearAllOutputs(title: string): Promise<void> {
|
||||
let notebook = await this.openNotebook(pySparkNotebookContent, pythonKernelMetadata, title + this.invocationCount++);
|
||||
await this.verifyClearAllOutputs(notebook);
|
||||
}
|
||||
|
||||
@stressify({ dop: NotebookTester.ParallelCount })
|
||||
async python3NbTest(title: string): Promise<void> {
|
||||
let notebook = await this.openNotebook(pySparkNotebookContent, pythonKernelMetadata, title + this.invocationCount++);
|
||||
let cellOutputs = notebook.document.cells[0].contents.outputs;
|
||||
console.log('Got cell outputs ---');
|
||||
if (cellOutputs) {
|
||||
cellOutputs.forEach(o => console.log(JSON.stringify(o, undefined, '\t')));
|
||||
}
|
||||
let result = (<azdata.nb.IExecuteResult>cellOutputs[0]).data['text/plain'];
|
||||
assert(result === '2', `Expected python result: 2, Actual: ${result}`);
|
||||
}
|
||||
|
||||
@stressify({ dop: NotebookTester.ParallelCount })
|
||||
async sqlNbClearAllOutputs(title: string): Promise<void> {
|
||||
let notebook = await this.openNotebook(sqlNotebookContent, sqlKernelMetadata, title + this.invocationCount++);
|
||||
await this.verifyClearAllOutputs(notebook);
|
||||
}
|
||||
|
||||
@stressify({ dop: NotebookTester.ParallelCount })
|
||||
async sqlNbMultipleCellsTest(title: string): Promise<void> {
|
||||
let notebook = await this.openNotebook(sqlNotebookMultipleCellsContent, sqlKernelMetadata, title + this.invocationCount++, true);
|
||||
const expectedOutput0 = '(1 row affected)';
|
||||
for (let i = 0; i < 3; i++) {
|
||||
let cellOutputs = notebook.document.cells[i].contents.outputs;
|
||||
console.log(`Got cell outputs --- ${i}`);
|
||||
if (cellOutputs) {
|
||||
cellOutputs.forEach(o => console.log(o));
|
||||
}
|
||||
assert(cellOutputs.length === 3, `Expected length: 3, Actual: '${cellOutputs.length}'`);
|
||||
let actualOutput0 = (<azdata.nb.IDisplayData>cellOutputs[0]).data['text/html'];
|
||||
console.log('Got first output');
|
||||
assert(actualOutput0 === expectedOutput0, `Expected row count: '${expectedOutput0}', Actual: '${actualOutput0}'`);
|
||||
let actualOutput2 = (<azdata.nb.IExecuteResult>cellOutputs[2]).data['application/vnd.dataresource+json'].data[0];
|
||||
assert(actualOutput2[0] === i.toString(), `Expected result: ${i.toString()}, Actual: '${actualOutput2[0]}'`);
|
||||
console.log('Sql multiple cells NB done');
|
||||
}
|
||||
}
|
||||
|
||||
@stressify({ dop: NotebookTester.ParallelCount })
|
||||
async sqlNbTest(title: string): Promise<void> {
|
||||
let notebook = await this.openNotebook(sqlNotebookContent, sqlKernelMetadata, title + this.invocationCount++, false, true);
|
||||
const expectedOutput0 = '(1 row affected)';
|
||||
let cellOutputs = notebook.document.cells[0].contents.outputs;
|
||||
console.log('Got cell outputs ---');
|
||||
if (cellOutputs) {
|
||||
cellOutputs.forEach(o => console.log(o));
|
||||
}
|
||||
assert(cellOutputs.length === 3, `Expected length: 3, Actual: ${cellOutputs.length}`);
|
||||
let actualOutput0 = (<azdata.nb.IDisplayData>cellOutputs[0]).data['text/html'];
|
||||
console.log('Got first output');
|
||||
assert(actualOutput0 === expectedOutput0, `Expected row count: ${expectedOutput0}, Actual: ${actualOutput0}`);
|
||||
let actualOutput2 = (<azdata.nb.IExecuteResult>cellOutputs[2]).data['application/vnd.dataresource+json'].data[0];
|
||||
assert(actualOutput2[0] === '1', `Expected result: 1, Actual: '${actualOutput2[0]}'`);
|
||||
}
|
||||
|
||||
async cleanup(testName: string): Promise<void> {
|
||||
try {
|
||||
let fileName = getFileName(testName + this.invocationCount++);
|
||||
if (fs.existsSync(fileName)) {
|
||||
fs.unlinkSync(fileName);
|
||||
console.log(`"${fileName}" is deleted.`);
|
||||
}
|
||||
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
|
||||
}
|
||||
catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
finally {
|
||||
console.log(`"${testName}" is done`);
|
||||
}
|
||||
}
|
||||
|
||||
async openNotebook(content: azdata.nb.INotebookContents, kernelMetadata: any, testName: string, runAllCells?: boolean, connectToDifferentServer?: boolean): Promise<azdata.nb.NotebookEditor> {
|
||||
let notebookConfig = vscode.workspace.getConfiguration('notebook');
|
||||
notebookConfig.update('pythonPath', getConfigValue(EnvironmentVariable_PYTHON_PATH), 1);
|
||||
if (!connectToDifferentServer) {
|
||||
let server = await getBdcServer();
|
||||
assert(server && server.serverName, 'No server could be found in openNotebook');
|
||||
await connectToServer(server, 6000);
|
||||
}
|
||||
let notebookJson = Object.assign({}, content, { metadata: kernelMetadata });
|
||||
let uri = writeNotebookToFile(notebookJson, testName);
|
||||
console.log(uri);
|
||||
let notebook = await azdata.nb.showNotebookDocument(uri);
|
||||
console.log('Notebook is opened');
|
||||
|
||||
if (!runAllCells) {
|
||||
assert(notebook.document.cells.length === 1, 'Notebook should have 1 cell');
|
||||
console.log('Before run notebook cell');
|
||||
let ran = await notebook.runCell(notebook.document.cells[0]);
|
||||
console.log('After run notebook cell');
|
||||
assert(ran, 'Notebook runCell should succeed');
|
||||
} else {
|
||||
console.log('Before run all notebook cells');
|
||||
let ran = await notebook.runAllCells();
|
||||
assert(ran, 'Notebook runCell should succeed');
|
||||
assert(notebook !== undefined && notebook !== null, 'Expected notebook object is defined');
|
||||
}
|
||||
|
||||
return notebook;
|
||||
}
|
||||
async verifyClearAllOutputs(notebook: azdata.nb.NotebookEditor): Promise<void> {
|
||||
let cellWithOutputs = notebook.document.cells.find(cell => cell.contents && cell.contents.outputs && cell.contents.outputs.length > 0);
|
||||
assert(cellWithOutputs !== undefined, 'Could not find notebook cells with outputs');
|
||||
console.log('Before clearing cell outputs');
|
||||
let clearedOutputs = await notebook.clearAllOutputs();
|
||||
let cells = notebook.document.cells;
|
||||
cells.forEach(cell => {
|
||||
assert(cell.contents && cell.contents.outputs && cell.contents.outputs.length === 0, `Expected Output: 0, Actual: '${cell.contents.outputs.length}'`);
|
||||
});
|
||||
assert(clearedOutputs, 'Outputs of all the code cells from Python notebook should be cleared');
|
||||
console.log('After clearing cell outputs');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -11,141 +11,164 @@ import { context } from './testContext';
|
||||
import { getBdcServer, TestServerProfile, getAzureServer, getStandaloneServer } from './testConfig';
|
||||
import { connectToServer, createDB, deleteDB } from './utils';
|
||||
import assert = require('assert');
|
||||
import { stressify } from 'adstest';
|
||||
|
||||
if (context.RunTest) {
|
||||
suite('Object Explorer integration suite', () => {
|
||||
test('BDC instance node label test', async function () {
|
||||
const expectedNodeLabel = ['Databases', 'Security', 'Server Objects', 'Data Services'];
|
||||
let server = await getBdcServer();
|
||||
await VerifyOeNode(server, 6000, expectedNodeLabel);
|
||||
await (new ObjectExplorerTester()).bdcNodeLabelTest();
|
||||
});
|
||||
test('Standard alone instance node label test', async function () {
|
||||
if (process.platform === 'win32') {
|
||||
const expectedNodeLabel = ['Databases', 'Security', 'Server Objects'];
|
||||
let server = await getStandaloneServer();
|
||||
await VerifyOeNode(server, 3000, expectedNodeLabel);
|
||||
}
|
||||
await (new ObjectExplorerTester()).standaloneNodeLabelTest();
|
||||
});
|
||||
test('Azure SQL DB instance node label test', async function () {
|
||||
const expectedNodeLabel = ['Databases', 'Security'];
|
||||
let server = await getAzureServer();
|
||||
await VerifyOeNode(server, 3000, expectedNodeLabel);
|
||||
await (new ObjectExplorerTester()).sqlDbNodeLabelTest();
|
||||
});
|
||||
|
||||
test('Standard SQL DB context menu test', async function () {
|
||||
let server = await getStandaloneServer();
|
||||
|
||||
let expectedActions: string[];
|
||||
|
||||
// Properties comes from the admin-tool-ext-win extension which is for Windows only, so the item won't show up on non-Win32 platforms
|
||||
if (process.platform === 'win32') {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler', 'Properties'];
|
||||
} else {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler'];
|
||||
}
|
||||
|
||||
await verifyContextMenu(server, expectedActions);
|
||||
await (new ObjectExplorerTester()).sqlDbContextMenuTest();
|
||||
});
|
||||
|
||||
test('BDC instance context menu test', async function () {
|
||||
let server = await getBdcServer();
|
||||
|
||||
let expectedActions: string[];
|
||||
|
||||
// Properties comes from the admin-tool-ext-win extension which is for Windows only, so the item won't show up on non-Win32 platforms
|
||||
if (process.platform === 'win32') {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler', 'Properties'];
|
||||
} else {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler'];
|
||||
}
|
||||
|
||||
await verifyContextMenu(server, expectedActions);
|
||||
await (new ObjectExplorerTester()).bdcContextMenuTest();
|
||||
});
|
||||
|
||||
test('Azure SQL DB context menu test', async function () {
|
||||
const server = await getAzureServer();
|
||||
// Azure DB doesn't have Properties node on server level
|
||||
const expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler'];
|
||||
|
||||
await verifyContextMenu(server, expectedActions);
|
||||
await (new ObjectExplorerTester()).sqlDbContextMenuTest();
|
||||
});
|
||||
|
||||
test('Stand alone database context menu test', async function () {
|
||||
let server = await getStandaloneServer();
|
||||
let expectedActions: string[] = [];
|
||||
if (process.platform === 'win32') {
|
||||
expectedActions = ['Manage', 'New Query', 'Backup', 'Restore', 'Refresh', 'Data-tier Application wizard', 'Schema Compare', 'Import wizard', 'Generate Scripts...', 'Properties'];
|
||||
}
|
||||
else {
|
||||
expectedActions = ['Manage', 'New Query', 'Backup', 'Restore', 'Refresh', 'Data-tier Application wizard', 'Schema Compare', 'Import wizard'];
|
||||
}
|
||||
await VerifyDBContextMenu(server, 3000, expectedActions);
|
||||
await (new ObjectExplorerTester()).standAloneContextMenuTest();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
async function verifyContextMenu(server: TestServerProfile, expectedActions: string[]): Promise<void> {
|
||||
await connectToServer(server, 3000);
|
||||
let nodes = <azdata.objectexplorer.ObjectExplorerNode[]>await azdata.objectexplorer.getActiveConnectionNodes();
|
||||
assert(nodes.length > 0, `Expecting at least one active connection, actual: ${nodes.length}`);
|
||||
class ObjectExplorerTester {
|
||||
private static ParallelCount = 1;
|
||||
|
||||
let index = nodes.findIndex(node => node.nodePath.includes(server.serverName));
|
||||
assert(index !== -1, `Failed to find server: "${server.serverName}" in OE tree`);
|
||||
@stressify({ dop: ObjectExplorerTester.ParallelCount })
|
||||
async bdcNodeLabelTest(): Promise<void> {
|
||||
const expectedNodeLabel = ['Databases', 'Security', 'Server Objects', 'Data Services'];
|
||||
let server = await getBdcServer();
|
||||
await this.verifyOeNode(server, 6000, expectedNodeLabel);
|
||||
}
|
||||
|
||||
let node = nodes[index];
|
||||
let actions = await azdata.objectexplorer.getNodeActions(node.connectionId, node.nodePath);
|
||||
@stressify({ dop: ObjectExplorerTester.ParallelCount })
|
||||
async standaloneNodeLabelTest(): Promise<void> {
|
||||
if (process.platform === 'win32') {
|
||||
const expectedNodeLabel = ['Databases', 'Security', 'Server Objects'];
|
||||
let server = await getStandaloneServer();
|
||||
await this.verifyOeNode(server, 3000, expectedNodeLabel);
|
||||
}
|
||||
}
|
||||
|
||||
let expectedString = expectedActions.join(',');
|
||||
const actualString = actions.join(',');
|
||||
assert(expectedActions.length === actions.length && expectedString === actualString, `Expected actions: "${expectedString}", Actual actions: "${actualString}"`);
|
||||
}
|
||||
@stressify({ dop: ObjectExplorerTester.ParallelCount })
|
||||
async sqlDbNodeLabelTest(): Promise<void> {
|
||||
const expectedNodeLabel = ['Databases', 'Security'];
|
||||
let server = await getAzureServer();
|
||||
await this.verifyOeNode(server, 3000, expectedNodeLabel);
|
||||
}
|
||||
|
||||
async function VerifyOeNode(server: TestServerProfile, timeout: number, expectedNodeLabel: string[]): Promise<void> {
|
||||
await connectToServer(server, timeout);
|
||||
let nodes = <azdata.objectexplorer.ObjectExplorerNode[]>await azdata.objectexplorer.getActiveConnectionNodes();
|
||||
assert(nodes.length > 0, `Expecting at least one active connection, actual: ${nodes.length}`);
|
||||
@stressify({ dop: ObjectExplorerTester.ParallelCount })
|
||||
async sqlDbContextMenuTest(): Promise<void> {
|
||||
let server = await getStandaloneServer();
|
||||
let expectedActions: string[];
|
||||
// Properties comes from the admin-tool-ext-win extension which is for Windows only, so the item won't show up on non-Win32 platforms
|
||||
if (process.platform === 'win32') {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler', 'Properties'];
|
||||
}
|
||||
else {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler'];
|
||||
}
|
||||
await this.verifyContextMenu(server, expectedActions);
|
||||
}
|
||||
|
||||
let index = nodes.findIndex(node => node.nodePath.includes(server.serverName));
|
||||
assert(index !== -1, `Failed to find server: "${server.serverName}" in OE tree`);
|
||||
let actualNodeLabel = [];
|
||||
let children = await nodes[index].getChildren();
|
||||
assert(children.length === expectedNodeLabel.length, `Expecting node count: ${expectedNodeLabel.length}, Actual: ${children.length}`);
|
||||
@stressify({ dop: ObjectExplorerTester.ParallelCount })
|
||||
async standAloneContextMenuTest(): Promise<void> {
|
||||
let server = await getStandaloneServer();
|
||||
let expectedActions: string[] = [];
|
||||
if (process.platform === 'win32') {
|
||||
expectedActions = ['Manage', 'New Query', 'Backup', 'Restore', 'Refresh', 'Data-tier Application wizard', 'Schema Compare', 'Import wizard', 'Generate Scripts...', 'Properties'];
|
||||
}
|
||||
else {
|
||||
expectedActions = ['Manage', 'New Query', 'Backup', 'Restore', 'Refresh', 'Data-tier Application wizard', 'Schema Compare', 'Import wizard'];
|
||||
}
|
||||
await this.verifyDBContextMenu(server, 3000, expectedActions);
|
||||
}
|
||||
|
||||
children.forEach(c => actualNodeLabel.push(c.label));
|
||||
assert(expectedNodeLabel.toLocaleString() === actualNodeLabel.toLocaleString(), `Expected node label: "${expectedNodeLabel}", Actual: "${actualNodeLabel}"`);
|
||||
}
|
||||
@stressify({ dop: ObjectExplorerTester.ParallelCount })
|
||||
async bdcContextMenuTest(): Promise<void> {
|
||||
let server = await getBdcServer();
|
||||
let expectedActions: string[];
|
||||
// Properties comes from the admin-tool-ext-win extension which is for Windows only, so the item won't show up on non-Win32 platforms
|
||||
if (process.platform === 'win32') {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler', 'Properties'];
|
||||
}
|
||||
else {
|
||||
expectedActions = ['Manage', 'New Query', 'Disconnect', 'Delete Connection', 'Refresh', 'New Notebook', 'Data-tier Application wizard', 'Launch Profiler'];
|
||||
}
|
||||
await this.verifyContextMenu(server, expectedActions);
|
||||
}
|
||||
|
||||
async function VerifyDBContextMenu(server: TestServerProfile, timeoutinMS: number, expectedActions: string[]) {
|
||||
async verifyContextMenu(server: TestServerProfile, expectedActions: string[]): Promise<void> {
|
||||
await connectToServer(server, 3000);
|
||||
let nodes = <azdata.objectexplorer.ObjectExplorerNode[]>await azdata.objectexplorer.getActiveConnectionNodes();
|
||||
assert(nodes.length > 0, `Expecting at least one active connection, actual: ${nodes.length}`);
|
||||
|
||||
await connectToServer(server, timeoutinMS);
|
||||
let index = nodes.findIndex(node => node.nodePath.includes(server.serverName));
|
||||
assert(index !== -1, `Failed to find server: "${server.serverName}" in OE tree`);
|
||||
|
||||
let nodes = <azdata.objectexplorer.ObjectExplorerNode[]>await azdata.objectexplorer.getActiveConnectionNodes();
|
||||
assert(nodes.length > 0, `Expecting at least one active connection, actual: ${nodes.length}`);
|
||||
let node = nodes[index];
|
||||
let actions = await azdata.objectexplorer.getNodeActions(node.connectionId, node.nodePath);
|
||||
|
||||
let index = nodes.findIndex(node => node.nodePath.includes(server.serverName));
|
||||
assert(index !== -1, `Failed to find server: "${server.serverName}" in OE tree`);
|
||||
|
||||
let ownerUri = await azdata.connection.getUriForConnection(nodes[index].connectionId);
|
||||
let dbName: string = 'ads_test_VerifyDBContextMenu_' + new Date().getTime().toString();
|
||||
try {
|
||||
await createDB(dbName, ownerUri);
|
||||
|
||||
let serverNode = nodes[index];
|
||||
let children = await serverNode.getChildren();
|
||||
|
||||
assert(children[0].label.toLocaleLowerCase === 'Databases'.toLocaleLowerCase, `Expected Databases node. Actual ${children[0].label}`);
|
||||
let databasesFolder = children[0];
|
||||
|
||||
let databases = await databasesFolder.getChildren();
|
||||
assert(databases.length > 2, `No database present, can not test further`); // System Databses folder and at least one database
|
||||
|
||||
let actions = await azdata.objectexplorer.getNodeActions(databases[1].connectionId, databases[1].nodePath);
|
||||
|
||||
const expectedString = expectedActions.join(',');
|
||||
let expectedString = expectedActions.join(',');
|
||||
const actualString = actions.join(',');
|
||||
assert(expectedActions.length === actions.length && expectedString === actualString, `Expected actions: "${expectedString}", Actual actions: "${actualString}"`);
|
||||
}
|
||||
finally {
|
||||
await deleteDB(dbName, ownerUri);
|
||||
|
||||
async verifyOeNode(server: TestServerProfile, timeout: number, expectedNodeLabel: string[]): Promise<void> {
|
||||
await connectToServer(server, timeout);
|
||||
let nodes = <azdata.objectexplorer.ObjectExplorerNode[]>await azdata.objectexplorer.getActiveConnectionNodes();
|
||||
assert(nodes.length > 0, `Expecting at least one active connection, actual: ${nodes.length}`);
|
||||
|
||||
let index = nodes.findIndex(node => node.nodePath.includes(server.serverName));
|
||||
assert(index !== -1, `Failed to find server: "${server.serverName}" in OE tree`);
|
||||
let actualNodeLabel = [];
|
||||
let children = await nodes[index].getChildren();
|
||||
assert(children.length === expectedNodeLabel.length, `Expecting node count: ${expectedNodeLabel.length}, Actual: ${children.length}`);
|
||||
|
||||
children.forEach(c => actualNodeLabel.push(c.label));
|
||||
assert(expectedNodeLabel.toLocaleString() === actualNodeLabel.toLocaleString(), `Expected node label: "${expectedNodeLabel}", Actual: "${actualNodeLabel}"`);
|
||||
}
|
||||
|
||||
async verifyDBContextMenu(server: TestServerProfile, timeoutinMS: number, expectedActions: string[]): Promise<void> {
|
||||
|
||||
await connectToServer(server, timeoutinMS);
|
||||
|
||||
let nodes = <azdata.objectexplorer.ObjectExplorerNode[]>await azdata.objectexplorer.getActiveConnectionNodes();
|
||||
assert(nodes.length > 0, `Expecting at least one active connection, actual: ${nodes.length}`);
|
||||
|
||||
let index = nodes.findIndex(node => node.nodePath.includes(server.serverName));
|
||||
assert(index !== -1, `Failed to find server: "${server.serverName}" in OE tree`);
|
||||
|
||||
let ownerUri = await azdata.connection.getUriForConnection(nodes[index].connectionId);
|
||||
let dbName: string = 'ads_test_VerifyDBContextMenu_' + new Date().getTime().toString();
|
||||
try {
|
||||
await createDB(dbName, ownerUri);
|
||||
|
||||
let serverNode = nodes[index];
|
||||
let children = await serverNode.getChildren();
|
||||
|
||||
assert(children[0].label.toLocaleLowerCase === 'Databases'.toLocaleLowerCase, `Expected Databases node. Actual ${children[0].label}`);
|
||||
let databasesFolder = children[0];
|
||||
|
||||
let databases = await databasesFolder.getChildren();
|
||||
assert(databases.length > 2, `No database present, can not test further`); // System Databses folder and at least one database
|
||||
|
||||
let actions = await azdata.objectexplorer.getNodeActions(databases[1].connectionId, databases[1].nodePath);
|
||||
|
||||
const expectedString = expectedActions.join(',');
|
||||
const actualString = actions.join(',');
|
||||
assert(expectedActions.length === actions.length && expectedString === actualString, `Expected actions: "${expectedString}", Actual actions: "${actualString}"`);
|
||||
}
|
||||
finally {
|
||||
await deleteDB(dbName, ownerUri);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"module": "commonjs",
|
||||
"target": "ES5",
|
||||
"outDir": "out",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user