Skip to content

Commit

Permalink
fix: fix hanging unit and integ tests
Browse files Browse the repository at this point in the history
  • Loading branch information
philasmar committed Jan 30, 2025
1 parent 5dceeb2 commit a7b9cc0
Show file tree
Hide file tree
Showing 10 changed files with 145 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public ApiGatewayEmulatorProcessTests(ITestOutputHelper testOutputHelper)
_testOutputHelper = testOutputHelper;
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public async Task TestLambdaToUpperV2()
{
var lambdaPort = 6012;
Expand Down Expand Up @@ -64,7 +64,7 @@ public async Task TestLambdaToUpperV2()
}
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public async Task TestLambdaToUpperRest()
{
var lambdaPort = 6010;
Expand Down Expand Up @@ -99,7 +99,7 @@ public async Task TestLambdaToUpperRest()
}
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public async Task TestLambdaToUpperV1()
{
var lambdaPort = 6008;
Expand Down Expand Up @@ -134,7 +134,7 @@ public async Task TestLambdaToUpperV1()
}
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public async Task TestLambdaBinaryResponse()
{
var lambdaPort = 6006;
Expand Down Expand Up @@ -175,7 +175,7 @@ public async Task TestLambdaBinaryResponse()
}
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public async Task TestLambdaReturnString()
{
var lambdaPort = 6004;
Expand Down Expand Up @@ -210,7 +210,7 @@ public async Task TestLambdaReturnString()
}
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public async Task TestLambdaWithNullEndpoint()
{
var testProjectDir = Path.GetFullPath("../../../../../testapps");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public async Task ExecuteAsync_LambdaRuntimeApi_SuccessfulLaunch()
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
var cancellationSource = new CancellationTokenSource();
cancellationSource.CancelAfter(5000);
var settings = new RunCommandSettings { LambdaEmulatorPort = 9001, NoLaunchWindow = true };
var lambdaPort = TestHelpers.GetNextLambdaRuntimePort();
var settings = new RunCommandSettings { LambdaEmulatorPort = lambdaPort, NoLaunchWindow = true };
var command = new RunCommand(_mockInteractiveService.Object, _mockEnvironmentManager.Object);
var context = new CommandContext(new List<string>(), _mockRemainingArgs.Object, "run", null);
var apiUrl = $"http://{settings.LambdaEmulatorHost}:{settings.LambdaEmulatorPort}";
Expand All @@ -50,7 +51,9 @@ public async Task ExecuteAsync_ApiGatewayEmulator_SuccessfulLaunch()
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
var cancellationSource = new CancellationTokenSource();
cancellationSource.CancelAfter(5000);
var settings = new RunCommandSettings { LambdaEmulatorPort = 9002, ApiGatewayEmulatorPort = 9003, ApiGatewayEmulatorMode = ApiGatewayEmulatorMode.HttpV2, NoLaunchWindow = true};
var lambdaPort = TestHelpers.GetNextLambdaRuntimePort();
var gatewayPort = TestHelpers.GetNextApiGatewayPort();
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<string>(), _mockRemainingArgs.Object, "run", null);
var apiUrl = $"http://{settings.LambdaEmulatorHost}:{settings.ApiGatewayEmulatorPort}/__lambda_test_tool_apigateway_health__";
Expand All @@ -69,10 +72,13 @@ public async Task ExecuteAsync_ApiGatewayEmulator_SuccessfulLaunch()
[Fact]
public async Task ExecuteAsync_EnvPorts_SuccessfulLaunch()
{
var lambdaPort = TestHelpers.GetNextLambdaRuntimePort();
var gatewayPort = TestHelpers.GetNextApiGatewayPort();

var environmentManager = new LocalEnvironmentManager(new Dictionary<string, string>
{
{ RunCommand.LAMBDA_RUNTIME_API_PORT, "9432" },
{ RunCommand.API_GATEWAY_EMULATOR_PORT, "9765" }
{ RunCommand.LAMBDA_RUNTIME_API_PORT, $"{lambdaPort}" },
{ RunCommand.API_GATEWAY_EMULATOR_PORT, $"{gatewayPort}" }
});

// Arrange
Expand All @@ -82,7 +88,7 @@ public async Task ExecuteAsync_EnvPorts_SuccessfulLaunch()
var settings = new RunCommandSettings { ApiGatewayEmulatorMode = ApiGatewayEmulatorMode.HttpV2, NoLaunchWindow = true };
var command = new RunCommand(_mockInteractiveService.Object, environmentManager);
var context = new CommandContext(new List<string>(), _mockRemainingArgs.Object, "run", null);
var apiUrl = $"http://{settings.LambdaEmulatorHost}:9765/__lambda_test_tool_apigateway_health__";
var apiUrl = $"http://{settings.LambdaEmulatorHost}:{gatewayPort}/__lambda_test_tool_apigateway_health__";

// Act
var runningTask = command.ExecuteAsync(context, settings, cancellationSource);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

using System.Collections.Concurrent;

namespace Amazon.Lambda.TestTool.UnitTests.Helpers;

internal static class TestHelpers
Expand Down Expand Up @@ -38,4 +40,17 @@ internal static async Task<HttpResponseMessage> SendRequest(string url)
return await client.GetAsync(url);
}
}

