Skip to content
This repository was archived by the owner on Jul 18, 2024. It is now read-only.

Commit 19d68fd

Browse files
Add process stat
1 parent 578c301 commit 19d68fd

12 files changed

+97
-32
lines changed

CSharpInteractive.Tests/BuildMessageLogWriterTests.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@ namespace CSharpInteractive.Tests;
55

66
public class BuildMessageLogWriterTests
77
{
8+
private static readonly ProcessInfo ProcessInfo = new(Mock.Of<IStartInfo>(), Mock.Of<IProcessMonitor>());
89
private static readonly Output Output = new(Mock.Of<IStartInfo>(), false, "", 99);
910
private readonly Mock<ILog<BuildMessageLogWriter>> _log = new();
1011
private readonly Mock<IStdOut> _stdOut = new();
1112
private readonly Mock<IStdErr> _stdErr = new();
13+
private readonly Mock<ICommandLineStatisticsRegistry> _statisticsRegistry = new();
1214

1315
[Fact]
1416
public void ShouldWriteInfo()
@@ -17,7 +19,7 @@ public void ShouldWriteInfo()
1719
var writer = CreateInstance();
1820

1921
// When
20-
writer.Write(new BuildMessage(Output, BuildMessageState.StdOut, default, "Abc"));
22+
writer.Write(ProcessInfo, new BuildMessage(Output, BuildMessageState.StdOut, default, "Abc"));
2123

2224
// Then
2325
_stdOut.Verify(i => i.WriteLine(It.Is<Text[]>(text => text.SequenceEqual(new[] {new Text("Abc")}))));
@@ -30,7 +32,7 @@ public void ShouldWriteStdErr()
3032
var writer = CreateInstance();
3133

3234
// When
33-
writer.Write(new BuildMessage(Output, BuildMessageState.StdError, default, "Abc"));
35+
writer.Write(ProcessInfo, new BuildMessage(Output, BuildMessageState.StdError, default, "Abc"));
3436

3537
// Then
3638
_stdErr.Verify(i => i.WriteLine(It.Is<Text[]>(text => text.SequenceEqual(new[] {new Text("Abc")}))));
@@ -43,9 +45,10 @@ public void ShouldWriteWarning()
4345
var writer = CreateInstance();
4446

4547
// When
46-
writer.Write(new BuildMessage(Output, BuildMessageState.Warning, default, "Abc"));
48+
writer.Write(ProcessInfo, new BuildMessage(Output, BuildMessageState.Warning, default, "Abc"));
4749

4850
// Then
51+
_statisticsRegistry.Verify(i => i.RegisterWarning(ProcessInfo, It.IsAny<Text[]>()));
4952
_log.Verify(i => i.Warning(It.IsAny<Text[]>()));
5053
}
5154

@@ -58,12 +61,16 @@ public void ShouldWriteError(BuildMessageState state)
5861
var writer = CreateInstance();
5962

6063
// When
61-
writer.Write(new BuildMessage(Output, state, default, "Abc"));
64+
writer.Write(ProcessInfo, new BuildMessage(Output, state, default, "Abc"));
6265

6366
// Then
67+
_statisticsRegistry.Verify(i => i.RegisterError(ProcessInfo, It.IsAny<Text[]>()));
6468
_log.Verify(i => i.Error(ErrorId.Build, It.IsAny<Text[]>()));
6569
}
6670

6771
private BuildMessageLogWriter CreateInstance() =>
68-
new(_log.Object, _stdOut.Object, _stdErr.Object);
72+
new(_log.Object,
73+
_stdOut.Object,
74+
_stdErr.Object,
75+
_statisticsRegistry.Object);
6976
}

CSharpInteractive.Tests/BuildRunnerTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,16 @@ public void ShouldRunBuildWhenHasHandler(bool handled)
5757
.Returns(_processResult);
5858

5959
var customHandler = Mock.Of<Action<BuildMessage>>();
60-
_customBuildMessagesProcessor.Setup(i => i.ProcessMessages(output, buildMessages, customHandler))
61-
.Callback<Output, IReadOnlyCollection<BuildMessage>, Action<BuildMessage>>((o, _, _) => { o.Handled = handled; });
60+
_customBuildMessagesProcessor.Setup(i => i.ProcessMessages(It.IsAny<ProcessInfo>(), output, buildMessages, customHandler))
61+
.Callback<ProcessInfo, Output, IReadOnlyCollection<BuildMessage>, Action<BuildMessage>>((_, o, _, _) => { o.Handled = handled; });
6262

6363
// When
6464
var result = buildService.Run(_process.Object, customHandler, TimeSpan.FromSeconds(1));
6565

