From ff92aab66598456506e05f0a55dd09b9451aff28 Mon Sep 17 00:00:00 2001 From: Phil Asmar Date: Wed, 22 Jan 2025 09:42:12 -0500 Subject: [PATCH 1/2] chore: fix errors in the test tool pipeline --- .autover/autover.json | 4 + .../Amazon.Lambda.TestTool.sln | 75 ++++++------ .../Amazon.Lambda.TestTool.slnx | 27 +++-- .../Amazon.Lambda.TestTool.csproj | 9 +- .../Processes/TestToolProcess.cs | 19 +++- .../Services/ConfigureStaticFilesOptions.cs | 35 ------ .../LambdaBinaryFunction/Function.cs | 0 .../LambdaBinaryFunction.csproj | 0 .../aws-lambda-tools-defaults.json | 0 .../LambdaReturnStringFunction/Function.cs | 0 .../LambdaReturnStringFunction.csproj | 0 .../aws-lambda-tools-defaults.json | 0 .../LambdaTestFunctionV1/Function.cs | 0 .../LambdaTestFunctionV1.csproj | 0 .../aws-lambda-tools-defaults.json | 0 .../LambdaTestFunctionV2/Function.cs | 0 .../LambdaTestFunctionV2.csproj | 0 .../aws-lambda-tools-defaults.json | 0 ...on.Lambda.TestTool.IntegrationTests.csproj | 34 +++--- .../ApiGatewayEmulatorProcessTests.cs | 27 +++-- .../ApiGatewayIntegrationTestCollection.cs | 2 + .../ApiGatewayIntegrationTestFixture.cs | 1 + ...atewayResponseExtensionsAdditionalTests.cs | 1 + .../ApiGatewayResponseExtensionsTests.cs | 4 +- .../Helpers/ApiGatewayTestHelper.cs | 1 + .../HttpContextExtensionsTests.cs | 5 +- ...nvokeResponseExtensionsIntegrationTests.cs | 1 + ...Amazon.Lambda.TestTool.Tests.Common.csproj | 18 +++ .../ApiGatewayResponseTestCases.cs | 107 +++++++++--------- .../HttpContextTestCases.cs | 3 +- .../Amazon.Lambda.TestTool.UnitTests.csproj | 16 +-- .../Commands/RunCommandTests.cs | 3 + .../Settings/RunCommandSettingsTests.cs | 1 + .../ApiGatewayResponseExtensionsTests.cs | 4 +- .../Extensions/HttpContextExtensionsTests.cs | 6 +- .../InvokeResponseExtensionsTests.cs | 1 + .../ApiGatewayEmulatorProcessTests.cs | 1 + .../RuntimeApiTests.cs | 4 + .../ApiGatewayRouteConfigServiceTests.cs | 1 + .../Utilities/HttpRequestUtilityTests.cs | 2 + 40 files changed, 228 insertions(+), 184 deletions(-) delete mode 100644 Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Services/ConfigureStaticFilesOptions.cs rename Tools/LambdaTestTool-v2/{tests/LambdaBinaryFunction/src => testapps}/LambdaBinaryFunction/Function.cs (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaBinaryFunction/src => testapps}/LambdaBinaryFunction/LambdaBinaryFunction.csproj (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaBinaryFunction/src => testapps}/LambdaBinaryFunction/aws-lambda-tools-defaults.json (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaReturnStringFunction/src => testapps}/LambdaReturnStringFunction/Function.cs (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaReturnStringFunction/src => testapps}/LambdaReturnStringFunction/LambdaReturnStringFunction.csproj (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaReturnStringFunction/src => testapps}/LambdaReturnStringFunction/aws-lambda-tools-defaults.json (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaTestFunctionV1/src => testapps}/LambdaTestFunctionV1/Function.cs (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaTestFunctionV1/src => testapps}/LambdaTestFunctionV1/LambdaTestFunctionV1.csproj (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaTestFunctionV1/src => testapps}/LambdaTestFunctionV1/aws-lambda-tools-defaults.json (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaTestFunctionV2/src => testapps}/LambdaTestFunctionV2/Function.cs (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaTestFunctionV2/src => testapps}/LambdaTestFunctionV2/LambdaTestFunctionV2.csproj (100%) rename Tools/LambdaTestTool-v2/{tests/LambdaTestFunctionV2/src => testapps}/LambdaTestFunctionV2/aws-lambda-tools-defaults.json (100%) create mode 100644 Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/Amazon.Lambda.TestTool.Tests.Common.csproj rename Tools/LambdaTestTool-v2/tests/{Amazon.Lambda.TestTool.UnitTests/Extensions => Amazon.Lambda.TestTool.Tests.Common}/ApiGatewayResponseTestCases.cs (89%) rename Tools/LambdaTestTool-v2/tests/{Amazon.Lambda.TestTool.UnitTests/Extensions => Amazon.Lambda.TestTool.Tests.Common}/HttpContextTestCases.cs (99%) diff --git a/.autover/autover.json b/.autover/autover.json index a5257a79d..b12651f8c 100644 --- a/.autover/autover.json +++ b/.autover/autover.json @@ -135,6 +135,10 @@ { "Name": "SnapshotRestore.Registry", "Path": "Libraries/src/SnapshotRestore.Registry/SnapshotRestore.Registry.csproj" + }, + { + "Name": "Amazon.Lambda.TestTool", + "Path": "Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj" } ], "UseCommitsForChangelog": false, diff --git a/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.sln b/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.sln index 1a73c3fb4..da704cc02 100644 --- a/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.sln +++ b/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.sln @@ -1,25 +1,26 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.12.35527.113 -MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.TestTool", "src\Amazon.Lambda.TestTool\Amazon.Lambda.TestTool.csproj", "{97EE2E8A-D1F4-CB11-B664-B99B036E9F7B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.TestTool.Tests.Common", "tests\Amazon.Lambda.TestTool.Tests.Common\Amazon.Lambda.TestTool.Tests.Common.csproj", "{E4D6D10C-C65F-E5E7-F865-FA931477FBCC}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.TestTool.UnitTests", "tests\Amazon.Lambda.TestTool.UnitTests\Amazon.Lambda.TestTool.UnitTests.csproj", "{80A4F809-28B7-61EC-6539-DF3C7A0733FD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.TestTool.IntegrationTests", "tests\Amazon.Lambda.TestTool.IntegrationTests\Amazon.Lambda.TestTool.IntegrationTests.csproj", "{5C1B3E1C-DFEA-425B-8ED2-BB43BAECC3CB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.TestTool.IntegrationTests", "tests\Amazon.Lambda.TestTool.IntegrationTests\Amazon.Lambda.TestTool.IntegrationTests.csproj", "{F7B6DF0E-EEB2-4B3F-47B7-49B188A2A216}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaTestFunctionV2", "testapps\LambdaTestFunctionV2\LambdaTestFunctionV2.csproj", "{803C76E6-8804-A4DF-8896-DDBC9FBEE8DD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaTestFunctionV2", "tests\LambdaTestFunctionV2\src\LambdaTestFunctionV2\LambdaTestFunctionV2.csproj", "{C446785B-BC47-4513-B37D-0C4976D6C396}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaBinaryFunction", "testapps\LambdaBinaryFunction\LambdaBinaryFunction.csproj", "{F625BA55-B999-6F5D-4DA1-9D4C77996D6A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaBinaryFunction", "tests\LambdaBinaryFunction\src\LambdaBinaryFunction\LambdaBinaryFunction.csproj", "{457F786A-1537-4003-8D9E-FAD0A8773437}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaReturnStringFunction", "testapps\LambdaReturnStringFunction\LambdaReturnStringFunction.csproj", "{54F64435-2082-3F4E-D3A8-B90BE58EF2EB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaReturnStringFunction", "tests\LambdaReturnStringFunction\src\LambdaReturnStringFunction\LambdaReturnStringFunction.csproj", "{FADCD9E4-A5C0-4127-AA1D-EFB9833DFF5D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaTestFunctionV1", "testapps\LambdaTestFunctionV1\LambdaTestFunctionV1.csproj", "{B532EEC5-2AA9-88BA-8D0B-46ECC392791A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambdaTestFunctionV1", "tests\LambdaTestFunctionV1\src\LambdaTestFunctionV1\LambdaTestFunctionV1.csproj", "{5B8A3222-1C8E-4796-B6C6-9EE1480CC920}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testapps", "testapps", "{4553EF99-1D3C-14C7-0D22-5364D18C373B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -31,41 +32,43 @@ Global {97EE2E8A-D1F4-CB11-B664-B99B036E9F7B}.Debug|Any CPU.Build.0 = Debug|Any CPU {97EE2E8A-D1F4-CB11-B664-B99B036E9F7B}.Release|Any CPU.ActiveCfg = Release|Any CPU {97EE2E8A-D1F4-CB11-B664-B99B036E9F7B}.Release|Any CPU.Build.0 = Release|Any CPU + {E4D6D10C-C65F-E5E7-F865-FA931477FBCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4D6D10C-C65F-E5E7-F865-FA931477FBCC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4D6D10C-C65F-E5E7-F865-FA931477FBCC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4D6D10C-C65F-E5E7-F865-FA931477FBCC}.Release|Any CPU.Build.0 = Release|Any CPU {80A4F809-28B7-61EC-6539-DF3C7A0733FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {80A4F809-28B7-61EC-6539-DF3C7A0733FD}.Debug|Any CPU.Build.0 = Debug|Any CPU {80A4F809-28B7-61EC-6539-DF3C7A0733FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {80A4F809-28B7-61EC-6539-DF3C7A0733FD}.Release|Any CPU.Build.0 = Release|Any CPU - {5C1B3E1C-DFEA-425B-8ED2-BB43BAECC3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5C1B3E1C-DFEA-425B-8ED2-BB43BAECC3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5C1B3E1C-DFEA-425B-8ED2-BB43BAECC3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5C1B3E1C-DFEA-425B-8ED2-BB43BAECC3CB}.Release|Any CPU.Build.0 = Release|Any CPU - {C446785B-BC47-4513-B37D-0C4976D6C396}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C446785B-BC47-4513-B37D-0C4976D6C396}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C446785B-BC47-4513-B37D-0C4976D6C396}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C446785B-BC47-4513-B37D-0C4976D6C396}.Release|Any CPU.Build.0 = Release|Any CPU - {457F786A-1537-4003-8D9E-FAD0A8773437}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {457F786A-1537-4003-8D9E-FAD0A8773437}.Debug|Any CPU.Build.0 = Debug|Any CPU - {457F786A-1537-4003-8D9E-FAD0A8773437}.Release|Any CPU.ActiveCfg = Release|Any CPU - {457F786A-1537-4003-8D9E-FAD0A8773437}.Release|Any CPU.Build.0 = Release|Any CPU - {FADCD9E4-A5C0-4127-AA1D-EFB9833DFF5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FADCD9E4-A5C0-4127-AA1D-EFB9833DFF5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FADCD9E4-A5C0-4127-AA1D-EFB9833DFF5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FADCD9E4-A5C0-4127-AA1D-EFB9833DFF5D}.Release|Any CPU.Build.0 = Release|Any CPU - {5B8A3222-1C8E-4796-B6C6-9EE1480CC920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5B8A3222-1C8E-4796-B6C6-9EE1480CC920}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5B8A3222-1C8E-4796-B6C6-9EE1480CC920}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5B8A3222-1C8E-4796-B6C6-9EE1480CC920}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE + {F7B6DF0E-EEB2-4B3F-47B7-49B188A2A216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7B6DF0E-EEB2-4B3F-47B7-49B188A2A216}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7B6DF0E-EEB2-4B3F-47B7-49B188A2A216}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7B6DF0E-EEB2-4B3F-47B7-49B188A2A216}.Release|Any CPU.Build.0 = Release|Any CPU + {803C76E6-8804-A4DF-8896-DDBC9FBEE8DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {803C76E6-8804-A4DF-8896-DDBC9FBEE8DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {803C76E6-8804-A4DF-8896-DDBC9FBEE8DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {803C76E6-8804-A4DF-8896-DDBC9FBEE8DD}.Release|Any CPU.Build.0 = Release|Any CPU + {F625BA55-B999-6F5D-4DA1-9D4C77996D6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F625BA55-B999-6F5D-4DA1-9D4C77996D6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F625BA55-B999-6F5D-4DA1-9D4C77996D6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F625BA55-B999-6F5D-4DA1-9D4C77996D6A}.Release|Any CPU.Build.0 = Release|Any CPU + {54F64435-2082-3F4E-D3A8-B90BE58EF2EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54F64435-2082-3F4E-D3A8-B90BE58EF2EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54F64435-2082-3F4E-D3A8-B90BE58EF2EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54F64435-2082-3F4E-D3A8-B90BE58EF2EB}.Release|Any CPU.Build.0 = Release|Any CPU + {B532EEC5-2AA9-88BA-8D0B-46ECC392791A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B532EEC5-2AA9-88BA-8D0B-46ECC392791A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B532EEC5-2AA9-88BA-8D0B-46ECC392791A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B532EEC5-2AA9-88BA-8D0B-46ECC392791A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {97EE2E8A-D1F4-CB11-B664-B99B036E9F7B} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {F625BA55-B999-6F5D-4DA1-9D4C77996D6A} = {4553EF99-1D3C-14C7-0D22-5364D18C373B} + {54F64435-2082-3F4E-D3A8-B90BE58EF2EB} = {4553EF99-1D3C-14C7-0D22-5364D18C373B} + {B532EEC5-2AA9-88BA-8D0B-46ECC392791A} = {4553EF99-1D3C-14C7-0D22-5364D18C373B} + {803C76E6-8804-A4DF-8896-DDBC9FBEE8DD} = {4553EF99-1D3C-14C7-0D22-5364D18C373B} + {F7B6DF0E-EEB2-4B3F-47B7-49B188A2A216} = {0AB3BF05-4346-4AA6-1389-037BE0695223} + {E4D6D10C-C65F-E5E7-F865-FA931477FBCC} = {0AB3BF05-4346-4AA6-1389-037BE0695223} {80A4F809-28B7-61EC-6539-DF3C7A0733FD} = {0AB3BF05-4346-4AA6-1389-037BE0695223} - {5C1B3E1C-DFEA-425B-8ED2-BB43BAECC3CB} = {0AB3BF05-4346-4AA6-1389-037BE0695223} - {C446785B-BC47-4513-B37D-0C4976D6C396} = {0AB3BF05-4346-4AA6-1389-037BE0695223} - {457F786A-1537-4003-8D9E-FAD0A8773437} = {0AB3BF05-4346-4AA6-1389-037BE0695223} - {FADCD9E4-A5C0-4127-AA1D-EFB9833DFF5D} = {0AB3BF05-4346-4AA6-1389-037BE0695223} - {5B8A3222-1C8E-4796-B6C6-9EE1480CC920} = {0AB3BF05-4346-4AA6-1389-037BE0695223} EndGlobalSection EndGlobal diff --git a/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.slnx b/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.slnx index 33ad6a6ea..5db12de26 100644 --- a/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.slnx +++ b/Tools/LambdaTestTool-v2/Amazon.Lambda.TestTool.slnx @@ -1,13 +1,16 @@ - - - - - - - - - - - - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj index 2cb3bdddc..20e6f53b6 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj @@ -1,4 +1,4 @@ - + A tool to help debug and test your .NET AWS Lambda functions locally. @@ -12,8 +12,14 @@ true true Amazon.Lambda.TestTool + lambda-test-tool + 0.0.1-beta.1 + + + + @@ -24,7 +30,6 @@ - diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Processes/TestToolProcess.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Processes/TestToolProcess.cs index 75762bbca..d3b93877b 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Processes/TestToolProcess.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Processes/TestToolProcess.cs @@ -5,6 +5,7 @@ using Amazon.Lambda.TestTool.Components; using Amazon.Lambda.TestTool.Services; using Amazon.Lambda.TestTool.Services.IO; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Options; namespace Amazon.Lambda.TestTool.Processes; @@ -46,7 +47,11 @@ public static TestToolProcess Startup(RunCommandSettings settings, CancellationT builder.Services.AddHttpContextAccessor(); - builder.Services.AddTransient, ConfigureStaticFilesOptions>(); + var wwwrootPath = Path.Combine(AppContext.BaseDirectory, "wwwroot"); + if (builder.Environment.IsProduction()) + { + builder.Services.AddSingleton(new PhysicalFileProvider(wwwrootPath)); + } builder.Services.AddSingleton(); var serviceUrl = $"http://{settings.Host}:{settings.Port}"; @@ -57,7 +62,17 @@ public static TestToolProcess Startup(RunCommandSettings settings, CancellationT app.UseDeveloperExceptionPage(); - app.UseStaticFiles(); + if (app.Environment.IsProduction()) + { + app.UseStaticFiles(new StaticFileOptions + { + FileProvider = new PhysicalFileProvider(wwwrootPath) + }); + } + else + { + app.UseStaticFiles(); + } app.UseAntiforgery(); app.MapRazorComponents() diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Services/ConfigureStaticFilesOptions.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Services/ConfigureStaticFilesOptions.cs deleted file mode 100644 index cb7394ed9..000000000 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Services/ConfigureStaticFilesOptions.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -using Microsoft.Extensions.FileProviders; -using Microsoft.Extensions.Options; - -namespace Amazon.Lambda.TestTool.Services; - -/// -/// Configures static file options for the application by setting up a composite file provider -/// that includes embedded resources from the assembly and the existing web root file provider. -/// -internal class ConfigureStaticFilesOptions(IWebHostEnvironment environment) - : IPostConfigureOptions -{ - /// - /// Configures the for the application. - /// - /// The name of the options instance being configured. - /// The options instance to configure. - /// Thrown when or is null. - public void PostConfigure(string? name, StaticFileOptions options) - { - name = name ?? throw new ArgumentNullException(nameof(name)); - options = options ?? throw new ArgumentNullException(nameof(options)); - - if (name != Options.DefaultName) - { - return; - } - - var fileProvider = new ManifestEmbeddedFileProvider(typeof(Program).Assembly, "wwwroot"); - environment.WebRootFileProvider = new CompositeFileProvider(fileProvider, environment.WebRootFileProvider); - } -} diff --git a/Tools/LambdaTestTool-v2/tests/LambdaBinaryFunction/src/LambdaBinaryFunction/Function.cs b/Tools/LambdaTestTool-v2/testapps/LambdaBinaryFunction/Function.cs similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaBinaryFunction/src/LambdaBinaryFunction/Function.cs rename to Tools/LambdaTestTool-v2/testapps/LambdaBinaryFunction/Function.cs diff --git a/Tools/LambdaTestTool-v2/tests/LambdaBinaryFunction/src/LambdaBinaryFunction/LambdaBinaryFunction.csproj b/Tools/LambdaTestTool-v2/testapps/LambdaBinaryFunction/LambdaBinaryFunction.csproj similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaBinaryFunction/src/LambdaBinaryFunction/LambdaBinaryFunction.csproj rename to Tools/LambdaTestTool-v2/testapps/LambdaBinaryFunction/LambdaBinaryFunction.csproj diff --git a/Tools/LambdaTestTool-v2/tests/LambdaBinaryFunction/src/LambdaBinaryFunction/aws-lambda-tools-defaults.json b/Tools/LambdaTestTool-v2/testapps/LambdaBinaryFunction/aws-lambda-tools-defaults.json similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaBinaryFunction/src/LambdaBinaryFunction/aws-lambda-tools-defaults.json rename to Tools/LambdaTestTool-v2/testapps/LambdaBinaryFunction/aws-lambda-tools-defaults.json diff --git a/Tools/LambdaTestTool-v2/tests/LambdaReturnStringFunction/src/LambdaReturnStringFunction/Function.cs b/Tools/LambdaTestTool-v2/testapps/LambdaReturnStringFunction/Function.cs similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaReturnStringFunction/src/LambdaReturnStringFunction/Function.cs rename to Tools/LambdaTestTool-v2/testapps/LambdaReturnStringFunction/Function.cs diff --git a/Tools/LambdaTestTool-v2/tests/LambdaReturnStringFunction/src/LambdaReturnStringFunction/LambdaReturnStringFunction.csproj b/Tools/LambdaTestTool-v2/testapps/LambdaReturnStringFunction/LambdaReturnStringFunction.csproj similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaReturnStringFunction/src/LambdaReturnStringFunction/LambdaReturnStringFunction.csproj rename to Tools/LambdaTestTool-v2/testapps/LambdaReturnStringFunction/LambdaReturnStringFunction.csproj diff --git a/Tools/LambdaTestTool-v2/tests/LambdaReturnStringFunction/src/LambdaReturnStringFunction/aws-lambda-tools-defaults.json b/Tools/LambdaTestTool-v2/testapps/LambdaReturnStringFunction/aws-lambda-tools-defaults.json similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaReturnStringFunction/src/LambdaReturnStringFunction/aws-lambda-tools-defaults.json rename to Tools/LambdaTestTool-v2/testapps/LambdaReturnStringFunction/aws-lambda-tools-defaults.json diff --git a/Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV1/src/LambdaTestFunctionV1/Function.cs b/Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV1/Function.cs similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV1/src/LambdaTestFunctionV1/Function.cs rename to Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV1/Function.cs diff --git a/Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV1/src/LambdaTestFunctionV1/LambdaTestFunctionV1.csproj b/Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV1/LambdaTestFunctionV1.csproj similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV1/src/LambdaTestFunctionV1/LambdaTestFunctionV1.csproj rename to Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV1/LambdaTestFunctionV1.csproj diff --git a/Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV1/src/LambdaTestFunctionV1/aws-lambda-tools-defaults.json b/Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV1/aws-lambda-tools-defaults.json similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV1/src/LambdaTestFunctionV1/aws-lambda-tools-defaults.json rename to Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV1/aws-lambda-tools-defaults.json diff --git a/Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV2/src/LambdaTestFunctionV2/Function.cs b/Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV2/Function.cs similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV2/src/LambdaTestFunctionV2/Function.cs rename to Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV2/Function.cs diff --git a/Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV2/src/LambdaTestFunctionV2/LambdaTestFunctionV2.csproj b/Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV2/LambdaTestFunctionV2.csproj similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV2/src/LambdaTestFunctionV2/LambdaTestFunctionV2.csproj rename to Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV2/LambdaTestFunctionV2.csproj diff --git a/Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV2/src/LambdaTestFunctionV2/aws-lambda-tools-defaults.json b/Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV2/aws-lambda-tools-defaults.json similarity index 100% rename from Tools/LambdaTestTool-v2/tests/LambdaTestFunctionV2/src/LambdaTestFunctionV2/aws-lambda-tools-defaults.json rename to Tools/LambdaTestTool-v2/testapps/LambdaTestFunctionV2/aws-lambda-tools-defaults.json diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj index 166c3d2fe..bf7be70bb 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj @@ -11,31 +11,31 @@ - - - - - - - + + + + + + + - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - - - + - - - - - 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 821f1e937..3002dbbe3 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs @@ -5,6 +5,7 @@ using System.Net; using System.Text; using Amazon.Lambda.TestTool.Models; +using Xunit; using Xunit.Abstractions; namespace Amazon.Lambda.TestTool.IntegrationTests; @@ -26,11 +27,11 @@ public ApiGatewayEmulatorProcessTests(ITestOutputHelper testOutputHelper) [Fact] public async Task TestLambdaToUpperV2() { - var testProjectDir = Path.GetFullPath("../../../../"); + var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { TestToolPath = Path.GetFullPath(Path.Combine(testProjectDir, "../src/Amazon.Lambda.TestTool")), - LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaTestFunctionV2/src/LambdaTestFunctionV2")), + LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaTestFunctionV2")), FunctionName = "LambdaTestFunctionV2", RouteName = "testfunction", HttpMethod = "Post" @@ -57,11 +58,11 @@ public async Task TestLambdaToUpperV2() [Fact] public async Task TestLambdaToUpperRest() { - var testProjectDir = Path.GetFullPath("../../../../"); + var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { TestToolPath = Path.GetFullPath(Path.Combine(testProjectDir, "../src/Amazon.Lambda.TestTool")), - LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaTestFunctionV1/src/LambdaTestFunctionV1")), + LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaTestFunctionV1")), FunctionName = "LambdaTestFunctionV1", RouteName = "testfunction", HttpMethod = "Post" @@ -88,11 +89,11 @@ public async Task TestLambdaToUpperRest() [Fact] public async Task TestLambdaToUpperV1() { - var testProjectDir = Path.GetFullPath("../../../../"); + var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { TestToolPath = Path.GetFullPath(Path.Combine(testProjectDir, "../src/Amazon.Lambda.TestTool")), - LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaTestFunctionV1/src/LambdaTestFunctionV1")), + LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaTestFunctionV1")), FunctionName = "LambdaTestFunctionV1", RouteName = "testfunction", HttpMethod = "Post" @@ -119,11 +120,11 @@ public async Task TestLambdaToUpperV1() [Fact] public async Task TestLambdaBinaryResponse() { - var testProjectDir = Path.GetFullPath("../../../../"); + var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { TestToolPath = Path.GetFullPath(Path.Combine(testProjectDir, "../src/Amazon.Lambda.TestTool")), - LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaBinaryFunction/src/LambdaBinaryFunction")), + LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaBinaryFunction")), FunctionName = "LambdaBinaryFunction", RouteName = "binaryfunction", HttpMethod = "Get" @@ -156,11 +157,11 @@ public async Task TestLambdaBinaryResponse() [Fact] public async Task TestLambdaReturnString() { - var testProjectDir = Path.GetFullPath("../../../../"); + var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { TestToolPath = Path.GetFullPath(Path.Combine(testProjectDir, "../src/Amazon.Lambda.TestTool")), - LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaReturnStringFunction/src/LambdaReturnStringFunction")), + LambdaPath = Path.GetFullPath(Path.Combine(testProjectDir, "LambdaReturnStringFunction")), FunctionName = "LambdaReturnStringFunction", RouteName = "stringfunction", HttpMethod = "Post" @@ -238,10 +239,14 @@ private async Task StartLambdaProcess(TestConfig config) throw new Exception($"Build failed: {buildResult.Output}\n{buildResult.Error}"); } + var publishFolder = Path.Combine(config.LambdaPath, "bin", "Release", "net8.0"); + var archFolders = Directory.GetDirectories(publishFolder, "*"); + var archFolder = Assert.Single(archFolders); + var startInfo = new ProcessStartInfo { FileName = "dotnet", - Arguments = Path.Combine("bin", "Release", "net8.0", "win-x64", "publish", $"{config.FunctionName}.dll"), + Arguments = Path.Combine(archFolder, "publish", $"{config.FunctionName}.dll"), WorkingDirectory = config.LambdaPath, UseShellExecute = false, RedirectStandardOutput = true, diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestCollection.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestCollection.cs index c7fd41d64..dc628d9b5 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestCollection.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestCollection.cs @@ -1,6 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +using Xunit; + namespace Amazon.Lambda.TestTool.IntegrationTests { [CollectionDefinition("ApiGateway Integration Tests")] diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestFixture.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestFixture.cs index 6a68c6861..fb6638527 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestFixture.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayIntegrationTestFixture.cs @@ -6,6 +6,7 @@ using Amazon.ApiGatewayV2; using Amazon.Lambda.TestTool.IntegrationTests.Helpers; using System.Reflection; +using Xunit; namespace Amazon.Lambda.TestTool.IntegrationTests { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsAdditionalTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsAdditionalTests.cs index 0cf7294e8..5779688b7 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsAdditionalTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsAdditionalTests.cs @@ -7,6 +7,7 @@ using Amazon.Lambda.TestTool.Extensions; using Amazon.Lambda.TestTool.Models; using System.Text; +using Xunit; namespace Amazon.Lambda.TestTool.IntegrationTests { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsTests.cs index 7877b240b..3defa21d0 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayResponseExtensionsTests.cs @@ -4,7 +4,9 @@ using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.TestTool.IntegrationTests.Helpers; using Amazon.Lambda.TestTool.Models; -using static ApiGatewayResponseTestCases; +using Amazon.Lambda.TestTool.Tests.Common; +using Xunit; +using static Amazon.Lambda.TestTool.Tests.Common.ApiGatewayResponseTestCases; namespace Amazon.Lambda.TestTool.IntegrationTests { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Helpers/ApiGatewayTestHelper.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Helpers/ApiGatewayTestHelper.cs index 6cee88a01..3237a5345 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Helpers/ApiGatewayTestHelper.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Helpers/ApiGatewayTestHelper.cs @@ -6,6 +6,7 @@ using Amazon.Lambda.TestTool.Extensions; using Amazon.Lambda.TestTool.Models; using Microsoft.AspNetCore.Http; +using Xunit; namespace Amazon.Lambda.TestTool.IntegrationTests.Helpers { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/HttpContextExtensionsTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/HttpContextExtensionsTests.cs index c38d577e9..480a9da74 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/HttpContextExtensionsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/HttpContextExtensionsTests.cs @@ -6,10 +6,11 @@ using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.TestTool.Extensions; using Amazon.Lambda.TestTool.Models; -using Amazon.Lambda.TestTool.UnitTests.Extensions; +using Amazon.Lambda.TestTool.Tests.Common; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -using static Amazon.Lambda.TestTool.UnitTests.Extensions.HttpContextTestCases; +using Xunit; +using static Amazon.Lambda.TestTool.Tests.Common.HttpContextTestCases; namespace Amazon.Lambda.TestTool.IntegrationTests { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/InvokeResponseExtensionsIntegrationTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/InvokeResponseExtensionsIntegrationTests.cs index 47f24f904..334965f05 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/InvokeResponseExtensionsIntegrationTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/InvokeResponseExtensionsIntegrationTests.cs @@ -6,6 +6,7 @@ using Amazon.Lambda.TestTool.Models; using System.Text; using System.Text.Json; +using Xunit; namespace Amazon.Lambda.TestTool.IntegrationTests; diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/Amazon.Lambda.TestTool.Tests.Common.csproj b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/Amazon.Lambda.TestTool.Tests.Common.csproj new file mode 100644 index 000000000..c270fa02b --- /dev/null +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/Amazon.Lambda.TestTool.Tests.Common.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseTestCases.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/ApiGatewayResponseTestCases.cs similarity index 89% rename from Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseTestCases.cs rename to Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/ApiGatewayResponseTestCases.cs index 1769d5c93..b5b62ede8 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseTestCases.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/ApiGatewayResponseTestCases.cs @@ -6,6 +6,9 @@ using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.TestTool.Models; using Microsoft.AspNetCore.Http; +using Xunit; + +namespace Amazon.Lambda.TestTool.Tests.Common; public static class ApiGatewayResponseTestCases { @@ -159,21 +162,21 @@ public static IEnumerable V1TestCases() { if (emulatorMode == ApiGatewayEmulatorMode.HttpV1) { - Assert.Equal("text/plain; charset=utf-8", response.ContentType); + Assert.Equal("text/plain; charset=utf-8", response.ContentType); } else { - Assert.Equal("application/json", response.ContentType); + Assert.Equal("application/json", response.ContentType); } }, IntegrationAssertions = async (response, emulatorMode) => { if (emulatorMode == ApiGatewayEmulatorMode.HttpV1) { - Assert.Equal("text/plain; charset=utf-8", response.Content.Headers.ContentType?.ToString()); - } + Assert.Equal("text/plain; charset=utf-8", response.Content.Headers.ContentType?.ToString()); + } else { - Assert.Equal("application/json", response.Content.Headers.ContentType?.ToString()); + Assert.Equal("application/json", response.Content.Headers.ContentType?.ToString()); } await Task.CompletedTask; } @@ -375,57 +378,57 @@ public static IEnumerable V1TestCases() }; yield return new object[] { - "V1_APIHeaders", - new ApiGatewayResponseTestCase - { - Response = new APIGatewayProxyResponse - { - StatusCode = 200, - Body = "Test body" - }, - Assertions = (response, emulatorMode) => + "V1_APIHeaders", + new ApiGatewayResponseTestCase { - Assert.True(response.Headers.ContainsKey("Date")); - - if (emulatorMode == ApiGatewayEmulatorMode.Rest) + Response = new APIGatewayProxyResponse { - Assert.True(response.Headers.ContainsKey("x-amzn-RequestId")); - Assert.True(response.Headers.ContainsKey("x-amz-apigw-id")); - Assert.True(response.Headers.ContainsKey("X-Amzn-Trace-Id")); - - Assert.Matches(@"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", response.Headers["x-amzn-RequestId"]); - Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers["x-amz-apigw-id"]); - Assert.Matches(@"^Root=1-[0-9a-f]{8}-[0-9a-f]{24};Parent=[0-9a-f]{16};Sampled=0;Lineage=1:[0-9a-f]{8}:0$", response.Headers["X-Amzn-Trace-Id"]); - } - else // HttpV1 or HttpV2 + StatusCode = 200, + Body = "Test body" + }, + Assertions = (response, emulatorMode) => { - Assert.True(response.Headers.ContainsKey("Apigw-Requestid")); - Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers["Apigw-Requestid"]); - } - }, - IntegrationAssertions = async (response, emulatorMode) => - { - Assert.True(response.Headers.Contains("Date")); + Assert.True(response.Headers.ContainsKey("Date")); - if (emulatorMode == ApiGatewayEmulatorMode.Rest) - { - Assert.True(response.Headers.Contains("x-amzn-RequestId")); - Assert.True(response.Headers.Contains("x-amz-apigw-id")); - Assert.True(response.Headers.Contains("X-Amzn-Trace-Id")); + if (emulatorMode == ApiGatewayEmulatorMode.Rest) + { + Assert.True(response.Headers.ContainsKey("x-amzn-RequestId")); + Assert.True(response.Headers.ContainsKey("x-amz-apigw-id")); + Assert.True(response.Headers.ContainsKey("X-Amzn-Trace-Id")); - Assert.Matches(@"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", response.Headers.GetValues("x-amzn-RequestId").First()); - Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers.GetValues("x-amz-apigw-id").First()); - Assert.Matches(@"^Root=1-[0-9a-f]{8}-[0-9a-f]{24};Parent=[0-9a-f]{16};Sampled=0;Lineage=1:[0-9a-f]{8}:0$", response.Headers.GetValues("X-Amzn-Trace-Id").First()); - } - else // HttpV1 or HttpV2 + Assert.Matches(@"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", response.Headers["x-amzn-RequestId"]); + Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers["x-amz-apigw-id"]); + Assert.Matches(@"^Root=1-[0-9a-f]{8}-[0-9a-f]{24};Parent=[0-9a-f]{16};Sampled=0;Lineage=1:[0-9a-f]{8}:0$", response.Headers["X-Amzn-Trace-Id"]); + } + else // HttpV1 or HttpV2 + { + Assert.True(response.Headers.ContainsKey("Apigw-Requestid")); + Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers["Apigw-Requestid"]); + } + }, + IntegrationAssertions = async (response, emulatorMode) => { - Assert.True(response.Headers.Contains("Apigw-Requestid")); - Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers.GetValues("Apigw-Requestid").First()); - } + Assert.True(response.Headers.Contains("Date")); + + if (emulatorMode == ApiGatewayEmulatorMode.Rest) + { + Assert.True(response.Headers.Contains("x-amzn-RequestId")); + Assert.True(response.Headers.Contains("x-amz-apigw-id")); + Assert.True(response.Headers.Contains("X-Amzn-Trace-Id")); - await Task.CompletedTask; + Assert.Matches(@"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", response.Headers.GetValues("x-amzn-RequestId").First()); + Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers.GetValues("x-amz-apigw-id").First()); + Assert.Matches(@"^Root=1-[0-9a-f]{8}-[0-9a-f]{24};Parent=[0-9a-f]{16};Sampled=0;Lineage=1:[0-9a-f]{8}:0$", response.Headers.GetValues("X-Amzn-Trace-Id").First()); + } + else // HttpV1 or HttpV2 + { + Assert.True(response.Headers.Contains("Apigw-Requestid")); + Assert.Matches(@"^[A-Za-z0-9_\-]{15}=$", response.Headers.GetValues("Apigw-Requestid").First()); + } + + await Task.CompletedTask; + } } - } }; } @@ -555,7 +558,7 @@ public static IEnumerable V2TestCases() }; yield return new object[] -{ + { "V2_SetsBodyNonBase64", new ApiGatewayResponseTestCase { @@ -575,7 +578,7 @@ public static IEnumerable V2TestCases() Assert.Equal("{\"message\":\"Hello, API Gateway v2!\"}", content); } } -}; + }; yield return new object[] { @@ -685,7 +688,7 @@ public static IEnumerable V2TestCases() }; yield return new object[] - { + { "V2_HttpAPIHeaders", new ApiGatewayResponseTestCase { @@ -710,7 +713,7 @@ public static IEnumerable V2TestCases() await Task.CompletedTask; } } - }; + }; } diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextTestCases.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs similarity index 99% rename from Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextTestCases.cs rename to Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs index 48df9d94b..22b20a93e 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextTestCases.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs @@ -6,8 +6,9 @@ using Amazon.Lambda.TestTool.Models; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; +using Xunit; -namespace Amazon.Lambda.TestTool.UnitTests.Extensions +namespace Amazon.Lambda.TestTool.Tests.Common { public static class HttpContextTestCases { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Amazon.Lambda.TestTool.UnitTests.csproj b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Amazon.Lambda.TestTool.UnitTests.csproj index 44357bfd5..4f385b6b0 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Amazon.Lambda.TestTool.UnitTests.csproj +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Amazon.Lambda.TestTool.UnitTests.csproj @@ -12,27 +12,23 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + 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 000709236..7cd3703e7 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 @@ -8,6 +8,7 @@ using Spectre.Console.Cli; using Moq; using Amazon.Lambda.TestTool.UnitTests.Helpers; +using Xunit; namespace Amazon.Lambda.TestTool.UnitTests.Commands; @@ -20,6 +21,7 @@ public class RunCommandTests public async Task ExecuteAsync_LambdaRuntimeApi_SuccessfulLaunch() { // Arrange + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); var cancellationSource = new CancellationTokenSource(); cancellationSource.CancelAfter(5000); var settings = new RunCommandSettings { Port = 9001, NoLaunchWindow = true }; @@ -42,6 +44,7 @@ public async Task ExecuteAsync_LambdaRuntimeApi_SuccessfulLaunch() public async Task ExecuteAsync_ApiGatewayEmulator_SuccessfulLaunch() { // Arrange + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); var cancellationSource = new CancellationTokenSource(); cancellationSource.CancelAfter(5000); var settings = new RunCommandSettings { Port = 9002, ApiGatewayEmulatorMode = ApiGatewayEmulatorMode.HttpV2, NoLaunchWindow = true}; 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 f4502ae5e..64036ed36 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 @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 using Amazon.Lambda.TestTool.Commands.Settings; +using Xunit; namespace Amazon.Lambda.TestTool.UnitTests.Commands.Settings; diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseExtensionsTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseExtensionsTests.cs index bbbd14944..7611995ba 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseExtensionsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/ApiGatewayResponseExtensionsTests.cs @@ -5,8 +5,10 @@ using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.TestTool.Extensions; using Amazon.Lambda.TestTool.Models; +using Amazon.Lambda.TestTool.Tests.Common; using Microsoft.AspNetCore.Http; -using static ApiGatewayResponseTestCases; +using Xunit; +using static Amazon.Lambda.TestTool.Tests.Common.ApiGatewayResponseTestCases; namespace Amazon.Lambda.TestTool.UnitTests.Extensions { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextExtensionsTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextExtensionsTests.cs index b925ea402..27e6cf896 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextExtensionsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/HttpContextExtensionsTests.cs @@ -3,10 +3,12 @@ using Amazon.Lambda.TestTool.Extensions; using Amazon.Lambda.TestTool.Models; +using Amazon.Lambda.TestTool.Tests.Common; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Primitives; -using static Amazon.Lambda.TestTool.UnitTests.Extensions.HttpContextTestCases; +using Xunit; +using static Amazon.Lambda.TestTool.Tests.Common.HttpContextTestCases; namespace Amazon.Lambda.TestTool.UnitTests.Extensions { @@ -126,7 +128,7 @@ public async Task ToApiGateway_MultiValueHeader(ApiGatewayEmulatorMode emulatorM Assert.Equal(["text/html", "application/json"], result.MultiValueHeaders["accept"]); } - + [Fact] public async Task ToApiGatewayHttpV1_EncodedAndUnicodeHeader() { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/InvokeResponseExtensionsTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/InvokeResponseExtensionsTests.cs index 89c96f26a..d122646a2 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/InvokeResponseExtensionsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Extensions/InvokeResponseExtensionsTests.cs @@ -4,6 +4,7 @@ using System.Text; using Amazon.Lambda.Model; using Amazon.Lambda.TestTool.Models; +using Xunit; namespace Amazon.Lambda.TestTool.UnitTests.Extensions; diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Processes/ApiGatewayEmulatorProcessTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Processes/ApiGatewayEmulatorProcessTests.cs index 55cb7a6ef..bde8c3f69 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Processes/ApiGatewayEmulatorProcessTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Processes/ApiGatewayEmulatorProcessTests.cs @@ -6,6 +6,7 @@ using Amazon.Lambda.TestTool.Models; using Amazon.Lambda.TestTool.Processes; using Amazon.Lambda.TestTool.UnitTests.Helpers; +using Xunit; namespace Amazon.Lambda.TestTool.UnitTests.Processes; diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/RuntimeApiTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/RuntimeApiTests.cs index 8befe6e0d..67180f6ff 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/RuntimeApiTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/RuntimeApiTests.cs @@ -10,6 +10,8 @@ using Amazon.Lambda.TestTool.Processes; using Amazon.Lambda.TestTool.Commands.Settings; using Microsoft.Extensions.DependencyInjection; +using Xunit; +using Environment = System.Environment; namespace Amazon.Lambda.TestTool.UnitTests; @@ -23,6 +25,7 @@ public async Task AddEventToDataStore() var cancellationTokenSource = new CancellationTokenSource(); var options = new RunCommandSettings(); options.Port = 9000; + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); var testToolProcess = TestToolProcess.Startup(options, cancellationTokenSource.Token); try { @@ -72,6 +75,7 @@ public async Task InvokeRequestResponse() var cancellationTokenSource = new CancellationTokenSource(); var options = new RunCommandSettings(); options.Port = 9001; + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); var testToolProcess = TestToolProcess.Startup(options, cancellationTokenSource.Token); try { diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Services/ApiGatewayRouteConfigServiceTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Services/ApiGatewayRouteConfigServiceTests.cs index ac0f0f049..a0cdb8cbb 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Services/ApiGatewayRouteConfigServiceTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Services/ApiGatewayRouteConfigServiceTests.cs @@ -7,6 +7,7 @@ using Amazon.Lambda.TestTool.Services.IO; using Microsoft.Extensions.Logging; using Moq; +using Xunit; namespace Amazon.Lambda.TestTool.UnitTests.Services; diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Utilities/HttpRequestUtilityTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Utilities/HttpRequestUtilityTests.cs index 192475e77..dbd43d47a 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Utilities/HttpRequestUtilityTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/Utilities/HttpRequestUtilityTests.cs @@ -1,6 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +using Xunit; + namespace Amazon.Lambda.TestTool.UnitTests.Utilities; using System.Collections.Generic; From 2a6d7504ca927de1ff0ee74b6aef73a6cdce4cbc Mon Sep 17 00:00:00 2001 From: Phil Asmar Date: Fri, 24 Jan 2025 10:21:00 -0500 Subject: [PATCH 2/2] fix integration tests and updated tool name --- .../Amazon.Lambda.TestTool.csproj | 2 +- .../src/Amazon.Lambda.TestTool/Constants.cs | 2 +- ...on.Lambda.TestTool.IntegrationTests.csproj | 1 + .../ApiGatewayEmulatorProcessTests.cs | 122 +++++++++++------- 4 files changed, 75 insertions(+), 52 deletions(-) diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj index 20e6f53b6..ff52f18f8 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj @@ -12,7 +12,7 @@ true true Amazon.Lambda.TestTool - lambda-test-tool + dotnet-lambda-test-tool 0.0.1-beta.1 diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs index a3651d0b9..93ff8ed2b 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Constants.cs @@ -13,7 +13,7 @@ public abstract class Constants /// /// The name of the dotnet CLI tool /// - public const string ToolName = "lambda-test-tool"; + 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. diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj index bf7be70bb..bd9f4df17 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/Amazon.Lambda.TestTool.IntegrationTests.csproj @@ -18,6 +18,7 @@ + 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 3002dbbe3..8523e8ff5 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/ApiGatewayEmulatorProcessTests.cs @@ -4,7 +4,12 @@ using System.Diagnostics; using System.Net; using System.Text; +using Amazon.Lambda.TestTool.Commands; +using Amazon.Lambda.TestTool.Commands.Settings; using Amazon.Lambda.TestTool.Models; +using Amazon.Lambda.TestTool.Services; +using Moq; +using Spectre.Console.Cli; using Xunit; using Xunit.Abstractions; @@ -12,13 +17,11 @@ namespace Amazon.Lambda.TestTool.IntegrationTests; public class ApiGatewayEmulatorProcessTests : IAsyncDisposable { + private readonly Mock _mockInteractiveService = new Mock(); + private readonly Mock _mockRemainingArgs = new Mock(); private readonly ITestOutputHelper _testOutputHelper; - private Process? _mainProcess; private Process? _lambdaProcess; - private const string ApiGatewayPort = "5051"; - private const string LambdaPort = "5050"; - public ApiGatewayEmulatorProcessTests(ITestOutputHelper testOutputHelper) { _testOutputHelper = testOutputHelper; @@ -27,6 +30,8 @@ public ApiGatewayEmulatorProcessTests(ITestOutputHelper testOutputHelper) [Fact] public async Task TestLambdaToUpperV2() { + var lambdaPort = 6012; + var apiGatewayPort = 6013; var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { @@ -37,13 +42,15 @@ public async Task TestLambdaToUpperV2() HttpMethod = "Post" }; + var cancellationTokenSource = new CancellationTokenSource(); + try { - await StartTestToolProcess(ApiGatewayEmulatorMode.HttpV2, config); - await WaitForGatewayHealthCheck(); - await StartLambdaProcess(config); + StartTestToolProcess(ApiGatewayEmulatorMode.HttpV2, config, lambdaPort, apiGatewayPort, cancellationTokenSource); + await WaitForGatewayHealthCheck(apiGatewayPort); + await StartLambdaProcess(config, lambdaPort); - var response = await TestEndpoint(config); + var response = await TestEndpoint(config, apiGatewayPort); var responseContent = await response.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -51,6 +58,7 @@ public async Task TestLambdaToUpperV2() } finally { + await cancellationTokenSource.CancelAsync(); await CleanupProcesses(); } } @@ -58,6 +66,8 @@ public async Task TestLambdaToUpperV2() [Fact] public async Task TestLambdaToUpperRest() { + var lambdaPort = 6010; + var apiGatewayPort = 6011; var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { @@ -68,13 +78,15 @@ public async Task TestLambdaToUpperRest() HttpMethod = "Post" }; + var cancellationTokenSource = new CancellationTokenSource(); + try { - await StartTestToolProcess(ApiGatewayEmulatorMode.Rest, config); - await WaitForGatewayHealthCheck(); - await StartLambdaProcess(config); + StartTestToolProcess(ApiGatewayEmulatorMode.Rest, config, lambdaPort, apiGatewayPort, cancellationTokenSource); + await WaitForGatewayHealthCheck(apiGatewayPort); + await StartLambdaProcess(config, lambdaPort); - var response = await TestEndpoint(config); + var response = await TestEndpoint(config, apiGatewayPort); var responseContent = await response.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -82,6 +94,7 @@ public async Task TestLambdaToUpperRest() } finally { + await cancellationTokenSource.CancelAsync(); await CleanupProcesses(); } } @@ -89,6 +102,8 @@ public async Task TestLambdaToUpperRest() [Fact] public async Task TestLambdaToUpperV1() { + var lambdaPort = 6008; + var apiGatewayPort = 6009; var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { @@ -99,13 +114,15 @@ public async Task TestLambdaToUpperV1() HttpMethod = "Post" }; + var cancellationTokenSource = new CancellationTokenSource(); + try { - await StartTestToolProcess(ApiGatewayEmulatorMode.HttpV1, config); - await WaitForGatewayHealthCheck(); - await StartLambdaProcess(config); + StartTestToolProcess(ApiGatewayEmulatorMode.HttpV1, config, lambdaPort, apiGatewayPort, cancellationTokenSource); + await WaitForGatewayHealthCheck(apiGatewayPort); + await StartLambdaProcess(config, lambdaPort); - var response = await TestEndpoint(config); + var response = await TestEndpoint(config, apiGatewayPort); var responseContent = await response.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -113,6 +130,7 @@ public async Task TestLambdaToUpperV1() } finally { + await cancellationTokenSource.CancelAsync(); await CleanupProcesses(); } } @@ -120,6 +138,8 @@ public async Task TestLambdaToUpperV1() [Fact] public async Task TestLambdaBinaryResponse() { + var lambdaPort = 6006; + var apiGatewayPort = 6007; var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { @@ -130,13 +150,15 @@ public async Task TestLambdaBinaryResponse() HttpMethod = "Get" }; + var cancellationTokenSource = new CancellationTokenSource(); + try { - await StartTestToolProcess(ApiGatewayEmulatorMode.HttpV2, config); - await WaitForGatewayHealthCheck(); - await StartLambdaProcess(config); + StartTestToolProcess(ApiGatewayEmulatorMode.HttpV2, config, lambdaPort, apiGatewayPort, cancellationTokenSource); + await WaitForGatewayHealthCheck(apiGatewayPort); + await StartLambdaProcess(config, lambdaPort); - var response = await TestEndpoint(config); + var response = await TestEndpoint(config, apiGatewayPort); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal("application/octet-stream", response.Content.Headers.ContentType?.MediaType); @@ -150,6 +172,7 @@ public async Task TestLambdaBinaryResponse() } finally { + await cancellationTokenSource.CancelAsync(); await CleanupProcesses(); } } @@ -157,6 +180,8 @@ public async Task TestLambdaBinaryResponse() [Fact] public async Task TestLambdaReturnString() { + var lambdaPort = 6004; + var apiGatewayPort = 6005; var testProjectDir = Path.GetFullPath("../../../../../testapps"); var config = new TestConfig { @@ -167,13 +192,15 @@ public async Task TestLambdaReturnString() HttpMethod = "Post" }; + var cancellationTokenSource = new CancellationTokenSource(); + try { - await StartTestToolProcess(ApiGatewayEmulatorMode.HttpV2, config); - await WaitForGatewayHealthCheck(); - await StartLambdaProcess(config); + StartTestToolProcess(ApiGatewayEmulatorMode.HttpV2, config, lambdaPort, apiGatewayPort, cancellationTokenSource); + await WaitForGatewayHealthCheck(apiGatewayPort); + await StartLambdaProcess(config, lambdaPort); - var response = await TestEndpoint(config); + var response = await TestEndpoint(config, apiGatewayPort); var responseContent = await response.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -181,6 +208,7 @@ public async Task TestLambdaReturnString() } finally { + await cancellationTokenSource.CancelAsync(); await CleanupProcesses(); } } @@ -194,43 +222,37 @@ private record TestConfig public required string HttpMethod { get; init; } } - private async Task TestEndpoint(TestConfig config, HttpContent? content = null) + private async Task TestEndpoint(TestConfig config, int apiGatewayPort, HttpContent? content = null) { using var client = new HttpClient(); return config.HttpMethod.ToUpper() switch { - "POST" => await client.PostAsync($"http://localhost:{ApiGatewayPort}/{config.RouteName}", + "POST" => await client.PostAsync($"http://localhost:{apiGatewayPort}/{config.RouteName}", content ?? new StringContent("hello world", Encoding.UTF8, "text/plain")), - "GET" => await client.GetAsync($"http://localhost:{ApiGatewayPort}/{config.RouteName}"), + "GET" => await client.GetAsync($"http://localhost:{apiGatewayPort}/{config.RouteName}"), _ => throw new ArgumentException($"Unsupported HTTP method: {config.HttpMethod}") }; } - private async Task StartTestToolProcess(ApiGatewayEmulatorMode apiGatewayMode, TestConfig config) + private void StartTestToolProcess(ApiGatewayEmulatorMode apiGatewayMode, TestConfig config, int lambdaPort, int apiGatewayPort, CancellationTokenSource cancellationTokenSource) { - var startInfo = new ProcessStartInfo - { - FileName = "dotnet", - Arguments = $"run --project \"{config.TestToolPath}\" -- --api-gateway-emulator {apiGatewayMode} --no-launch-window", - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true - }; - - startInfo.EnvironmentVariables["ASPNETCORE_ENVIRONMENT"] = "Development"; - startInfo.EnvironmentVariables["APIGATEWAY_EMULATOR_ROUTE_CONFIG"] = $@"{{ + Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development"); + Environment.SetEnvironmentVariable("APIGATEWAY_EMULATOR_ROUTE_CONFIG", $@"{{ ""LambdaResourceName"": ""{config.RouteName}"", - ""Endpoint"": ""http://localhost:{LambdaPort}"", + ""Endpoint"": ""http://localhost:{lambdaPort}"", ""HttpMethod"": ""{config.HttpMethod}"", ""Path"": ""/{config.RouteName}"" - }}"; - - _mainProcess = Process.Start(startInfo) ?? throw new Exception("Failed to start test tool process"); - ConfigureProcessLogging(_mainProcess, "TestTool"); + }}"); + cancellationTokenSource.CancelAfter(5000); + var settings = new RunCommandSettings { Port = lambdaPort, NoLaunchWindow = true, ApiGatewayEmulatorMode = apiGatewayMode,ApiGatewayEmulatorPort = apiGatewayPort}; + var command = new RunCommand(_mockInteractiveService.Object); + var context = new CommandContext(new List(), _mockRemainingArgs.Object, "run", null); + + // Act + _ = command.ExecuteAsync(context, settings, cancellationTokenSource); } - private async Task StartLambdaProcess(TestConfig config) + private async Task StartLambdaProcess(TestConfig config, int lambdaPort) { // Build the project var buildResult = await RunProcess("dotnet", "publish -c Release", config.LambdaPath); @@ -254,7 +276,7 @@ private async Task StartLambdaProcess(TestConfig config) CreateNoWindow = true }; - startInfo.EnvironmentVariables["AWS_LAMBDA_RUNTIME_API"] = $"localhost:{LambdaPort}/{config.RouteName}"; + startInfo.EnvironmentVariables["AWS_LAMBDA_RUNTIME_API"] = $"localhost:{lambdaPort}/{config.RouteName}"; startInfo.EnvironmentVariables["LAMBDA_TASK_ROOT"] = config.LambdaPath; startInfo.EnvironmentVariables["AWS_LAMBDA_FUNCTION_MEMORY_SIZE"] = "256"; startInfo.EnvironmentVariables["AWS_LAMBDA_FUNCTION_TIMEOUT"] = "30"; @@ -308,12 +330,12 @@ private void ConfigureProcessLogging(Process process, string prefix) return (process.ExitCode, output.ToString(), error.ToString()); } - private async Task WaitForGatewayHealthCheck() + private async Task WaitForGatewayHealthCheck(int apiGatewayPort) { using var client = new HttpClient(); var startTime = DateTime.UtcNow; var timeout = TimeSpan.FromSeconds(10); - var healthUrl = $"http://localhost:{ApiGatewayPort}/__lambda_test_tool_apigateway_health__"; + var healthUrl = $"http://localhost:{apiGatewayPort}/__lambda_test_tool_apigateway_health__"; while (DateTime.UtcNow - startTime < timeout) { @@ -342,7 +364,7 @@ private void LogMessage(string message) private async Task CleanupProcesses() { - var processes = new[] { _mainProcess, _lambdaProcess }; + var processes = new[] { _lambdaProcess }; foreach (var process in processes.Where(p => p != null && !p.HasExited)) { try