Merge pull request #9332 from dotnet/merges/release/2.1.4xx-to-master

Merge release/2.1.4xx to master
This commit is contained in:
Livar 2018-05-31 10:22:00 -07:00 committed by GitHub
commit 80d542b8f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 274 additions and 92 deletions

View file

@ -5,7 +5,7 @@
<MicrosoftAspNetCoreAppPackageVersion>$(MicrosoftAspNetCoreAllPackageVersion)</MicrosoftAspNetCoreAppPackageVersion>
<MicrosoftNETCoreAppPackageVersion>2.1.0-rtm-26515-03</MicrosoftNETCoreAppPackageVersion>
<MicrosoftNETCoreDotNetHostResolverPackageVersion>$(MicrosoftNETCoreAppPackageVersion)</MicrosoftNETCoreDotNetHostResolverPackageVersion>
<MicrosoftBuildPackageVersion>15.7.179</MicrosoftBuildPackageVersion>
<MicrosoftBuildPackageVersion>15.8.0-preview-000061</MicrosoftBuildPackageVersion>
<MicrosoftBuildFrameworkPackageVersion>$(MicrosoftBuildPackageVersion)</MicrosoftBuildFrameworkPackageVersion>
<MicrosoftBuildRuntimePackageVersion>$(MicrosoftBuildPackageVersion)</MicrosoftBuildRuntimePackageVersion>
<MicrosoftBuildLocalizationPackageVersion>$(MicrosoftBuildPackageVersion)</MicrosoftBuildLocalizationPackageVersion>
@ -45,6 +45,7 @@
<NuGetPackagingPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetPackagingPackageVersion>
<NuGetProjectModelPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetProjectModelPackageVersion>
<NuGetVersioningPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetVersioningPackageVersion>
<NuGetSdkResolverPackageVersion>$(NuGetBuildTasksPackageVersion)</NuGetSdkResolverPackageVersion>
<MicrosoftNETTestSdkPackageVersion>15.8.0-preview-20180510-03</MicrosoftNETTestSdkPackageVersion>
<MicrosoftTestPlatformCLIPackageVersion>$(MicrosoftNETTestSdkPackageVersion)</MicrosoftTestPlatformCLIPackageVersion>
<MicrosoftTestPlatformBuildPackageVersion>$(MicrosoftNETTestSdkPackageVersion)</MicrosoftTestPlatformBuildPackageVersion>

View file

@ -3,6 +3,7 @@
// Import the utility functionality.
import jobs.generation.ArchivalSettings;
import jobs.generation.Utilities;
def project = GithubProject
@ -108,6 +109,12 @@ set DOTNET_CLI_UI_LANGUAGE=es
Utilities.addMSTestResults(newJob, '**/*.trx')
}
Utilities.addGithubPRTriggerForBranch(newJob, branch, "${os} ${architecture} ${configuration} Build")
def archiveSettings = new ArchivalSettings()
archiveSettings.addFiles("test/**/*.trx")
archiveSettings.setFailIfNothingArchived()
archiveSettings.setArchiveOnFailure()
Utilities.addArchival(newJob, archiveSettings)
}
// Make the call to generate the help job

View file

@ -522,6 +522,7 @@ else {
throw "Invalid value for `$Runtime"
}
# Check if the SDK version is already installed.
$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
if ($isAssetInstalled) {
Say "$assetName version $SpecificVersion is already installed."
@ -561,6 +562,12 @@ catch {
Say "Extracting zip from $DownloadLink"
Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot
# Check if the SDK version is now installed; if not, fail the installation.
$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion
if (!$isAssetInstalled) {
throw "$assetName version $SpecificVersion failed to install with an unknown error."
}
Remove-Item $ZipPath
Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath

View file

@ -754,6 +754,7 @@ install_dotnet() {
return 1
fi
# Check if the SDK version is already installed.
if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then
say "$asset_name version $specific_version is already installed."
return 0
@ -791,6 +792,12 @@ install_dotnet() {
say "Extracting zip from $download_link"
extract_dotnet_package "$zip_path" "$install_root"
# Check if the SDK version is now installed; if not, fail the installation.
if ! is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then
say_err "$asset_name version $specific_version failed to install with an unknown error."
return 1
fi
return 0
}

View file

@ -3,6 +3,7 @@
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.DotNet.Cli.Utils
@ -47,5 +48,35 @@ namespace Microsoft.DotNet.Cli.Utils
}
}
}
/// <summary>
/// Run Directory.Move and File.Move in Windows has a chance to get IOException with
/// HResult 0x80070005 due to Indexer. But this error is transient.
/// </summary>
internal static void RetryOnMoveAccessFailure(Action action)
{
const int ERROR_HRESULT_ACCESS_DENIED = unchecked((int)0x80070005);
int nextWaitTime = 10;
int remainRetry = 10;
while (true)
{
try
{
action();
break;
}
catch (IOException e) when (e.HResult == ERROR_HRESULT_ACCESS_DENIED)
{
Thread.Sleep(nextWaitTime);
nextWaitTime *= 2;
remainRetry--;
if (remainRetry == 0)
{
throw;
}
}
}
}
}
}