6666
// Then
6767
output.Handled.ShouldBeTrue();
68-
_customBuildMessagesProcessor.Verify(i => i.ProcessMessages(output, buildMessages, customHandler));
69-
_defaultBuildMessagesProcessor.Verify(i => i.ProcessMessages(output, buildMessages, It.IsAny<Action<BuildMessage>>()), Times.Exactly(handled ? 0 : 1));
68+
_customBuildMessagesProcessor.Verify(i => i.ProcessMessages(It.IsAny<ProcessInfo>(), output, buildMessages, customHandler));
69+
_defaultBuildMessagesProcessor.Verify(i => i.ProcessMessages(It.IsAny<ProcessInfo>(), output, buildMessages, It.IsAny<Action<BuildMessage>>()), Times.Exactly(handled ? 0 : 1));
7070
_teamCityContext.VerifySet(i => i.TeamCityIntegration = true);
7171
_teamCityContext.VerifySet(i => i.TeamCityIntegration = false);
7272
_processResultHandler.Verify(i => i.Handle(_processResult, customHandler));
@@ -96,7 +96,7 @@ public void ShouldRunBuildWhenHasNoHandler()
9696

9797
// Then
9898
output.Handled.ShouldBeTrue();
99-
_defaultBuildMessagesProcessor.Verify(i => i.ProcessMessages(output, buildMessages, It.IsAny<Action<BuildMessage>>()));
99+
_defaultBuildMessagesProcessor.Verify(i => i.ProcessMessages(It.IsAny<ProcessInfo>(), output, buildMessages, It.IsAny<Action<BuildMessage>>()));
100100
_teamCityContext.VerifySet(i => i.TeamCityIntegration = true);
101101
_teamCityContext.VerifySet(i => i.TeamCityIntegration = false);
102102
_processResultHandler.Verify(i => i.Handle(_processResult, default(Action<BuildMessage>)));

CSharpInteractive.Tests/CustomMessagesProcessorTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace CSharpInteractive.Tests;
55

66
public class CustomMessagesProcessorTests
77
{
8+
private static readonly ProcessInfo ProcessInfo = new(Mock.Of<IStartInfo>(), Mock.Of<IProcessMonitor>());
89
private static readonly Output Output = new(Mock.Of<IStartInfo>(), false, "", 99);
910
private readonly Mock<IStartInfo> _startInfo = new();
1011

@@ -20,7 +21,7 @@ public void ShouldProcessMessages()
2021
var processor = CreateInstance();
2122

2223
// When
23-
processor.ProcessMessages(output, messages, nextHandler.Object);
24+
processor.ProcessMessages(ProcessInfo, output, messages, nextHandler.Object);
2425

2526
// Then
2627
nextHandler.Verify(i => i(msg1));

CSharpInteractive.Tests/DefaultBuildMessagesProcessorTests.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace CSharpInteractive.Tests;
66

77
public class DefaultBuildMessagesProcessorTests
88
{
9+
private static readonly ProcessInfo ProcessInfo = new(Mock.Of<IStartInfo>(), Mock.Of<IProcessMonitor>());
910
private static readonly Output Output = new(Mock.Of<IStartInfo>(), false, "", 99);
1011
private readonly Mock<ICISettings> _teamCitySettings = new();
1112
private readonly Mock<IProcessOutputWriter> _processOutputWriter = new();
@@ -35,7 +36,7 @@ public void ShouldSendServiceMessagesToTeamCityViaProcessOutputWhenIsUnderTeamCi
3536
var processor = CreateInstance();
3637

3738
// When
38-
processor.ProcessMessages(output, messages, nextHandler.Object);
39+
processor.ProcessMessages(ProcessInfo, output, messages, nextHandler.Object);
3940

4041
// Then
4142
_processOutputWriter.Verify(i => i.Write(output), Times.Exactly(write ? 1 : 0));
@@ -55,11 +56,11 @@ public void ShouldProcessBuildMessageWhenIsNotUnderTeamCity()
5556
var processor = CreateInstance();
5657

5758
// When
58-
processor.ProcessMessages(output, new[] {msg1, msg2}, nextHandler.Object);
59+
processor.ProcessMessages(ProcessInfo, output, new[] {msg1, msg2}, nextHandler.Object);
5960

6061
// Then
61-
_buildMessageLogWriter.Verify(i => i.Write(msg1));
62-
_buildMessageLogWriter.Verify(i => i.Write(msg2));
62+
_buildMessageLogWriter.Verify(i => i.Write(ProcessInfo, msg1));
63+
_buildMessageLogWriter.Verify(i => i.Write(ProcessInfo, msg2));
6364
_processOutputWriter.Verify(i => i.Write(It.IsAny<Output>()), Times.Never);
6465
nextHandler.Verify(i => i(It.IsAny<BuildMessage>()), Times.Never);
6566
}
@@ -77,11 +78,11 @@ public void ShouldProcessBuildMessageWhenHasNotTeamCityServiceMessages()
7778
var processor = CreateInstance();
7879

7980
// When
80-
processor.ProcessMessages(output, new[] {msg1, msg2}, nextHandler.Object);
81+
processor.ProcessMessages(ProcessInfo, output, new[] {msg1, msg2}, nextHandler.Object);
8182

8283
// Then
83-
_buildMessageLogWriter.Verify(i => i.Write(msg1));
84-
_buildMessageLogWriter.Verify(i => i.Write(msg2));
84+
_buildMessageLogWriter.Verify(i => i.Write(ProcessInfo, msg1));
85+
_buildMessageLogWriter.Verify(i => i.Write(ProcessInfo, msg2));
8586
_processOutputWriter.Verify(i => i.Write(It.IsAny<Output>()), Times.Never);
8687
nextHandler.Verify(i => i(It.IsAny<BuildMessage>()), Times.Never);
8788
}

