mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-14 01:25:40 -05:00
Fixing the bug with connections on database make restore fail (#473)
* closing the connections that don't need to be open and keeping track of the connections that should stay open
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection;
|
||||
using Microsoft.SqlTools.ServiceLayer.LanguageServices;
|
||||
using Moq;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Connection
|
||||
{
|
||||
public class DatabaseLocksManagerTests
|
||||
{
|
||||
private string server1 = "server1";
|
||||
private string database1 = "database1";
|
||||
|
||||
[Fact]
|
||||
public void GainFullAccessShouldDisconnectTheConnections()
|
||||
{
|
||||
var connectionLock = new Mock<IConnectedBindingQueue>();
|
||||
connectionLock.Setup(x => x.CloseConnections(server1, database1));
|
||||
|
||||
using (DatabaseLocksManager databaseLocksManager = CreateManager())
|
||||
{
|
||||
databaseLocksManager.ConnectionService.RegisterConnectedQueue("test", connectionLock.Object);
|
||||
|
||||
databaseLocksManager.GainFullAccessToDatabase(server1, database1);
|
||||
connectionLock.Verify(x => x.CloseConnections(server1, database1));
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ReleaseAccessShouldConnectTheConnections()
|
||||
{
|
||||
var connectionLock = new Mock<IConnectedBindingQueue>();
|
||||
connectionLock.Setup(x => x.OpenConnections(server1, database1));
|
||||
|
||||
using (DatabaseLocksManager databaseLocksManager = CreateManager())
|
||||
{
|
||||
databaseLocksManager.ConnectionService.RegisterConnectedQueue("test", connectionLock.Object);
|
||||
|
||||
databaseLocksManager.ReleaseAccess(server1, database1);
|
||||
connectionLock.Verify(x => x.OpenConnections(server1, database1));
|
||||
}
|
||||
}
|
||||
|
||||
//[Fact]
|
||||
public void SecondProcessToGainAccessShouldWaitForTheFirstProcess()
|
||||
{
|
||||
var connectionLock = new Mock<IConnectedBindingQueue>();
|
||||
|
||||
using (DatabaseLocksManager databaseLocksManager = CreateManager())
|
||||
{
|
||||
databaseLocksManager.GainFullAccessToDatabase(server1, database1);
|
||||
bool secondTimeGettingAccessFails = false;
|
||||
try
|
||||
{
|
||||
databaseLocksManager.GainFullAccessToDatabase(server1, database1);
|
||||
}
|
||||
catch (DatabaseFullAccessException)
|
||||
{
|
||||
secondTimeGettingAccessFails = true;
|
||||
}
|
||||
Assert.Equal(secondTimeGettingAccessFails, true);
|
||||
databaseLocksManager.ReleaseAccess(server1, database1);
|
||||
Assert.Equal(databaseLocksManager.GainFullAccessToDatabase(server1, database1), true);
|
||||
databaseLocksManager.ReleaseAccess(server1, database1);
|
||||
}
|
||||
}
|
||||
|
||||
private DatabaseLocksManager CreateManager()
|
||||
{
|
||||
DatabaseLocksManager databaseLocksManager = new DatabaseLocksManager(2000);
|
||||
var connectionLock1 = new Mock<IConnectedBindingQueue>();
|
||||
var connectionLock2 = new Mock<IConnectedBindingQueue>();
|
||||
connectionLock1.Setup(x => x.CloseConnections(It.IsAny<string>(), It.IsAny<string>()));
|
||||
connectionLock2.Setup(x => x.OpenConnections(It.IsAny<string>(), It.IsAny<string>()));
|
||||
connectionLock1.Setup(x => x.OpenConnections(It.IsAny<string>(), It.IsAny<string>()));
|
||||
connectionLock2.Setup(x => x.CloseConnections(It.IsAny<string>(), It.IsAny<string>()));
|
||||
ConnectionService connectionService = new ConnectionService();
|
||||
|
||||
databaseLocksManager.ConnectionService = connectionService;
|
||||
|
||||
connectionService.RegisterConnectedQueue("1", connectionLock1.Object);
|
||||
connectionService.RegisterConnectedQueue("2", connectionLock2.Object);
|
||||
return databaseLocksManager;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user