From 62ffcf74bee83574a9c23f0c52a28d529e684f63 Mon Sep 17 00:00:00 2001 From: maoyouaa <136690485+maoyouaa@users.noreply.github.com> Date: Mon, 10 Aug 2026 23:31:47 +0800 Subject: [PATCH] Fix Test Tool handling of missing start options --- .../f18b48b1-83b3-4d62-accf-4dbfa4373537.json | 11 ++++++++ .../Commands/RunCommand.cs | 4 +-- .../Models/Exceptions.cs | 8 ++++++ .../Commands/RunCommandTests.cs | 26 ++++++++++++++++++- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 .autover/changes/f18b48b1-83b3-4d62-accf-4dbfa4373537.json diff --git a/.autover/changes/f18b48b1-83b3-4d62-accf-4dbfa4373537.json b/.autover/changes/f18b48b1-83b3-4d62-accf-4dbfa4373537.json new file mode 100644 index 000000000..7a693b5a8 --- /dev/null +++ b/.autover/changes/f18b48b1-83b3-4d62-accf-4dbfa4373537.json @@ -0,0 +1,11 @@ +{ + "Projects": [ + { + "Name": "Amazon.Lambda.TestTool", + "Type": "Patch", + "ChangelogMessages": [ + "Report missing Test Tool startup options as a user error" + ] + } + ] +} 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 d4397b301..db173ae02 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/RunCommand.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Commands/RunCommand.cs @@ -42,8 +42,8 @@ public override async Task ExecuteAsync(CommandContext context, RunCommandS if (!settings.LambdaEmulatorPort.HasValue && !settings.ApiGatewayEmulatorPort.HasValue && !settings.ApiGatewayEmulatorHttpsPort.HasValue && string.IsNullOrEmpty(settings.SQSEventSourceConfig) && string.IsNullOrEmpty(settings.DynamoDBStreamsEventSourceConfig)) { - throw new ArgumentException("At least one of the following parameters must be set: " + - "--lambda-emulator-port, --api-gateway-emulator-port, --api-gateway-emulator-https-port, --sqs-eventsource-config or --dynamodbstreams-eventsource-config"); + throw new InvalidRunCommandSettingsException("At least one of the following parameters must be set: " + + "--lambda-emulator-port, --api-gateway-emulator-port, --api-gateway-emulator-https-port, --sqs-eventsource-config or --dynamodbstreams-eventsource-config"); } var tasks = new List(); diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Models/Exceptions.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Models/Exceptions.cs index 216d9eca8..668823135 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Models/Exceptions.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Models/Exceptions.cs @@ -11,6 +11,14 @@ namespace Amazon.Lambda.TestTool.Models; public abstract class TestToolException(string message, Exception? innerException = null) : Exception(message, innerException); +/// +/// Thrown if the run command settings are invalid. +/// +/// The message used in the exception. +/// The inner exception, if any. +public class InvalidRunCommandSettingsException(string message, Exception? innerException = null) + : TestToolException(message, innerException); + /// /// Thrown if the API Gateway Emulator mode was not provided, /// 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 5dcdf7934..9c7e55d75 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 @@ -21,6 +21,30 @@ public class RunCommandTests private readonly Mock _mockInteractiveService = new Mock(); private readonly Mock _mockRemainingArgs = new Mock(); + [Fact] + public async Task ExecuteAsync_NoEmulatorConfiguration_ReturnsUserError() + { + // Arrange + var cancellationSource = new CancellationTokenSource(); + var settings = new RunCommandSettings(); + var command = new RunCommand(_mockInteractiveService.Object, _mockEnvironmentManager.Object); + var context = new CommandContext(new List(), _mockRemainingArgs.Object, "run", null); + + // Act + var result = await command.ExecuteAsync(context, settings, cancellationSource); + + // Assert + Assert.Equal(CommandReturnCodes.UserError, result); + _mockInteractiveService.Verify( + service => service.WriteErrorLine(It.Is(message => + message != null && message.Contains("At least one of the following parameters must be set"))), + Times.Once); + _mockInteractiveService.Verify( + service => service.WriteErrorLine(It.Is(message => + message != null && message.Contains("This is a bug"))), + Times.Never); + } + [Fact] public async Task ExecuteAsync_LambdaRuntimeApi_SuccessfulLaunch() { @@ -54,7 +78,7 @@ public async Task ExecuteAsync_ApiGatewayEmulator_SuccessfulLaunch() cancellationSource.CancelAfter(5000); var lambdaPort = TestHelpers.GetNextLambdaRuntimePort(); var gatewayPort = TestHelpers.GetNextApiGatewayPort(); - var settings = new RunCommandSettings { LambdaEmulatorPort = lambdaPort, ApiGatewayEmulatorPort = gatewayPort, ApiGatewayEmulatorMode = ApiGatewayEmulatorMode.HttpV2, NoLaunchWindow = true}; + var settings = new RunCommandSettings { LambdaEmulatorPort = lambdaPort, ApiGatewayEmulatorPort = gatewayPort, 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__";