diff --git a/source/Calamari.Common/Features/Scripting/ScriptEngine.cs b/source/Calamari.Common/Features/Scripting/ScriptEngine.cs index 3d5232a2a0..8d97f75d75 100644 --- a/source/Calamari.Common/Features/Scripting/ScriptEngine.cs +++ b/source/Calamari.Common/Features/Scripting/ScriptEngine.cs @@ -7,7 +7,6 @@ using Calamari.Common.Features.Scripting.Python; using Calamari.Common.Features.Scripting.WindowsPowerShell; using Calamari.Common.Features.Scripts; -using Calamari.Common.FeatureToggles; using Calamari.Common.Plumbing.Extensions; using Calamari.Common.Plumbing.Logging; using Calamari.Common.Plumbing.Variables; @@ -18,11 +17,15 @@ public interface IScriptEngine { ScriptSyntax[] GetSupportedTypes(); + CommandResult Execute(Script script, + IVariables variables, + ICommandLineRunner commandLineRunner); + CommandResult Execute( Script script, IVariables variables, ICommandLineRunner commandLineRunner, - Dictionary? environmentVars = null); + Dictionary environmentVars); } public class ScriptEngine : IScriptEngine @@ -41,11 +44,13 @@ public ScriptSyntax[] GetSupportedTypes() return ScriptSyntaxHelper.GetPreferenceOrderedScriptSyntaxesForEnvironment(); } + public CommandResult Execute(Script script, IVariables variables, ICommandLineRunner commandLineRunner) => Execute(script, variables, commandLineRunner, []); + public CommandResult Execute( Script script, IVariables variables, ICommandLineRunner commandLineRunner, - Dictionary? environmentVars = null) + Dictionary environmentVars) { var syntax = script.File.ToScriptType(); return BuildWrapperChain(syntax, variables, commandLineRunner) diff --git a/source/Calamari.Tests/Fixtures/Integration/Scripting/ScriptEngineFixture.cs b/source/Calamari.Tests/Fixtures/Integration/Scripting/ScriptEngineFixture.cs index 9596bd02c9..cbcffa1bca 100644 --- a/source/Calamari.Tests/Fixtures/Integration/Scripting/ScriptEngineFixture.cs +++ b/source/Calamari.Tests/Fixtures/Integration/Scripting/ScriptEngineFixture.cs @@ -1,9 +1,10 @@ using System; using System.Collections.Generic; +using Calamari.Common.Features.Processes; using Calamari.Common.Features.Scripting; -using Calamari.Common.Features.Scripting.DotnetScript; using Calamari.Common.Features.Scripts; using Calamari.Common.Plumbing.Logging; +using Calamari.Common.Plumbing.Variables; using Calamari.Testing.Helpers; using FluentAssertions; using NSubstitute; @@ -30,6 +31,13 @@ public class ScriptEngineFixture ScriptSyntax.Bash }; + ICommandLineRunner runner; + public ScriptEngineFixture() + { + runner = Substitute.For(); + runner.Execute(Arg.Any()).Returns(new CommandResult("foo", 0)); + } + [Test] [Category(TestCategory.CompatibleOS.OnlyWindows)] public void DeterminesCorrectScriptTypePreferenceOrderWindows() @@ -44,6 +52,62 @@ public void DeterminesCorrectScriptTypePreferencesOrderNonWindows() DeterminesCorrectScriptTypePreferenceOrder(ScriptPreferencesNonWindows); } + [Test] + public void ExecuteWithoutEnvironmentVarsPassesEmptyDictionaryToWrappers() + { + Dictionary receivedEnvironmentVars = null; + var capturingWrapper = new CapturingScriptWrapper() + { + OnExecute = envVars => receivedEnvironmentVars = envVars + }; + + var engine = new ScriptEngine(new List { capturingWrapper }, Substitute.For()); + var variables = new CalamariVariables(); + + engine.Execute(new Script("test.ps1"), variables, runner); + + receivedEnvironmentVars.Should().NotBeNull(); + receivedEnvironmentVars.Should().BeEmpty(); + } + + [Test] + public void ExecuteWithEnvironmentVarsPassesDictionaryToWrappers() + { + Dictionary receivedEnvironmentVars = null; + var capturingWrapper = new CapturingScriptWrapper() + { + OnExecute = envVars => receivedEnvironmentVars = envVars + }; + + var engine = new ScriptEngine(new List { capturingWrapper }, Substitute.For()); + var variables = new CalamariVariables(); + var envVars = new Dictionary { { "AWS_REGION", "us-east-1" } }; + + engine.Execute(new Script("test.ps1"), variables, runner, envVars); + + receivedEnvironmentVars.Should().NotBeNull(); + receivedEnvironmentVars.Should().ContainKey("AWS_REGION"); + } + + /// + /// A wrapper that captures the environmentVars it receives, to verify they are never null. + /// + class CapturingScriptWrapper : IScriptWrapper + { + public Action> OnExecute { get; set; } + + public int Priority => ScriptWrapperPriorities.ToolConfigPriority; + public IScriptWrapper NextWrapper { get; set; } + + public bool IsEnabled(ScriptSyntax syntax) => true; + + public CommandResult ExecuteScript(Script script, ScriptSyntax scriptSyntax, ICommandLineRunner commandLineRunner, Dictionary environmentVars) + { + OnExecute?.Invoke(environmentVars); + return NextWrapper?.ExecuteScript(script, scriptSyntax, commandLineRunner, environmentVars) ?? new CommandResult("captured", 0); + } + } + void DeterminesCorrectScriptTypePreferenceOrder(IEnumerable expected) { var engine = new ScriptEngine(new List(), Substitute.For());