From 245a370ce00f32a62953e5022e5c610954140e21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cezary=20Pi=C4=85tek?= Date: Wed, 31 May 2023 21:53:46 +0200 Subject: [PATCH] Return info about exposed endpoints from InstallMethod --- src/GrpcTestKit/GrpcTestKit.Demo/Tests.cs | 7 ++++--- .../TestContainerGrpcMockServerConnector.cs | 17 +++++++++-------- .../GrpcMockServerConnectionInfo.cs | 13 +++++++++++++ .../TestConnectors/IGrpcMockServerConnector.cs | 4 ++-- .../TestChartGrpcMockServerConnector.cs | 17 ++++++++++++++--- .../grpcmockserver/templates/Service.yaml | 2 +- 6 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 src/GrpcTestKit/GrpcTestKit/TestConnectors/GrpcMockServerConnectionInfo.cs diff --git a/src/GrpcTestKit/GrpcTestKit.Demo/Tests.cs b/src/GrpcTestKit/GrpcTestKit.Demo/Tests.cs index 1f16832..9de3d67 100644 --- a/src/GrpcTestKit/GrpcTestKit.Demo/Tests.cs +++ b/src/GrpcTestKit/GrpcTestKit.Demo/Tests.cs @@ -5,6 +5,8 @@ namespace GrpcTestKit.Demo { + + [Explicit] public class Tests { [Test] @@ -65,10 +67,9 @@ await grpcMockClient.MockClientStreaming [Test] public async Task test_with_testcharts() { + await using var connector = new TestChartGrpcMockServerConnector("protos", grpcPort: 8889); - await using var connector = new TestChartGrpcMockServerConnector("protos"); - - await connector.Install(); + var connectionInfo = await connector.Install(); var grpcMockClient = connector.CreateClient(); diff --git a/src/GrpcTestKit/GrpcTestKit/TestConnectors/Docker/TestContainerGrpcMockServerConnector.cs b/src/GrpcTestKit/GrpcTestKit/TestConnectors/Docker/TestContainerGrpcMockServerConnector.cs index 8e96662..98086b9 100644 --- a/src/GrpcTestKit/GrpcTestKit/TestConnectors/Docker/TestContainerGrpcMockServerConnector.cs +++ b/src/GrpcTestKit/GrpcTestKit/TestConnectors/Docker/TestContainerGrpcMockServerConnector.cs @@ -13,6 +13,7 @@ public class TestContainerGrpcMockServerConnector : IGrpcMockServerConnector private readonly string _dockerImage; private readonly int _grpcPort; private IContainer? container; + private string? _stubbingUrl; public TestContainerGrpcMockServerConnector(string protoDirectory, int grpcPort = 5033, string dockerImage = "cezarypiatek/grpc-mock-server") { @@ -29,7 +30,7 @@ public TestContainerGrpcMockServerConnector(string protoDirectory, int grpcPort _grpcPort = grpcPort; } - public async Task Install() + public async Task Install() { container = new ContainerBuilder() .WithImage(_dockerImage) @@ -43,29 +44,29 @@ public async Task Install() .WithBindMount(_protoDirectory, "/protos") .WithAutoRemove(true) .WithCleanUp(false) - .Build(); var st = Stopwatch.StartNew(); await container.StartAsync(); st.Stop(); Console.WriteLine($"Container startup time: {st.Elapsed}"); + + var wireMockPort = container.GetMappedPublicPort("9095"); + this._stubbingUrl = $"http://localhost:{wireMockPort}"; + return new GrpcMockServerConnectionInfo($"http://localhost:{_grpcPort}", _stubbingUrl); } public IGrpcMockClient CreateClient() { - if (container == null) + if (_stubbingUrl == null) { throw new InvalidOperationException("Connector not installed. Call Install() method first."); } - var wireMockPort = container.GetMappedPublicPort("9095"); - var baseUrl = $"http://localhost:{wireMockPort}"; - var wireMockApiClient = RestClient.For(baseUrl); - return new GrpcMockClient(wireMockApiClient, baseUrl); + var wireMockApiClient = RestClient.For(_stubbingUrl); + return new GrpcMockClient(wireMockApiClient, _stubbingUrl); } - public async ValueTask DisposeAsync() { if (container != null) diff --git a/src/GrpcTestKit/GrpcTestKit/TestConnectors/GrpcMockServerConnectionInfo.cs b/src/GrpcTestKit/GrpcTestKit/TestConnectors/GrpcMockServerConnectionInfo.cs new file mode 100644 index 0000000..0909765 --- /dev/null +++ b/src/GrpcTestKit/GrpcTestKit/TestConnectors/GrpcMockServerConnectionInfo.cs @@ -0,0 +1,13 @@ +namespace GrpcTestKit.TestConnectors; + +public class GrpcMockServerConnectionInfo +{ + public string GrpcEndpoint { get; } + public string StubbingEndpoint { get; } + + public GrpcMockServerConnectionInfo(string grpcEndpoint, string stubbingEndpoint) + { + GrpcEndpoint = grpcEndpoint; + StubbingEndpoint = stubbingEndpoint; + } +} \ No newline at end of file diff --git a/src/GrpcTestKit/GrpcTestKit/TestConnectors/IGrpcMockServerConnector.cs b/src/GrpcTestKit/GrpcTestKit/TestConnectors/IGrpcMockServerConnector.cs index b924b7c..4531ee6 100644 --- a/src/GrpcTestKit/GrpcTestKit/TestConnectors/IGrpcMockServerConnector.cs +++ b/src/GrpcTestKit/GrpcTestKit/TestConnectors/IGrpcMockServerConnector.cs @@ -1,7 +1,7 @@ namespace GrpcTestKit.TestConnectors; -public interface IGrpcMockServerConnector: System.IAsyncDisposable +public interface IGrpcMockServerConnector: IAsyncDisposable { - Task Install(); + Task Install(); IGrpcMockClient CreateClient(); } \ No newline at end of file diff --git a/src/GrpcTestKit/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs b/src/GrpcTestKit/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs index f100130..51a28a5 100644 --- a/src/GrpcTestKit/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs +++ b/src/GrpcTestKit/GrpcTestKit/TestConnectors/Kubernetes/TestChartGrpcMockServerConnector.cs @@ -9,29 +9,32 @@ public class TestChartGrpcMockServerConnector : IGrpcMockServerConnector private readonly string _protoDirectory; private readonly int _grpcPort; private readonly string _dockerImage; + private readonly bool _exposeGrpcPortOnLocalhost; private readonly string _releaseName; private readonly ChartInstaller _chartInstaller; private readonly ChartFromLocalPath _chart; private Release? _release; private int _wireMockPort; - public TestChartGrpcMockServerConnector(string protoDirectory, int grpcPort = 5033, string dockerImage = "cezarypiatek/grpc-mock-server", string? releaseName = null) + public TestChartGrpcMockServerConnector(string protoDirectory, int grpcPort = 5033, string dockerImage = "cezarypiatek/grpc-mock-server", string? releaseName = null, bool exposeGrpcPortOnLocalhost = false) { _protoDirectory = Path.GetFullPath(protoDirectory); _grpcPort = grpcPort; _dockerImage = dockerImage; + _exposeGrpcPortOnLocalhost = exposeGrpcPortOnLocalhost; _releaseName = releaseName ?? "grpcmockserverconnector"; _chartInstaller = new ChartInstaller(new ProcessLauncher(new ConsoleProcessOutputWriter())); _chart = new ChartFromLocalPath("./charts/grpcmockserver"); } - public async Task Install() + public async Task Install() { var allProtoFile = Directory.EnumerateFiles(_protoDirectory, "*.proto", SearchOption.AllDirectories); var overrides = new { dockerImage = _dockerImage, + grpcPort = _grpcPort, protoFiles = allProtoFile.Select(x => new { key = Guid.NewGuid().ToString("N"), @@ -41,8 +44,16 @@ public async Task Install() }; _release = await _chartInstaller.Install(_chart, _releaseName, overrides); - _ = await _release.StartPortForwardForService(serviceName: $"{_releaseName}-grpcmockserver-service", servicePort: 5033, localPort: _grpcPort); + if (_exposeGrpcPortOnLocalhost) + { + _ = await _release.StartPortForwardForService(serviceName: $"{_releaseName}-grpcmockserver-service", servicePort: _grpcPort, localPort: _grpcPort); + } _wireMockPort = await _release.StartPortForwardForService(serviceName: $"{_releaseName}-grpcmockserver-service", servicePort: 9095); + return new GrpcMockServerConnectionInfo + ( + grpcEndpoint: _exposeGrpcPortOnLocalhost ? $"http://127.0.0.1:{_grpcPort}": $"http://{_releaseName}-grpcmockserver-service:{_grpcPort}" , + stubbingEndpoint: $"http://127.0.0.1:{ _wireMockPort}" + ); } public IGrpcMockClient CreateClient() diff --git a/src/GrpcTestKit/GrpcTestKit/charts/grpcmockserver/templates/Service.yaml b/src/GrpcTestKit/GrpcTestKit/charts/grpcmockserver/templates/Service.yaml index e08a308..41c2abd 100644 --- a/src/GrpcTestKit/GrpcTestKit/charts/grpcmockserver/templates/Service.yaml +++ b/src/GrpcTestKit/GrpcTestKit/charts/grpcmockserver/templates/Service.yaml @@ -8,7 +8,7 @@ spec: app: {{.Release.Name}}-grpcmockserver ports: - name: grpcport - port: 5033 + port: {{ .Values.grpcPort | default 5033}} targetPort: 5033 protocol: TCP - name: wiremockport