Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
#nullable enable
Microsoft.Testing.Extensions.RunSettingsProviderHelper
Microsoft.VisualStudio.TestTools.UnitTesting.PlatformServicesConfigurationAdapter
Microsoft.VisualStudio.TestTools.UnitTesting.PlatformServicesConfigurationAdapter.PlatformServicesConfigurationAdapter(Microsoft.Testing.Platform.Configurations.IConfiguration! configuration) -> void
Microsoft.VisualStudio.TestTools.UnitTesting.PlatformServicesConfigurationAdapter.this[string! key].get -> string?
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.ApplyEnvironmentVariables(System.Xml.Linq.XDocument! runSettings, Microsoft.Testing.Platform.Extensions.TestHostControllers.IEnvironmentVariables! environmentVariables) -> void
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.CanReadFile(Microsoft.Testing.Platform.Helpers.IFileSystem! fileSystem, string! filePath) -> bool
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.FindInvalidTestParameter(string![]! arguments) -> string?
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.HasEnvironmentVariables(System.Xml.Linq.XDocument! runSettings) -> bool
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.TryLoadRunSettingsAsync(Microsoft.Testing.Platform.CommandLine.ICommandLineOptions! commandLineOptions, Microsoft.Testing.Platform.Helpers.IFileSystem! fileSystem, Microsoft.Testing.Platform.Helpers.IEnvironment! environment, string! runSettingsOptionName) -> System.Threading.Tasks.Task<System.Xml.Linq.XDocument?>!
2 changes: 2 additions & 0 deletions src/Adapter/MSTest.TestAdapter/MSTest.TestAdapter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@

<ItemGroup>
<Compile Include="$(RepoRoot)src\Adapter\Shared\BannerMessageHelper.cs" Link="Shared\BannerMessageHelper.cs" />
<!-- Dependency-free logic shared with the VSTestBridge runsettings/test-parameter providers (see issue #9762). -->
Comment thread
Evangelink marked this conversation as resolved.
<Compile Include="$(RepoRoot)src\Platform\SharedExtensionHelpers\RunSettingsProviderHelper.cs" Link="Shared\RunSettingsProviderHelper.cs" />
<Compile Include="$(RepoRoot)src/Polyfills/**/*.cs" Link="Polyfills\%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if !WINDOWS_UWP
using Microsoft.Testing.Extensions;
using Microsoft.Testing.Platform.CommandLine;
using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Extensions.CommandLine;
Expand Down Expand Up @@ -38,22 +39,9 @@ public override Task<ValidationResult> ValidateOptionArgumentsAsync(CommandLineO

return !_fileSystem.ExistFile(filePath)
? ValidationResult.InvalidTask(string.Format(CultureInfo.InvariantCulture, PlatformAdapterResources.RunsettingsFileDoesNotExist, filePath))
: !CanReadFile(filePath)
: !RunSettingsProviderHelper.CanReadFile(_fileSystem, filePath)
? ValidationResult.InvalidTask(string.Format(CultureInfo.InvariantCulture, PlatformAdapterResources.RunsettingsFileCannotBeRead, filePath))
: ValidationResult.ValidTask;
}

private bool CanReadFile(string filePath)
{
try
{
using IFileStream stream = _fileSystem.NewFileStream(filePath, FileMode.Open, FileAccess.Read);
return true;
}
catch (IOException)
{
return false;
}
}
}
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if !WINDOWS_UWP
using Microsoft.Testing.Extensions;
using Microsoft.Testing.Platform.CommandLine;
using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Extensions.TestHostControllers;

using IEnvironment = Microsoft.Testing.Platform.Helpers.IEnvironment;
using IFileStream = Microsoft.Testing.Platform.Helpers.IFileStream;
using IFileSystem = Microsoft.Testing.Platform.Helpers.IFileSystem;

