File: ExtensionFramework\DataCollectionExtensionManager.cs
Web Access
Project: src\src\vstest\src\Microsoft.TestPlatform.Common\Microsoft.TestPlatform.Common.csproj (Microsoft.VisualStudio.TestPlatform.Common)
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System.Collections.Generic;

using Microsoft.VisualStudio.TestPlatform.Common.DataCollector;
using Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework.Utilities;
using Microsoft.VisualStudio.TestPlatform.Common.Interfaces;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;

namespace Microsoft.VisualStudio.TestPlatform.Common.ExtensionFramework;

/// <summary>
/// Manages loading and provides access to data collector extensions implementing the
/// DataCollector interface.
/// </summary>
internal class DataCollectorExtensionManager : TestExtensionManager<ObjectModel.DataCollection.DataCollector, IDataCollectorCapabilities>
{
    /// <summary>
    /// Default constructor.
    /// </summary>
    /// <param name="unfilteredTestExtensions">
    /// The unfiltered Test Extensions.
    /// </param>
    /// <param name="testExtensions">
    /// The test Extensions.
    /// </param>
    /// <param name="logger">
    /// The logger.
    /// </param>
    /// <remarks>
    /// The constructor is not public because the factory method should be used to get instances of this class.
    /// </remarks>
    protected DataCollectorExtensionManager(
        IEnumerable<LazyExtension<ObjectModel.DataCollection.DataCollector, Dictionary<string, object>>> unfilteredTestExtensions,
        IEnumerable<LazyExtension<ObjectModel.DataCollection.DataCollector, IDataCollectorCapabilities>> testExtensions,
        IMessageLogger logger)
        : base(unfilteredTestExtensions, testExtensions, logger)
    {
    }

    /// <summary>
    /// Gets an instance of the DataCollectorExtensionManager.
    /// </summary>
    /// <param name="messageLogger">
    /// The message Logger.
    /// </param>
    /// <returns>
    /// The DataCollectorExtensionManager.
    /// </returns>
    public static DataCollectorExtensionManager Create(IMessageLogger messageLogger)
    {
        TestPluginManager.GetSpecificTestExtensions<DataCollectorConfig, ObjectModel.DataCollection.DataCollector, IDataCollectorCapabilities, DataCollectorMetadata>(
            TestPlatformConstants.DataCollectorEndsWithPattern,
            out var unfilteredTestExtensions,
            out var filteredTestExtensions);

        return new DataCollectorExtensionManager(unfilteredTestExtensions, filteredTestExtensions, messageLogger);
    }

    /// <summary>
    /// Gets an instance of the DataCollectorExtensionManager.
    /// </summary>
    /// <param name="extensionAssemblyFilePath">
    /// File path that contains data collectors to load.
    /// </param>
    /// <param name="skipCache">
    /// Skip the extensions cache.
    /// </param>
    /// <param name="messageLogger">
    /// The message Logger.
    /// </param>
    /// <returns>
    /// The DataCollectorExtensionManager.
    /// </returns>
    public static DataCollectorExtensionManager Create(string extensionAssemblyFilePath, bool skipCache, IMessageLogger messageLogger)
    {
        TestPluginManager.GetTestExtensions<DataCollectorConfig, ObjectModel.DataCollection.DataCollector, IDataCollectorCapabilities, DataCollectorMetadata>(
            extensionAssemblyFilePath,
            out var unfilteredTestExtensions,
            out var filteredTestExtensions,
            skipCache);

        return new DataCollectorExtensionManager(unfilteredTestExtensions, filteredTestExtensions, messageLogger);
    }
}

/// <summary>
/// Hold data about the Data Collector.
/// </summary>
public class DataCollectorMetadata : IDataCollectorCapabilities
{
    /// <summary>
    /// Constructor for DataCollectorMetadata
    /// </summary>
    /// <param name="extension">
    /// Uri identifying the data collector.
    /// </param>
    /// <param name="friendlyName">
    /// The friendly Name.
    /// </param>
    public DataCollectorMetadata(string extension, string friendlyName)
        : this(extension, friendlyName, false)
    { }

    /// <summary>
    /// Constructor for DataCollectorMetadata
    /// </summary>
    /// <param name="extension">
    /// Uri identifying the data collector.
    /// </param>
    /// <param name="friendlyName">
    /// The friendly Name.
    /// </param>
    /// <param name="hasAttachmentProcessor">
    /// Indicates if the current data collector registers an attachment processor
    /// </param>
    public DataCollectorMetadata(string extension, string friendlyName, bool hasAttachmentProcessor)
    {
        ExtensionUri = extension;
        FriendlyName = friendlyName;
        HasAttachmentProcessor = hasAttachmentProcessor;
    }

    /// <summary>
    /// Gets Uri identifying the data collector.
    /// </summary>
    public string ExtensionUri
    {
        get;
        private set;
    }

    /// <summary>
    /// Gets Friendly Name identifying the data collector.
    /// </summary>
    public string FriendlyName
    {
        get;
        private set;
    }

    /// <summary>
    /// Check if the data collector has got attachment processor registered
    /// </summary>
    public bool HasAttachmentProcessor
    {
        get;
        private set;
    }
}