CSharpInteractive/Core/BuildMessageLogWriter.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ namespace CSharpInteractive.Core;
77
internal class BuildMessageLogWriter(
88
ILog<BuildMessageLogWriter> log,
99
[Tag("Default")] IStdOut stdOut,
10-
[Tag("Default")] IStdErr stdErr) : IBuildMessageLogWriter
10+
[Tag("Default")] IStdErr stdErr,
11+
ICommandLineStatisticsRegistry statisticsRegistry)
12+
: IBuildMessageLogWriter
1113
{
12-
public void Write(BuildMessage message)
14+
public void Write(ProcessInfo processInfo, BuildMessage message)
1315
{
1416
// ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault
1517
switch (message.State)
@@ -23,12 +25,16 @@ public void Write(BuildMessage message)
2325
break;
2426

2527
case BuildMessageState.Warning:
26-
log.Warning(message.Text);
28+
var warning = new Text(message.Text, Color.Warning);
29+
statisticsRegistry.RegisterWarning(processInfo, warning);
30+
log.Warning(warning);
2731
break;
2832

2933
case BuildMessageState.Failure:
3034
case BuildMessageState.BuildProblem:
31-
log.Error(ErrorId.Build, message.Text);
35+
var error = new Text(message.Text, Color.Error);
36+
statisticsRegistry.RegisterError(processInfo, error);
37+
log.Error(ErrorId.Build, error);
3238
break;
3339
}
3440
}

