Skip to content

Commit

Permalink
fix: languageClient tests (#329)
Browse files Browse the repository at this point in the history
* fix: language client tests

* refactor: move LanguageClientManager to serviceProvider

* refactor: mock JsonRpc

* fix: enable ls trust
  • Loading branch information
ShawkyZ authored Dec 5, 2024
1 parent c9198ca commit c5baafe
Show file tree
Hide file tree
Showing 26 changed files with 425 additions and 276 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Snyk.VisualStudio.Extension.Service;
using System;
using Microsoft.VisualStudio.Shell;
using Snyk.VisualStudio.Extension.Language;

namespace Snyk.VisualStudio.Extension.Commands
{
Expand All @@ -27,7 +28,7 @@ public AbstractTaskCommand(AsyncPackage package, OleMenuCommandService commandSe
protected bool IsButtonAvailable()
{
ThreadHelper.ThrowIfNotOnUIThread();
var isLsReady = SnykVSPackage.Instance?.LanguageClientManager?.IsReady ?? false;
var isLsReady = LanguageClientHelper.IsLanguageServerReady();
return SnykSolutionService.Instance.IsSolutionOpen() && isLsReady;
}

Expand Down
16 changes: 16 additions & 0 deletions Snyk.VisualStudio.Extension.2022/Language/IJsonRpc.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using StreamJsonRpc;

namespace Snyk.VisualStudio.Extension.Language;

public interface IJsonRpc
{
Task<T> InvokeAsync<T>(string targetName, CancellationToken cancellationToken);
Task<T> InvokeWithParameterObjectAsync<T>(string targetName, object argument, CancellationToken cancellationToken);
Task NotifyWithParameterObjectAsync(string targetName, object argument);
event EventHandler<JsonRpcDisconnectedEventArgs> Disconnected;
bool AllowModificationWhileListening { get; set; }
IActivityTracingStrategy ActivityTracingStrategy { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface ILanguageClientManager
Task RestartServerAsync();
Task StopServerAsync();
bool IsReady { get; set; }
JsonRpc Rpc { get; set; }
IJsonRpc Rpc { get; set; }
Task<object> InvokeWorkspaceScanAsync(CancellationToken cancellationToken);
Task<SastSettings> InvokeGetSastEnabled(CancellationToken cancellationToken);
Task<string> InvokeLogin(CancellationToken cancellationToken);
Expand Down
49 changes: 49 additions & 0 deletions Snyk.VisualStudio.Extension.2022/Language/JsonRpcWrapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using StreamJsonRpc;

namespace Snyk.VisualStudio.Extension.Language;

public class JsonRpcWrapper : IJsonRpc
{
private readonly JsonRpc jsonRpc;

public JsonRpcWrapper(JsonRpc jsonRpc)
{
this.jsonRpc = jsonRpc;
}

public event EventHandler<JsonRpcDisconnectedEventArgs> Disconnected
{
add => jsonRpc.Disconnected += value;
remove => jsonRpc.Disconnected -= value;
}

public bool AllowModificationWhileListening
{
get => jsonRpc.AllowModificationWhileListening;
set => jsonRpc.AllowModificationWhileListening = value;
}

public IActivityTracingStrategy ActivityTracingStrategy
{
get => jsonRpc.ActivityTracingStrategy;
set => jsonRpc.ActivityTracingStrategy = value;
}

public Task<T> InvokeAsync<T>(string targetName, CancellationToken cancellationToken)
{
return jsonRpc.InvokeAsync<T>(targetName, cancellationToken);
}

public Task<T> InvokeWithParameterObjectAsync<T>(string targetName, object argument, CancellationToken cancellationToken)
{
return jsonRpc.InvokeWithParameterObjectAsync<T>(targetName, argument, cancellationToken);
}

public Task NotifyWithParameterObjectAsync(string targetName, object argument)
{
return jsonRpc.NotifyWithParameterObjectAsync(targetName, argument);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public static class LanguageClientHelper
{
public static ILanguageClientManager LanguageClientManager()
{
return SnykVSPackage.Instance?.LanguageClientManager;
return SnykVSPackage.ServiceProvider.LanguageClientManager;
}

public static bool IsLanguageServerReady()
Expand Down
2 changes: 1 addition & 1 deletion Snyk.VisualStudio.Extension.2022/Language/LsSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public SnykLsInitializationOptions GetInitializationOptions()
ActivateSnykOpenSource = options.OssEnabled.ToString().ToLower(),
ActivateSnykIac = options.IacEnabled.ToString().ToLower(),
ManageBinariesAutomatically = options.BinariesAutoUpdate.ToString().ToLower(),
EnableTrustedFoldersFeature = "false",
EnableTrustedFoldersFeature = "true",
TrustedFolders = options.TrustedFolders.ToList(),
IntegrationName = this.GetIntegrationName(options),
IntegrationVersion = this.GetIntegrationVersion(options),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public object GetInitializationOptions()

public bool ShowNotificationOnInitializeFailed => true;

public JsonRpc Rpc { get; set; }
public IJsonRpc Rpc { get; set; }
private readonly SnykLanguageClientMiddleware middleware;

public object MiddleLayer => middleware;
Expand Down Expand Up @@ -241,7 +241,7 @@ private void Rpc_Disconnected(object sender, JsonRpcDisconnectedEventArgs e)
public async Task AttachForCustomMessageAsync(JsonRpc rpc)
{
await Task.Yield();
Rpc = rpc;
Rpc = new JsonRpcWrapper(rpc);
Rpc.AllowModificationWhileListening = true;
Rpc.ActivityTracingStrategy = null;
Rpc.AllowModificationWhileListening = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,7 @@ public async Task OnHasAuthenticated(JToken arg)
serviceProvider.Options.ApiToken = new AuthenticationToken(serviceProvider.Options.AuthenticationMethod, token);

await serviceProvider.Options.HandleAuthenticationSuccess(token, apiUrl);
// for testing
if(FeatureFlagService.Instance != null && SnykVSPackage.Instance != null)
FeatureFlagService.Instance.RefreshAsync(SnykVSPackage.Instance.DisposalToken).FireAndForget();
serviceProvider.FeatureFlagService.RefreshAsync(SnykVSPackage.Instance.DisposalToken).FireAndForget();

if (serviceProvider.Options.AutoScan)
{
Expand All @@ -153,6 +151,7 @@ public async Task OnAddTrustedFolders(JToken arg)

serviceProvider.Options.TrustedFolders = new HashSet<string>(trustedFolders.TrustedFolders);
this.serviceProvider.UserStorageSettingsService?.SaveSettings();
await serviceProvider.LanguageClientManager.DidChangeConfigurationAsync(SnykVSPackage.Instance.DisposalToken);
}

private async Task ProcessCodeScanAsync(LsAnalysisResult lsAnalysisResult)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Threading;
using System.Threading.Tasks;

namespace Snyk.VisualStudio.Extension.Service;

public interface IFeatureFlagService
{
Task RefreshAsync(CancellationToken cancellationToken);
}
11 changes: 11 additions & 0 deletions Snyk.VisualStudio.Extension.2022/Service/ISnykServiceProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using EnvDTE80;
using Microsoft.VisualStudio.Settings;
using Microsoft.VisualStudio.Shell;
using Snyk.VisualStudio.Extension.Language;
using Snyk.VisualStudio.Extension.Settings;
using Snyk.VisualStudio.Extension.Theme;
using Snyk.VisualStudio.Extension.UI.Toolwindow;
Expand Down Expand Up @@ -72,5 +73,15 @@ public interface ISnykServiceProvider
/// <param name="serviceType">Service type.</param>
/// <returns>VS service instance.</returns>
Task<object> GetServiceAsync(Type serviceType);

/// <summary>
/// Get Feature Flag Service
/// </summary>
IFeatureFlagService FeatureFlagService { get; }

/// <summary>
/// Get Language Client Manager
/// </summary>
ILanguageClientManager LanguageClientManager { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,18 @@

namespace Snyk.VisualStudio.Extension.Service;

public class FeatureFlagService
public class SnykFeatureFlagService : IFeatureFlagService
{
private readonly ILanguageClientManager languageClient;
private readonly ISnykOptions settings;
private static readonly ILogger Logger = LogManager.ForContext<FeatureFlagService>();
private static FeatureFlagService instance;
private static readonly ILogger Logger = LogManager.ForContext<SnykFeatureFlagService>();

public FeatureFlagService(ILanguageClientManager languageClient, ISnykOptions settings)
public SnykFeatureFlagService(ILanguageClientManager languageClient, ISnykOptions settings)
{
this.languageClient = languageClient;
this.settings = settings;
}

public static FeatureFlagService Instance => instance;

/// <summary>
/// Initialize service.
/// </summary>
/// <param name="languageClient"></param>
/// <param name="settings"></param>
/// <returns>Task.</returns>
public static FeatureFlagService Initialize(ILanguageClientManager languageClient, ISnykOptions settings)
{
if (instance != null)
return instance;

instance = new FeatureFlagService(languageClient, settings);

Logger.Information("FeatureFlagService initialized");
return instance;
}

public async Task RefreshAsync(CancellationToken cancellationToken)
{
var result = await languageClient.InvokeGetFeatureFlagStatusAsync(LsConstants.SnykConsistentIgnoresEnabled, cancellationToken);
Expand Down
21 changes: 20 additions & 1 deletion Snyk.VisualStudio.Extension.2022/Service/SnykService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
using System.Threading.Tasks;
using EnvDTE;
using EnvDTE80;
using Microsoft;
using Microsoft.VisualStudio.ComponentModelHost;
using Microsoft.VisualStudio.Settings;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Settings;
using Serilog;
using Snyk.VisualStudio.Extension.Language;
using Snyk.VisualStudio.Extension.Settings;
using Snyk.VisualStudio.Extension.Theme;
using Snyk.VisualStudio.Extension.UI;
Expand All @@ -34,6 +37,7 @@ public class SnykService : ISnykServiceProvider, ISnykService
private DTE2 dte;

private SnykUserStorageSettingsService userStorageSettingsService;
private SnykFeatureFlagService featureFlagService;

private IWorkspaceTrustService workspaceTrustService;

Expand All @@ -48,10 +52,12 @@ public SnykService(IAsyncServiceProvider serviceProvider, string vsVersion = "")
this.vsVersion = vsVersion;
}

public ILanguageClientManager LanguageClientManager { get; set; }

/// <summary>
/// Gets Snyk options implementation.
/// </summary>
public ISnykOptions Options => this.Package.GeneralOptionsDialogPage;
public ISnykOptions Options => this.Package.Options;

/// <summary>
/// Gets solution service.
Expand Down Expand Up @@ -122,6 +128,19 @@ public IUserStorageSettingsService UserStorageSettingsService
public async Task<object> GetServiceAsync(Type serviceType) =>
await this.serviceProvider.GetServiceAsync(serviceType);

public IFeatureFlagService FeatureFlagService
{
get
{
if (this.featureFlagService == null)
{
this.featureFlagService = new SnykFeatureFlagService(LanguageClientManager, Options);
}

return this.featureFlagService;
}
}

/// <summary>
/// Initialize service.
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ public async Task<FeaturesSettings> GetFeaturesSettingsAsync()
SastSettings sastSettings = null;
if (LanguageClientHelper.IsLanguageServerReady())
{
sastSettings = await this.serviceProvider.Package.LanguageClientManager.InvokeGetSastEnabled(CancellationToken.None);
sastSettings = await this.serviceProvider.LanguageClientManager.InvokeGetSastEnabled(CancellationToken.None);
}

bool snykCodeEnabled = sastSettings?.SnykCodeEnabled ?? false;
Expand Down
2 changes: 2 additions & 0 deletions Snyk.VisualStudio.Extension.2022/Settings/ISnykOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Threading.Tasks;
using Snyk.VisualStudio.Extension.Authentication;
using Snyk.VisualStudio.Extension.Language;
using Snyk.VisualStudio.Extension.Service;

namespace Snyk.VisualStudio.Extension.Settings
{
Expand All @@ -11,6 +12,7 @@ namespace Snyk.VisualStudio.Extension.Settings
/// </summary>
public interface ISnykOptions
{
void Initialize(ISnykServiceProvider provider);
string Application { get; set; }
string ApplicationVersion { get; set; }
string IntegrationName { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -472,10 +472,10 @@ private void SnykGeneralOptionsDialogPage_SettingsChanged(object sender, SnykSet
{
if (LanguageClientHelper.IsLanguageServerReady())
{
await ServiceProvider.Package.LanguageClientManager.DidChangeConfigurationAsync(SnykVSPackage
await ServiceProvider.LanguageClientManager.DidChangeConfigurationAsync(SnykVSPackage
.Instance.DisposalToken);
if (AutoScan)
await ServiceProvider.Package.LanguageClientManager.InvokeWorkspaceScanAsync(SnykVSPackage
await ServiceProvider.LanguageClientManager.InvokeWorkspaceScanAsync(SnykVSPackage
.Instance.DisposalToken);
}
}).FireAndForget();
Expand Down Expand Up @@ -503,9 +503,9 @@ public void Authenticate()

ThreadHelper.JoinableTaskFactory.RunAsync(async () =>
{
await ServiceProvider.Package.LanguageClientManager.InvokeLogout(SnykVSPackage.Instance
await ServiceProvider.LanguageClientManager.InvokeLogout(SnykVSPackage.Instance
.DisposalToken);
await ServiceProvider.Package.LanguageClientManager.InvokeLogin(SnykVSPackage.Instance
await ServiceProvider.LanguageClientManager.InvokeLogin(SnykVSPackage.Instance
.DisposalToken);
}).FireAndForget();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ public void InvalidateApiToken()
if(LanguageClientHelper.IsLanguageServerReady())
ThreadHelper.JoinableTaskFactory.RunAsync(async () =>
{
await ServiceProvider.Package.LanguageClientManager.InvokeLogout(SnykVSPackage.Instance.DisposalToken);
await ServiceProvider.LanguageClientManager.InvokeLogout(SnykVSPackage.Instance.DisposalToken);
}).FireAndForget();
}

Expand Down Expand Up @@ -332,8 +332,8 @@ private void CheckForIgnores()
{
ThreadHelper.JoinableTaskFactory.RunAsync(async () =>
{
if (!OptionsDialogPage.ConsistentIgnoresEnabled && LanguageClientHelper.IsLanguageServerReady() && FeatureFlagService.Instance != null)
await FeatureFlagService.Instance.RefreshAsync(SnykVSPackage.Instance.DisposalToken);
if (!OptionsDialogPage.ConsistentIgnoresEnabled && LanguageClientHelper.IsLanguageServerReady())
await ServiceProvider.FeatureFlagService.RefreshAsync(SnykVSPackage.Instance.DisposalToken);
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
this.ignoreGroupbox.Visible = this.OptionsDialogPage.ConsistentIgnoresEnabled;
}).FireAndForget();
Expand All @@ -356,7 +356,7 @@ private void StartSastEnablementCheckLoop()
try
{
if (!LanguageClientHelper.IsLanguageServerReady()) return;
var sastSettings = await this.ServiceProvider.Package.LanguageClientManager.InvokeGetSastEnabled(SnykVSPackage.Instance.DisposalToken);
var sastSettings = await this.ServiceProvider.LanguageClientManager.InvokeGetSastEnabled(SnykVSPackage.Instance.DisposalToken);

bool snykCodeEnabled = sastSettings != null ? sastSettings.SnykCodeEnabled : false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
</PropertyGroup>
<PropertyGroup>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
</PropertyGroup>
<ItemGroup>
<Compile Include="Analytics\AbstractAnalyticsEvent.cs" />
<Compile Include="Analytics\AnalyticsEvent.cs" />
Expand All @@ -78,8 +78,10 @@
<Compile Include="Extension\UriExtensions.cs" />
<Compile Include="Language\CustomInitializationOptions.cs" />
<Compile Include="Language\FeatureFlagResponse.cs" />
<Compile Include="Language\IJsonRpc.cs" />
<Compile Include="Language\ILanguageClientManager.cs" />
<Compile Include="Language\InvalidProductTypeException.cs" />
<Compile Include="Language\JsonRpcWrapper.cs" />
<Compile Include="Language\LsSettings.cs" />
<Compile Include="Language\LsConstants.cs" />
<Compile Include="Language\LsAnalysisResult.cs" />
Expand Down Expand Up @@ -125,7 +127,8 @@
<Compile Include="SastSettings.cs" />
<Compile Include="Service\ApiEndpointResolver.cs" />
<Compile Include="Service\Domain\FeaturesSettings.cs" />
<Compile Include="Service\FeatureFlagService.cs" />
<Compile Include="Service\SnykFeatureFlagService.cs" />
<Compile Include="Service\IFeatureFlagService.cs" />
<Compile Include="Service\ISnykProgressWorker.cs" />
<Compile Include="Service\ISnykService.cs" />
<Compile Include="Service\ISnykServiceProvider.cs" />
Expand Down
Loading

0 comments on commit c5baafe

Please sign in to comment.