1111using Azure . Core . TestFramework ;
1212using Azure . Identity . Tests . Mock ;
1313using NUnit . Framework ;
14+ using System . Runtime . InteropServices ;
1415
1516namespace Azure . Identity . Tests
1617{
@@ -73,9 +74,6 @@ public async Task AuthenticateWithAzurePowerShellCredential(
7374
7475 private static IEnumerable < object [ ] > ErrorScenarios ( )
7576 {
76- yield return new object [ ] { "'pwsh' is not recognized" , AzurePowerShellCredential . PowerShellNotInstalledError } ;
77- yield return new object [ ] { "pwsh: command not found" , AzurePowerShellCredential . PowerShellNotInstalledError } ;
78- yield return new object [ ] { "pwsh: not found" , AzurePowerShellCredential . PowerShellNotInstalledError } ;
7977 yield return new object [ ] { "Run Connect-AzAccount to login" , AzurePowerShellCredential . AzurePowerShellNotLogInError } ;
8078 yield return new object [ ] { "NoAzAccountModule" , AzurePowerShellCredential . AzurePowerShellModuleNotInstalledError } ;
8179 yield return new object [ ] { "Get-AzAccessToken: Run Connect-AzAccount to login." , AzurePowerShellCredential . AzurePowerShellNotLogInError } ;
@@ -94,6 +92,32 @@ public void AuthenticateWithAzurePowerShellCredential_ErrorScenarios(string erro
9492 Assert . AreEqual ( expectedError , ex . Message ) ;
9593 }
9694
95+ /// <summary>
96+ /// Requires 2 TestProcess results falling back from pwsh to powershell on Windows
97+ /// </summary>
98+ private static IEnumerable < object [ ] > FallBackErrorScenarios ( )
99+ {
100+ yield return new object [ ] { "'pwsh' is not recognized" , AzurePowerShellCredential . PowerShellNotInstalledError } ;
101+ yield return new object [ ] { "pwsh: command not found" , AzurePowerShellCredential . PowerShellNotInstalledError } ;
102+ yield return new object [ ] { "pwsh: not found" , AzurePowerShellCredential . PowerShellNotInstalledError } ;
103+ }
104+
105+ [ Test ]
106+ [ TestCaseSource ( nameof ( FallBackErrorScenarios ) ) ]
107+ public void AuthenticateWithAzurePowerShellCredential_FallBackErrorScenarios ( string errorMessage , string expectedError )
108+ {
109+ // This will require two processes on Windows and one on other platforms
110+ // Purposefully stripping out the second process to ensure any attempt to fallback is caught on non-Windows
111+ TestProcess [ ] testProcesses = new TestProcess [ ] { new TestProcess { Error = errorMessage } , new TestProcess { Error = errorMessage } } ;
112+ if ( ! RuntimeInformation . IsOSPlatform ( OSPlatform . Windows ) )
113+ testProcesses = new TestProcess [ ] { testProcesses [ 0 ] } ;
114+
115+ AzurePowerShellCredential credential = InstrumentClient (
116+ new AzurePowerShellCredential ( new AzurePowerShellCredentialOptions ( ) , CredentialPipeline . GetInstance ( null ) , new TestProcessService ( testProcesses ) ) ) ;
117+ var ex = Assert . ThrowsAsync < CredentialUnavailableException > ( async ( ) => await credential . GetTokenAsync ( new TokenRequestContext ( MockScopes . Default ) ) ) ;
118+ Assert . AreEqual ( expectedError , ex . Message ) ;
119+ }
120+
97121 [ Test ]
98122 public async Task HandlesAlternateDateTimeFormats ( [ Values ( "en-US" , "nl-NL" ) ] string culture )
99123 {
@@ -151,7 +175,10 @@ public void AuthenticateWithAzurePowerShellCredential_PowerShellNotInstalled(
151175 {
152176 var testProcess = new TestProcess { Error = errorMessage } ;
153177 AzurePowerShellCredential credential = InstrumentClient (
154- new AzurePowerShellCredential ( new AzurePowerShellCredentialOptions ( ) , CredentialPipeline . GetInstance ( null ) , new TestProcessService ( testProcess ) ) ) ;
178+ new AzurePowerShellCredential ( new AzurePowerShellCredentialOptions ( ) , CredentialPipeline . GetInstance ( null ) , new TestProcessService ( testProcess ) )
179+ {
180+ UseLegacyPowerShell = true
181+ } ) ;
155182 var ex = Assert . ThrowsAsync < CredentialUnavailableException > ( async ( ) => await credential . GetTokenAsync ( new TokenRequestContext ( MockScopes . Default ) ) ) ;
156183 Assert . AreEqual ( AzurePowerShellCredential . PowerShellNotInstalledError , ex . Message ) ;
157184 }
0 commit comments