mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
added perf tests using test driver (#136)
* added perf tests using test driver
This commit is contained in:
@@ -14,6 +14,7 @@ using System.Threading.Tasks;
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol;
|
||||
using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol.Channel;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageServices.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Driver
|
||||
@@ -93,6 +94,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Driver
|
||||
// Setup events to queue for testing
|
||||
this.QueueEventsForType(ConnectionCompleteNotification.Type);
|
||||
this.QueueEventsForType(QueryExecuteCompleteEvent.Type);
|
||||
this.QueueEventsForType(PublishDiagnosticsNotification.Type);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.SqlTools.ServiceLayer.TestDriver.Driver;
|
||||
@@ -31,20 +32,36 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver
|
||||
|
||||
Task.Run(async () =>
|
||||
{
|
||||
string testNamespace = "Microsoft.SqlTools.ServiceLayer.TestDriver.Tests.";
|
||||
foreach (var test in args)
|
||||
{
|
||||
try
|
||||
{
|
||||
var className = test.Substring(0, test.LastIndexOf('.'));
|
||||
var methodName = test.Substring(test.LastIndexOf('.') + 1);
|
||||
var testName = test.Contains(testNamespace) ? test.Replace(testNamespace, "") : test;
|
||||
bool containsTestName = testName.Contains(".");
|
||||
var className = containsTestName ? testName.Substring(0, testName.LastIndexOf('.')) : testName;
|
||||
var methodName = containsTestName ? testName.Substring(testName.LastIndexOf('.') + 1) : null;
|
||||
|
||||
var type = Type.GetType("Microsoft.SqlTools.ServiceLayer.TestDriver.Tests." + className);
|
||||
using (var typeInstance = (IDisposable)Activator.CreateInstance(type))
|
||||
var type = Type.GetType(testNamespace + className);
|
||||
if (type == null)
|
||||
{
|
||||
MethodInfo methodInfo = type.GetMethod(methodName);
|
||||
|
||||
Console.WriteLine("Running test " + test);
|
||||
await (Task)methodInfo.Invoke(typeInstance, null);
|
||||
Console.WriteLine("Invalid class name");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrEmpty(methodName))
|
||||
{
|
||||
var methods = type.GetMethods().Where(x => x.CustomAttributes.Any(a => a.AttributeType == typeof(FactAttribute)));
|
||||
foreach (var method in methods)
|
||||
{
|
||||
await RunTest(type, method, method.Name);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MethodInfo methodInfo = type.GetMethod(methodName);
|
||||
await RunTest(type, methodInfo, test);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -54,5 +71,22 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver
|
||||
}
|
||||
}).Wait();
|
||||
}
|
||||
|
||||
private static async Task RunTest(Type type, MethodInfo methodInfo, string testName)
|
||||
{
|
||||
if (methodInfo == null)
|
||||
{
|
||||
Console.WriteLine("Invalid method name");
|
||||
}
|
||||
else
|
||||
{
|
||||
using (var typeInstance = (IDisposable)Activator.CreateInstance(type))
|
||||
{
|
||||
Console.WriteLine("Running test " + testName);
|
||||
await (Task)methodInfo.Invoke(typeInstance, null);
|
||||
Console.WriteLine("Test ran successfully: " + testName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,682 @@
|
||||
USE [AdventureWorks2016CTP3]
|
||||
GO
|
||||
|
||||
SELECT [SystemInformationID]
|
||||
,[Database Version]
|
||||
,[VersionDate]
|
||||
,[ModifiedDate]
|
||||
FROM [dbo].[AWBuildVersion]
|
||||
GO
|
||||
|
||||
|
||||
GO
|
||||
|
||||
SELECT [DatabaseLogID]
|
||||
,[PostTime]
|
||||
,[DatabaseUser]
|
||||
,[Event]
|
||||
,[Schema]
|
||||
,[Object]
|
||||
,[TSQL]
|
||||
,[XmlEvent]
|
||||
FROM [dbo].[DatabaseLog]
|
||||
GO
|
||||
|
||||
|
||||
SELECT [OrderQty]
|
||||
,[ProductID]
|
||||
,[SpecialOfferID]
|
||||
,[OrderID]
|
||||
,[LocalID]
|
||||
FROM [Demo].[DemoSalesOrderDetailSeed]
|
||||
GO
|
||||
|
||||
SELECT [DueDate]
|
||||
,[CustomerID]
|
||||
,[SalesPersonID]
|
||||
,[BillToAddressID]
|
||||
,[ShipToAddressID]
|
||||
,[ShipMethodID]
|
||||
,[LocalID]
|
||||
FROM [Demo].[DemoSalesOrderHeaderSeed]
|
||||
GO
|
||||
|
||||
SELECT [DepartmentID]
|
||||
,[Name]
|
||||
,[GroupName]
|
||||
,[ModifiedDate]
|
||||
FROM [HumanResources].[Department]
|
||||
GO
|
||||
|
||||
SELECT [BusinessEntityID]
|
||||
,[NationalIDNumber]
|
||||
,[LoginID]
|
||||
,[OrganizationNode]
|
||||
,[OrganizationLevel]
|
||||
,[JobTitle]
|
||||
,[BirthDate]
|
||||
,[MaritalStatus]
|
||||
,[Gender]
|
||||
,[HireDate]
|
||||
,[SalariedFlag]
|
||||
,[VacationHours]
|
||||
,[SickLeaveHours]
|
||||
,[CurrentFlag]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [HumanResources].[Employee]
|
||||
GO
|
||||
|
||||
SELECT [TrackingEventID]
|
||||
,[EventName]
|
||||
FROM [Sales].[TrackingEvent]
|
||||
GO
|
||||
|
||||
SELECT [SalesTaxRateID]
|
||||
,[StateProvinceID]
|
||||
,[TaxType]
|
||||
,[TaxRate]
|
||||
,[Name]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[SalesTaxRate]
|
||||
GO
|
||||
|
||||
SELECT [SalesOrderID]
|
||||
,[SalesOrderDetailID]
|
||||
,[CarrierTrackingNumber]
|
||||
,[OrderQty]
|
||||
,[ProductID]
|
||||
,[SpecialOfferID]
|
||||
,[UnitPrice]
|
||||
,[UnitPriceDiscount]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[SalesOrderDetail_inmem]
|
||||
GO
|
||||
|
||||
SELECT [SalesOrderID]
|
||||
,[RevisionNumber]
|
||||
,[OrderDate]
|
||||
,[DueDate]
|
||||
,[ShipDate]
|
||||
,[Status]
|
||||
,[OnlineOrderFlag]
|
||||
,[SalesOrderNumber]
|
||||
,[PurchaseOrderNumber]
|
||||
,[AccountNumber]
|
||||
,[CustomerID]
|
||||
,[SalesPersonID]
|
||||
,[TerritoryID]
|
||||
,[BillToAddressID]
|
||||
,[ShipToAddressID]
|
||||
,[ShipMethodID]
|
||||
,[CreditCardID]
|
||||
,[CreditCardApprovalCode]
|
||||
,[CurrencyRateID]
|
||||
,[SubTotal]
|
||||
,[TaxAmt]
|
||||
,[Freight]
|
||||
,[TotalDue]
|
||||
,[Comment]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[SalesOrderHeader]
|
||||
GO
|
||||
|
||||
|
||||
|
||||
SELECT [SalesOrderID]
|
||||
,[RevisionNumber]
|
||||
,[OrderDate]
|
||||
,[DueDate]
|
||||
,[ShipDate]
|
||||
,[Status]
|
||||
,[OnlineOrderFlag]
|
||||
,[SalesOrderNumber]
|
||||
,[PurchaseOrderNumber]
|
||||
,[AccountNumber]
|
||||
,[CustomerID]
|
||||
,[SalesPersonID]
|
||||
,[TerritoryID]
|
||||
,[BillToAddressID]
|
||||
,[ShipToAddressID]
|
||||
,[ShipMethodID]
|
||||
,[CreditCardID]
|
||||
,[CreditCardApprovalCode]
|
||||
,[CurrencyRateID]
|
||||
,[SubTotal]
|
||||
,[TaxAmt]
|
||||
,[Freight]
|
||||
,[TotalDue]
|
||||
,[Comment]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[SalesOrder_json]
|
||||
GO
|
||||
|
||||
SELECT [BusinessEntityID]
|
||||
,[CreditCardID]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[PersonCreditCard]
|
||||
GO
|
||||
|
||||
SELECT [OrderTrackingID]
|
||||
,[SalesOrderID]
|
||||
,[CarrierTrackingNumber]
|
||||
,[TrackingEventID]
|
||||
,[EventDetails]
|
||||
,[EventDateTime]
|
||||
FROM [Sales].[OrderTracking]
|
||||
GO
|
||||
|
||||
SELECT [CustomerID]
|
||||
,[FirstName]
|
||||
,[LastName]
|
||||
,[SSN]
|
||||
,[CreditCardNumber]
|
||||
,[EmailAddress]
|
||||
,[PhoneNumber]
|
||||
,[TerritoryID]
|
||||
FROM [Sales].[CustomerPII]
|
||||
GO
|
||||
|
||||
SELECT [CustomerID]
|
||||
,[PersonID]
|
||||
,[StoreID]
|
||||
,[TerritoryID]
|
||||
,[AccountNumber]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[Customer]
|
||||
GO
|
||||
|
||||
SELECT [CurrencyRateID]
|
||||
,[CurrencyRateDate]
|
||||
,[FromCurrencyCode]
|
||||
,[ToCurrencyCode]
|
||||
,[AverageRate]
|
||||
,[EndOfDayRate]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[CurrencyRate]
|
||||
GO
|
||||
|
||||
|
||||
SELECT [CurrencyCode]
|
||||
,[Name]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[Currency]
|
||||
GO
|
||||
|
||||
SELECT [CreditCardID]
|
||||
,[CardType]
|
||||
,[CardNumber]
|
||||
,[ExpMonth]
|
||||
,[ExpYear]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[CreditCard]
|
||||
GO
|
||||
|
||||
SELECT [CountryRegionCode]
|
||||
,[CurrencyCode]
|
||||
,[ModifiedDate]
|
||||
FROM [Sales].[CountryRegionCurrency]
|
||||
GO
|
||||
|
||||
SELECT [BusinessEntityID]
|
||||
,[AccountNumber]
|
||||
,[Name]
|
||||
,[CreditRating]
|
||||
,[PreferredVendorStatus]
|
||||
,[ActiveFlag]
|
||||
,[PurchasingWebServiceURL]
|
||||
,[ModifiedDate]
|
||||
FROM [Purchasing].[Vendor]
|
||||
GO
|
||||
|
||||
SELECT [ShipMethodID]
|
||||
,[Name]
|
||||
,[ShipBase]
|
||||
,[ShipRate]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Purchasing].[ShipMethod]
|
||||
GO
|
||||
|
||||
SELECT [PurchaseOrderID]
|
||||
,[RevisionNumber]
|
||||
,[Status]
|
||||
,[EmployeeID]
|
||||
,[VendorID]
|
||||
,[ShipMethodID]
|
||||
,[OrderDate]
|
||||
,[ShipDate]
|
||||
,[SubTotal]
|
||||
,[TaxAmt]
|
||||
,[Freight]
|
||||
,[TotalDue]
|
||||
,[ModifiedDate]
|
||||
FROM [Purchasing].[PurchaseOrderHeader]
|
||||
GO
|
||||
|
||||
SELECT [PurchaseOrderID]
|
||||
,[PurchaseOrderDetailID]
|
||||
,[DueDate]
|
||||
,[OrderQty]
|
||||
,[ProductID]
|
||||
,[UnitPrice]
|
||||
,[LineTotal]
|
||||
,[ReceivedQty]
|
||||
,[RejectedQty]
|
||||
,[StockedQty]
|
||||
,[ModifiedDate]
|
||||
FROM [Purchasing].[PurchaseOrderDetail]
|
||||
GO
|
||||
|
||||
SELECT [LocationID]
|
||||
,[Name]
|
||||
,[CostRate]
|
||||
,[Availability]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[Location]
|
||||
GO
|
||||
|
||||
|
||||
SELECT [ProductID]
|
||||
,[Name]
|
||||
,[ProductNumber]
|
||||
,[MakeFlag]
|
||||
,[FinishedGoodsFlag]
|
||||
,[Color]
|
||||
,[SafetyStockLevel]
|
||||
,[ReorderPoint]
|
||||
,[StandardCost]
|
||||
,[ListPrice]
|
||||
,[Size]
|
||||
,[SizeUnitMeasureCode]
|
||||
,[WeightUnitMeasureCode]
|
||||
,[Weight]
|
||||
,[DaysToManufacture]
|
||||
,[ProductLine]
|
||||
,[Class]
|
||||
,[Style]
|
||||
,[ProductSubcategoryID]
|
||||
,[ProductModelID]
|
||||
,[SellStartDate]
|
||||
,[SellEndDate]
|
||||
,[DiscontinuedDate]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[Product]
|
||||
GO
|
||||
|
||||
SELECT [ProductID]
|
||||
,[Name]
|
||||
,[ProductNumber]
|
||||
,[MakeFlag]
|
||||
,[FinishedGoodsFlag]
|
||||
,[Color]
|
||||
,[SafetyStockLevel]
|
||||
,[ReorderPoint]
|
||||
,[StandardCost]
|
||||
,[ListPrice]
|
||||
,[Size]
|
||||
,[SizeUnitMeasureCode]
|
||||
,[WeightUnitMeasureCode]
|
||||
,[Weight]
|
||||
,[DaysToManufacture]
|
||||
,[ProductLine]
|
||||
,[Class]
|
||||
,[Style]
|
||||
,[ProductSubcategoryID]
|
||||
,[ProductModelID]
|
||||
,[SellStartDate]
|
||||
,[SellEndDate]
|
||||
,[DiscontinuedDate]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[Product_inmem]
|
||||
GO
|
||||
|
||||
SELECT [ProductID]
|
||||
,[Name]
|
||||
,[ProductNumber]
|
||||
,[MakeFlag]
|
||||
,[FinishedGoodsFlag]
|
||||
,[Color]
|
||||
,[SafetyStockLevel]
|
||||
,[ReorderPoint]
|
||||
,[StandardCost]
|
||||
,[ListPrice]
|
||||
,[Size]
|
||||
,[SizeUnitMeasureCode]
|
||||
,[WeightUnitMeasureCode]
|
||||
,[Weight]
|
||||
,[DaysToManufacture]
|
||||
,[ProductLine]
|
||||
,[Class]
|
||||
,[Style]
|
||||
,[ProductSubcategoryID]
|
||||
,[ProductModelID]
|
||||
,[SellStartDate]
|
||||
,[SellEndDate]
|
||||
,[DiscontinuedDate]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[Product_ondisk]
|
||||
GO
|
||||
|
||||
SELECT [ProductCategoryID]
|
||||
,[Name]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductCategory]
|
||||
GO
|
||||
|
||||
SELECT [ProductID]
|
||||
,[StartDate]
|
||||
,[EndDate]
|
||||
,[StandardCost]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductCostHistory]
|
||||
GO
|
||||
|
||||
SELECT [ProductDescriptionID]
|
||||
,[Description]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductDescription]
|
||||
GO
|
||||
|
||||
|
||||
SELECT [ProductID]
|
||||
,[DocumentNode]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductDocument]
|
||||
GO
|
||||
|
||||
SELECT [ProductID]
|
||||
,[LocationID]
|
||||
,[Shelf]
|
||||
,[Bin]
|
||||
,[Quantity]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductInventory]
|
||||
GO
|
||||
|
||||
SELECT [ProductID]
|
||||
,[StartDate]
|
||||
,[EndDate]
|
||||
,[ListPrice]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductListPriceHistory]
|
||||
GO
|
||||
|
||||
SELECT [ProductModelID]
|
||||
,[Name]
|
||||
,[CatalogDescription]
|
||||
,[Instructions]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductModel]
|
||||
GO
|
||||
|
||||
SELECT [ProductModelID]
|
||||
,[IllustrationID]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductModelIllustration]
|
||||
GO
|
||||
|
||||
SELECT [ProductModelID]
|
||||
,[IllustrationID]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductModelIllustration]
|
||||
GO
|
||||
SELECT [ProductModelID]
|
||||
,[ProductDescriptionID]
|
||||
,[CultureID]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductModelProductDescriptionCulture]
|
||||
GO
|
||||
SELECT [ProductPhotoID]
|
||||
,[ThumbNailPhoto]
|
||||
,[ThumbnailPhotoFileName]
|
||||
,[LargePhoto]
|
||||
,[LargePhotoFileName]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductPhoto]
|
||||
GO
|
||||
SELECT [ProductID]
|
||||
,[ProductPhotoID]
|
||||
,[Primary]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductProductPhoto]
|
||||
GO
|
||||
SELECT [ProductReviewID]
|
||||
,[ProductID]
|
||||
,[ReviewerName]
|
||||
,[ReviewDate]
|
||||
,[EmailAddress]
|
||||
,[Rating]
|
||||
,[Comments]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[ProductReview]
|
||||
GO
|
||||
|
||||
SELECT [TransactionID]
|
||||
,[ProductID]
|
||||
,[ReferenceOrderID]
|
||||
,[ReferenceOrderLineID]
|
||||
,[TransactionDate]
|
||||
,[TransactionType]
|
||||
,[Quantity]
|
||||
,[ActualCost]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[TransactionHistory]
|
||||
GO
|
||||
|
||||
SELECT [TransactionID]
|
||||
,[ProductID]
|
||||
,[ReferenceOrderID]
|
||||
,[ReferenceOrderLineID]
|
||||
,[TransactionDate]
|
||||
,[TransactionType]
|
||||
,[Quantity]
|
||||
,[ActualCost]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[TransactionHistoryArchive]
|
||||
GO
|
||||
SELECT [UnitMeasureCode]
|
||||
,[Name]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[UnitMeasure]
|
||||
GO
|
||||
|
||||
SELECT [WorkOrderID]
|
||||
,[ProductID]
|
||||
,[OrderQty]
|
||||
,[StockedQty]
|
||||
,[ScrappedQty]
|
||||
,[StartDate]
|
||||
,[EndDate]
|
||||
,[DueDate]
|
||||
,[ScrapReasonID]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[WorkOrder]
|
||||
GO
|
||||
SELECT [WorkOrderID]
|
||||
,[ProductID]
|
||||
,[OperationSequence]
|
||||
,[LocationID]
|
||||
,[ScheduledStartDate]
|
||||
,[ScheduledEndDate]
|
||||
,[ActualStartDate]
|
||||
,[ActualEndDate]
|
||||
,[ActualResourceHrs]
|
||||
,[PlannedCost]
|
||||
,[ActualCost]
|
||||
,[ModifiedDate]
|
||||
FROM [Production].[WorkOrderRouting]
|
||||
GO
|
||||
|
||||
SELECT [ProductID]
|
||||
,[BusinessEntityID]
|
||||
,[AverageLeadTime]
|
||||
,[StandardPrice]
|
||||
,[LastReceiptCost]
|
||||
,[LastReceiptDate]
|
||||
,[MinOrderQty]
|
||||
,[MaxOrderQty]
|
||||
,[OnOrderQty]
|
||||
,[UnitMeasureCode]
|
||||
,[ModifiedDate]
|
||||
FROM [Purchasing].[ProductVendor]
|
||||
GO
|
||||
|
||||
SELECT [PurchaseOrderID]
|
||||
,[PurchaseOrderDetailID]
|
||||
,[DueDate]
|
||||
,[OrderQty]
|
||||
,[ProductID]
|
||||
,[UnitPrice]
|
||||
,[LineTotal]
|
||||
,[ReceivedQty]
|
||||
,[RejectedQty]
|
||||
,[StockedQty]
|
||||
,[ModifiedDate]
|
||||
FROM [Purchasing].[PurchaseOrderDetail]
|
||||
GO
|
||||
SELECT [AddressID]
|
||||
,[AddressLine1]
|
||||
,[AddressLine2]
|
||||
,[City]
|
||||
,[StateProvinceID]
|
||||
,[PostalCode]
|
||||
,[SpatialLocation]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[Address]
|
||||
GO
|
||||
SELECT [AddressTypeID]
|
||||
,[Name]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[AddressType]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[BusinessEntity]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[AddressID]
|
||||
,[AddressTypeID]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[BusinessEntityAddress]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[PersonID]
|
||||
,[ContactTypeID]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[BusinessEntityContact]
|
||||
GO
|
||||
SELECT [ContactTypeID]
|
||||
,[Name]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[ContactType]
|
||||
GO
|
||||
SELECT [CountryRegionCode]
|
||||
,[Name]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[CountryRegion]
|
||||
GO
|
||||
|
||||
SELECT [BusinessEntityID]
|
||||
,[EmailAddressID]
|
||||
,[EmailAddress]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[EmailAddress]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[PasswordHash]
|
||||
,[PasswordSalt]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[Password]
|
||||
GO
|
||||
|
||||
SELECT [BusinessEntityID]
|
||||
,[PersonType]
|
||||
,[NameStyle]
|
||||
,[Title]
|
||||
,[FirstName]
|
||||
,[MiddleName]
|
||||
,[LastName]
|
||||
,[Suffix]
|
||||
,[EmailPromotion]
|
||||
,[AdditionalContactInfo]
|
||||
,[Demographics]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[Person]
|
||||
GO
|
||||
SELECT [PersonID]
|
||||
,[PersonType]
|
||||
,[NameStyle]
|
||||
,[Title]
|
||||
,[FirstName]
|
||||
,[MiddleName]
|
||||
,[LastName]
|
||||
,[Suffix]
|
||||
,[EmailPromotion]
|
||||
,[AdditionalContactInfo]
|
||||
,[Demographics]
|
||||
,[rowguid]
|
||||
,[ModifiedDate]
|
||||
FROM [Person].[Person_json]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[NationalIDNumber]
|
||||
,[LoginID]
|
||||
,[OrganizationNode]
|
||||
,[OrganizationLevel]
|
||||
,[JobTitle]
|
||||
,[BirthDate]
|
||||
,[MaritalStatus]
|
||||
,[Gender]
|
||||
,[HireDate]
|
||||
,[VacationHours]
|
||||
,[SickLeaveHours]
|
||||
,[ValidFrom]
|
||||
,[ValidTo]
|
||||
FROM [HumanResources].[Employee_Temporal]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[DepartmentID]
|
||||
,[ShiftID]
|
||||
,[StartDate]
|
||||
,[EndDate]
|
||||
,[ModifiedDate]
|
||||
FROM [HumanResources].[EmployeeDepartmentHistory]
|
||||
GO
|
||||
SELECT [BusinessEntityID]
|
||||
,[RateChangeDate]
|
||||
,[Rate]
|
||||
,[PayFrequency]
|
||||
,[ModifiedDate]
|
||||
FROM [HumanResources].[EmployeePayHistory]
|
||||
GO
|
||||
SELECT [JobCandidateID]
|
||||
,[BusinessEntityID]
|
||||
,[Resume]
|
||||
,[ModifiedDate]
|
||||
FROM [HumanResources].[JobCandidate]
|
||||
GO
|
||||
SELECT [ShiftID]
|
||||
,[Name]
|
||||
,[StartTime]
|
||||
,[EndTime]
|
||||
,[ModifiedDate]
|
||||
FROM [HumanResources].[Shift]
|
||||
GO
|
||||
@@ -0,0 +1,562 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageServices.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.TestDriver.Utility;
|
||||
using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Tests
|
||||
{
|
||||
public class PerformanceTests : TestBase
|
||||
{
|
||||
private static string ComplexQuery = File.ReadAllText("./Scripts/AdventureWorks.sql");
|
||||
private static string SimpleQuery = "SELECT * FROM sys.all_columns";
|
||||
|
||||
[Fact]
|
||||
public async Task HoverTestOnPrem()
|
||||
{
|
||||
try
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
string query = SimpleQuery;
|
||||
|
||||
await ConnectAsync(TestServerType.OnPrem, query, ownerUri);
|
||||
Hover hover = await CalculateRunTime("Hover", async () =>
|
||||
{
|
||||
return await RequestHover(ownerUri, query, 0, 15); ;
|
||||
});
|
||||
Assert.True(hover != null, "Hover tool-tip is not null");
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task SuggestionsTest()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
|
||||
WriteToFile(ownerUri, query);
|
||||
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
await ValidateCompletionResponse(ownerUri, query, null);
|
||||
|
||||
await ValidateCompletionResponse(ownerUri, query, "Suggestions");
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task DiagnosticsTests()
|
||||
{
|
||||
try
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
string query = "SELECT * FROM sys.objects";
|
||||
|
||||
await ConnectAsync(TestServerType.OnPrem, query, ownerUri);
|
||||
Thread.Sleep(500);
|
||||
|
||||
var contentChanges = new TextDocumentChangeEvent[1];
|
||||
contentChanges[0] = new TextDocumentChangeEvent()
|
||||
{
|
||||
Range = new Range()
|
||||
{
|
||||
Start = new Position()
|
||||
{
|
||||
Line = 0,
|
||||
Character = 5
|
||||
},
|
||||
End = new Position()
|
||||
{
|
||||
Line = 0,
|
||||
Character = 6
|
||||
}
|
||||
},
|
||||
RangeLength = 1,
|
||||
Text = "z"
|
||||
};
|
||||
|
||||
DidChangeTextDocumentParams changeParams = new DidChangeTextDocumentParams()
|
||||
{
|
||||
ContentChanges = contentChanges,
|
||||
TextDocument = new VersionedTextDocumentIdentifier()
|
||||
{
|
||||
Version = 2,
|
||||
Uri = ownerUri
|
||||
}
|
||||
};
|
||||
TestTimer timer = new TestTimer();
|
||||
await RequestChangeTextDocumentNotification(changeParams);
|
||||
|
||||
while (true)
|
||||
{
|
||||
var completeEvent = await Driver.WaitForEvent(PublishDiagnosticsNotification.Type, 15000);
|
||||
if (completeEvent != null && completeEvent.Diagnostics != null && completeEvent.Diagnostics.Length > 0)
|
||||
{
|
||||
timer.EndAndPrint("Diagnostics");
|
||||
break;
|
||||
}
|
||||
if (timer.TotalMilliSecondsUntilNow >= 500000)
|
||||
{
|
||||
Assert.True(false, "Failed to get Diagnostics");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ValidateCompletionResponse(string ownerUri, string query, string testName)
|
||||
{
|
||||
TestTimer timer = new TestTimer();
|
||||
CompletionItem completion = null;
|
||||
while (true)
|
||||
{
|
||||
CompletionItem[] completions = await RequestCompletion(ownerUri, query, 0, 15);
|
||||
|
||||
completion = completions != null ? completions.FirstOrDefault(x => x.Label == "master") : null;
|
||||
if (completion != null)
|
||||
{
|
||||
if (testName != null)
|
||||
{
|
||||
timer.EndAndPrint(testName);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (timer.TotalMilliSecondsUntilNow >= 500000)
|
||||
{
|
||||
Assert.True(false, "Failed to get a valid auto-complete list");
|
||||
break;
|
||||
}
|
||||
|
||||
Thread.Sleep(50);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task VerifyBindingLoadScenario(TestServerType serverType, string query, string testName = null)
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
|
||||
WriteToFile(ownerUri, query);
|
||||
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
await ValidateCompletionResponse(ownerUri, query, testName);
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheColdAzureSimpleQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
Thread.Sleep(5000);
|
||||
await VerifyBindingLoadScenario(TestServerType.Azure, query, "[Simple query][Cold][SQL DB] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheColdOnPremSimpleQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
await VerifyBindingLoadScenario(TestServerType.OnPrem, query, "[Simple query][Cold][On-Prem] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheWarmAzureSimpleQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.Azure;
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
Thread.Sleep(10000);
|
||||
await VerifyBindingLoadScenario(serverType, query, "[Simple query][Warm][SQL DB] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheWarmOnPremSimpleQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
Thread.Sleep(10000);
|
||||
await VerifyBindingLoadScenario(serverType, query, "[Simple query][Warm][On-Prem] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheColdAzureComplexQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = ComplexQuery;
|
||||
await VerifyBindingLoadScenario(TestServerType.Azure, query, "[Complex query][Cold][SQL DB] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheColdOnPremComplexQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = ComplexQuery;
|
||||
await VerifyBindingLoadScenario(TestServerType.OnPrem, query, "[Complex query][Cold][On-Prem] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheWarmAzureComplexQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = ComplexQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.Azure;
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
Thread.Sleep(100000);
|
||||
await VerifyBindingLoadScenario(serverType, query, "[Complex query][Warm][SQL DB] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BindingCacheWarmOnPremComplexQuery()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = ComplexQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
Thread.Sleep(10000);
|
||||
await VerifyBindingLoadScenario(serverType, query, "[Complex query][Warm][On-Prem] Binding cache");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ConnectAzureTest()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.Azure;
|
||||
WriteToFile(ownerUri, query);
|
||||
|
||||
DidOpenTextDocumentNotification openParams = new DidOpenTextDocumentNotification()
|
||||
{
|
||||
TextDocument = new TextDocumentItem()
|
||||
{
|
||||
Uri = ownerUri,
|
||||
LanguageId = "enu",
|
||||
Version = 1,
|
||||
Text = query
|
||||
}
|
||||
};
|
||||
|
||||
await RequestOpenDocumentNotification(openParams);
|
||||
|
||||
Thread.Sleep(500);
|
||||
var connected = await CalculateRunTime("Connect SQL DB", async () =>
|
||||
{
|
||||
var connectParams = await GetDatabaseConnectionAsync(serverType);
|
||||
return await Connect(ownerUri, connectParams);
|
||||
});
|
||||
Assert.True(connected, "Connection is successful");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ConnectOnPremTest()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
WriteToFile(ownerUri, query);
|
||||
|
||||
DidOpenTextDocumentNotification openParams = new DidOpenTextDocumentNotification()
|
||||
{
|
||||
TextDocument = new TextDocumentItem()
|
||||
{
|
||||
Uri = ownerUri,
|
||||
LanguageId = "enu",
|
||||
Version = 1,
|
||||
Text = query
|
||||
}
|
||||
};
|
||||
|
||||
await RequestOpenDocumentNotification(openParams);
|
||||
|
||||
Thread.Sleep(500);
|
||||
var connected = await CalculateRunTime("Connect On-Prem", async () =>
|
||||
{
|
||||
var connectParams = await GetDatabaseConnectionAsync(serverType);
|
||||
return await Connect(ownerUri, connectParams);
|
||||
});
|
||||
Assert.True(connected, "Connection is successful");
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Disconnect()
|
||||
{
|
||||
try
|
||||
{
|
||||
string query = SimpleQuery;
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
Thread.Sleep(1000);
|
||||
var connected = await CalculateRunTime("Disconnect On-Prem", async () =>
|
||||
{
|
||||
return await Disconnect(ownerUri);
|
||||
});
|
||||
Assert.True(connected);
|
||||
}
|
||||
finally
|
||||
{
|
||||
WaitForExit();
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task QueryResultSummaryOnPremTest()
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
string query = SimpleQuery;
|
||||
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
|
||||
var queryTask = await CalculateRunTime("Basic Query Result On-Prem", async () =>
|
||||
{
|
||||
return await RunQuery(ownerUri, query);
|
||||
});
|
||||
|
||||
Assert.NotNull(queryTask);
|
||||
Assert.True(queryTask.BatchSummaries.Any(x => x.ResultSetSummaries.Any( r => r.RowCount > 0)));
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task QueryResultFirstOnPremTest()
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
string query = SimpleQuery;
|
||||
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
|
||||
var queryResult = await CalculateRunTime("Basic Query Result First Rows On-Prem", async () =>
|
||||
{
|
||||
var queryTask = await RunQuery(ownerUri, query);
|
||||
return await ExecuteSubset(ownerUri, 0, 0, 0, 100);
|
||||
});
|
||||
|
||||
Assert.NotNull(queryResult);
|
||||
Assert.NotNull(queryResult.ResultSubset);
|
||||
Assert.True(queryResult.ResultSubset.Rows.Count() > 0);
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public async Task CancelQueryOnPremTest()
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
string query = "WAITFOR DELAY '00:01:00';";
|
||||
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
var queryParams = new QueryExecuteParams();
|
||||
queryParams.OwnerUri = ownerUri;
|
||||
queryParams.QuerySelection = null;
|
||||
|
||||
var result = await Driver.SendRequest(QueryExecuteRequest.Type, queryParams);
|
||||
if (result != null && string.IsNullOrEmpty(result.Messages))
|
||||
{
|
||||
TestTimer timer = new TestTimer();
|
||||
|
||||
while (true)
|
||||
{
|
||||
var queryTask = await CancelQuery(ownerUri);
|
||||
if (queryTask != null)
|
||||
{
|
||||
timer.EndAndPrint("Cancel Query On-Prem");
|
||||
break;
|
||||
}
|
||||
if (timer.TotalMilliSecondsUntilNow >= 100000)
|
||||
{
|
||||
Assert.True(false, "Failed to cancel query");
|
||||
break;
|
||||
}
|
||||
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.True(false, "Failed to run the query");
|
||||
}
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TestSaveResultsToCsvTest()
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
string query = SimpleQuery;
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
string output = Path.GetTempFileName();
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
|
||||
// Execute a query
|
||||
await RunQuery(ownerUri, query);
|
||||
|
||||
var saveTask = await CalculateRunTime("Basic Query Save To CSV", async () =>
|
||||
{
|
||||
return await SaveAsCsv(ownerUri, output, 0, 0);
|
||||
});
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TestSaveResultsToJsonTest()
|
||||
{
|
||||
string ownerUri = Path.GetTempFileName();
|
||||
string query = SimpleQuery;
|
||||
TestServerType serverType = TestServerType.OnPrem;
|
||||
await ConnectAsync(serverType, query, ownerUri);
|
||||
string output = Path.GetTempFileName();
|
||||
// Execute a query
|
||||
await RunQuery(ownerUri, query);
|
||||
|
||||
var saveTask = await CalculateRunTime("Basic Query Save To Json", async () =>
|
||||
{
|
||||
return await SaveAsJson(ownerUri, output, 0, 0);
|
||||
});
|
||||
|
||||
await Disconnect(ownerUri);
|
||||
}
|
||||
|
||||
private async Task<bool> ConnectAsync(TestServerType serverType, string query, string ownerUri)
|
||||
{
|
||||
WriteToFile(ownerUri, query);
|
||||
|
||||
DidOpenTextDocumentNotification openParams = new DidOpenTextDocumentNotification()
|
||||
{
|
||||
TextDocument = new TextDocumentItem()
|
||||
{
|
||||
Uri = ownerUri,
|
||||
LanguageId = "enu",
|
||||
Version = 1,
|
||||
Text = query
|
||||
}
|
||||
};
|
||||
|
||||
await RequestOpenDocumentNotification(openParams);
|
||||
|
||||
Thread.Sleep(500);
|
||||
var connectParams = await GetDatabaseConnectionAsync(serverType);
|
||||
bool connected = await Connect(ownerUri, connectParams);
|
||||
Assert.True(connected, "Connection is successful");
|
||||
if (connected)
|
||||
{
|
||||
Console.WriteLine("Connection is successful");
|
||||
}
|
||||
|
||||
return connected;
|
||||
}
|
||||
|
||||
private async Task<T> CalculateRunTime<T>(string testName, Func<Task<T>> testToRun)
|
||||
{
|
||||
TestTimer timer = new TestTimer();
|
||||
T result = await testToRun();
|
||||
timer.EndAndPrint(testName);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,12 +5,15 @@
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.Credentials.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageServices.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts;
|
||||
using Microsoft.SqlTools.ServiceLayer.SqlContext;
|
||||
using Microsoft.SqlTools.ServiceLayer.TestDriver.Driver;
|
||||
using Microsoft.SqlTools.ServiceLayer.TestDriver.Utility;
|
||||
using Microsoft.SqlTools.ServiceLayer.Workspace.Contracts;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Tests
|
||||
@@ -163,7 +166,31 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Tests
|
||||
var result = await Driver.SendRequest(CompletionResolveRequest.Type, item);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Request a Read Credential for given credential id
|
||||
/// </summary>
|
||||
protected async Task<Credential> ReadCredential(string credentialId)
|
||||
{
|
||||
var credentialParams = new Credential();
|
||||
credentialParams.CredentialId = credentialId;
|
||||
|
||||
return await Driver.SendRequest(ReadCredentialRequest.Type, credentialParams);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns database connection parameters for given server type
|
||||
/// </summary>
|
||||
protected async Task<ConnectParams> GetDatabaseConnectionAsync(TestServerType serverType)
|
||||
{
|
||||
TestServerIdentity serverIdentiry = ConnectionTestUtils.TestServers.FirstOrDefault(x => x.ServerType == serverType);
|
||||
var connectionProfile = ConnectionTestUtils.Setting.GetConnentProfile(serverIdentiry.ProfileName, serverIdentiry.ServerName);
|
||||
Credential credential = await ReadCredential(connectionProfile.formatCredentialId());
|
||||
ConnectParams conenctParam = ConnectionTestUtils.CreateConnectParams(connectionProfile.ServerName, connectionProfile.Database,
|
||||
connectionProfile.User, credential.Password);
|
||||
return conenctParam;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Request a list of completion items for a position in a block of text
|
||||
/// </summary>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
@@ -17,9 +18,41 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Utility
|
||||
/// </summary>
|
||||
public class ConnectionTestUtils
|
||||
{
|
||||
public static IEnumerable<TestServerIdentity> TestServers = InitTestServerNames();
|
||||
public static Setting Setting = InitSetting();
|
||||
|
||||
private static readonly Lazy<ConnectParams> azureTestServerConnection =
|
||||
new Lazy<ConnectParams>(() => GetConnectionFromVsCodeSettings("***REMOVED***"));
|
||||
|
||||
private static IEnumerable<TestServerIdentity> InitTestServerNames()
|
||||
{
|
||||
try
|
||||
{
|
||||
string testServerNamesFilePath = Environment.GetEnvironmentVariable("TestServerNamesFile");
|
||||
string jsonFileContent = File.ReadAllText(testServerNamesFilePath);
|
||||
return Newtonsoft.Json.JsonConvert.DeserializeObject<IList<TestServerIdentity>>(jsonFileContent);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static Setting InitSetting()
|
||||
{
|
||||
try
|
||||
{
|
||||
string settingsFileContents = GetSettingFileContent();
|
||||
Setting setting = Newtonsoft.Json.JsonConvert.DeserializeObject<Setting>(settingsFileContents);
|
||||
|
||||
return setting;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static ConnectParams AzureTestServerConnection
|
||||
{
|
||||
get { return azureTestServerConnection.Value; }
|
||||
@@ -70,6 +103,26 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Utility
|
||||
private static readonly Lazy<ConnectParams> dataToolsTelemetryAzureConnection =
|
||||
new Lazy<ConnectParams>(() => GetConnectionFromVsCodeSettings("***REMOVED***"));
|
||||
|
||||
private static string GetSettingFileContent()
|
||||
{
|
||||
string settingsFilename;
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
settingsFilename = Environment.GetEnvironmentVariable("APPDATA") + @"\Code\User\settings.json";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
settingsFilename = Environment.GetEnvironmentVariable("HOME") + @"/Library/Application Support/Code/User/settings.json";
|
||||
}
|
||||
else
|
||||
{
|
||||
settingsFilename = Environment.GetEnvironmentVariable("HOME") + @"/.config/Code/User/settings.json";
|
||||
}
|
||||
string settingsFileContents = File.ReadAllText(settingsFilename);
|
||||
|
||||
return settingsFileContents;
|
||||
}
|
||||
|
||||
public static ConnectParams DataToolsTelemetryAzureConnection
|
||||
{
|
||||
get { return dataToolsTelemetryAzureConnection.Value; }
|
||||
@@ -97,20 +150,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Utility
|
||||
{
|
||||
try
|
||||
{
|
||||
string settingsFilename;
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
settingsFilename = Environment.GetEnvironmentVariable("APPDATA") + @"\Code\User\settings.json";
|
||||
}
|
||||
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
||||
{
|
||||
settingsFilename = Environment.GetEnvironmentVariable("HOME") + @"/Library/Application Support/Code/User/settings.json";
|
||||
}
|
||||
else
|
||||
{
|
||||
settingsFilename = Environment.GetEnvironmentVariable("HOME") + @"/.config/Code/User/settings.json";
|
||||
}
|
||||
string settingsFileContents = File.ReadAllText(settingsFilename);
|
||||
string settingsFileContents = GetSettingFileContent();
|
||||
|
||||
JObject root = JObject.Parse(settingsFileContents);
|
||||
JArray connections = (JArray)root["mssql.connections"];
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Globalization;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Utility
|
||||
{
|
||||
/// <summary>
|
||||
/// The model for deserializing settings.json
|
||||
/// </summary>
|
||||
public class Setting
|
||||
{
|
||||
[JsonProperty("mssql.connections")]
|
||||
public List<ConnectionProfile> Connections { get; set; }
|
||||
|
||||
public ConnectionProfile GetConnentProfile(string profilerName, string serverName)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(profilerName))
|
||||
{
|
||||
var byPrfileName = Connections.FirstOrDefault(x => x.ProfileName == profilerName);
|
||||
if (byPrfileName != null)
|
||||
{
|
||||
return byPrfileName;
|
||||
}
|
||||
}
|
||||
return Connections.FirstOrDefault(x => x.ServerName == serverName);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The model to deserializing the connections inside settings.json
|
||||
/// </summary>
|
||||
public class ConnectionProfile
|
||||
{
|
||||
public const string CRED_PREFIX = "Microsoft.SqlTools";
|
||||
public const string CRED_SEPARATOR = "|";
|
||||
public const string CRED_SERVER_PREFIX = "server:";
|
||||
public const string CRED_DB_PREFIX = "db:";
|
||||
public const string CRED_USER_PREFIX = "user:";
|
||||
public const string CRED_ITEMTYPE_PREFIX = "itemtype:";
|
||||
|
||||
[JsonProperty("server")]
|
||||
public string ServerName { get; set; }
|
||||
public string Database { get; set; }
|
||||
|
||||
public string User { get; set; }
|
||||
|
||||
public string Password { get; set; }
|
||||
|
||||
public string ProfileName { get; set; }
|
||||
|
||||
|
||||
public string formatCredentialId(string itemType = "Profile")
|
||||
{
|
||||
if (!string.IsNullOrEmpty(ServerName))
|
||||
{
|
||||
List<string> cred = new List<string>();
|
||||
cred.Add(CRED_PREFIX);
|
||||
AddToList(itemType, CRED_ITEMTYPE_PREFIX, cred);
|
||||
AddToList(ServerName, CRED_SERVER_PREFIX, cred);
|
||||
AddToList(Database, CRED_DB_PREFIX, cred);
|
||||
AddToList(User, CRED_USER_PREFIX, cred);
|
||||
return string.Join(CRED_SEPARATOR, cred.ToArray());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
private void AddToList(string item, string prefix, List<string> list)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(item))
|
||||
{
|
||||
list.Add(string.Format(CultureInfo.InvariantCulture, "{0}{1}", prefix, item));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Utility
|
||||
{
|
||||
/// <summary>
|
||||
/// The model to deserialize the server names json
|
||||
/// </summary>
|
||||
public class TestServerIdentity
|
||||
{
|
||||
public string ServerName { get; set; }
|
||||
public string ProfileName { get; set; }
|
||||
|
||||
public TestServerType ServerType { get; set; }
|
||||
}
|
||||
|
||||
public enum TestServerType
|
||||
{
|
||||
None,
|
||||
Azure,
|
||||
OnPrem
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Utility
|
||||
{
|
||||
/// <summary>
|
||||
/// Timer to calculate the test run time
|
||||
/// </summary>
|
||||
public class TestTimer
|
||||
{
|
||||
public TestTimer()
|
||||
{
|
||||
Start();
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
StartDateTime = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public void End()
|
||||
{
|
||||
EndDateTime = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public void EndAndPrint(string testName)
|
||||
{
|
||||
End();
|
||||
var currentColor = Console.ForegroundColor;
|
||||
Console.ForegroundColor = ConsoleColor.Green;
|
||||
Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Test Name: {0} Run time in milliSeconds: {1}", testName, TotalMilliSeconds));
|
||||
Console.ForegroundColor = currentColor;
|
||||
}
|
||||
|
||||
public double TotalMilliSeconds
|
||||
{
|
||||
get
|
||||
{
|
||||
return (EndDateTime - StartDateTime).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public double TotalMilliSecondsUntilNow
|
||||
{
|
||||
get
|
||||
{
|
||||
return (DateTime.UtcNow - StartDateTime).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public DateTime StartDateTime { get; private set; }
|
||||
public DateTime EndDateTime { get; private set; }
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,10 @@
|
||||
"version": "1.0.0-*",
|
||||
"buildOptions": {
|
||||
"debugType": "portable",
|
||||
"emitEntryPoint": true
|
||||
"emitEntryPoint": true,
|
||||
"embed": [
|
||||
"Scripts/AdventureWorks.sql"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"xunit": "2.1.0",
|
||||
|
||||
Reference in New Issue
Block a user