File: InProcess\VisualStudio_InProc_Telemetry.cs
Web Access
Project: ..\..\..\src\VisualStudio\IntegrationTest\TestUtilities\Microsoft.VisualStudio.IntegrationTest.Utilities.csproj (Microsoft.VisualStudio.IntegrationTest.Utilities)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using Microsoft.VisualStudio.Telemetry;
 
namespace Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess
{
    internal partial class VisualStudio_InProc : InProcComponent
    {
        public void EnableTestTelemetryChannel()
        {
            InvokeOnUIThread(cancellationToken =>
            {
                TelemetryService.DetachTestChannel(LoggerTestChannel.Instance);
 
                LoggerTestChannel.Instance.Clear();
 
                TelemetryService.AttachTestChannel(LoggerTestChannel.Instance);
            });
        }
 
        public void DisableTestTelemetryChannel()
        {
            InvokeOnUIThread(cancellationToken =>
            {
                TelemetryService.DetachTestChannel(LoggerTestChannel.Instance);
 
                LoggerTestChannel.Instance.Clear();
            });
        }
 
        public bool TryWaitForTelemetryEvents(string[] names)
            => LoggerTestChannel.Instance.TryWaitForEvents(names);
 
        private sealed class LoggerTestChannel : ITelemetryTestChannel
        {
            public static readonly LoggerTestChannel Instance = new LoggerTestChannel();
 
            private BlockingCollection<TelemetryEvent> eventsQueue =
                new BlockingCollection<TelemetryEvent>();
 
            /// <summary>
            /// Waits for one or more events with the specified names
            /// </summary>
            /// <param name="events"></param>
            public bool TryWaitForEvents(string[] events)
            {
                if (!TelemetryService.DefaultSession.IsOptedIn)
                    return false;
 
                using var cancellationTokenSource = new CancellationTokenSource(Helper.HangMitigatingTimeout);
                var set = new HashSet<string>(events);
                while (set.Count > 0)
                {
                    var result = eventsQueue.Take(cancellationTokenSource.Token);
                    set.Remove(result.Name);
                }
 
                return true;
            }
 
            /// <summary>
            /// Clear current queue.
            /// </summary>
            public void Clear()
            {
                this.eventsQueue.CompleteAdding();
                this.eventsQueue = new BlockingCollection<TelemetryEvent>();
            }
 
            /// <summary>
            /// Process incoming events.
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void ITelemetryTestChannel.OnPostEvent(object sender, TelemetryTestChannelEventArgs e)
            {
                this.eventsQueue.Add(e.Event);
            }
        }
    }
}