File: InteropTests.cs
Web Access
Project: src\src\Grpc\Interop\test\InteropTests\InteropTests.csproj (InteropTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using InteropTests.Helpers;
using Microsoft.AspNetCore.InternalTesting;
using Xunit.Abstractions;
 
namespace InteropTests;
 
// All interop test cases, minus GCE authentication specific tests.
// Tests are separate methods so that they can be quarantined separately.
public class InteropTests
{
    private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(30);
    private readonly string _clientPath = Path.Combine(Directory.GetCurrentDirectory(), "InteropClient", "InteropClient.dll");
    private readonly string _serverPath = Path.Combine(Directory.GetCurrentDirectory(), "InteropWebsite", "InteropWebsite.dll");
    private readonly ITestOutputHelper _output;
 
    public InteropTests(ITestOutputHelper output)
    {
        _output = output;
    }
 
    [Fact]
    public Task EmptyUnary() => InteropTestCase("empty_unary");
 
    [Fact]
    public Task LargeUnary() => InteropTestCase("large_unary");
 
    [Fact]
    public Task ClientStreaming() => InteropTestCase("client_streaming");
 
    [Fact]
    public Task ServerStreaming() => InteropTestCase("server_streaming");
 
    [Fact]
    public Task PingPong() => InteropTestCase("ping_pong");
 
    [Fact]
    public Task EmptyStream() => InteropTestCase("empty_stream");
 
    [Fact]
    public Task CancelAfterBegin() => InteropTestCase("cancel_after_begin");
 
    [Fact]
    public Task CancelAfterFirstResponse() => InteropTestCase("cancel_after_first_response");
 
    [Fact]
    public Task TimeoutOnSleepingServer() => InteropTestCase("timeout_on_sleeping_server");
 
    [Fact]
    public Task CustomMetadata() => InteropTestCase("custom_metadata");
 
    [Fact]
    public Task StatusCodeAndMessage() => InteropTestCase("status_code_and_message");
 
    [Fact]
    public Task SpecialStatusMessage() => InteropTestCase("special_status_message");
 
    [Fact]
    public Task UnimplementedService() => InteropTestCase("unimplemented_service");
 
    [Fact]
    public Task UnimplementedMethod() => InteropTestCase("unimplemented_method");
 
    [Fact]
    public Task ClientCompressedUnary() => InteropTestCase("client_compressed_unary");
 
    [Fact]
    public Task ClientCompressedStreaming() => InteropTestCase("client_compressed_streaming");
 
    [Fact]
    public Task ServerCompressedUnary() => InteropTestCase("server_compressed_unary");
 
    [Fact]
    public Task ServerCompressedStreaming() => InteropTestCase("server_compressed_streaming");
 
    private async Task InteropTestCase(string name)
    {
        using (var serverProcess = new WebsiteProcess(_serverPath, _output))
        {
            try
            {
                await serverProcess.WaitForReady().TimeoutAfter(DefaultTimeout);
            }
            catch (Exception ex)
            {
                var errorMessage = $@"Error while running server process.
 
Server ready: {serverProcess.IsReady}
 
Server process output:
======================================
{serverProcess.GetOutput()}
======================================";
                throw new InvalidOperationException(errorMessage, ex);
            }
 
            using (var clientProcess = new ClientProcess(_output, _clientPath, serverProcess.ServerPort, name))
            {
                try
                {
                    await clientProcess.WaitForReadyAsync().TimeoutAfter(DefaultTimeout);
 
                    await clientProcess.WaitForExitAsync().TimeoutAfter(DefaultTimeout);
 
                    Assert.Equal(0, clientProcess.ExitCode);
                }
                catch (Exception ex)
                {
                    var errorMessage = $@"Error while running client process.
 
Server ready: {serverProcess.IsReady}
Client ready: {clientProcess.IsReady}
 
Server process output:
======================================
{serverProcess.GetOutput()}
======================================
 
Client process output:
======================================
{clientProcess.GetOutput()}
======================================";
                    throw new InvalidOperationException(errorMessage, ex);
                }
            }
        }
    }
}