97 lines
3.1 KiB
C#
97 lines
3.1 KiB
C#
// Copyright The OpenTelemetry Authors
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
using System.Net.Sockets;
|
|
using IntegrationTests.Helpers;
|
|
using Xunit.Abstractions;
|
|
using static OpenTelemetry.Proto.Trace.V1.Span.Types;
|
|
|
|
namespace IntegrationTests;
|
|
|
|
public abstract class WcfTestsBase : TestHelper, IDisposable
|
|
{
|
|
private readonly string _testAppName;
|
|
private ProcessHelper? _serverProcess;
|
|
|
|
protected WcfTestsBase(string testAppName, ITestOutputHelper output)
|
|
: base(testAppName, output)
|
|
{
|
|
_testAppName = testAppName;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (_serverProcess?.Process == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_serverProcess.Process.HasExited)
|
|
{
|
|
Output.WriteLine($"WCF server process finished. Exit code: {_serverProcess.Process.ExitCode}.");
|
|
}
|
|
else
|
|
{
|
|
_serverProcess.Process.Kill();
|
|
}
|
|
|
|
Output.WriteLine("ProcessId: " + _serverProcess.Process.Id);
|
|
Output.WriteLine("Exit Code: " + _serverProcess.Process.ExitCode);
|
|
Output.WriteResult(_serverProcess);
|
|
}
|
|
|
|
protected async Task SubmitsTracesInternal(string clientPackageVersion)
|
|
{
|
|
Assert.True(EnvironmentTools.IsWindowsAdministrator(), "This test requires Windows Administrator privileges.");
|
|
|
|
var collector = new MockSpansCollector(Output);
|
|
SetExporter(collector);
|
|
|
|
var serverHelper = new WcfServerTestHelper(Output);
|
|
_serverProcess = serverHelper.RunWcfServer(collector);
|
|
await WaitForServer();
|
|
|
|
RunTestApplication(new TestSettings
|
|
{
|
|
PackageVersion = clientPackageVersion
|
|
});
|
|
|
|
collector.Expect("OpenTelemetry.Instrumentation.Wcf", span => span.Kind == SpanKind.Server, "Server 1");
|
|
collector.Expect("OpenTelemetry.Instrumentation.Wcf", span => span.Kind == SpanKind.Client, "Client 1");
|
|
collector.Expect("OpenTelemetry.Instrumentation.Wcf", span => span.Kind == SpanKind.Server, "Server 2");
|
|
collector.Expect("OpenTelemetry.Instrumentation.Wcf", span => span.Kind == SpanKind.Client, "Client 2");
|
|
|
|
collector.Expect($"TestApplication.{_testAppName}", span => span.Kind == SpanKind.Internal, "Custom parent");
|
|
collector.Expect($"TestApplication.{_testAppName}", span => span.Kind == SpanKind.Internal, "Custom sibling");
|
|
|
|
collector.ExpectCollected(WcfClientInstrumentation.ValidateExpectedSpanHierarchy);
|
|
|
|
collector.AssertExpectations();
|
|
}
|
|
|
|
private async Task WaitForServer()
|
|
{
|
|
const int tcpPort = 9090;
|
|
using var tcpClient = new TcpClient();
|
|
var retries = 0;
|
|
|
|
Output.WriteLine("Waiting for WCF Server to open ports.");
|
|
while (retries < 60)
|
|
{
|
|
try
|
|
{
|
|
await tcpClient.ConnectAsync("127.0.0.1", tcpPort);
|
|
Output.WriteLine("WCF Server is running.");
|
|
return;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
retries++;
|
|
await Task.Delay(500);
|
|
}
|
|
}
|
|
|
|
Assert.Fail("WCF Server did not open the port.");
|
|
}
|
|
}
|