View file

@ -0,0 +1,24 @@
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
namespace Microsoft.DotNet.Configurer
{
public class DotnetFirstRunConfiguration
{
public bool GenerateAspNetCertificate { get; }
public bool PrintTelemetryMessage { get; }
public bool SkipFirstRunExperience { get; }
public DotnetFirstRunConfiguration(
bool generateAspNetCertificate,
bool printTelemetryMessage,
bool skipFirstRunExperience)
{
GenerateAspNetCertificate = generateAspNetCertificate;
PrintTelemetryMessage = printTelemetryMessage;
SkipFirstRunExperience = skipFirstRunExperience;
}
}
}

View file

@ -12,7 +12,7 @@ namespace Microsoft.DotNet.Configurer
public class DotnetFirstTimeUseConfigurer
{
private IReporter _reporter;
private IEnvironmentProvider _environmentProvider;
private DotnetFirstRunConfiguration _dotnetFirstRunConfiguration;
private INuGetCachePrimer _nugetCachePrimer;
private INuGetCacheSentinel _nugetCacheSentinel;
private IFirstTimeUseNoticeSentinel _firstTimeUseNoticeSentinel;
@ -29,7 +29,7 @@ namespace Microsoft.DotNet.Configurer
IAspNetCertificateSentinel aspNetCertificateSentinel,
IAspNetCoreCertificateGenerator aspNetCoreCertificateGenerator,
IFileSentinel toolPathSentinel,
IEnvironmentProvider environmentProvider,
DotnetFirstRunConfiguration dotnetFirstRunConfiguration,
IReporter reporter,
string cliFallbackFolderPath,
IEnvironmentPath pathAdder)
@ -40,7 +40,7 @@ namespace Microsoft.DotNet.Configurer
_aspNetCertificateSentinel = aspNetCertificateSentinel;
_aspNetCoreCertificateGenerator = aspNetCoreCertificateGenerator;
_toolPathSentinel = toolPathSentinel;
_environmentProvider = environmentProvider;
_dotnetFirstRunConfiguration = dotnetFirstRunConfiguration;
_reporter = reporter;
_cliFallbackFolderPath = cliFallbackFolderPath;
_pathAdder = pathAdder ?? throw new ArgumentNullException(nameof(pathAdder));
@ -93,11 +93,8 @@ namespace Microsoft.DotNet.Configurer
#if EXCLUDE_ASPNETCORE
return false;
#else
var generateAspNetCertificate =
_environmentProvider.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true);
return ShouldRunFirstRunExperience() &&
generateAspNetCertificate &&
_dotnetFirstRunConfiguration.GenerateAspNetCertificate &&
!_aspNetCertificateSentinel.Exists();
#endif
}
@ -116,11 +113,8 @@ namespace Microsoft.DotNet.Configurer
private bool ShouldPrintFirstTimeUseNotice()
{
var showFirstTimeUseNotice =
_environmentProvider.GetEnvironmentVariableAsBool("DOTNET_PRINT_TELEMETRY_MESSAGE", true);
return ShouldRunFirstRunExperience() &&
showFirstTimeUseNotice &&
_dotnetFirstRunConfiguration.PrintTelemetryMessage &&
!_firstTimeUseNoticeSentinel.Exists();
}
@ -157,10 +151,7 @@ namespace Microsoft.DotNet.Configurer
private bool ShouldRunFirstRunExperience()
{
var skipFirstTimeExperience =
_environmentProvider.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false);
return !skipFirstTimeExperience;
return !_dotnetFirstRunConfiguration.SkipFirstRunExperience;
}
}
}

View file

