diff --git a/src/package/nuspec/Microsoft.TestPlatform.TestHost.NetCore.props b/src/package/nuspec/Microsoft.TestPlatform.TestHost.NetCore.props index fd9adc4d16..a33990d7a3 100644 --- a/src/package/nuspec/Microsoft.TestPlatform.TestHost.NetCore.props +++ b/src/package/nuspec/Microsoft.TestPlatform.TestHost.NetCore.props @@ -12,7 +12,7 @@ False - + testhost.exe PreserveNewest diff --git a/src/vstest.console/CommandLine/InferHelper.cs b/src/vstest.console/CommandLine/InferHelper.cs index f9dda8b734..1168cec2fb 100644 --- a/src/vstest.console/CommandLine/InferHelper.cs +++ b/src/vstest.console/CommandLine/InferHelper.cs @@ -27,9 +27,9 @@ internal InferHelper(IAssemblyMetadataProvider assemblyMetadataProvider) /// /// Determines Architecture from sources. /// - public Architecture AutoDetectArchitecture(List sources, IDictionary sourcePlatforms) + public Architecture AutoDetectArchitecture(List sources, IDictionary sourcePlatforms, Architecture defaultArchitecture) { - Architecture architecture = Constants.DefaultPlatform; + var architecture = defaultArchitecture; try { if (sources != null && sources.Count > 0) @@ -64,7 +64,7 @@ public Architecture AutoDetectArchitecture(List sources, IDictionary sou var loggerRunSettings = XmlRunSettingsUtilities.GetLoggerRunSettings(runsettingsXml) ?? new LoggerRunSettings(); settingsUpdated |= this.UpdateFramework(document, navigator, sources, sourceFrameworks, registrar, out Framework chosenFramework); - settingsUpdated |= this.UpdatePlatform(document, navigator, sources, sourcePlatforms, out Architecture chosenPlatform); + + // Choose default architecture based on the framework + // For .NET core, the default platform architecture should be x64. + var defaultArchitecture = chosenFramework.Name.IndexOf("netstandard", StringComparison.OrdinalIgnoreCase) >= 0 + || chosenFramework.Name.IndexOf("netcoreapp", StringComparison.OrdinalIgnoreCase) >= 0 ? Architecture.X64 : Architecture.X86; + + settingsUpdated |= this.UpdatePlatform(document, navigator, sources, sourcePlatforms, defaultArchitecture, out Architecture chosenPlatform); this.CheckSourcesForCompatibility(chosenFramework, chosenPlatform, sourcePlatforms, sourceFrameworks, registrar); settingsUpdated |= this.UpdateDesignMode(document, runConfiguration); settingsUpdated |= this.UpdateCollectSourceInformation(document, runConfiguration); @@ -460,10 +466,10 @@ private void CheckSourcesForCompatibility(Framework chosenFramework, Architectur } } - private bool UpdatePlatform(XmlDocument document, XPathNavigator navigator, List sources, IDictionary sourcePlatforms, out Architecture chosenPlatform) + private bool UpdatePlatform(XmlDocument document, XPathNavigator navigator, List sources, IDictionary sourcePlatforms, Architecture defaultArchitecture, out Architecture chosenPlatform) { // Get platform from sources - var inferedPlatform = inferHelper.AutoDetectArchitecture(sources, sourcePlatforms); + var inferedPlatform = inferHelper.AutoDetectArchitecture(sources, sourcePlatforms, defaultArchitecture); // Get platform from runsettings bool updatePlatform = IsAutoPlatformDetectRequired(navigator, out chosenPlatform); diff --git a/test/vstest.console.UnitTests/CommandLine/InferHelperTests.cs b/test/vstest.console.UnitTests/CommandLine/InferHelperTests.cs index 4c35efddd4..900a5e2593 100644 --- a/test/vstest.console.UnitTests/CommandLine/InferHelperTests.cs +++ b/test/vstest.console.UnitTests/CommandLine/InferHelperTests.cs @@ -19,6 +19,7 @@ public class InferHelperTests private readonly Mock mockAssemblyHelper; private InferHelper inferHelper; private readonly Framework defaultFramework = Framework.DefaultFramework; + private readonly Architecture DefaultArchitecture = Architecture.X64; private readonly Framework frameworkNet45 = Framework.FromString(".NETFramework,Version=4.5"); private readonly Framework frameworkNet46 = Framework.FromString(".NETFramework,Version=4.6"); private readonly Framework frameworkNet47 = Framework.FromString(".NETFramework,Version=4.7"); @@ -38,46 +39,46 @@ public InferHelperTests() [TestMethod] public void AutoDetectArchitectureShouldReturnDefaultArchitectureOnNullSources() { - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(null, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(null, sourceArchitectures, DefaultArchitecture)); } [TestMethod] public void AutoDetectArchitectureShouldReturnDefaultArchitectureOnEmptySources() { - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List(0), sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List(0), sourceArchitectures, DefaultArchitecture)); } [TestMethod] public void AutoDetectArchitectureShouldReturnDefaultArchitectureOnNullItemInSources() { - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List(){null}, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List(){null}, sourceArchitectures, DefaultArchitecture)); } [TestMethod] public void AutoDetectArchitectureShouldReturnDefaultArchitectureOnWhiteSpaceItemInSources() { - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List() { " "}, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List() { " "}, sourceArchitectures, DefaultArchitecture)); } [TestMethod] public void AutoDetectArchitectureShouldReturnCorrectArchForOneSource() { this.mockAssemblyHelper.Setup(ah => ah.GetArchitecture(It.IsAny())).Returns(Architecture.X86); - Assert.AreEqual(Architecture.X86, inferHelper.AutoDetectArchitecture(new List(){"1.dll"}, sourceArchitectures)); + Assert.AreEqual(Architecture.X86, inferHelper.AutoDetectArchitecture(new List(){"1.dll"}, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny())); } [TestMethod] public void AutoDetectArchitectureShouldReturnCorrectDefaultArchForNotDotNetAssembly() { - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List() { "NotDotNetAssebly.appx" }, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List() { "NotDotNetAssebly.appx" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Never); } [TestMethod] public void AutoDetectArchitectureShouldSetAnyCpuArchForNotDotNetAssembly() { - inferHelper.AutoDetectArchitecture(new List() { "NotDotNetAssebly.appx" }, sourceArchitectures); + inferHelper.AutoDetectArchitecture(new List() { "NotDotNetAssebly.appx" }, sourceArchitectures, DefaultArchitecture); Assert.AreEqual(Architecture.AnyCPU, sourceArchitectures["NotDotNetAssebly.appx"]); } @@ -86,7 +87,7 @@ public void AutoDetectArchitectureShouldReturnDefaultArchForAllAnyCpuAssemblies( { this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.AnyCPU).Returns(Architecture.AnyCPU).Returns(Architecture.AnyCPU); - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "AnyCPU2.exe", "AnyCPU3.dll" }, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "AnyCPU2.exe", "AnyCPU3.dll" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Exactly(3)); } @@ -95,7 +96,7 @@ public void AutoDetectArchitectureShouldReturnX86ArchIfOneX86AssemblyAndRestAnyC { this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.AnyCPU).Returns(Architecture.AnyCPU).Returns(Architecture.X86); - Assert.AreEqual(Architecture.X86, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "AnyCPU2.exe", "x86.dll" }, sourceArchitectures)); + Assert.AreEqual(Architecture.X86, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "AnyCPU2.exe", "x86.dll" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Exactly(3)); } @@ -104,7 +105,7 @@ public void AutoDetectArchitectureShouldReturnARMArchIfOneARMAssemblyAndRestAnyC { this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.ARM).Returns(Architecture.ARM).Returns(Architecture.ARM); - Assert.AreEqual(Architecture.ARM, inferHelper.AutoDetectArchitecture(new List() { "ARM1.dll", "ARM2.dll", "ARM3.dll" }, sourceArchitectures)); + Assert.AreEqual(Architecture.ARM, inferHelper.AutoDetectArchitecture(new List() { "ARM1.dll", "ARM2.dll", "ARM3.dll" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Exactly(3)); } @@ -113,7 +114,7 @@ public void AutoDetectArchitectureShouldReturnX64ArchIfOneX64AssemblyAndRestAnyC { this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.AnyCPU).Returns(Architecture.AnyCPU).Returns(Architecture.X64); - Assert.AreEqual(Architecture.X64, inferHelper.AutoDetectArchitecture(new List() { "x64.dll", "AnyCPU2.exe", "x64.dll" }, sourceArchitectures)); + Assert.AreEqual(Architecture.X64, inferHelper.AutoDetectArchitecture(new List() { "x64.dll", "AnyCPU2.exe", "x64.dll" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Exactly(3)); } @@ -122,7 +123,7 @@ public void AutoDetectArchitectureShouldReturnDefaultArchOnConflictArches() { this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.AnyCPU).Returns(Architecture.X64).Returns(Architecture.X86); - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "x64.exe", "x86.dll" }, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "x64.exe", "x86.dll" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Exactly(3)); } @@ -132,7 +133,7 @@ public void AutoDetectArchitectureShouldPoulateSourceArchitectureDictionary() this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.AnyCPU).Returns(Architecture.X64).Returns(Architecture.X86); - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "x64.exe", "x86.dll" }, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "x64.exe", "x86.dll" }, sourceArchitectures, DefaultArchitecture)); Assert.AreEqual(3, sourceArchitectures.Count); Assert.AreEqual(Architecture.AnyCPU, sourceArchitectures["AnyCPU1.dll"]); Assert.AreEqual(Architecture.X64, sourceArchitectures["x64.exe"]); @@ -146,7 +147,7 @@ public void AutoDetectArchitectureShouldReturnDefaultArchIfthereIsNotDotNetAssem { this.mockAssemblyHelper.SetupSequence(ah => ah.GetArchitecture(It.IsAny())) .Returns(Architecture.AnyCPU); - Assert.AreEqual(Constants.DefaultPlatform, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "NotDotNetAssebly.appx" }, sourceArchitectures)); + Assert.AreEqual(DefaultArchitecture, inferHelper.AutoDetectArchitecture(new List() { "AnyCPU1.dll", "NotDotNetAssebly.appx" }, sourceArchitectures, DefaultArchitecture)); this.mockAssemblyHelper.Verify(ah => ah.GetArchitecture(It.IsAny()), Times.Exactly(1)); } diff --git a/test/vstest.console.UnitTests/TestPlatformHelpers/TestRequestManagerTests.cs b/test/vstest.console.UnitTests/TestPlatformHelpers/TestRequestManagerTests.cs index 977a9a2c7c..968d0516da 100644 --- a/test/vstest.console.UnitTests/TestPlatformHelpers/TestRequestManagerTests.cs +++ b/test/vstest.console.UnitTests/TestPlatformHelpers/TestRequestManagerTests.cs @@ -262,7 +262,7 @@ public void DiscoverTestsShouldCollectMetrics() var payload = new DiscoveryRequestPayload() { - Sources = new List() { "a", "b" }, + Sources = new List() { "a.dll", "b.dll" }, RunSettings = @" 2 @@ -1063,7 +1063,7 @@ public void RunTestsShouldCollectMetrics() var payload = new TestRunRequestPayload() { - Sources = new List() { "a" }, + Sources = new List() { "a.dll" }, RunSettings = @" 2