CSharpInteractive/Core/BuildRunner.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ public IBuildResult Run(ICommandLine commandLine, Action<BuildMessage>? handler
2828
ArgumentNullException.ThrowIfNull(commandLine);
2929
var buildContext = buildContextFactory();
3030
var startInfo = CreateStartInfo(commandLine);
31-
var processInfo = new ProcessInfo(startInfo, monitorFactory(), output => Handle(handler, output, buildContext));
31+
var processInfo = new ProcessInfo(startInfo, monitorFactory());
32+
var info = processInfo;
33+
processInfo = processInfo.WithHandler(output => Handle(info, handler, output, buildContext));
3234
var processResult = processRunner.Run(processInfo, timeout);
3335
processResultHandler.Handle(processResult, handler);
3436
var buildResult = buildContext.Create(
@@ -42,7 +44,9 @@ public async Task<IBuildResult> RunAsync(ICommandLine commandLine, Action<BuildM
4244
ArgumentNullException.ThrowIfNull(commandLine);
4345
var buildContext = buildContextFactory();
4446
var startInfo = CreateStartInfo(commandLine);
45-
var processInfo = new ProcessInfo(startInfo, monitorFactory(), output => Handle(handler, output, buildContext));
47+
var processInfo = new ProcessInfo(startInfo, monitorFactory());
48+
var info = processInfo;
49+
processInfo = processInfo.WithHandler(output => Handle(info, handler, output, buildContext));
4650
var processResult = await processRunner.RunAsync(processInfo, cancellationToken);
4751
processResultHandler.Handle(processResult, handler);
4852
var buildResult = buildContext.Create(
@@ -64,17 +68,17 @@ private IStartInfo CreateStartInfo(ICommandLine commandLine)
6468
}
6569
}
6670

67-
private void Handle(Action<BuildMessage>? handler, Output output, IBuildContext buildContext)
71+
private void Handle(ProcessInfo processInfo, Action<BuildMessage>? handler, Output output, IBuildContext buildContext)
6872
{
6973
var messages = buildOutputProcessor.Convert(output, buildContext).ToList();
7074
if (handler != default)
7175
{
72-
customBuildMessagesProcessor.ProcessMessages(output, messages, handler);
76+
customBuildMessagesProcessor.ProcessMessages(processInfo, output, messages, handler);
7377
}
7478

7579
if (!output.Handled)
7680
{
77-
defaultBuildMessagesProcessor.ProcessMessages(output, messages, EmptyHandler);
81+
defaultBuildMessagesProcessor.ProcessMessages(processInfo, output, messages, EmptyHandler);
7882
}
7983

8084
output.Handled = true;

CSharpInteractive/Core/CommandLineStatistics.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
internal class CommandLineStatistics : ICommandLineStatisticsRegistry, ICommandLineStatistics
66
{
77
private readonly List<CommandLineInfo> _info = [];
8+
private readonly Dictionary<int, List<Text[]>> _warnings = [];
9+
private readonly Dictionary<int, List<Text[]>> _errors = [];
810

911
public bool IsEmpty => CommandLines.Count == 0;
1012

@@ -26,4 +28,32 @@ public void Register(CommandLineInfo info)
2628
_info.Add(info);
2729
}
2830
}
31+
32+
public void RegisterWarning(ProcessInfo processInfo, Text[] warning)
33+
{
34+
lock (_info)
35+
{
36+
if (!_warnings.TryGetValue(processInfo.RunId, out var warnings))
37+
{
38+
warnings = new List<Text[]>();
39+
_warnings.Add(processInfo.RunId, warnings);
40+
}
41+
42+
warnings.Add(warning);
43+
}
44+
}
45+
46+
public void RegisterError(ProcessInfo processInfo, Text[] error)
47+
{
48+
lock (_info)
49+
{
50+
if (!_errors.TryGetValue(processInfo.RunId, out var errors))
51+
{
52+
errors = new List<Text[]>();
53+
_errors.Add(processInfo.RunId, errors);
54+
}
55+
56+
errors.Add(error);
57+
}
58+
}
2959
}

CSharpInteractive/Core/CustomMessagesProcessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ namespace CSharpInteractive.Core;
55

66
internal class CustomMessagesProcessor : IBuildMessagesProcessor
77
{
8-
public void ProcessMessages(Output output, IReadOnlyCollection<BuildMessage> messages, Action<BuildMessage> nextHandler)
8+
public void ProcessMessages(
9+
ProcessInfo processInfo,
10+
Output output,
11+
IReadOnlyCollection<BuildMessage> messages,
12+
Action<BuildMessage> nextHandler)
913
{
1014
foreach (var buildMessage in messages)
1115
{

CSharpInteractive/Core/DefaultBuildMessagesProcessor.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ internal class DefaultBuildMessagesProcessor(
99
IBuildMessageLogWriter buildMessageLogWriter)
1010
: IBuildMessagesProcessor
1111
{
12-
public void ProcessMessages(Output output, IReadOnlyCollection<BuildMessage> messages, Action<BuildMessage> nextHandler)
12+
public void ProcessMessages(
13+
ProcessInfo processInfo,
14+
Output output,
15+
IReadOnlyCollection<BuildMessage> messages,
16+
Action<BuildMessage> nextHandler)
1317
{
1418
if (ciSettings.CIType == CIType.TeamCity
1519
&& messages.Any(i => i.State is BuildMessageState.ServiceMessage or BuildMessageState.TestResult))
@@ -20,7 +24,7 @@ public void ProcessMessages(Output output, IReadOnlyCollection<BuildMessage> mes
2024
{
2125
foreach (var buildMessage in messages)
2226
{
23-
buildMessageLogWriter.Write(buildMessage);
27+
buildMessageLogWriter.Write(processInfo, buildMessage);
2428
}
2529
}
2630
}

CSharpInteractive/Core/IBuildMessageLogWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ namespace CSharpInteractive.Core;
44

55
internal interface IBuildMessageLogWriter
66
{
7-
void Write(BuildMessage message);
7+
void Write(ProcessInfo processInfo, BuildMessage message);
88
}

CSharpInteractive/Core/IBuildMessagesProcessor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,9 @@ namespace CSharpInteractive.Core;
44

55
internal interface IBuildMessagesProcessor
66
{
7-
void ProcessMessages(Output output, IReadOnlyCollection<BuildMessage> messages, Action<BuildMessage> nextHandler);
7+
void ProcessMessages(
8+
ProcessInfo processInfo,
9+
Output output,
10+
IReadOnlyCollection<BuildMessage> messages,
11+
Action<BuildMessage> nextHandler);
812
}

CSharpInteractive/Core/ICommandLineStatisticsRegistry.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@
33
internal interface ICommandLineStatisticsRegistry
44
{
55
void Register(CommandLineInfo info);
6+
7+
void RegisterWarning(ProcessInfo processInfo, Text[] warning);
8+
9+
void RegisterError(ProcessInfo processInfo, Text[] error);
610
}

0 commit comments

Comments
 (0)