Merge pull request #23 from Microsoft/bug/intellisenseCacheTestFix

Fixed bug in intellisense cache test
This commit is contained in:
Mitchell Sternke
2016-08-22 10:25:25 -07:00
committed by GitHub
2 changed files with 24 additions and 56 deletions

View File

@@ -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>

View File

@@ -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);