namespace Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.TestingPlatformAdapter;
Expand Down Expand Up @@ -44,59 +44,18 @@ public MSTestRunSettingsEnvironmentVariableProvider(IExtension extension, IComma

public async Task<bool> IsEnabledAsync()
{
string? runSettingsFilePath = null;
string? runSettingsContent = null;
_runSettings = await RunSettingsProviderHelper.TryLoadRunSettingsAsync(
_commandLineOptions,
_fileSystem,
_environment,
MSTestRunSettingsCommandLineOptionsProvider.RunSettingsOptionName).ConfigureAwait(false);

if (_commandLineOptions.TryGetOptionArgumentList(MSTestRunSettingsCommandLineOptionsProvider.RunSettingsOptionName, out string[]? runsettings)
&& runsettings.Length > 0
&& _fileSystem.ExistFile(runsettings[0]))
{
runSettingsFilePath = runsettings[0];
}

if (runSettingsFilePath is null)
{
runSettingsContent = _environment.GetEnvironmentVariable("TESTINGPLATFORM_EXPERIMENTAL_VSTEST_RUNSETTINGS");
}

if (runSettingsFilePath is null && string.IsNullOrEmpty(runSettingsContent))
{
string? envVarFilePath = _environment.GetEnvironmentVariable("TESTINGPLATFORM_VSTESTBRIDGE_RUNSETTINGS_FILE");
if (!string.IsNullOrEmpty(envVarFilePath) && _fileSystem.ExistFile(envVarFilePath!))
{
runSettingsFilePath = envVarFilePath;
}
}

if (runSettingsFilePath is not null)
{
using IFileStream fileStream = _fileSystem.NewFileStream(runSettingsFilePath, FileMode.Open, FileAccess.Read);
#if NETCOREAPP
_runSettings = await XDocument.LoadAsync(fileStream.Stream, LoadOptions.None, CancellationToken.None).ConfigureAwait(false);
#else
using StreamReader streamReader = new(fileStream.Stream);
_runSettings = XDocument.Parse(await streamReader.ReadToEndAsync().ConfigureAwait(false));
#endif
}
else if (!string.IsNullOrEmpty(runSettingsContent))
{
_runSettings = XDocument.Parse(runSettingsContent);
}
else
{
return false;
}

return _runSettings.Element("RunSettings")?.Element("RunConfiguration")?.Element("EnvironmentVariables") is not null;
return _runSettings is not null && RunSettingsProviderHelper.HasEnvironmentVariables(_runSettings);
}

public Task UpdateAsync(IEnvironmentVariables environmentVariables)
{
foreach (XElement element in _runSettings!.Element("RunSettings")!.Element("RunConfiguration")!.Element("EnvironmentVariables")!.Elements())
{
environmentVariables.SetVariable(new(element.Name.ToString(), element.Value, true, true));
}

RunSettingsProviderHelper.ApplyEnvironmentVariables(_runSettings!, environmentVariables);
return Task.CompletedTask;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#if !WINDOWS_UWP
using Microsoft.Testing.Extensions;
using Microsoft.Testing.Platform.CommandLine;
using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Extensions.CommandLine;
Expand All @@ -26,7 +27,7 @@ public MSTestTestRunParametersCommandLineOptionsProvider(IExtension extension)

public override Task<ValidationResult> ValidateOptionArgumentsAsync(CommandLineOption commandOption, string[] arguments)
{
string? invalidArgument = arguments.FirstOrDefault(argument => !argument.Contains('='));
string? invalidArgument = RunSettingsProviderHelper.FindInvalidTestParameter(arguments);
return invalidArgument is not null
? ValidationResult.InvalidTask(string.Format(CultureInfo.CurrentCulture, PlatformAdapterResources.TestRunParameterOptionArgumentIsNotParameter, invalidArgument))
: ValidationResult.ValidTask;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,25 +41,12 @@ public override Task<ValidationResult> ValidateOptionArgumentsAsync(CommandLineO
}

// Even if the file exists, we want to validate we can open/read it.
if (!CanReadFile(filePath))
if (!RunSettingsProviderHelper.CanReadFile(_fileSystem, filePath))
{
return ValidationResult.InvalidTask(string.Format(CultureInfo.InvariantCulture, ExtensionResources.RunsettingsFileCannotBeRead, filePath));
}

// No problem found
return ValidationResult.ValidTask;
}

private bool CanReadFile(string filePath)
{
try
{
using IFileStream stream = _fileSystem.NewFileStream(filePath, FileMode.Open, FileAccess.Read);
return true;
}
catch (IOException)
{
return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,9 @@ public TestRunParametersCommandLineOptionsProvider(IExtension extension)
/// <inheritdoc />
public override Task<ValidationResult> ValidateOptionArgumentsAsync(CommandLineOption commandOption, string[] arguments)
{
foreach (string argument in arguments)
{
if (!argument.Contains('='))
{
return ValidationResult.InvalidTask(string.Format(CultureInfo.CurrentCulture, ExtensionResources.TestRunParameterOptionArgumentIsNotParameter, argument));
}
}

return ValidationResult.ValidTask;
string? invalidArgument = RunSettingsProviderHelper.FindInvalidTestParameter(arguments);
return invalidArgument is not null
? ValidationResult.InvalidTask(string.Format(CultureInfo.CurrentCulture, ExtensionResources.TestRunParameterOptionArgumentIsNotParameter, invalidArgument))
: ValidationResult.ValidTask;
}
}
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
#nullable enable
Microsoft.Testing.Extensions.RunSettingsProviderHelper
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.ApplyEnvironmentVariables(System.Xml.Linq.XDocument! runSettings, Microsoft.Testing.Platform.Extensions.TestHostControllers.IEnvironmentVariables! environmentVariables) -> void
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.CanReadFile(Microsoft.Testing.Platform.Helpers.IFileSystem! fileSystem, string! filePath) -> bool
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.FindInvalidTestParameter(string![]! arguments) -> string?
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.HasEnvironmentVariables(System.Xml.Linq.XDocument! runSettings) -> bool
static Microsoft.Testing.Extensions.RunSettingsProviderHelper.TryLoadRunSettingsAsync(Microsoft.Testing.Platform.CommandLine.ICommandLineOptions! commandLineOptions, Microsoft.Testing.Platform.Helpers.IFileSystem! fileSystem, Microsoft.Testing.Platform.Helpers.IEnvironment! environment, string! runSettingsOptionName) -> System.Threading.Tasks.Task<System.Xml.Linq.XDocument?>!
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
<ItemGroup>
<!-- Embedded helpers from Microsoft.Testing.Platform -->
<Compile Include="$(RepoRoot)src\Platform\Microsoft.Testing.Platform\Helpers\RoslynString.cs" Link="Helpers\RoslynString.cs" />
<!-- Dependency-free logic shared with the MSTest adapter's native MTP providers (see issue #9762). -->
Comment thread
Evangelink marked this conversation as resolved.
<Compile Include="$(RepoRoot)src\Platform\SharedExtensionHelpers\RunSettingsProviderHelper.cs" Link="Helpers\RunSettingsProviderHelper.cs" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Microsoft.Testing.Extensions.VSTestBridge.CommandLine;
using Microsoft.Testing.Platform;
using Microsoft.Testing.Platform.CommandLine;
using Microsoft.Testing.Platform.Extensions;
using Microsoft.Testing.Platform.Extensions.TestHostControllers;
Expand Down Expand Up @@ -36,66 +35,18 @@ public RunSettingsEnvironmentVariableProvider(IExtension extension, ICommandLine

public async Task<bool> IsEnabledAsync()
{
string? runSettingsFilePath = null;
string? runSettingsContent = null;
_runSettings = await RunSettingsProviderHelper.TryLoadRunSettingsAsync(
_commandLineOptions,
_fileSystem,
_environment,
RunSettingsCommandLineOptionsProvider.RunSettingsOptionName).ConfigureAwait(false);

// Try to get runsettings from command line
if (_commandLineOptions.TryGetOptionArgumentList(RunSettingsCommandLineOptionsProvider.RunSettingsOptionName, out string[]? runsettings)
&& runsettings.Length > 0)
{
if (_fileSystem.ExistFile(runsettings[0]))
{
runSettingsFilePath = runsettings[0];
}
}

// If not from command line, try environment variable with content
if (runSettingsFilePath is null)
{
runSettingsContent = _environment.GetEnvironmentVariable("TESTINGPLATFORM_EXPERIMENTAL_VSTEST_RUNSETTINGS");
}

// If not from content env var, try environment variable with file path
if (runSettingsFilePath is null && RoslynString.IsNullOrEmpty(runSettingsContent))
{
string? envVarFilePath = _environment.GetEnvironmentVariable("TESTINGPLATFORM_VSTESTBRIDGE_RUNSETTINGS_FILE");
if (!RoslynString.IsNullOrEmpty(envVarFilePath) && _fileSystem.ExistFile(envVarFilePath))
{
runSettingsFilePath = envVarFilePath;
}
}

// If we have a file path, read from file
if (runSettingsFilePath is not null)
{
using IFileStream fileStream = _fileSystem.NewFileStream(runSettingsFilePath, FileMode.Open, FileAccess.Read);
#if NETCOREAPP
_runSettings = await XDocument.LoadAsync(fileStream.Stream, LoadOptions.None, CancellationToken.None).ConfigureAwait(false);
#else
using StreamReader streamReader = new(fileStream.Stream);
_runSettings = XDocument.Parse(await streamReader.ReadToEndAsync().ConfigureAwait(false));
#endif
}
else if (!RoslynString.IsNullOrEmpty(runSettingsContent))
{
// If we have content, parse it directly
_runSettings = XDocument.Parse(runSettingsContent);
}
else
{
return false;
}

return _runSettings.Element("RunSettings")?.Element("RunConfiguration")?.Element("EnvironmentVariables") is not null;
return _runSettings is not null && RunSettingsProviderHelper.HasEnvironmentVariables(_runSettings);
}

public Task UpdateAsync(IEnvironmentVariables environmentVariables)
{
foreach (XElement element in _runSettings!.Element("RunSettings")!.Element("RunConfiguration")!.Element("EnvironmentVariables")!.Elements())
{
environmentVariables.SetVariable(new(element.Name.ToString(), element.Value, true, true));
}

RunSettingsProviderHelper.ApplyEnvironmentVariables(_runSettings!, environmentVariables);
return Task.CompletedTask;
}

Expand Down
Loading