diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/RunCommand.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/RunCommand.cs index 34e776ada..2dd4395c7 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/RunCommand.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/RunCommand.cs @@ -30,30 +30,44 @@ public override async Task ExecuteAsync(CommandContext context, RunCommandS { EvaluateEnvironmentVariables(settings); - var tasks = new List(); + if (!settings.LambdaEmulatorPort.HasValue && !settings.ApiGatewayEmulatorPort.HasValue) + { + throw new ArgumentException("At least one of the following parameters must be set: " + + "--lambda-emulator-port or --api-gateway-emulator-port"); + } - var testToolProcess = TestToolProcess.Startup(settings, cancellationTokenSource.Token); - tasks.Add(testToolProcess.RunningTask); + var tasks = new List(); - if (!settings.NoLaunchWindow) + if (settings.LambdaEmulatorPort.HasValue) { - try + var testToolProcess = TestToolProcess.Startup(settings, cancellationTokenSource.Token); + tasks.Add(testToolProcess.RunningTask); + + if (!settings.NoLaunchWindow) { - var info = new ProcessStartInfo + try { - UseShellExecute = true, - FileName = testToolProcess.ServiceUrl - }; - Process.Start(info); - } - catch (Exception e) - { - toolInteractiveService.WriteErrorLine($"Error launching browser: {e.Message}"); + var info = new ProcessStartInfo + { + UseShellExecute = true, + FileName = testToolProcess.ServiceUrl + }; + Process.Start(info); + } + catch (Exception e) + { + toolInteractiveService.WriteErrorLine($"Error launching browser: {e.Message}"); + } } } - if (settings.ApiGatewayEmulatorMode is not null) + if (settings.ApiGatewayEmulatorPort.HasValue) { + if (settings.ApiGatewayEmulatorMode is null) + { + throw new ArgumentException("When --api-gateway-emulator-port is set the --api-gateway-mode must be set to configure the mode for the API Gateway emulator."); + } + var apiGatewayEmulatorProcess = ApiGatewayEmulatorProcess.Startup(settings, cancellationTokenSource.Token); tasks.Add(apiGatewayEmulatorProcess.RunningTask); diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/Settings/RunCommandSettings.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/Settings/RunCommandSettings.cs index 151cc6600..aac0bccb9 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/Settings/RunCommandSettings.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/Settings/RunCommandSettings.cs @@ -1,4 +1,4 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using Amazon.Lambda.TestTool.Models; @@ -23,12 +23,11 @@ public sealed class RunCommandSettings : CommandSettings public string LambdaEmulatorHost { get; set; } = Constants.DefaultLambdaEmulatorHost; /// - /// The port number used for the test tool's web interface. + /// The port number used for the test tool's web interface. If a port is specified the Lambda emulator will be started. /// [CommandOption("-p|--lambda-emulator-port ")] [Description("The port number used for the test tool's web interface.")] - [DefaultValue(Constants.DefaultLambdaEmulatorPort)] - public int LambdaEmulatorPort { get; set; } = Constants.DefaultLambdaEmulatorPort; + public int? LambdaEmulatorPort { get; set; } /// /// Disable auto launching the test tool's web interface in a browser. @@ -58,17 +57,16 @@ public sealed class RunCommandSettings : CommandSettings /// and how API Gateway interprets the response from Lambda. /// The available modes are: Rest, HttpV1, HttpV2. /// - [CommandOption("--api-gateway-emulator ")] + [CommandOption("--api-gateway-emulator-mode ")] [Description( "The API Gateway Emulator Mode specifies the format of the event that API Gateway sends to a Lambda integration, and how API Gateway interprets the response from Lambda. " + "The available modes are: Rest, HttpV1, HttpV2.")] public ApiGatewayEmulatorMode? ApiGatewayEmulatorMode { get; set; } /// - /// The port number used for the test tool's API Gateway emulator. + /// The port number used for the test tool's API Gateway emulator. If a port is specified the API Gateway emulator will be started. The --api-gateway-mode muse also be set when setting the API Gateway emulator port. /// [CommandOption("--api-gateway-emulator-port ")] [Description("The port number used for the test tool's API Gateway emulator.")] - [DefaultValue(Constants.DefaultApiGatewayEmulatorPort)] - public int? ApiGatewayEmulatorPort { get; set; } = Constants.DefaultApiGatewayEmulatorPort; + public int? ApiGatewayEmulatorPort { get; set; } } diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Components/Pages/Home.razor.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Components/Pages/Home.razor.cs index 4334e6505..8b6dae993 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Components/Pages/Home.razor.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Components/Pages/Home.razor.cs @@ -8,11 +8,14 @@ using Amazon.Lambda.TestTool.Services.IO; using BlazorMonaco.Editor; using Microsoft.JSInterop; +using Microsoft.AspNetCore.WebUtilities; namespace Amazon.Lambda.TestTool.Components.Pages; public partial class Home : ComponentBase, IDisposable { + [Inject] public required NavigationManager NavManager { get; set; } + [Inject] public required ILogger Logger { get; set; } [Inject] public required IHttpContextAccessor HttpContextAccessor { get; set; } [Inject] public required IRuntimeApiDataStoreManager DataStoreManager { get; set; } [Inject] public required IDirectoryManager DirectoryManager { get; set; } @@ -87,10 +90,38 @@ public partial class Home : ComponentBase, IDisposable protected override void OnInitialized() { - DataStore = DataStoreManager.GetLambdaRuntimeDataStore(LambdaRuntimeApi.DefaultFunctionName); + var uri = NavManager.ToAbsoluteUri(NavManager.Uri); + string initialFunction = string.Empty; + if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("function", out var queryValue)) + { + initialFunction = queryValue.ToString(); + } + + Logger.LogDebug("Query string variable for initial Lambda function set to: {initialFunction}", initialFunction); + _availableLambdaFunctions = DataStoreManager.GetListOfFunctionNames().ToList(); if (_availableLambdaFunctions.Count > 0) - SelectedFunctionName = _availableLambdaFunctions.First(); + { + if (!string.IsNullOrEmpty(initialFunction) && _availableLambdaFunctions.Contains(initialFunction)) + { + Logger.LogDebug("Query string function found in the list of available functions"); + SelectedFunctionName = initialFunction; + } + else + { + Logger.LogDebug("Query string function not found in the list of available functions"); + SelectedFunctionName = _availableLambdaFunctions.First(); + } + + DataStore = DataStoreManager.GetLambdaRuntimeDataStore(SelectedFunctionName); + } + else + { + Logger.LogDebug("No functions currently registered with the test tool so default to the default function datastore"); + DataStore = DataStoreManager.GetLambdaRuntimeDataStore(LambdaRuntimeApi.DefaultFunctionName); + } + + ThemeService.OnThemeChanged += HandleThemeChanged; DataStoreManager.StateChange += DataStoreManagerOnStateChange; SampleRequestManager = new SampleRequestManager(DirectoryManager.GetCurrentDirectory()); diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs index 6d0c31af5..11a940278 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs @@ -15,16 +15,6 @@ public abstract class Constants /// public const string ToolName = "dotnet-lambda-test-tool"; - /// - /// The default port used by the Lambda Test Tool for the Lambda Runtime API and the Web Interface. - /// - public const int DefaultLambdaEmulatorPort = 5050; - - /// - /// The default port used by the API Gateway Emulator. - /// - public const int DefaultApiGatewayEmulatorPort = 5051; - /// /// The default hostname used for the Lambda Test Tool. /// diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs index eb5b693a1..6cb5b76c8 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs @@ -245,7 +245,7 @@ private void StartTestToolProcess(ApiGatewayEmulatorMode apiGatewayMode, TestCon ""HttpMethod"": ""{config.HttpMethod}"", ""Path"": ""/{config.RouteName}"" }}"); - cancellationTokenSource.CancelAfter(5000); + cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(60)); var settings = new RunCommandSettings { LambdaEmulatorPort = lambdaPort, NoLaunchWindow = true, ApiGatewayEmulatorMode = apiGatewayMode,ApiGatewayEmulatorPort = apiGatewayPort}; var command = new RunCommand(_mockInteractiveService.Object, _mockEnvironmentManager.Object); var context = new CommandContext(new List(), _mockRemainingArgs.Object, "run", null); diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/RunCommandTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/RunCommandTests.cs index 5ef8a445b..427275aba 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/RunCommandTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/RunCommandTests.cs @@ -50,7 +50,7 @@ public async Task ExecuteAsync_ApiGatewayEmulator_SuccessfulLaunch() Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); var cancellationSource = new CancellationTokenSource(); cancellationSource.CancelAfter(5000); - var settings = new RunCommandSettings { LambdaEmulatorPort = 9002, ApiGatewayEmulatorMode = ApiGatewayEmulatorMode.HttpV2, NoLaunchWindow = true}; + var settings = new RunCommandSettings { LambdaEmulatorPort = 9002, ApiGatewayEmulatorPort = 9003, ApiGatewayEmulatorMode = ApiGatewayEmulatorMode.HttpV2, NoLaunchWindow = true}; var command = new RunCommand(_mockInteractiveService.Object, _mockEnvironmentManager.Object); var context = new CommandContext(new List(), _mockRemainingArgs.Object, "run", null); var apiUrl = $"http://{settings.LambdaEmulatorHost}:{settings.ApiGatewayEmulatorPort}/__lambda_test_tool_apigateway_health__"; diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/Settings/RunCommandSettingsTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/Settings/RunCommandSettingsTests.cs index 422c623fe..b10d1caaf 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/Settings/RunCommandSettingsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Commands/Settings/RunCommandSettingsTests.cs @@ -1,4 +1,4 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using Amazon.Lambda.TestTool.Commands.Settings; @@ -18,26 +18,6 @@ public void DefaultHost_IsSetToConstantsDefaultHost() Assert.Equal(Constants.DefaultLambdaEmulatorHost, settings.LambdaEmulatorHost); } - [Fact] - public void DefaultPort_IsSetToConstantsDefaultPort() - { - // Arrange - var settings = new RunCommandSettings(); - - // Assert - Assert.Equal(Constants.DefaultLambdaEmulatorPort, settings.LambdaEmulatorPort); - } - - [Fact] - public void ApiGatewayEmulatorPort_IsSetToConstantsDefaultApiGatewayEmulatorPort() - { - // Arrange - var settings = new RunCommandSettings(); - - // Assert - Assert.Equal(Constants.DefaultApiGatewayEmulatorPort, settings.ApiGatewayEmulatorPort); - } - [Fact] public void NoLaunchWindow_DefaultsToFalse() {