mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 10:58:30 -05:00
Merge pull request #23 from Microsoft/bug/intellisenseCacheTestFix
Fixed bug in intellisense cache test
This commit is contained in:
@@ -53,34 +53,6 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
|
|||||||
new Dictionary<ConnectionSummary, IntellisenseCache>(new ConnectionSummaryComparer());
|
new Dictionary<ConnectionSummary, IntellisenseCache>(new ConnectionSummaryComparer());
|
||||||
private Object cachesLock = new Object(); // Used when we insert/remove something from the cache dictionary
|
private Object cachesLock = new Object(); // Used when we insert/remove something from the cache dictionary
|
||||||
|
|
||||||
private ISqlConnectionFactory factory;
|
|
||||||
private Object factoryLock = new Object();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Internal for testing purposes only
|
|
||||||
/// </summary>
|
|
||||||
internal ISqlConnectionFactory ConnectionFactory
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
lock(factoryLock)
|
|
||||||
{
|
|
||||||
if(factory == null)
|
|
||||||
{
|
|
||||||
factory = new SqlConnectionFactory();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return factory;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
lock(factoryLock)
|
|
||||||
{
|
|
||||||
factory = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ConnectionService connectionService = null;
|
private ConnectionService connectionService = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -112,14 +84,6 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
|
|||||||
ConnectionServiceInstance.RegisterOnDisconnectTask(RemoveAutoCompleteCacheUriReference);
|
ConnectionServiceInstance.RegisterOnDisconnectTask(RemoveAutoCompleteCacheUriReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task UpdateAutoCompleteCache(ConnectionInfo connectionInfo)
|
|
||||||
{
|
|
||||||
if (connectionInfo != null)
|
|
||||||
{
|
|
||||||
await UpdateAutoCompleteCache(connectionInfo.ConnectionDetails);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Intellisense cache count access for testing.
|
/// Intellisense cache count access for testing.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -158,21 +122,24 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the cached autocomplete candidate list when the user connects to a database
|
/// Update the cached autocomplete candidate list when the user connects to a database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="details"></param>
|
/// <param name="info"></param>
|
||||||
public async Task UpdateAutoCompleteCache(ConnectionDetails details)
|
public async Task UpdateAutoCompleteCache(ConnectionInfo info)
|
||||||
{
|
{
|
||||||
IntellisenseCache cache;
|
if (info != null)
|
||||||
lock(cachesLock)
|
|
||||||
{
|
{
|
||||||
if(!caches.TryGetValue(details, out cache))
|
IntellisenseCache cache;
|
||||||
|
lock(cachesLock)
|
||||||
{
|
{
|
||||||
cache = new IntellisenseCache(ConnectionFactory, details);
|
if(!caches.TryGetValue(info.ConnectionDetails, out cache))
|
||||||
caches[cache.DatabaseInfo] = cache;
|
{
|
||||||
|
cache = new IntellisenseCache(info.Factory, info.ConnectionDetails);
|
||||||
|
caches[cache.DatabaseInfo] = cache;
|
||||||
|
}
|
||||||
|
cache.ReferenceCount++;
|
||||||
}
|
}
|
||||||
cache.ReferenceCount++;
|
|
||||||
|
await cache.UpdateCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
await cache.UpdateCache();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -181,12 +181,10 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.LanguageServices
|
|||||||
mockFactory.Setup(factory => factory.CreateSqlConnection(It.IsAny<string>()))
|
mockFactory.Setup(factory => factory.CreateSqlConnection(It.IsAny<string>()))
|
||||||
.Returns(CreateMockDbConnection(new[] {data}));
|
.Returns(CreateMockDbConnection(new[] {data}));
|
||||||
|
|
||||||
var connectionService = TestObjects.GetTestConnectionService();
|
var connectionService = new ConnectionService(mockFactory.Object);
|
||||||
var autocompleteService = new AutoCompleteService();
|
var autocompleteService = new AutoCompleteService();
|
||||||
autocompleteService.ConnectionServiceInstance = connectionService;
|
autocompleteService.ConnectionServiceInstance = connectionService;
|
||||||
autocompleteService.InitializeService(Microsoft.SqlTools.ServiceLayer.Hosting.ServiceHost.Instance);
|
autocompleteService.InitializeService(Microsoft.SqlTools.ServiceLayer.Hosting.ServiceHost.Instance);
|
||||||
|
|
||||||
autocompleteService.ConnectionFactory = mockFactory.Object;
|
|
||||||
|
|
||||||
// Open a connection
|
// Open a connection
|
||||||
// The cache should get updated as part of this
|
// The cache should get updated as part of this
|
||||||
@@ -216,7 +214,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.LanguageServices
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void OnlyOneCacheIsCreatedForTwoDocumentsWithSameConnection()
|
public void OnlyOneCacheIsCreatedForTwoDocumentsWithSameConnection()
|
||||||
{
|
{
|
||||||
var connectionService = TestObjects.GetTestConnectionService();
|
var connectionService = new ConnectionService(TestObjects.GetTestSqlConnectionFactory());
|
||||||
var autocompleteService = new AutoCompleteService();
|
var autocompleteService = new AutoCompleteService();
|
||||||
autocompleteService.ConnectionServiceInstance = connectionService;
|
autocompleteService.ConnectionServiceInstance = connectionService;
|
||||||
autocompleteService.InitializeService(Microsoft.SqlTools.ServiceLayer.Hosting.ServiceHost.Instance);
|
autocompleteService.InitializeService(Microsoft.SqlTools.ServiceLayer.Hosting.ServiceHost.Instance);
|
||||||
@@ -242,6 +240,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.LanguageServices
|
|||||||
[Fact]
|
[Fact]
|
||||||
public void TwoCachesAreCreatedForTwoDocumentsWithDifferentConnections()
|
public void TwoCachesAreCreatedForTwoDocumentsWithDifferentConnections()
|
||||||
{
|
{
|
||||||
|
const string testDb1 = "my_db";
|
||||||
|
const string testDb2 = "my_other_db";
|
||||||
|
|
||||||
// Result set for the query of database tables
|
// Result set for the query of database tables
|
||||||
Dictionary<string, string>[] data1 =
|
Dictionary<string, string>[] data1 =
|
||||||
{
|
{
|
||||||
@@ -257,21 +258,21 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.LanguageServices
|
|||||||
};
|
};
|
||||||
|
|
||||||
var mockFactory = new Mock<ISqlConnectionFactory>();
|
var mockFactory = new Mock<ISqlConnectionFactory>();
|
||||||
mockFactory.SetupSequence(factory => factory.CreateSqlConnection(It.IsAny<string>()))
|
mockFactory.Setup(factory => factory.CreateSqlConnection(It.Is<string>(x => x.Contains(testDb1))))
|
||||||
.Returns(CreateMockDbConnection(new[] {data1}))
|
.Returns(CreateMockDbConnection(new[] {data1}));
|
||||||
|
mockFactory.Setup(factory => factory.CreateSqlConnection(It.Is<string>(x => x.Contains(testDb2))))
|
||||||
.Returns(CreateMockDbConnection(new[] {data2}));
|
.Returns(CreateMockDbConnection(new[] {data2}));
|
||||||
|
|
||||||
var connectionService = TestObjects.GetTestConnectionService();
|
var connectionService = new ConnectionService(mockFactory.Object);
|
||||||
var autocompleteService = new AutoCompleteService();
|
var autocompleteService = new AutoCompleteService();
|
||||||
autocompleteService.ConnectionServiceInstance = connectionService;
|
autocompleteService.ConnectionServiceInstance = connectionService;
|
||||||
autocompleteService.InitializeService(Microsoft.SqlTools.ServiceLayer.Hosting.ServiceHost.Instance);
|
autocompleteService.InitializeService(Microsoft.SqlTools.ServiceLayer.Hosting.ServiceHost.Instance);
|
||||||
|
|
||||||
autocompleteService.ConnectionFactory = mockFactory.Object;
|
|
||||||
|
|
||||||
// Open connections
|
// Open connections
|
||||||
// The cache should get updated as part of this
|
// The cache should get updated as part of this
|
||||||
ConnectParams connectionRequest = TestObjects.GetTestConnectionParams();
|
ConnectParams connectionRequest = TestObjects.GetTestConnectionParams();
|
||||||
connectionRequest.OwnerUri = "file:///my/first/sql/file.sql";
|
connectionRequest.OwnerUri = "file:///my/first/sql/file.sql";
|
||||||
|
connectionRequest.Connection.DatabaseName = testDb1;
|
||||||
var connectionResult = connectionService.Connect(connectionRequest);
|
var connectionResult = connectionService.Connect(connectionRequest);
|
||||||
Assert.NotEmpty(connectionResult.ConnectionId);
|
Assert.NotEmpty(connectionResult.ConnectionId);
|
||||||
|
|
||||||
@@ -281,7 +282,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.LanguageServices
|
|||||||
// Open second connection
|
// Open second connection
|
||||||
ConnectParams connectionRequest2 = TestObjects.GetTestConnectionParams();
|
ConnectParams connectionRequest2 = TestObjects.GetTestConnectionParams();
|
||||||
connectionRequest2.OwnerUri = "file:///my/second/sql/file.sql";
|
connectionRequest2.OwnerUri = "file:///my/second/sql/file.sql";
|
||||||
connectionRequest2.Connection.DatabaseName = "my_other_db";
|
connectionRequest2.Connection.DatabaseName = testDb2;
|
||||||
var connectionResult2 = connectionService.Connect(connectionRequest2);
|
var connectionResult2 = connectionService.Connect(connectionRequest2);
|
||||||
Assert.NotEmpty(connectionResult2.ConnectionId);
|
Assert.NotEmpty(connectionResult2.ConnectionId);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user