TeamCity.CSharpInteractive/DotNetTestReportingService.cs (55 lines of code) (raw):
namespace HostApi.DotNet;
using System.Text;
using JetBrains.TeamCity.ServiceMessages;
using JetBrains.TeamCity.ServiceMessages.Read;
using JetBrains.TeamCity.ServiceMessages.Write;
using JetBrains.TeamCity.ServiceMessages.Write.Special;
using TeamCity.CSharpInteractive;
internal class DotNetTestReportingService : IDotNetTestReportingService
{
private readonly IDotNetSettings _settings;
private readonly ITeamCityWriter _teamCityWriter;
private readonly IServiceMessageParser _serviceMessageParser;
private readonly IFileSystem _fileSystem;
public DotNetTestReportingService(
IDotNetSettings settings,
ITeamCityWriter teamCityWriter,
IServiceMessageParser serviceMessageParser,
IFileSystem fileSystem)
{
_settings = settings;
_teamCityWriter = teamCityWriter;
_serviceMessageParser = serviceMessageParser;
_fileSystem = fileSystem;
}
public void SendTestResultsStreamingDataMessageIfNeeded()
{
var shouldStreamTestReportsFromFiles = !string.IsNullOrWhiteSpace(_settings.TeamCityTestReportFilesPathEnvValue);
if (shouldStreamTestReportsFromFiles)
{
var importDataServiceMessage = new ServiceMessage("importData")
{
{"type", "streamToBuildLog"},
{"filePattern", $"{_settings.TeamCityTestReportFilesPathEnvValue}/*.msg"},
{"wrapFileContentInBlock", "false"}
};
_teamCityWriter.WriteRawMessage(importDataServiceMessage);
}
}
public IEnumerable<IServiceMessage> GetServiceMessagesFromFilesWithTestReports()
{
var teamCityTestReportFilesPath = _settings.TeamCityTestReportFilesPathEnvValue;
if (teamCityTestReportFilesPath == null || !_fileSystem.IsDirectoryExist(teamCityTestReportFilesPath))
{
yield break;
}
foreach (var fileWithTestReports in _fileSystem.EnumerateFiles(teamCityTestReportFilesPath, "*.msg", SearchOption.TopDirectoryOnly))
{
using var textReader = _fileSystem.OpenTextReader(fileWithTestReports, Encoding.UTF8);
foreach (var serviceMessage in _serviceMessageParser.ParseServiceMessages(textReader))
{
yield return serviceMessage;
}
}
}
}