Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SLVS-1473 Refactor AliveConnectionTracker #5717

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -18,6 +18,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using System.ComponentModel;
using System.IO;
using System.IO.Abstractions;
using SonarLint.VisualStudio.ConnectedMode.Binding;
@@ -338,6 +339,32 @@ public void TryAdd_WritingThrowsException_DoesNotUpdateConnectionAndWritesLog()
logger.Received(1).WriteLine($"Failed updating the {ServerConnectionsRepository.ConnectionsFileName}: {exceptionMsg}");
}

[TestMethod]
public void TryAdd_DoesNotAddConnection_DoesNotInvokeConnectionChangedEvent()
{
MockReadingFile(new ServerConnectionsListJsonModel());
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(false);
var eventHandler = Substitute.For<EventHandler>();
testSubject.ConnectionChanged += eventHandler;

testSubject.TryAdd(sonarCloudServerConnection);

eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<EventArgs>());
}

[TestMethod]
public void TryAdd_AddsConnection_InvokesConnectionChangedEvent()
{
MockReadingFile(new ServerConnectionsListJsonModel());
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(true);
var eventHandler = Substitute.For<EventHandler>();
testSubject.ConnectionChanged += eventHandler;

testSubject.TryAdd(sonarCloudServerConnection);

eventHandler.Received().Invoke(testSubject, Arg.Any<EventArgs>());
}

[TestMethod]
public void TryDelete_FileCouldNotBeRead_ReturnsFalse()
{
@@ -439,6 +466,32 @@ public void TryDelete_WritingThrowsException_DoesNotUpdateConnectionAndWritesLog
logger.Received(1).WriteLine($"Failed updating the {ServerConnectionsRepository.ConnectionsFileName}: {exceptionMsg}");
}

[TestMethod]
public void TryDelete_DoesNotDeleteConnection_DoesNotInvokeConnectionChangedEvent()
{
var sonarQube = MockFileWithOneSonarQubeConnection();
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(false);
var eventHandler = Substitute.For<EventHandler>();
testSubject.ConnectionChanged += eventHandler;

testSubject.TryDelete(sonarQube.Id);

eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<EventArgs>());
}

[TestMethod]
public void TryDelete_DeletesConnection_InvokesConnectionChangedEvent()
{
var sonarQube = MockFileWithOneSonarQubeConnection();
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(true);
var eventHandler = Substitute.For<EventHandler>();
testSubject.ConnectionChanged += eventHandler;

testSubject.TryDelete(sonarQube.Id);

eventHandler.Received(1).Invoke(testSubject, Arg.Any<EventArgs>());
}

[TestMethod]
public void TryUpdateSettingsById_FileCouldNotBeRead_ReturnsFalse()
{
@@ -505,6 +558,32 @@ public void TryUpdateSettingsById_WritingThrowsException_DoesNotUpdateConnection
logger.Received(1).WriteLine($"Failed updating the {ServerConnectionsRepository.ConnectionsFileName}: {exceptionMsg}");
}

[TestMethod]
public void TryUpdateSettingsById_DoesNotUpdateConnection_DoesNotInvokeConnectionChangedEvent()
{
var sonarQube = MockFileWithOneSonarQubeConnection();
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(false);
var eventHandler = Substitute.For<EventHandler>();
testSubject.ConnectionChanged += eventHandler;

testSubject.TryDelete(sonarQube.Id);

eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<EventArgs>());
}

[TestMethod]
public void TryUpdateSettingsById_UpdatesConnection_InvokesConnectionChangedEvent()
{
var sonarQube = MockFileWithOneSonarQubeConnection();
jsonFileHandler.TryWriteToFile(Arg.Any<string>(), Arg.Any<ServerConnectionsListJsonModel>()).Returns(true);
var eventHandler = Substitute.For<EventHandler>();
testSubject.ConnectionChanged += eventHandler;

testSubject.TryUpdateSettingsById(sonarQube.Id, new ServerConnectionSettings(true));

eventHandler.Received(1).Invoke(testSubject, Arg.Any<EventArgs>());
}

[TestMethod]
public void TryUpdateCredentialsById_ConnectionDoesNotExist_DoesNotUpdateCredentials()
{
@@ -540,6 +619,30 @@ public void TryUpdateCredentialsById_SonarQubeConnectionExists_UpdatesCredential
credentialsLoader.Received(1).Save(newCredentials, sonarQube.ServerUri);
}

