Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
abist committed Dec 10, 2019
2 parents e9ac9f7 + bfa3698 commit a6e9928
Show file tree
Hide file tree
Showing 10 changed files with 226 additions and 79 deletions.
2 changes: 1 addition & 1 deletion src/configurations/dev.config.json
@@ -1,7 +1,7 @@
{
"service": {
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
"version": "2.0.0-release.30",
"version": "2.0.0-release.39",
"downloadFileNames": {
"Windows_7_86": "win-x86-netcoreapp2.2.zip",
"Windows_7_64": "win-x64-netcoreapp2.2.zip",
Expand Down
4 changes: 3 additions & 1 deletion src/constants/constants.ts
Expand Up @@ -130,4 +130,6 @@ export const sqlToolsServiceConfigKey = 'service';
export const v1SqlToolsServiceConfigKey = 'v1Service';
export const scriptSelectText = 'SELECT TOP (1000) * FROM ';
export const tenantDisplayName = 'Microsoft';
export const firewallErrorMessage = 'To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.';
export const firewallErrorMessage = 'To enable access, use the Windows Azure Management Portal or run sp_set_firewall_rule on the master database to create a firewall rule for this IP address or address range.';
export const windowsResourceClientPath = 'SqlToolsResourceProviderService.exe';
export const unixResourceClientPath = 'SqlToolsResourceProviderService';
9 changes: 8 additions & 1 deletion src/extension.ts
Expand Up @@ -25,6 +25,9 @@ export function activate(context: vscode.ExtensionContext): Promise<boolean> {
if (applyLocalization) {
LocalizedConstants.loadLocalizedConstants(vscode.env.language);
}

// Exposed for testing purposes
vscode.commands.registerCommand('mssql.getControllerForTests', () => controller);
return controller.activate();
}

Expand All @@ -39,6 +42,10 @@ export function deactivate(): void {
/**
* Exposed for testing purposes
*/
export function getController(): MainController {
export async function getController(): Promise<MainController> {
if (!controller) {
let savedController: MainController = await vscode.commands.executeCommand('mssql.getControllerForTests');
return savedController;
}
return controller;
}
7 changes: 7 additions & 0 deletions src/firewall/firewallService.ts
Expand Up @@ -36,6 +36,13 @@ export class FirewallService {
return this._account;
}

/**
* Public for testing purposes only
*/
public set token(value: any) {
this._token = value;
}

private convertToAzureAccount(azureSession: AzureSession): Account {
let tenant = {
displayName: Constants.tenantDisplayName,
Expand Down
2 changes: 1 addition & 1 deletion src/languageservice/httpClient.ts
Expand Up @@ -146,7 +146,7 @@ export default class HttpClient implements IHttpClient {
/*
* Interface to store the values needed to calculate download percentage
*/
interface IDownloadProgress {
export interface IDownloadProgress {
packageSize: number;
downloadedBytes: number;
downloadPercentage: number;
Expand Down
10 changes: 5 additions & 5 deletions src/languageservice/serviceclient.ts
Expand Up @@ -3,7 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';

import { ExtensionContext, workspace, window, OutputChannel, languages } from 'vscode';
import {
LanguageClient, LanguageClientOptions, ServerOptions,
Expand Down Expand Up @@ -190,11 +189,11 @@ export default class SqlToolsServiceClient {
_channel.show();
}
let installedServerPath = await this._server.downloadServerFiles(platformInfo.runtimeId);
this.initializeLanguageClient(installedServerPath, context);
this.initializeLanguageClient(installedServerPath, context, platformInfo.isWindows());
await this._client.onReady();
resolve(new ServerInitializationResult(true, true, installedServerPath));
} else {
this.initializeLanguageClient(serverPath, context);
this.initializeLanguageClient(serverPath, context, platformInfo.isWindows());
await this._client.onReady();
resolve(new ServerInitializationResult(false, true, serverPath));
}
Expand Down Expand Up @@ -256,7 +255,7 @@ export default class SqlToolsServiceClient {
});
}

private initializeLanguageClient(serverPath: string, context: ExtensionContext): void {
private initializeLanguageClient(serverPath: string, context: ExtensionContext, isWindows: boolean): void {
if (serverPath === undefined) {
Utils.logDebug(Constants.invalidServiceFilePath);
throw new Error(Constants.invalidServiceFilePath);
Expand All @@ -265,7 +264,8 @@ export default class SqlToolsServiceClient {
self.initializeLanguageConfiguration();
let serverOptions: ServerOptions = this.createServerOptions(serverPath);
this.client = this.createLanguageClient(serverOptions);
let resourcePath = path.join(path.dirname(serverPath), 'SqlToolsResourceProviderService.exe');
let executablePath = isWindows ? Constants.windowsResourceClientPath : Constants.unixResourceClientPath;
let resourcePath = path.join(path.dirname(serverPath), executablePath);
this._resourceClient = this.createResourceClient(resourcePath);

if (context !== undefined) {
Expand Down
83 changes: 83 additions & 0 deletions test/firewallService.test.ts
@@ -0,0 +1,83 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import * as vscode from 'vscode';
import * as TypeMoq from 'typemoq';
import SqlToolsServiceClient from '../src/languageservice/serviceclient';
import { FirewallService } from '../src/firewall/firewallService';
import { HandleFirewallRuleRequest, HandleFirewallRuleResponse,
CreateFirewallRuleRequest, CreateFirewallRuleResponse, HandleFirewallRuleParams } from '../src/models/contracts/firewall/firewallRequest';
import VscodeWrapper from '../src/controllers/vscodeWrapper';
import { assert } from 'chai';
import { AzureSession } from '../src/models/interfaces';


suite('Firewall Service Tests', () => {
let firewallService: FirewallService;
let client: TypeMoq.IMock<SqlToolsServiceClient>;
let vscodeWrapper: TypeMoq.IMock<VscodeWrapper>;

setup(() => {
client = TypeMoq.Mock.ofType(SqlToolsServiceClient, TypeMoq.MockBehavior.Loose);
let mockHandleFirewallResponse: HandleFirewallRuleResponse = {
result: true,
ipAddress: '128.0.0.0'
};
let mockCreateFirewallRuleResponse: CreateFirewallRuleResponse = {
result: true,
errorMessage: ''
};
client.setup(c => c.sendResourceRequest(HandleFirewallRuleRequest.type, TypeMoq.It.isAny())).returns(() => Promise.resolve(mockHandleFirewallResponse));
client.setup(c => c.sendResourceRequest(CreateFirewallRuleRequest.type, TypeMoq.It.isAny())).returns(() => Promise.resolve(mockCreateFirewallRuleResponse));
vscodeWrapper = TypeMoq.Mock.ofType(VscodeWrapper, TypeMoq.MockBehavior.Loose);
let mockSession: AzureSession = {
environment: undefined,
userId: 'test',
tenantId: 'test',
credentials: undefined
};
let mockExtension: vscode.Extension<any> = {
id: '',
extensionKind: undefined,
extensionPath: '',
isActive: true,
packageJSON: undefined,
activate: undefined,
exports: {
sessions: [mockSession]
}
};
vscodeWrapper.setup(v => v.azureAccountExtension).returns(() => mockExtension);
firewallService = new FirewallService(client.object, vscodeWrapper.object);
});

test('isSignedIn Test', () => {
let isSignedIn = firewallService.isSignedIn;
assert.isNotTrue(isSignedIn, 'Firewall Service should not be signed in initially');
firewallService.isSignedIn = true;
assert.isTrue(firewallService.isSignedIn, 'Firewall Service should be signed in once set');
});

test('Handle Firewall Rule test', async () => {
let result = await firewallService.handleFirewallRule(12345, 'firewall error!');
assert.isNotNull(result, 'Handle Firewall Rule request is sent successfully');
});

test('Create Firewall Rule Test', async () => {
let server = 'test_server';
let startIpAddress = '1.2.3.1';
let endIpAddress = '1.2.3.255';
firewallService.isSignedIn = true;
let mockToken = {
expiresOn: new Date(),
resource: undefined,
tokenType: 'test',
accessToken: 'test_token'
}
firewallService.token = mockToken;
let result = await firewallService.createFirewallRule(server, startIpAddress, endIpAddress);
assert.isNotNull(result, 'Create Firewall Rule request is sent successfully');
});
});

7 changes: 4 additions & 3 deletions test/initialization.test.ts
Expand Up @@ -32,13 +32,14 @@ suite('Initialization Tests', () => {
Telemetry.disable();
});

test('Connection manager is initialized properly', () => {
test('Connection manager is initialized properly', (done) => {
// Wait for the extension to activate
ensureExtensionIsActive().then(() => {
ensureExtensionIsActive().then(async () => {
// Verify that the connection manager was initialized properly
let controller: MainController = Extension.getController();
let controller: MainController = await Extension.getController();
let connectionManager: ConnectionManager = controller.connectionManager;
assert.notStrictEqual(undefined, connectionManager.client);
done();
});
});
});
70 changes: 70 additions & 0 deletions test/languageService.test.ts
@@ -0,0 +1,70 @@
import DecompressProvider from "../src/languageservice/decompressProvider";
import { IPackage, IStatusView } from "../src/languageservice/interfaces";
import { ILogger } from "../src/models/interfaces";
import { assert } from "chai";
import HttpClient, { IDownloadProgress } from "../src/languageservice/httpClient";
import { HttpModule } from "../out/src/views/htmlcontent/src/js/lib/@angular/http";

/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */

suite('Language Service Tests', () => {

suite('Decompress Provider Tests', () => {
let decompressProvider = new DecompressProvider();

test('Decompress package test', async () => {
let testPackage: IPackage = {
url: 'test_url',
tmpFile: undefined
};
let testLogger: ILogger = {
logDebug: undefined,
increaseIndent: undefined,
decreaseIndent: undefined,
append: undefined,
appendLine: undefined

};
try {
await decompressProvider.decompress(testPackage, testLogger);
} catch (err) {
assert.isNotNull(err, 'Should throw an error');
}
});
});

suite('HttpClient Tests', () => {
let httpClient = new HttpClient();

test('handleDataReceivedEvent test', () => {
let mockProgress: IDownloadProgress = {
packageSize: 10,
downloadedBytes: 0,
downloadPercentage: 0,
dots: 0
};
let testLogger: ILogger = {
logDebug: () => undefined,
increaseIndent: () => undefined,
decreaseIndent: () => undefined,
append: () => undefined,
appendLine: () => undefined

};
let mockStatusView: IStatusView = {
installingService: () => undefined,
serviceInstalled: () => undefined,
serviceInstallationFailed: () => undefined,
updateServiceDownloadingProgress: (downloadPercentage: number) => undefined
}
httpClient.handleDataReceivedEvent(mockProgress, [1,2,3,4,5], testLogger, mockStatusView);
assert.strictEqual(mockProgress.downloadPercentage, 50);
assert.strictEqual(mockProgress.downloadedBytes, 5);
assert.strictEqual(mockProgress.dots, 10);
});
});
});

0 comments on commit a6e9928

Please sign in to comment.