@ -141,6 +141,15 @@ namespace Microsoft.DotNet.Cli
command = "help";
}
var environmentProvider = new EnvironmentProvider();
bool generateAspNetCertificate =
environmentProvider.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true);
bool printTelemetryMessage =
environmentProvider.GetEnvironmentVariableAsBool("DOTNET_PRINT_TELEMETRY_MESSAGE", true);
bool skipFirstRunExperience =
environmentProvider.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false);
topLevelCommandParserResult = new TopLevelCommandParserResult(command);
var hasSuperUserAccess = false;
if (IsDotnetBeingInvokedFromNativeInstaller(topLevelCommandParserResult))
@ -149,15 +158,26 @@ namespace Microsoft.DotNet.Cli
firstTimeUseNoticeSentinel = new NoOpFirstTimeUseNoticeSentinel();
toolPathSentinel = new NoOpFileSentinel(exists: false);
hasSuperUserAccess = true;
// When running through a native installer, we want the cache expansion to happen, so
// we need to override this.
skipFirstRunExperience = false;
}
var dotnetFirstRunConfiguration = new DotnetFirstRunConfiguration(
generateAspNetCertificate,
printTelemetryMessage,
skipFirstRunExperience);
ConfigureDotNetForFirstTimeUse(
nugetCacheSentinel,
firstTimeUseNoticeSentinel,
aspNetCertificateSentinel,
toolPathSentinel,
cliFallbackFolderPathCalculator,
hasSuperUserAccess);
hasSuperUserAccess,
dotnetFirstRunConfiguration,
environmentProvider);
break;
}
@ -222,15 +242,17 @@ namespace Microsoft.DotNet.Cli
IAspNetCertificateSentinel aspNetCertificateSentinel,
IFileSentinel toolPathSentinel,
CliFolderPathCalculator cliFolderPathCalculator,
bool hasSuperUserAccess)
bool hasSuperUserAccess,
DotnetFirstRunConfiguration dotnetFirstRunConfiguration,
IEnvironmentProvider environmentProvider)
{
var environmentProvider = new EnvironmentProvider();
using (PerfTrace.Current.CaptureTiming())
{
var nugetPackagesArchiver = new NuGetPackagesArchiver();
var environmentPath =
EnvironmentPathFactory.CreateEnvironmentPath(cliFolderPathCalculator, hasSuperUserAccess, environmentProvider);
var environmentPath = EnvironmentPathFactory.CreateEnvironmentPath(
cliFolderPathCalculator,
hasSuperUserAccess,
environmentProvider);
var commandFactory = new DotNetCommandFactory(alwaysRunOutOfProc: true);
var nugetCachePrimer = new NuGetCachePrimer(
nugetPackagesArchiver,
@ -244,7 +266,7 @@ namespace Microsoft.DotNet.Cli
aspNetCertificateSentinel,
aspnetCertificateGenerator,
toolPathSentinel,
environmentProvider,
dotnetFirstRunConfiguration,
Reporter.Output,
cliFolderPathCalculator.CliFallbackFolderPath,
environmentPath);

View file

@ -113,7 +113,7 @@ namespace Microsoft.DotNet.ShellShim
foreach (var file in GetShimFiles(commandName).Where(f => _fileSystem.File.Exists(f.Value)))
{
var tempPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
_fileSystem.File.Move(file.Value, tempPath);
FileAccessRetrier.RetryOnMoveAccessFailure(() => _fileSystem.File.Move(file.Value, tempPath));
files[file.Value] = tempPath;
}
}
@ -137,7 +137,7 @@ namespace Microsoft.DotNet.ShellShim
rollback: () => {
foreach (var kvp in files)
{
_fileSystem.File.Move(kvp.Value, kvp.Key);
FileAccessRetrier.RetryOnMoveAccessFailure(() => _fileSystem.File.Move(kvp.Value, kvp.Key));
}
});
}

View file

@ -4,6 +4,7 @@ using System.IO;
using System.Linq;
using System.Xml.Linq;
using Microsoft.DotNet.Cli;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.DotNet.Configurer;
using Microsoft.DotNet.Tools;
using Microsoft.Extensions.EnvironmentAbstractions;
@ -82,7 +83,7 @@ namespace Microsoft.DotNet.ToolPackage
}
Directory.CreateDirectory(packageRootDirectory.Value);
Directory.Move(stageDirectory.Value, packageDirectory.Value);
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(stageDirectory.Value, packageDirectory.Value));
rollbackDirectory = packageDirectory.Value;
return new ToolPackageInstance(_store, packageId, version, packageDirectory);

View file

