Skip to content

Commit 9045cf7

Browse files
authored
Add BuildOM forward compatibility (#10394)
* Add BuildOM fwd compatibility * Add tests guarding the fwd compat
1 parent 486dbb4 commit 9045cf7

File tree

5 files changed

+188
-1
lines changed

5 files changed

+188
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System;
5+
using System.Reflection;
6+
using Microsoft.Build.Execution;
7+
using Microsoft.Build.Graph;
8+
using Shouldly;
9+
using Xunit;
10+
11+
namespace Microsoft.Build.Engine.UnitTests.BackEnd
12+
{
13+
public class BuildOMCompatibility_Tests
14+
{
15+
[Theory]
16+
[InlineData("ProjectInstance")]
17+
[InlineData("ProjectFullPath")]
18+
[InlineData("TargetNames")]
19+
[InlineData("Flags")]
20+
[InlineData("GlobalProperties")]
21+
[InlineData("ExplicitlySpecifiedToolsVersion")]
22+
[InlineData("HostServices")]
23+
[InlineData("PropertiesToTransfer")]
24+
[InlineData("RequestedProjectState")]
25+
public void BuildRequestDataPropertyCompatTest(string propertyName)
26+
=> VerifyPropertyExists(typeof(BuildRequestData), propertyName);
27+
28+
[Theory]
29+
[InlineData("ProjectGraph")]
30+
[InlineData("ProjectGraphEntryPoints")]
31+
[InlineData("TargetNames")]
32+
[InlineData("Flags")]
33+
[InlineData("GraphBuildOptions")]
34+
[InlineData("HostServices")]
35+
public void GraphBuildRequestDataPropertyCompatTest(string propertyName)
36+
=> VerifyPropertyExists(typeof(GraphBuildRequestData), propertyName);
37+
38+
[Theory]
39+
[InlineData("BuildManager")]
40+
[InlineData("SubmissionId")]
41+
[InlineData("AsyncContext")]
42+
[InlineData("WaitHandle")]
43+
[InlineData("IsCompleted")]
44+
[InlineData("BuildResult")]
45+
public void BuildSubmissionDataPropertyCompatTest(string propertyName)
46+
=> VerifyPropertyExists(typeof(BuildSubmission), propertyName);
47+
48+
[Theory]
49+
[InlineData("Execute")]
50+
[InlineData("ExecuteAsync")]
51+
public void BuildSubmissionDataMethodCompatTest(string methodName)
52+
=> VerifyMethodExists(typeof(BuildSubmission), methodName);
53+
54+
[Theory]
55+
[InlineData("BuildManager")]
56+
[InlineData("SubmissionId")]
57+
[InlineData("AsyncContext")]
58+
[InlineData("WaitHandle")]
59+
[InlineData("IsCompleted")]
60+
[InlineData("BuildResult")]
61+
public void GraphBuildSubmissionDataPropertyCompatTest(string propertyName)
62+
=> VerifyPropertyExists(typeof(BuildSubmission), propertyName);
63+
64+
[Theory]
65+
[InlineData("Execute")]
66+
[InlineData("ExecuteAsync")]
67+
public void GraphBuildSubmissionDataMethodCompatTest(string methodName)
68+
=> VerifyMethodExists(typeof(BuildSubmission), methodName);
69+
70+
[Theory]
71+
[InlineData("SubmissionId")]
72+
[InlineData("ConfigurationId")]
73+
[InlineData("GlobalRequestId")]
74+
[InlineData("ParentGlobalRequestId")]
75+
[InlineData("NodeRequestId")]
76+
[InlineData("Exception")]
77+
[InlineData("CircularDependency")]
78+
[InlineData("OverallResult")]
79+
[InlineData("ResultsByTarget")]
80+
[InlineData("ProjectStateAfterBuild")]
81+
[InlineData("BuildRequestDataFlags")]
82+
public void BuildResultPropertyCompatTest(string propertyName)
83+
=> VerifyPropertyExists(typeof(BuildResult), propertyName);
84+
85+
[Theory]
86+
[InlineData("AddResultsForTarget")]
87+
[InlineData("MergeResults")]
88+
[InlineData("HasResultsForTarget")]
89+
public void BuildResultMethodCompatTest(string methodName)
90+
=> VerifyMethodExists(typeof(BuildResult), methodName);
91+
92+
[Theory]
93+
[InlineData("SubmissionId")]
94+
[InlineData("Exception")]
95+
[InlineData("CircularDependency")]
96+
[InlineData("OverallResult")]
97+
[InlineData("ResultsByNode")]
98+
public void GraphBuildResultPropertyCompatTest(string propertyName)
99+
=> VerifyPropertyExists(typeof(GraphBuildResult), propertyName);
100+
101+
private void VerifyPropertyExists(Type type, string propertyName)
102+
{
103+
type.GetProperty(
104+
propertyName,
105+
BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
106+
.ShouldNotBeNull();
107+
}
108+
109+
private void VerifyMethodExists(Type type, string propertyName)
110+
{
111+
type.GetMethod(
112+
propertyName,
113+
BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
114+
.ShouldNotBeNull();
115+
}
116+
}
117+
}

src/Build/BackEnd/BuildManager/BuildRequestData.cs

+13
Original file line numberDiff line numberDiff line change
@@ -301,5 +301,18 @@ internal override BuildSubmissionBase<BuildRequestData, BuildResult> CreateSubmi
301301
/// <inheritdoc cref="BuildRequestDataBase"/>
302302
public override IReadOnlyDictionary<string, string?> GlobalPropertiesLookup => _globalPropertiesLookup ??=
303303
Execution.GlobalPropertiesLookup.ToGlobalPropertiesLookup(GlobalPropertiesDictionary);
304+
305+
// WARNING!: Do not remove the below proxy properties.
306+
// They are required to make the OM forward compatible
307+
// (code built against this OM should run against binaries with previous version of OM).
308+
309+
/// <inheritdoc cref="BuildRequestDataBase.TargetNames"/>
310+
public new ICollection<string> TargetNames => base.TargetNames;
311+
312+
/// <inheritdoc cref="BuildRequestDataBase.Flags"/>
313+
public new BuildRequestDataFlags Flags => base.Flags;
314+
315+
/// <inheritdoc cref="BuildRequestDataBase.HostServices"/>
316+
public new HostServices? HostServices => base.HostServices;
304317
}
305318
}

src/Build/BackEnd/BuildManager/BuildSubmission.cs

+22
Original file line numberDiff line numberDiff line change
@@ -232,5 +232,27 @@ protected internal override void OnCompletition()
232232
BuildResult.SetOverallResult(overallResult: false);
233233
}
234234
}
235+
236+
// WARNING!: Do not remove the below proxy properties.
237+
// They are required to make the OM forward compatible
238+
// (code built against this OM should run against binaries with previous version of OM).
239+
240+
/// <inheritdoc cref="BuildSubmissionBase{BuildRequestData, BuildResult}.BuildResult"/>
241+
public new BuildResult? BuildResult => base.BuildResult;
242+
243+
/// <inheritdoc cref="BuildSubmissionBase.BuildManager"/>
244+
public new BuildManager BuildManager => base.BuildManager;
245+
246+
/// <inheritdoc cref="BuildSubmissionBase.SubmissionId"/>
247+
public new int SubmissionId => base.SubmissionId;
248+
249+
/// <inheritdoc cref="BuildSubmissionBase.AsyncContext"/>
250+
public new object? AsyncContext => base.AsyncContext;
251+
252+
/// <inheritdoc cref="BuildSubmissionBase.WaitHandle"/>
253+
public new WaitHandle WaitHandle => base.WaitHandle;
254+
255+
/// <inheritdoc cref="BuildSubmissionBase.IsCompleted"/>
256+
public new bool IsCompleted => base.IsCompleted;
235257
}
236258
}

