From 1faf4f6f3b072f04cf896475e08172bdd4d7afd5 Mon Sep 17 00:00:00 2001 From: Garrett Beatty Date: Tue, 28 Jan 2025 11:28:14 -0500 Subject: [PATCH 1/2] fix dotnet pack command to run on linux too --- .../Amazon.Lambda.TestTool/Amazon.Lambda.TestTool.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 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 8f8b4afbf..bd40c2955 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 @@ -31,7 +31,7 @@ - + @@ -44,10 +44,10 @@ Condition="'%(Identity)' != 'netstandard2.0'" /> - + - + true content\Amazon.Lambda.RuntimeSupport\%(TargetFrameworks.Identity) From 0c16dfc7c2501ac4ed9720ba771b3ce5384f7b45 Mon Sep 17 00:00:00 2001 From: Garrett Beatty Date: Thu, 23 Jan 2025 16:25:23 -0500 Subject: [PATCH 2/2] Fix compiler warnings --- .../Utilities/HttpRequestUtility.cs | 4 +- .../HttpContextExtensionsTests.cs | 56 +++++++++++-------- .../HttpContextTestCases.cs | 6 +- .../PackagingTests.cs | 8 +-- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Utilities/HttpRequestUtility.cs b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Utilities/HttpRequestUtility.cs index fce9494cc..d498d76f1 100644 --- a/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Utilities/HttpRequestUtility.cs +++ b/Tools/LambdaTestTool-v2/src/Amazon.Lambda.TestTool/Utilities/HttpRequestUtility.cs @@ -93,7 +93,7 @@ public static bool IsBinaryContent(string? contentType) /// Accept: text/html /// Accept: application/xhtml+xml /// X-Custom-Header: value1 - /// + /// /// The method will return: /// singleValueHeaders: { "Accept": "application/xhtml+xml", "X-Custom-Header": "value1" } /// multiValueHeaders: { "Accept": ["text/html", "application/xhtml+xml"], "X-Custom-Header": ["value1"] } @@ -120,7 +120,7 @@ public static (IDictionary, IDictionary>) /// A tuple containing single-value and multi-value query parameter dictionaries. /// /// For query string: ?param1=value1&param2=value2&param2=value3 - /// + /// /// The method will return: /// singleValueParams: { "param1": "value1", "param2": "value3" } /// multiValueParams: { "param1": ["value1"], "param2": ["value2", "value3"] } 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 480a9da74..34f1b39ac 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/HttpContextExtensionsTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.IntegrationTests/HttpContextExtensionsTests.cs @@ -1,6 +1,7 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +using System.Diagnostics; using System.Net; using System.Text.Json; using Amazon.Lambda.APIGatewayEvents; @@ -80,12 +81,13 @@ public async Task BinaryContentHttpV1() ApiGatewayRouteConfig = config, Assertions = (actualRequest, emulatorMode) => { + Assert.NotNull(actualRequest); var typedRequest = (APIGatewayProxyRequest)actualRequest; - Assert.True(typedRequest.IsBase64Encoded); - Assert.Equal(Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5 }), typedRequest.Body); - Assert.Equal("123", typedRequest.PathParameters["userId"]); - Assert.Equal("/test3/api/users/{userId}/avatar", typedRequest.Resource); - Assert.Equal("POST", typedRequest.HttpMethod); + Assert.True(typedRequest?.IsBase64Encoded); + Assert.Equal(Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5 }), typedRequest?.Body); + Assert.Equal("123", typedRequest?.PathParameters["userId"]); + Assert.Equal("/test3/api/users/{userId}/avatar", typedRequest?.Resource); + Assert.Equal("POST", typedRequest?.HttpMethod); } }; @@ -123,12 +125,13 @@ public async Task BinaryContentRest() ApiGatewayRouteConfig = config, Assertions = (actualRequest, emulatorMode) => { + Assert.NotNull(actualRequest); var typedRequest = (APIGatewayProxyRequest)actualRequest; - Assert.True(typedRequest.IsBase64Encoded); - Assert.Equal(Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5 }), typedRequest.Body); - Assert.Equal("123", typedRequest.PathParameters["userId"]); - Assert.Equal("/test4/api/users/{userId}/avatar", typedRequest.Resource); - Assert.Equal("POST", typedRequest.HttpMethod); + Assert.True(typedRequest?.IsBase64Encoded); + Assert.Equal(Convert.ToBase64String(new byte[] { 1, 2, 3, 4, 5 }), typedRequest?.Body); + Assert.Equal("123", typedRequest?.PathParameters["userId"]); + Assert.Equal("/test4/api/users/{userId}/avatar", typedRequest?.Resource); + Assert.Equal("POST", typedRequest?.HttpMethod); } }; @@ -178,7 +181,7 @@ private async Task RunApiGatewayTest(HttpContextTestCase testCase, string api } - private void CompareApiGatewayRequests(T expected, T actual) where T : class + private void CompareApiGatewayRequests(T expected, T actual) where T : class? { if (expected is APIGatewayProxyRequest v1Expected && actual is APIGatewayProxyRequest v1Actual) { @@ -261,22 +264,31 @@ private void CompareMultiValueHeaders(IDictionary> expecte } } - private IDictionary FilterHeaders(IDictionary headers) + private IDictionary FilterHeaders(IDictionary headers) where TKey : notnull { - return headers.Where(kvp => - !(kvp.Key.ToString().StartsWith("x-forwarded-", StringComparison.OrdinalIgnoreCase) || // ignore these for now - kvp.Key.ToString().StartsWith("cloudfront-", StringComparison.OrdinalIgnoreCase) || // ignore these for now - kvp.Key.ToString().StartsWith("via-", StringComparison.OrdinalIgnoreCase) || // ignore these for now - kvp.Key.ToString().Equals("x-amzn-trace-id", StringComparison.OrdinalIgnoreCase) || // this is dynamic so ignoring for now - kvp.Key.ToString().Equals("cookie", StringComparison.OrdinalIgnoreCase) || // TODO may have to have api gateway v2 not set this in headers - kvp.Key.ToString().Equals("host", StringComparison.OrdinalIgnoreCase))) // TODO we may want to set this - .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + return headers.Where(kvp => { + var key = kvp.Key?.ToString(); + return key != null && !( + key.StartsWith("x-forwarded-", StringComparison.OrdinalIgnoreCase) || // ignore these for now + key.StartsWith("cloudfront-", StringComparison.OrdinalIgnoreCase) || // ignore these for now + key.StartsWith("via-", StringComparison.OrdinalIgnoreCase) || // ignore these for now + key.Equals("x-amzn-trace-id", StringComparison.OrdinalIgnoreCase) || // this is dynamic so ignoring for now + key.Equals("cookie", StringComparison.OrdinalIgnoreCase) || // TODO may have to have api gateway v2 not set this in headers + key.Equals("host", StringComparison.OrdinalIgnoreCase) // TODO we may want to set this + ); + }).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); } - private void CompareDictionaries(IDictionary expected, IDictionary actual) + private void CompareDictionaries(IDictionary? expected, IDictionary? actual) { if (expected == null && actual == null) return; + + if (expected == null || actual == null) + { + Assert.Fail("One collection is null while the other is not"); + } + Assert.Equal(expected.Count, actual.Count); foreach (var kvp in expected) @@ -291,7 +303,7 @@ private void CompareStringArrays(string[] expected, string[] actual) Assert.Equal(expected?.Length, actual?.Length); if (expected != null) { - Assert.Equal(expected.OrderBy(x => x), actual.OrderBy(x => x)); + Assert.Equal(expected.OrderBy(x => x), actual?.OrderBy(x => x)); } } diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs index 22b20a93e..70e4152e8 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.Tests.Common/HttpContextTestCases.cs @@ -322,9 +322,9 @@ public static DefaultHttpContext CreateHttpContext(string method, string path, public class HttpContextTestCase { - public required DefaultHttpContext HttpContext { get; set; } - public required ApiGatewayRouteConfig ApiGatewayRouteConfig { get; set; } - public required Action Assertions { get; set; } + public required DefaultHttpContext HttpContext { get; init; } + public required ApiGatewayRouteConfig ApiGatewayRouteConfig { get; init; } + public required Action Assertions { get; init; } } } } diff --git a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/PackagingTests.cs b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/PackagingTests.cs index bbf248f6b..c4f2a5be6 100644 --- a/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/PackagingTests.cs +++ b/Tools/LambdaTestTool-v2/tests/Amazon.Lambda.TestTool.UnitTests/PackagingTests.cs @@ -1,9 +1,5 @@ -using System; using System.Diagnostics; -using System.IO; using System.IO.Compression; -using System.Collections.Generic; -using System.Linq; using Xunit; using Xunit.Abstractions; @@ -135,9 +131,9 @@ public void VerifyPackageContentsHasRuntimeSupport() } } - private string FindSolutionRoot() + private string? FindSolutionRoot() { - string currentDirectory = Directory.GetCurrentDirectory(); + string? currentDirectory = Directory.GetCurrentDirectory(); while (currentDirectory != null) { // Look for the aws-lambda-dotnet directory specifically