[TestMethod]
public void TryUpdateCredentialsById_DoesNotUpdateCredentials_DoesNotInvokeConnectionChangedEvent()
{
MockReadingFile(new ServerConnectionsListJsonModel());
var eventHandler = Substitute.For<EventHandler<ServerConnectionUpdatedEventArgs>>();
testSubject.CredentialsChanged += eventHandler;

testSubject.TryUpdateCredentialsById("non-existingConn", Substitute.For<ICredentials>());

eventHandler.DidNotReceive().Invoke(testSubject, Arg.Any<ServerConnectionUpdatedEventArgs>());
}

[TestMethod]
public void TryUpdateCredentialsById_UpdatesCredentials_InvokesConnectionChangedEvent()
{
var sonarQube = MockFileWithOneSonarQubeConnection();
var eventHandler = Substitute.For<EventHandler<ServerConnectionUpdatedEventArgs>>();
testSubject.CredentialsChanged += eventHandler;

testSubject.TryUpdateCredentialsById(sonarQube.Id, Substitute.For<ICredentials>());

eventHandler.Received(1).Invoke(testSubject, Arg.Is<ServerConnectionUpdatedEventArgs>(args => args.ServerConnection == sonarQube));
}

[TestMethod]
[DataRow(true)]
[DataRow(false)]
14 changes: 13 additions & 1 deletion src/ConnectedMode/Persistence/ServerConnectionsRepository.cs
Original file line number Diff line number Diff line change
@@ -43,6 +43,9 @@ internal class ServerConnectionsRepository : IServerConnectionsRepository
private readonly string connectionsStorageFilePath;
private static readonly object LockObject = new();

public event EventHandler ConnectionChanged;
public event EventHandler<ServerConnectionUpdatedEventArgs> CredentialsChanged;

[ImportingConstructor]
public ServerConnectionsRepository(
IJsonFileHandler jsonFileHandle,
@@ -127,6 +130,7 @@ public bool TryUpdateCredentialsById(string connectionId, ICredentials credentia
if (wasFound)
{
credentialsLoader.Save(credentials, serverConnection.CredentialsUri);
OnCredentialsChanged(serverConnection);
return true;
}
}
@@ -229,7 +233,12 @@ private bool SafeUpdateConnectionsFile(Func<List<ServerConnection>, bool> tryUpd
if (tryUpdateConnectionModels(serverConnections))
{
var model = serverConnectionModelMapper.GetServerConnectionsListJsonModel(serverConnections);
return jsonFileHandle.TryWriteToFile(connectionsStorageFilePath, model);
var wasSaved = jsonFileHandle.TryWriteToFile(connectionsStorageFilePath, model);
if (wasSaved)
{
OnConnectionChanged();
}
return wasSaved;
}
}
catch (Exception ex) when (!ErrorHandler.IsCriticalException(ex))
@@ -240,4 +249,7 @@ private bool SafeUpdateConnectionsFile(Func<List<ServerConnection>, bool> tryUpd
return false;
}
}

private void OnConnectionChanged() => ConnectionChanged?.Invoke(this, EventArgs.Empty);
private void OnCredentialsChanged(ServerConnection serverConnection) => CredentialsChanged?.Invoke(this, new ServerConnectionUpdatedEventArgs(serverConnection));
}
13 changes: 13 additions & 0 deletions src/Core/Binding/IServerConnectionsRepository.cs
Original file line number Diff line number Diff line change
@@ -29,4 +29,17 @@ public interface IServerConnectionsRepository
bool TryUpdateSettingsById(string connectionId, ServerConnectionSettings connectionSettings);
bool TryUpdateCredentialsById(string connectionId, ICredentials credentials);
bool ConnectionsFileExists();
event EventHandler ConnectionChanged;
event EventHandler<ServerConnectionUpdatedEventArgs> CredentialsChanged;
}

public class ServerConnectionUpdatedEventArgs : EventArgs
{
public ServerConnectionUpdatedEventArgs(ServerConnection serverConnection)
{
ServerConnection = serverConnection;
}

public ServerConnection ServerConnection { get; }
}

Loading