src/Build/Graph/GraphBuildRequestData.cs

+14-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public GraphBuildRequestData(IEnumerable<ProjectGraphEntryPoint> projectGraphEnt
167167
private GraphBuildRequestData(ICollection<string> targetsToBuild, HostServices? hostServices, BuildRequestDataFlags flags, GraphBuildOptions? graphBuildOptions = null)
168168
: base(targetsToBuild, flags, hostServices)
169169
{
170-
Flags = flags;
170+
base.Flags = flags;
171171
GraphBuildOptions = graphBuildOptions ?? new GraphBuildOptions();
172172
}
173173

@@ -235,5 +235,18 @@ public override IEnumerable<string> EntryProjectsFullPath
235235
/// Options for how the graph should be built.
236236
/// </summary>
237237
public GraphBuildOptions GraphBuildOptions { get; }
238+
239+
// WARNING!: Do not remove the below proxy properties.
240+
// They are required to make the OM forward compatible
241+
// (code built against this OM should run against binaries with previous version of OM).
242+
243+
/// <inheritdoc cref="BuildRequestDataBase.TargetNames"/>
244+
public new ICollection<string> TargetNames => base.TargetNames;
245+
246+
/// <inheritdoc cref="BuildRequestDataBase.Flags"/>
247+
public new BuildRequestDataFlags Flags => base.Flags;
248+
249+
/// <inheritdoc cref="BuildRequestDataBase.HostServices"/>
250+
public new HostServices? HostServices => base.HostServices;
238251
}
239252
}

src/Build/Graph/GraphBuildSubmission.cs

+22
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,27 @@ protected internal override void CheckResultValidForCompletion(GraphBuildResult
7070

7171
protected internal override GraphBuildResult CreateFailedResult(Exception exception)
7272
=> new(SubmissionId, exception);
73+
74+
// WARNING!: Do not remove the below proxy properties.
75+
// They are required to make the OM forward compatible
76+
// (code built against this OM should run against binaries with previous version of OM).
77+
78+
/// <inheritdoc cref="BuildSubmissionBase{GraphBuildRequestData, GraphBuildResult}.BuildResult"/>
79+
public new GraphBuildResult? BuildResult => base.BuildResult;
80+
81+
/// <inheritdoc cref="BuildSubmissionBase.BuildManager"/>
82+
public new BuildManager BuildManager => base.BuildManager;
83+
84+
/// <inheritdoc cref="BuildSubmissionBase.SubmissionId"/>
85+
public new int SubmissionId => base.SubmissionId;
86+
87+
/// <inheritdoc cref="BuildSubmissionBase.AsyncContext"/>
88+
public new object? AsyncContext => base.AsyncContext;
89+
90+
/// <inheritdoc cref="BuildSubmissionBase.WaitHandle"/>
91+
public new WaitHandle WaitHandle => base.WaitHandle;
92+
93+
/// <inheritdoc cref="BuildSubmissionBase.IsCompleted"/>
94+
public new bool IsCompleted => base.IsCompleted;
7395
}
7496
}

0 commit comments

Comments
 (0)