Skip to content

Commit 0627131

Browse files
authored
Change how logging is gathered (#147)
Also add a new `For()` method Add some tests to make sure all logging messages are gathered
1 parent cf2e76d commit 0627131

File tree

8 files changed

+99
-48
lines changed

8 files changed

+99
-48
lines changed

src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/BuildTests.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,59 @@ public void BuildWithGlobalProperties()
8080
buildOutputWithGlobalProperties.MessageEvents.High.ShouldHaveSingleItem(buildOutputWithGlobalProperties.GetConsoleLog()).Message.ShouldBe("Value = D7BBABDFB2D142D3A75E0C1A33E33780", buildOutputWithGlobalProperties.GetConsoleLog());
8181
}
8282

83+
[Fact]
84+
public void BuildOutputContainsOutOfProcMessages()
85+
{
86+
const int messageCount = 100;
87+
88+
List<ProjectCreator> projects = new List<ProjectCreator>(messageCount);
89+
90+
for (int i = 0; i < messageCount; i++)
91+
{
92+
FileInfo projectPath = new FileInfo(Path.Combine(TestRootPath, $"Project{i}", $"Project{i}.proj"));
93+
94+
projectPath.Directory!.Create();
95+
96+
projects.Add(
97+
ProjectCreator.Create()
98+
.Target("Build")
99+
.TaskMessage($"Message {i}", MessageImportance.High)
100+
.Save(projectPath.FullName));
101+
}
102+
103+
ProjectCreator.Create(path: GetTempProjectPath())
104+
.ForEach(projects, (project, creator) => creator.ItemProjectReference(project))
105+
.Target("Build")
106+
.Task("MSBuild", parameters: new Dictionary<string, string>
107+
{
108+
["Projects"] = "@(ProjectReference)",
109+
["BuildInParallel"] = bool.TrueString,
110+
})
111+
.Save()
112+
.TryBuild(out bool result, out BuildOutput buildOutput);
113+
114+
result.ShouldBeTrue(buildOutput.GetConsoleLog());
115+
116+
buildOutput.IsShutdown.ShouldBeTrue(buildOutput.GetConsoleLog());
117+
118+
buildOutput.MessageEvents.High.Count.ShouldBe(messageCount, buildOutput.GetConsoleLog());
119+
}
120+
121+
[Fact]
122+
public void BuildOutputIsComplete()
123+
{
124+
ProjectCreator.Create()
125+
.Target("Build")
126+
.For(100, (i, creator) => creator.TaskMessage($"Message {i}", MessageImportance.High))
127+
.TryBuild(out bool result, out BuildOutput buildOutput);
128+
129+
result.ShouldBeTrue(buildOutput.GetConsoleLog());
130+
131+
buildOutput.IsShutdown.ShouldBeTrue();
132+
133+
buildOutput.MessageEvents.High.Count.ShouldBe(100, buildOutput.GetConsoleLog());
134+
}
135+
83136
[Fact]
84137
public void CanBuildLotsOfProjects()
85138
{

src/Microsoft.Build.Utilities.ProjectCreation/BuildManagerHost.cs

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -144,32 +144,12 @@ private static BuildResult Build(BuildRequestData buildRequestData, IEnumerable<
144144
{
145145
lock (LockObject)
146146
{
147-
MuxLogger muxLogger = new MuxLogger
148-
{
149-
Verbosity = LoggerVerbosity.Diagnostic,
150-
};
151-
152147
BuildParameters buildParameters = new BuildParameters
153148
{
154149
EnableNodeReuse = false,
155150
MaxNodeCount = Environment.ProcessorCount,
156151
ResetCaches = true,
157-
};
158-
159-
LoggerDescription forwardingLoggerDescription = new LoggerDescription(
160-
loggerClassName: typeof(ConfigurableForwardingLogger).FullName,
161-
loggerAssemblyName: typeof(ConfigurableForwardingLogger).Assembly.GetName().FullName,
162-
loggerAssemblyFile: null,
163-
loggerSwitchParameters: string.Empty,
164-
verbosity: muxLogger.Verbosity);
165-
166-
ForwardingLoggerRecord forwardingLoggerRecord = new ForwardingLoggerRecord(
167-
muxLogger,
168-
forwardingLoggerDescription);
169-
170-
buildParameters.ForwardingLoggers = new[]
171-
{
172-
forwardingLoggerRecord,
152+
Loggers = loggers,
173153
};
174154

175155
BuildManager.DefaultBuildManager.BeginBuild(buildParameters);
@@ -178,28 +158,16 @@ private static BuildResult Build(BuildRequestData buildRequestData, IEnumerable<
178158
{
179159
BuildSubmission buildSubmission = BuildManager.DefaultBuildManager.PendBuildRequest(buildRequestData);
180160

181-
foreach (ILogger logger in loggers)
182-
{
183-
muxLogger.RegisterLogger(buildSubmission.SubmissionId, logger);
184-
}
185-
186-
try
187-
{
188-
SetCurrentHost(BuildManager.DefaultBuildManager);
161+
SetCurrentHost(BuildManager.DefaultBuildManager);
189162

190-
BuildResult buildResult = buildSubmission.Execute();
163+
BuildResult buildResult = buildSubmission.Execute();
191164

192-
if (buildResult.Exception != null)
193-
{
194-
throw buildResult.Exception;
195-
}
196-
197-
return buildResult;
198-
}
199-
finally
165+
if (buildResult.Exception != null)
200166
{
201-
muxLogger.UnregisterLoggers(buildSubmission.SubmissionId);
167+
throw buildResult.Exception;
202168
}
169+
170+
return buildResult;
203171
}
204172
finally
205173
{

src/Microsoft.Build.Utilities.ProjectCreation/BuildOutput.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ private BuildOutput()
2929
Parameters = string.Empty;
3030
}
3131

32+
/// <summary>
33+
/// Gets a value indicating whether or not the build output is shut down.
34+
/// </summary>
35+
public bool IsShutdown { get; private set; }
36+
3237
/// <inheritdoc cref="ILogger.Parameters" />
3338
public string Parameters { get; set; }
3439

@@ -73,6 +78,7 @@ public void Initialize(IEventSource eventSource)
7378
/// <inheritdoc cref="ILogger.Shutdown" />
7479
public void Shutdown()
7580
{
81+
IsShutdown = true;
7682
}
7783

7884
private void OnAnyEventRaised(object sender, BuildEventArgs e)

src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Linq.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,30 @@ namespace Microsoft.Build.Utilities.ProjectCreation
99
{
1010
public partial class ProjectCreator
1111
{
12+
/// <summary>
13+
/// Executes the specified action the specified number of times.
14+
/// </summary>
15+
/// <param name="count">The number of times to execute the action</param>
16+
/// <param name="action">An <see cref="Action{T1, T2}" /> that is called the specified number of times.</param>
17+
/// <returns>The current <see cref="ProjectCreator" />.</returns>
18+
public ProjectCreator For(int count, Action<int, ProjectCreator> action)
19+
{
20+
for (int i = 0; i < count; i++)
21+
{
22+
action(i, this);
23+
}
24+
25+
return this;
26+
}
27+
1228
/// <summary>
1329
/// Executes the specified action for each item in a list.
1430
/// </summary>
1531
/// <typeparam name="T">The type of the item.</typeparam>
1632
/// <param name="source">An <see cref="IEnumerable{T}" /> containing items to iterate through.</param>
1733
/// <param name="action">An <see cref="Action{T, ProjectCreator}" /> to execute against the current <see cref="ProjectCreator" />.</param>
1834
/// <returns>The current <see cref="ProjectCreator" />.</returns>
19-
public ProjectCreator ForEach<T>(IEnumerable<T> source, Action<T, ProjectCreator> action)
35+
public ProjectCreator ForEach<T>(IEnumerable<T>? source, Action<T, ProjectCreator> action)
2036
{
2137
if (source != null)
2238
{

src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
1+
Microsoft.Build.Utilities.ProjectCreation.BuildOutput.IsShutdown.get -> bool
2+
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
23
Microsoft.Build.Utilities.ProjectCreation.Package.Compare(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> int
34
Microsoft.Build.Utilities.ProjectCreation.Package.CompareTo(Microsoft.Build.Utilities.ProjectCreation.Package? other) -> int
45
Microsoft.Build.Utilities.ProjectCreation.Package.Equals(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> bool
@@ -73,7 +74,8 @@ Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Package(string! name
7374
Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Packages.get -> System.Collections.Generic.IReadOnlyCollection<Microsoft.Build.Utilities.ProjectCreation.Package!>!
7475
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Choose(string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7576
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.CustomAction(System.Action<Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>? projectCreator) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
76-
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>! source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
77+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.For(int count, System.Action<int, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
78+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>? source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7779
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.FullPath.get -> string!
7880
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Construction.ProjectRootElement! projectRootElement, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7981
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Evaluation.Project! project, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!

src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net5.0/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
1+
Microsoft.Build.Utilities.ProjectCreation.BuildOutput.IsShutdown.get -> bool
2+
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
23
Microsoft.Build.Utilities.ProjectCreation.Package.Compare(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> int
34
Microsoft.Build.Utilities.ProjectCreation.Package.CompareTo(Microsoft.Build.Utilities.ProjectCreation.Package? other) -> int
45
Microsoft.Build.Utilities.ProjectCreation.Package.Equals(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> bool
@@ -73,7 +74,8 @@ Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Package(string! name
7374
Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Packages.get -> System.Collections.Generic.IReadOnlyCollection<Microsoft.Build.Utilities.ProjectCreation.Package!>!
7475
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Choose(string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7576
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.CustomAction(System.Action<Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>? projectCreator) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
76-
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>! source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
77+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.For(int count, System.Action<int, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
78+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>? source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7779
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.FullPath.get -> string!
7880
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Construction.ProjectRootElement! projectRootElement, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7981
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Evaluation.Project! project, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!

src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net6.0/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
1+
Microsoft.Build.Utilities.ProjectCreation.BuildOutput.IsShutdown.get -> bool
2+
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
23
Microsoft.Build.Utilities.ProjectCreation.Package.Compare(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> int
34
Microsoft.Build.Utilities.ProjectCreation.Package.CompareTo(Microsoft.Build.Utilities.ProjectCreation.Package? other) -> int
45
Microsoft.Build.Utilities.ProjectCreation.Package.Equals(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> bool
@@ -73,7 +74,8 @@ Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Package(string! name
7374
Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Packages.get -> System.Collections.Generic.IReadOnlyCollection<Microsoft.Build.Utilities.ProjectCreation.Package!>!
7475
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Choose(string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7576
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.CustomAction(System.Action<Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>? projectCreator) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
76-
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>! source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
77+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.For(int count, System.Action<int, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
78+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>? source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7779
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.FullPath.get -> string!
7880
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Construction.ProjectRootElement! projectRootElement, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7981
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Evaluation.Project! project, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!

src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/netcoreapp3.1/PublicAPI.Unshipped.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
1+
Microsoft.Build.Utilities.ProjectCreation.BuildOutput.IsShutdown.get -> bool
2+
Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods
23
Microsoft.Build.Utilities.ProjectCreation.Package.Compare(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> int
34
Microsoft.Build.Utilities.ProjectCreation.Package.CompareTo(Microsoft.Build.Utilities.ProjectCreation.Package? other) -> int
45
Microsoft.Build.Utilities.ProjectCreation.Package.Equals(Microsoft.Build.Utilities.ProjectCreation.Package? x, Microsoft.Build.Utilities.ProjectCreation.Package? y) -> bool
@@ -73,7 +74,8 @@ Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Package(string! name
7374
Microsoft.Build.Utilities.ProjectCreation.PackageRepository.Packages.get -> System.Collections.Generic.IReadOnlyCollection<Microsoft.Build.Utilities.ProjectCreation.Package!>!
7475
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Choose(string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7576
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.CustomAction(System.Action<Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>? projectCreator) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
76-
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>! source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
77+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.For(int count, System.Action<int, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
78+
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.ForEach<T>(System.Collections.Generic.IEnumerable<T>? source, System.Action<T, Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!>! action) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7779
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.FullPath.get -> string!
7880
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Construction.ProjectRootElement! projectRootElement, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!
7981
Microsoft.Build.Utilities.ProjectCreation.ProjectCreator.Import(Microsoft.Build.Evaluation.Project! project, string? condition = null, bool conditionOnExistence = false, string? label = null) -> Microsoft.Build.Utilities.ProjectCreation.ProjectCreator!

0 commit comments

Comments
 (0)