176 lines
		
	
	
	
		
			6.7 KiB
			
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			176 lines
		
	
	
	
		
			6.7 KiB
			
		
	
	
	
		
			C#
		
	
	
	
	
	
|   | // 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. | ||
|  | 
 | ||
|  | using System; | ||
|  | using FluentAssertions; | ||
|  | using Microsoft.DotNet.Cli.Utils; | ||
|  | using Microsoft.DotNet.Configurer; | ||
|  | using Microsoft.DotNet.Tools; | ||
|  | using Microsoft.DotNet.Tools.Test.Utilities; | ||
|  | using Moq; | ||
|  | using Xunit; | ||
|  | 
 | ||
|  | namespace Microsoft.DotNet.ShellShim.Tests | ||
|  | { | ||
|  |     public class WindowsEnvironmentPathTests | ||
|  |     { | ||
|  |         [Fact] | ||
|  |         public void GivenPathNotSetItPrintsManualInstructions() | ||
|  |         { | ||
|  |             var reporter = new BufferedReporter(); | ||
|  |             var toolsPath = @"C:\Tools"; | ||
|  |             var pathValue = @"C:\Other"; | ||
|  |             var provider = new Mock<IEnvironmentProvider>(MockBehavior.Strict); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable( | ||
|  |                     "PATH", | ||
|  |                     It.Is<EnvironmentVariableTarget>(t => | ||
|  |                         t == EnvironmentVariableTarget.Process || | ||
|  |                         t == EnvironmentVariableTarget.User || | ||
|  |                         t == EnvironmentVariableTarget.Machine))) | ||
|  |                 .Returns(pathValue); | ||
|  | 
 | ||
|  |             var environmentPath = new WindowsEnvironmentPath(toolsPath, reporter, provider.Object); | ||
|  | 
 | ||
|  |             environmentPath.PrintAddPathInstructionIfPathDoesNotExist(); | ||
|  | 
 | ||
|  |             reporter.Lines.Should().Equal( | ||
|  |                 string.Format( | ||
|  |                     CommonLocalizableStrings.EnvironmentPathWindowsManualInstructions, | ||
|  |                     toolsPath)); | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fact] | ||
|  |         public void GivenPathNotSetInProcessItPrintsReopenNotice() | ||
|  |         { | ||
|  |             var reporter = new BufferedReporter(); | ||
|  |             var toolsPath = @"C:\Tools"; | ||
|  |             var pathValue = @"C:\Other"; | ||
|  |             var provider = new Mock<IEnvironmentProvider>(MockBehavior.Strict); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Process)) | ||
|  |                 .Returns(pathValue); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable( | ||
|  |                     "PATH", | ||
|  |                     It.Is<EnvironmentVariableTarget>(t => | ||
|  |                         t == EnvironmentVariableTarget.User || | ||
|  |                         t == EnvironmentVariableTarget.Machine))) | ||
|  |                 .Returns(pathValue + ";" + toolsPath); | ||
|  | 
 | ||
|  |             var environmentPath = new WindowsEnvironmentPath(toolsPath, reporter, provider.Object); | ||
|  | 
 | ||
|  |             environmentPath.PrintAddPathInstructionIfPathDoesNotExist(); | ||
|  | 
 | ||
|  |             reporter.Lines.Should().Equal(CommonLocalizableStrings.EnvironmentPathWindowsNeedReopen); | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fact] | ||
|  |         public void GivenPathSetInProcessAndEnvironmentItPrintsNothing() | ||
|  |         { | ||
|  |             var reporter = new BufferedReporter(); | ||
|  |             var toolsPath = @"C:\Tools"; | ||
|  |             var pathValue = @"C:\Other"; | ||
|  |             var provider = new Mock<IEnvironmentProvider>(MockBehavior.Strict); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable( | ||
|  |                     "PATH", | ||
|  |                     It.Is<EnvironmentVariableTarget>(t => | ||
|  |                         t == EnvironmentVariableTarget.Process || | ||
|  |                         t == EnvironmentVariableTarget.User || | ||
|  |                         t == EnvironmentVariableTarget.Machine))) | ||
|  |                 .Returns(pathValue + ";" + toolsPath); | ||
|  | 
 | ||
|  |             var environmentPath = new WindowsEnvironmentPath(toolsPath, reporter, provider.Object); | ||
|  | 
 | ||