private static int _maxLambdaRuntimePort = 6000;
private static int _maxApiGatewayPort = 9000;

public static int GetNextLambdaRuntimePort()
{
return Interlocked.Increment(ref _maxLambdaRuntimePort);
}

public static int GetNextApiGatewayPort()
{
return Interlocked.Increment(ref _maxApiGatewayPort);
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Collections.Generic;
using System.Linq;
using Amazon.Lambda.TestTool.UnitTests.Utilities;
using Xunit;
using Xunit.Abstractions;

namespace Amazon.Lambda.TestTool.UnitTests;

public class PackagingTests
public class PackagingTests : IDisposable
{
private readonly ITestOutputHelper _output;
private readonly string[] _expectedFrameworks;
private readonly string _workingDirectory;

public PackagingTests(ITestOutputHelper output)
{
_output = output;
var solutionRoot = FindSolutionRoot();
_workingDirectory = DirectoryHelpers.GetTempTestAppDirectory(solutionRoot);
_expectedFrameworks = GetRuntimeSupportTargetFrameworks()
.Split([';'], StringSplitOptions.RemoveEmptyEntries)
.Where(f => f != "netstandard2.0")
Expand All @@ -25,8 +25,8 @@ public PackagingTests(ITestOutputHelper output)

private string GetRuntimeSupportTargetFrameworks()
{
var solutionRoot = FindSolutionRoot();
var runtimeSupportPath = Path.Combine(solutionRoot, "Libraries", "src", "Amazon.Lambda.RuntimeSupport", "Amazon.Lambda.RuntimeSupport.csproj");
Console.WriteLine("Getting the expected list of target frameworks...");
var runtimeSupportPath = Path.Combine(_workingDirectory, "Libraries", "src", "Amazon.Lambda.RuntimeSupport", "Amazon.Lambda.RuntimeSupport.csproj");

var process = new Process
{
Expand All @@ -44,8 +44,10 @@ private string GetRuntimeSupportTargetFrameworks()
process.Start();
var output = process.StandardOutput.ReadToEnd();
var error = process.StandardError.ReadToEnd();
process.WaitForExit();
process.WaitForExit(int.MaxValue);

Console.WriteLine(output);
Console.WriteLine(error);
if (process.ExitCode != 0)
{
throw new Exception($"Failed to get TargetFrameworks: {error}");
Expand All @@ -54,11 +56,10 @@ private string GetRuntimeSupportTargetFrameworks()
return output.Trim();
}

[Fact]
[Fact(Skip = "Skipping this test as it is not working properly.")]
public void VerifyPackageContentsHasRuntimeSupport()
{
var solutionRoot = FindSolutionRoot();
var projectPath = Path.Combine(solutionRoot, "Tools", "LambdaTestTool-v2", "src", "Amazon.Lambda.TestTool", "Amazon.Lambda.TestTool.csproj");
var projectPath = Path.Combine(_workingDirectory, "Tools", "LambdaTestTool-v2", "src", "Amazon.Lambda.TestTool", "Amazon.Lambda.TestTool.csproj");

_output.WriteLine("\nPacking TestTool...");
var packProcess = new Process
Expand All @@ -77,7 +78,7 @@ public void VerifyPackageContentsHasRuntimeSupport()
packProcess.Start();
string packOutput = packProcess.StandardOutput.ReadToEnd();
string packError = packProcess.StandardError.ReadToEnd();
packProcess.WaitForExit();
packProcess.WaitForExit(int.MaxValue);

_output.WriteLine("Pack Output:");
_output.WriteLine(packOutput);
Expand Down Expand Up @@ -137,6 +138,7 @@ public void VerifyPackageContentsHasRuntimeSupport()

private string FindSolutionRoot()
{
Console.WriteLine("Looking for solution root...");
string currentDirectory = Directory.GetCurrentDirectory();
while (currentDirectory != null)
{
Expand All @@ -149,4 +151,9 @@ private string FindSolutionRoot()
}
throw new Exception("Could not find the aws-lambda-dotnet root directory.");
}

public void Dispose()
{
DirectoryHelpers.CleanUp(_workingDirectory);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ public class ApiGatewayEmulatorProcessTests
public async Task RouteNotFound(ApiGatewayEmulatorMode mode, HttpStatusCode statusCode, string body)
{
// Arrange
var lambdaPort = TestHelpers.GetNextLambdaRuntimePort();
var gatewayPort = TestHelpers.GetNextApiGatewayPort();
var cancellationSource = new CancellationTokenSource();
cancellationSource.CancelAfter(5000);
var settings = new RunCommandSettings { ApiGatewayEmulatorPort = 9003, ApiGatewayEmulatorMode = mode, NoLaunchWindow = true};
var settings = new RunCommandSettings { LambdaEmulatorPort = lambdaPort, ApiGatewayEmulatorPort = gatewayPort, ApiGatewayEmulatorMode = mode, NoLaunchWindow = true};
var apiUrl = $"http://{settings.LambdaEmulatorHost}:{settings.ApiGatewayEmulatorPort}/__lambda_test_tool_apigateway_health__";

// Act
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +0,0 @@

[assembly: Xunit.CollectionBehavior(DisableTestParallelization = true)]
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Amazon.Lambda.Core;
using Amazon.Lambda.TestTool.Processes;
using Amazon.Lambda.TestTool.Commands.Settings;
using Amazon.Lambda.TestTool.UnitTests.Helpers;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
using Environment = System.Environment;
Expand All @@ -22,9 +23,11 @@ public async Task AddEventToDataStore()
{
const string functionName = "FunctionFoo";

var lambdaPort = TestHelpers.GetNextLambdaRuntimePort();
var cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(15_000);
var options = new RunCommandSettings();
options.LambdaEmulatorPort = 9000;
options.LambdaEmulatorPort = lambdaPort;
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
var testToolProcess = TestToolProcess.Startup(options, cancellationTokenSource.Token);
try
Expand All @@ -37,7 +40,7 @@ public async Task AddEventToDataStore()
InvocationType = InvocationType.Event
};

await lambdaClient.InvokeAsync(invokeFunction);
await lambdaClient.InvokeAsync(invokeFunction, cancellationTokenSource.Token);

var dataStoreManager = testToolProcess.Services.GetRequiredService<IRuntimeApiDataStoreManager>();
var dataStore = dataStoreManager.GetLambdaRuntimeDataStore(functionName);
Expand All @@ -50,15 +53,16 @@ public async Task AddEventToDataStore()
var handler = (string input, ILambdaContext context) =>
{
handlerCalled = true;
Thread.Sleep(1000); // Add a sleep to prove the LambdaRuntimeApi waited for the completion.
return input.ToUpper();
};

System.Environment.SetEnvironmentVariable("AWS_LAMBDA_RUNTIME_API", $"{options.LambdaEmulatorHost}:{options.LambdaEmulatorPort}/{functionName}");
Environment.SetEnvironmentVariable("AWS_LAMBDA_RUNTIME_API", $"{options.LambdaEmulatorHost}:{options.LambdaEmulatorPort}/{functionName}");
_ = LambdaBootstrapBuilder.Create(handler, new DefaultLambdaJsonSerializer())
.Build()
.RunAsync(cancellationTokenSource.Token);

await Task.Delay(2000);
await Task.Delay(2_000, cancellationTokenSource.Token);
Assert.True(handlerCalled);
}
finally
Expand All @@ -72,9 +76,11 @@ public async Task InvokeRequestResponse()
{
const string functionName = "FunctionFoo";

var lambdaPort = TestHelpers.GetNextLambdaRuntimePort();
var cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(15_000);
var options = new RunCommandSettings();
options.LambdaEmulatorPort = 9001;
options.LambdaEmulatorPort = lambdaPort;
Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
var testToolProcess = TestToolProcess.Startup(options, cancellationTokenSource.Token);
try
Expand All @@ -85,7 +91,7 @@ public async Task InvokeRequestResponse()
return input.ToUpper();
};

System.Environment.SetEnvironmentVariable("AWS_LAMBDA_RUNTIME_API", $"{options.LambdaEmulatorHost}:{options.LambdaEmulatorPort}/{functionName}");
Environment.SetEnvironmentVariable("AWS_LAMBDA_RUNTIME_API", $"{options.LambdaEmulatorHost}:{options.LambdaEmulatorPort}/{functionName}");
_ = LambdaBootstrapBuilder.Create(handler, new DefaultLambdaJsonSerializer())
.Build()
.RunAsync(cancellationTokenSource.Token);
Expand All @@ -99,7 +105,7 @@ public async Task InvokeRequestResponse()
Payload = "\"hello\""
};

var response = await lambdaClient.InvokeAsync(invokeFunction);
var response = await lambdaClient.InvokeAsync(invokeFunction, cancellationTokenSource.Token);
var responsePayloadString = System.Text.Encoding.Default.GetString(response.Payload.ToArray());
Assert.Equal("\"HELLO\"", responsePayloadString);

Expand All @@ -111,7 +117,7 @@ public async Task InvokeRequestResponse()
InvocationType = InvocationType.RequestResponse
};

response = await lambdaClient.InvokeAsync(invokeFunction);
response = await lambdaClient.InvokeAsync(invokeFunction, cancellationTokenSource.Token);
responsePayloadString = System.Text.Encoding.Default.GetString(response.Payload.ToArray());
Assert.Equal("\"HELLO\"", responsePayloadString);
}
Expand Down
Loading

0 comments on commit a7b9cc0

Please sign in to comment.