TeamCity.VSTest.TestLogger/TeamCityTestLogger.cs (60 lines of code) (raw):

// ReSharper disable ClassNeverInstantiated.Global // ReSharper disable RedundantUsingDirective namespace TeamCity.VSTest.TestLogger; using System; using System.Reflection; #if !NET35 using IoC; #endif using Microsoft.VisualStudio.TestPlatform.ObjectModel; using Microsoft.VisualStudio.TestPlatform.ObjectModel.Client; [ExtensionUri(ExtensionId)] [FriendlyName(FriendlyName)] public class TeamCityTestLogger : ITestLogger { internal const string ExtensionId = "logger://" + FriendlyName; private const string FriendlyName = "TeamCity"; #if NET35 private static readonly ServiceLocatorNet35 ServiceLocatorNet35 = new(); private readonly IMessageHandler _handler = ServiceLocatorNet35.MessageHandler; private readonly IOptions _options = ServiceLocatorNet35; private readonly IMessageWriter _messageWriter = ServiceLocatorNet35.MessageWriter; #else private static readonly IMutableContainer Container = IoC.Container.Create().Using<IoCConfiguration>(); private readonly IMessageHandler _handler = Container.Resolve<IMessageHandler>(); private readonly IOptions _options = Container.Resolve<IOptions>(); private readonly IMessageWriter _messageWriter = Container.Resolve<IMessageWriter>(); #endif public void Initialize(TestLoggerEvents events, string testRunDirectory) { if (events == null) throw new ArgumentNullException(nameof(events)); OutputLoggerInitializedMessage(); _options.TestRunDirectory = testRunDirectory; var shouldOpenNewFlowForServiceMessages = _options.FallbackToStdOutTestReporting; events.TestRunMessage += (_, args) => _handler.OnTestRunMessage(args); events.TestResult += (_, args) => _handler.OnTestResult(args); events.TestRunComplete += (_, _) => { _handler.OnTestRunComplete(); _messageWriter.Dispose(); }; #if (NET35 || NET40) // .Net Framework version of TestLoggerEvents does not have a TestRunStart event handler, // so test run directory is used as an acceptable substitute for test run sources _handler.OnTestRunStart( $"Unit tests from for test run directory {testRunDirectory}", shouldOpenNewFlowForServiceMessages); #else events.TestRunStart += (sender, args) => _handler.OnTestRunStart( "Unit tests from " + string.Join(" ", args.TestRunCriteria.Sources), shouldOpenNewFlowForServiceMessages); #endif } private void OutputLoggerInitializedMessage() { // ReSharper disable once JoinDeclarationAndInitializer Version currentAssemblyVersion; #if (NET35 || NET40) currentAssemblyVersion = GetType().Assembly.GetName().Version; #else currentAssemblyVersion = GetType().GetTypeInfo().Assembly.GetName().Version; #endif Console.WriteLine($"TeamCity test logger version {currentAssemblyVersion} is initialized"); } }