|  |             environmentPath.PrintAddPathInstructionIfPathDoesNotExist(); | ||
|  | 
 | ||
|  |             reporter.Lines.Should().BeEmpty(); | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fact] | ||
|  |         public void GivenPathSetItDoesNotAddPathToEnvironment() | ||
|  |         { | ||
|  |             var reporter = new BufferedReporter(); | ||
|  |             var toolsPath = @"C:\Tools"; | ||
|  |             var pathValue = @"C:\Other"; | ||
|  |             var provider = new Mock<IEnvironmentProvider>(MockBehavior.Strict); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable( | ||
|  |                     "PATH", | ||
|  |                     It.Is<EnvironmentVariableTarget>(t => | ||
|  |                         t == EnvironmentVariableTarget.Process || | ||
|  |                         t == EnvironmentVariableTarget.User || | ||
|  |                         t == EnvironmentVariableTarget.Machine))) | ||
|  |                 .Returns(pathValue + ";" + toolsPath); | ||
|  | 
 | ||
|  |             var environmentPath = new WindowsEnvironmentPath(toolsPath, reporter, provider.Object); | ||
|  | 
 | ||
|  |             environmentPath.AddPackageExecutablePathToUserPath(); | ||
|  | 
 | ||
|  |             reporter.Lines.Should().BeEmpty(); | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fact] | ||
|  |         public void GivenPathNotSetItAddsToEnvironment() | ||
|  |         { | ||
|  |             var reporter = new BufferedReporter(); | ||
|  |             var toolsPath = @"C:\Tools"; | ||
|  |             var pathValue = @"C:\Other"; | ||
|  |             var provider = new Mock<IEnvironmentProvider>(MockBehavior.Strict); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable( | ||
|  |                     "PATH", | ||
|  |                     It.Is<EnvironmentVariableTarget>(t => | ||
|  |                         t == EnvironmentVariableTarget.Process || | ||
|  |                         t == EnvironmentVariableTarget.User || | ||
|  |                         t == EnvironmentVariableTarget.Machine))) | ||
|  |                 .Returns(pathValue); | ||
|  |             provider | ||
|  |                 .Setup(p => p.SetEnvironmentVariable("PATH", pathValue + ";" + toolsPath, EnvironmentVariableTarget.User)); | ||
|  | 
 | ||
|  |             var environmentPath = new WindowsEnvironmentPath(toolsPath, reporter, provider.Object); | ||
|  | 
 | ||
|  |             environmentPath.AddPackageExecutablePathToUserPath(); | ||
|  | 
 | ||
|  |             reporter.Lines.Should().BeEmpty(); | ||
|  |         } | ||
|  | 
 | ||
|  |         [Fact] | ||
|  |         public void GivenSecurityExceptionItPrintsWarning() | ||
|  |         { | ||
|  |             var reporter = new BufferedReporter(); | ||
|  |             var toolsPath = @"C:\Tools"; | ||
|  |             var pathValue = @"C:\Other"; | ||
|  |             var provider = new Mock<IEnvironmentProvider>(MockBehavior.Strict); | ||
|  | 
 | ||
|  |             provider | ||
|  |                 .Setup(p => p.GetEnvironmentVariable( | ||
|  |                     "PATH", | ||
|  |                     It.Is<EnvironmentVariableTarget>(t => | ||
|  |                         t == EnvironmentVariableTarget.Process || | ||
|  |                         t == EnvironmentVariableTarget.User || | ||
|  |                         t == EnvironmentVariableTarget.Machine))) | ||
|  |                 .Returns(pathValue); | ||
|  |             provider | ||
|  |                 .Setup(p => p.SetEnvironmentVariable("PATH", pathValue + ";" + toolsPath, EnvironmentVariableTarget.User)) | ||
|  |                 .Throws(new System.Security.SecurityException()); | ||
|  | 
 | ||
|  |             var environmentPath = new WindowsEnvironmentPath(toolsPath, reporter, provider.Object); | ||
|  | 
 | ||
|  |             environmentPath.AddPackageExecutablePathToUserPath(); | ||
|  | 
 | ||
|  |             reporter.Lines.Should().Equal( | ||
|  |                 string.Format( | ||
|  |                     CommonLocalizableStrings.FailedToSetToolsPathEnvironmentVariable, | ||
|  |                     toolsPath).Yellow()); | ||
|  |         } | ||
|  |     } | ||
|  | } |