@ -8,6 +8,7 @@ using Microsoft.Extensions.EnvironmentAbstractions;
using NuGet.ProjectModel;
using NuGet.Versioning;
using Microsoft.DotNet.Cli.Utils;
using System.Threading;
namespace Microsoft.DotNet.ToolPackage
{
@ -79,7 +80,7 @@ namespace Microsoft.DotNet.ToolPackage
// Use the staging directory for uninstall
// This prevents cross-device moves when temp is mounted to a different device
var tempPath = _store.GetRandomStagingDirectory().Value;
Directory.Move(PackageDirectory.Value, tempPath);
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(PackageDirectory.Value, tempPath));
tempPackageDirectory = tempPath;
}
@ -111,7 +112,7 @@ namespace Microsoft.DotNet.ToolPackage
if (tempPackageDirectory != null)
{
Directory.CreateDirectory(rootDirectory.Value);
Directory.Move(tempPackageDirectory, PackageDirectory.Value);
FileAccessRetrier.RetryOnMoveAccessFailure(() => Directory.Move(tempPackageDirectory, PackageDirectory.Value));
}
});
}

View file

@ -17,6 +17,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.NETCore.App" Version="$(MicrosoftNETCoreAppPackageVersion)" />
<PackageReference Include="NuGet.Build.Tasks" Version="$(NuGetBuildTasksPackageVersion)" />
<PackageReference Include="Microsoft.Build.NuGetSdkResolver" Version="$(NuGetSdkResolverPackageVersion)" />
<PackageReference Include="Microsoft.TestPlatform.CLI" Version="$(MicrosoftTestPlatformCLIPackageVersion)" />
<PackageReference Include="Microsoft.TestPlatform.Build" Version="$(MicrosoftTestPlatformBuildPackageVersion)" />
<PackageReference Condition=" '$(DotNetBuildFromSource)' != 'true' " Include="NuGet.Localization" Version="$(NuGetProjectModelPackageVersion)" />
@ -283,6 +284,9 @@
<RemainingFiles Remove="$(PublishDir)**\*.resources.dll" />
<DiasymReaderPath Include="$(SharedFrameworkNameVersionPath)/Microsoft.DiaSymReader.Native.*.dll" />
<!-- MSBuild includes reference assemblies to compile in-memory tasks. Don't try to crossgen. -->
<RemainingFiles Remove="$(PublishDir)ref\*.dll" />
</ItemGroup>
<AddMetadataIsPE Items="@(RoslynFiles)">

View file

