-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
GivenThatWeWantToPublishANetCoreAppForTelemetry.cs
160 lines (143 loc) · 7.4 KB
/
GivenThatWeWantToPublishANetCoreAppForTelemetry.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using FluentAssertions;
using Microsoft.NET.Build.Tests;
using Microsoft.NET.TestFramework;
using Microsoft.NET.TestFramework.Assertions;
using Microsoft.NET.TestFramework.Commands;
using Microsoft.NET.TestFramework.ProjectConstruction;
using Xunit;
using Xunit.Abstractions;
namespace Microsoft.NET.Publish.Tests
{
public class GivenThatWeWantToPublishANetCoreAppForTelemetry : SdkTest
{
public GivenThatWeWantToPublishANetCoreAppForTelemetry(ITestOutputHelper log) : base(log)
{
}
[CoreMSBuildOnlyTheory]
[InlineData(ToolsetInfo.CurrentTargetFramework)]
public void It_collects_empty_Trimmer_SingleFile_ReadyToRun_Aot_publishing_properties(string targetFramework)
{
Type loggerType = typeof(LogTelemetryToStdOutForTest);
var TelemetryTestLogger = new[]
{
$"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}"
};
var testProject = CreateTestProject(targetFramework, "PlainProject");
var testProjectInstance = _testAssetsManager.CreateTestProject(testProject);
var publishCommand = new PublishCommand(testProjectInstance);
publishCommand.Execute(TelemetryTestLogger).StdOut.Should().Contain(
"{\"EventName\":\"PublishProperties\",\"Properties\":{\"PublishReadyToRun\":\"null\",\"PublishTrimmed\":\"null\",\"PublishSingleFile\":\"null\",\"PublishAot\":\"null\",\"PublishProtocol\":\"null\"}");
}
[CoreMSBuildOnlyTheory]
[InlineData(ToolsetInfo.CurrentTargetFramework)]
public void It_collects_Trimmer_SingleFile_ReadyToRun_publishing_properties(string targetFramework)
{
Type loggerType = typeof(LogTelemetryToStdOutForTest);
var TelemetryTestLogger = new[]
{
$"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}"
};
var testProject = CreateTestProject(targetFramework, "TrimmedR2RSingleFileProject", true, true, true);
var testProjectInstance = _testAssetsManager.CreateTestProject(testProject);
var publishCommand = new PublishCommand(testProjectInstance);
string s = publishCommand.Execute(TelemetryTestLogger).StdOut;//.Should()
s.Should().Contain(
"{\"EventName\":\"PublishProperties\",\"Properties\":{\"PublishReadyToRun\":\"True\",\"PublishTrimmed\":\"True\",\"PublishSingleFile\":\"True\",\"PublishAot\":\"null\",\"PublishProtocol\":\"null\"}");
s.Should().Contain(
"{\"EventName\":\"ReadyToRun\",\"Properties\":{\"PublishReadyToRunUseCrossgen2\":\"true\",")
.And.MatchRegex(
"\"Crossgen2PackVersion\":\"[5-9]\\..+\"");
s.Should().Contain(
"\"FailedCount\":\"0\"");
s.Should().MatchRegex(
"\"CompileListCount\":\"[1-9]\\d?\""); // Do not hardcode number of assemblies being compiled here, due to ILTrimmer
}
[CoreMSBuildOnlyTheory]
[InlineData(ToolsetInfo.CurrentTargetFramework)]
void It_collects_crossgen2_publishing_properties(string targetFramework)
{
// Crossgen2 only supported for Linux/Windows x64 scenarios for now
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.OSArchitecture != Architecture.X64)
return;
Type loggerType = typeof(LogTelemetryToStdOutForTest);
var TelemetryTestLogger = new[]
{
$"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}"
};
var testProject = CreateTestProject(targetFramework, "TrimmedR2RSingleFileProject", r2r: true);
testProject.AdditionalProperties["PublishReadyToRunUseCrossgen2"] = "True";
var testProjectInstance = _testAssetsManager.CreateTestProject(testProject);
var publishCommand = new PublishCommand(testProjectInstance);
publishCommand.Execute(TelemetryTestLogger).StdOut.Should()
.Contain(
"{\"EventName\":\"PublishProperties\",\"Properties\":{\"PublishReadyToRun\":\"True\",\"PublishTrimmed\":\"null\",\"PublishSingleFile\":\"null\",\"PublishAot\":\"null\",\"PublishProtocol\":\"null\"}")
.And.Contain(
"{\"EventName\":\"ReadyToRun\",\"Properties\":{\"PublishReadyToRunUseCrossgen2\":\"true\",")
.And.MatchRegex(
"\"Crossgen2PackVersion\":\"[5-9]\\..+\"")
.And.Contain(
"\"CompileListCount\":\"1\",\"FailedCount\":\"0\"");
}
[CoreMSBuildOnlyTheory]
[InlineData(ToolsetInfo.CurrentTargetFramework)]
public void It_collects_Aot_publishing_properties(string targetFramework)
{
// NativeAOT is only supported on Linux/Windows x64 scenarios for now
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.OSArchitecture != Architecture.X64)
return;
Type loggerType = typeof(LogTelemetryToStdOutForTest);
var TelemetryTestLogger = new[]
{
$"/Logger:{loggerType.FullName},{loggerType.GetTypeInfo().Assembly.Location}"
};
// NativeAOT compilation requires PublishTrimmed and will be set to true if not set by the user
var rid = EnvironmentInfo.GetCompatibleRid(targetFramework);
var testProject = CreateTestProject(targetFramework, "AotProject", aot: true);
testProject.AdditionalProperties["RuntimeIdentifier"] = rid;
var testProjectInstance = _testAssetsManager.CreateTestProject(testProject);
var publishCommand = new PublishCommand(testProjectInstance);
publishCommand.Execute(TelemetryTestLogger).StdOut.Should().Contain(
"{\"EventName\":\"PublishProperties\",\"Properties\":{\"PublishReadyToRun\":\"null\",\"PublishTrimmed\":\"true\",\"PublishSingleFile\":\"null\",\"PublishAot\":\"True\",\"PublishProtocol\":\"null\"}");
}
private TestProject CreateTestProject(string targetFramework, string projectName, bool trimmer = false, bool r2r = false, bool singleFile = false, bool aot = false)
{
var testProject = new TestProject()
{
Name = projectName,
TargetFrameworks = targetFramework,
IsExe = true,
RuntimeIdentifier = EnvironmentInfo.GetCompatibleRid(targetFramework)
};
if (r2r)
{
testProject.AdditionalProperties["PublishReadyToRun"] = "True";
}
if (trimmer)
{
testProject.AdditionalProperties["PublishTrimmed"] = "True";
}
if (singleFile)
{
testProject.AdditionalProperties["PublishSingleFile"] = "True";
}
if (aot)
{
testProject.AdditionalProperties["PublishAot"] = "True";
}
testProject.SourceFiles[$"{projectName}.cs"] = @"
using System;
public class Program
{
public static void Main()
{
Console.WriteLine(""Hello world"");
}
}";
return testProject;
}
}
}