// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #if NETFRAMEWORK using System.Security; #endif using Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.ObjectModel; using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution; internal sealed class TestAssemblySettingsProvider #if NETFRAMEWORK : MarshalByRefObject #endif { #if NETFRAMEWORK /// /// Returns object to be used for controlling lifetime, null means infinite lifetime. /// /// /// The . /// [SecurityCritical] public override object? InitializeLifetimeService() => null; #endif [SuppressMessage( "Performance", "CA1822:Mark members as static", Justification = "Intentionally not static. We call it from a different AppDomain")] internal TestAssemblySettings GetSettings(string source) { var testAssemblySettings = new TestAssemblySettings(); // Load the source. Assembly testAssembly = PlatformServiceProvider.Instance.FileOperations.LoadAssembly(source); IReflectionOperations reflectionOperations = PlatformServiceProvider.Instance.ReflectionOperations; ParallelizeAttribute? parallelizeAttribute = reflectionOperations.GetSingleAttributeOrDefault(testAssembly); if (parallelizeAttribute is not null) { testAssemblySettings.Workers = parallelizeAttribute.Workers; testAssemblySettings.Scope = parallelizeAttribute.Scope; if (testAssemblySettings.Workers == 0) { testAssemblySettings.Workers = Environment.ProcessorCount; } } testAssemblySettings.CanParallelizeAssembly = !reflectionOperations.IsAttributeDefined(testAssembly); return testAssemblySettings; } }