Skip to content

Commit

Permalink
SLVS-1473 Refactor AliveConnectionTracker (#5717)
Browse files Browse the repository at this point in the history
  • Loading branch information
gabriela-trutan-sonarsource authored and vnaskos-sonar committed Oct 1, 2024
1 parent 2685de2 commit b60af3d
Show file tree
Hide file tree
Showing 5 changed files with 244 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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()
{
Expand Down Expand Up @@ -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()
{
Expand Down Expand Up @@ -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()
{
Expand Down Expand Up @@ -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)]
Expand Down
14 changes: 13 additions & 1 deletion src/ConnectedMode/Persistence/ServerConnectionsRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -127,6 +130,7 @@ public bool TryUpdateCredentialsById(string connectionId, ICredentials credentia
if (wasFound)
{
credentialsLoader.Save(credentials, serverConnection.CredentialsUri);
OnCredentialsChanged(serverConnection);
return true;
}
}
Expand Down Expand Up @@ -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))
Expand All @@ -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
Expand Up @@ -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

0 comments on commit b60af3d

Please sign in to comment.