@ -21,7 +21,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
private Mock<IAspNetCertificateSentinel> _aspNetCertificateSentinelMock;
private Mock<IAspNetCoreCertificateGenerator> _aspNetCoreCertificateGeneratorMock;
private Mock<IFileSentinel> _toolPathSentinelMock;
private Mock<IEnvironmentProvider> _environmentProviderMock;
private Mock<IReporter> _reporterMock;
private Mock<IEnvironmentPath> _pathAdderMock;
@ -33,16 +32,8 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock = new Mock<IAspNetCertificateSentinel>();
_aspNetCoreCertificateGeneratorMock = new Mock<IAspNetCoreCertificateGenerator>();
_toolPathSentinelMock = new Mock<IFileSentinel>();
_environmentProviderMock = new Mock<IEnvironmentProvider>();
_reporterMock = new Mock<IReporter>();
_pathAdderMock = new Mock<IEnvironmentPath>();
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
.Returns(false);
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_PRINT_TELEMETRY_MESSAGE", true))
.Returns(true);
}
[Fact]
@ -57,7 +48,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -72,9 +68,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
public void It_does_not_print_the_first_time_use_notice_when_the_user_has_set_the_DOTNET_SKIP_FIRST_TIME_EXPERIENCE_environemnt_variable()
{
_firstTimeUseNoticeSentinelMock.Setup(n => n.Exists()).Returns(false);
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
.Returns(true);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
@ -83,7 +76,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: true
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -98,9 +96,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
public void It_does_not_print_the_first_time_use_notice_when_the_user_has_set_the_DOTNET_PRINT_TELEMETRY_MESSAGE_environemnt_variable()
{
_firstTimeUseNoticeSentinelMock.Setup(n => n.Exists()).Returns(false);
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_PRINT_TELEMETRY_MESSAGE", true))
.Returns(false);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
@ -109,7 +104,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: false,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -132,7 +132,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -155,7 +160,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -177,7 +187,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -199,7 +214,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -210,12 +230,9 @@ namespace Microsoft.DotNet.Configurer.UnitTests
}
[Fact]
public void It_does_not_prime_the_cache_if_the_sentinel_exists_but_the_user_has_set_the_DOTNET_SKIP_FIRST_TIME_EXPERIENCE_environemnt_variable()
public void It_does_not_prime_the_cache_if_the_sentinel_does_not_exist_but_the_user_has_set_the_DOTNET_SKIP_FIRST_TIME_EXPERIENCE_environment_variable()
{
_nugetCacheSentinelMock.Setup(n => n.Exists()).Returns(false);
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
.Returns(true);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
@ -224,7 +241,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: true
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -246,7 +268,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -269,7 +296,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -295,7 +327,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -322,7 +359,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -345,7 +387,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -368,7 +415,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -398,7 +450,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -420,7 +477,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -435,9 +497,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
public void It_does_not_generate_the_aspnet_https_development_certificate_when_the_user_has_set_the_DOTNET_SKIP_FIRST_TIME_EXPERIENCE_environment_variable()
{
_aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(false);
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
.Returns(true);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
@ -446,7 +505,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: true
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -461,9 +525,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
public void It_does_not_generate_the_aspnet_https_development_certificate_when_the_user_has_set_the_DOTNET_GENERATE_ASPNET_CERTIFICATE_environment_variable()
{
_aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(false);
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true))
.Returns(false);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
@ -472,7 +533,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: false,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -487,8 +553,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
public void It_generates_the_aspnet_https_development_certificate_if_the_sentinel_does_not_exist()
{
_aspNetCertificateSentinelMock.Setup(n => n.Exists()).Returns(false);
_environmentProviderMock.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_GENERATE_ASPNET_CERTIFICATE", true))
.Returns(true);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
@ -497,7 +561,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -520,7 +589,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: false
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);
@ -533,10 +607,6 @@ namespace Microsoft.DotNet.Configurer.UnitTests
[Fact]
public void It_does_not_add_the_tool_path_to_the_environment_if_the_first_run_experience_is_skipped()
{
_environmentProviderMock
.Setup(e => e.GetEnvironmentVariableAsBool("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", false))
.Returns(true);
var dotnetFirstTimeUseConfigurer = new DotnetFirstTimeUseConfigurer(
_nugetCachePrimerMock.Object,
_nugetCacheSentinelMock.Object,
@ -544,7 +614,12 @@ namespace Microsoft.DotNet.Configurer.UnitTests
_aspNetCertificateSentinelMock.Object,
_aspNetCoreCertificateGeneratorMock.Object,
_toolPathSentinelMock.Object,
_environmentProviderMock.Object,
new DotnetFirstRunConfiguration
(
generateAspNetCertificate: true,
printTelemetryMessage: true,
skipFirstRunExperience: true
),
_reporterMock.Object,
CliFallbackFolderPath,
_pathAdderMock.Object);

View file

@ -334,19 +334,34 @@ namespace Microsoft.DotNet.Cli.Utils.Tests
private sealed class MockFactory : SdkResultFactory
{
public override SdkResult IndicateFailure(IEnumerable<string> errors, IEnumerable<string> warnings = null)
=> new MockResult { Success = false, Errors = errors, Warnings = warnings };
=> new MockResult(success: false, path: null, version: null, warnings: warnings, errors: errors);
public override SdkResult IndicateSuccess(string path, string version, IEnumerable<string> warnings = null)
=> new MockResult { Success = true, Path = path, Version = version, Warnings = warnings };
=> new MockResult(success: true, path: path, version: version, warnings: warnings);
}
private sealed class MockResult : SdkResult
{
public new bool Success { get => base.Success; set => base.Success = value; }
public string Version { get; set; }
public string Path { get; set; }
public IEnumerable<string> Errors { get; set; }
public IEnumerable<string> Warnings { get; set; }
public MockResult(bool success, string path, string version, IEnumerable<string> warnings = null,
IEnumerable<string> errors = null)
{
Success = success;
Path = path;
Version = version;
Warnings = warnings;
Errors = errors;
}
public new bool Success
{
get => base.Success;
private set => base.Success = value;
}
public override string Version { get; protected set; }
public override string Path { get; protected set; }
public IEnumerable<string> Errors { get; }
public IEnumerable<string> Warnings { get; }
}
}
}

View file

@ -14,8 +14,4 @@
<ProjectReference Include="..\..\src\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NETStandard.Library" Version="2.0.0" />
</ItemGroup>
</Project>