/// <summary> /// Test for the method overload: public EventPipeSession StartEventPipeSession(EventPipeProvider provider, bool requestRundown=true, int circularBufferMB=256) /// </summary> private async Task StartEventPipeSessionWithSingleProviderTestCore(bool useAsync) { using TestRunner runner = new TestRunner(CommonHelper.GetTraceePathWithArgs(), output); runner.Start(timeoutInMSPipeCreation: 15_000, testProcessTimeout: 60_000); DiagnosticsClientApiShim clientShim = new DiagnosticsClientApiShim(new DiagnosticsClient(runner.Pid), useAsync); using (var session = await clientShim.StartEventPipeSession(new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational))) { Assert.True(session.EventStream != null); } runner.Stop(); }
/// <summary> /// Tries to start an EventPipe session on a non-existent process /// </summary> private async Task EventPipeSessionUnavailableTestCore(bool useAsync) { List <int> pids = new List <int>(DiagnosticsClient.GetPublishedProcesses()); int arbitraryPid = 1; DiagnosticsClientApiShim clientShim = new DiagnosticsClientApiShim(new DiagnosticsClient(arbitraryPid), useAsync); await Assert.ThrowsAsync <ServerNotAvailableException>(() => clientShim.StartEventPipeSession(new List <EventPipeProvider>() { new EventPipeProvider("Microsoft-Windows-DotNETRuntime", EventLevel.Informational) })); }
/// <summary> /// Checks if we can create an EventPipeSession and can get some expected events out of it. /// </summary> private async Task EventPipeSessionStreamTestCore(bool useAsync) { TestRunner runner = new TestRunner(CommonHelper.GetTraceePathWithArgs(), output); runner.Start(timeoutInMSPipeCreation: 15_000, testProcessTimeout: 60_000); DiagnosticsClientApiShim clientShim = new DiagnosticsClientApiShim(new DiagnosticsClient(runner.Pid), useAsync); runner.PrintStatus(); output.WriteLine($"[{DateTime.Now.ToString()}] Trying to start an EventPipe session on process {runner.Pid}"); using (var session = await clientShim.StartEventPipeSession(new List <EventPipeProvider>() { new EventPipeProvider("System.Runtime", EventLevel.Informational, 0, new Dictionary <string, string>() { { "EventCounterIntervalSec", "1" } }) })) { var evntCnt = 0; Task streamTask = Task.Run(() => { var source = new EventPipeEventSource(session.EventStream); source.Dynamic.All += (TraceEvent obj) => { output.WriteLine("Got an event"); evntCnt += 1; }; try { source.Process(); } catch (Exception e) { // This exception can happen if the target process exits while EventPipeEventSource is in the middle of reading from the pipe. output.WriteLine("Error encountered while processing events"); output.WriteLine(e.ToString()); } finally { runner.Stop(); } }); output.WriteLine("Waiting for stream Task"); streamTask.Wait(10000); output.WriteLine("Done waiting for stream Task"); Assert.True(evntCnt > 0); } }
/// <summary> /// Verifies that a client can handle multiple operations simultaneously. /// </summary> private async Task VerifySingleSession(IpcEndpointInfo info, bool useAsync) { await VerifyWaitForConnection(info, useAsync); var clientShim = new DiagnosticsClientApiShim(new DiagnosticsClient(info.Endpoint), useAsync); _outputHelper.WriteLine($"{info.RuntimeInstanceCookie}: Creating session #1."); var providers = new List <EventPipeProvider>(); providers.Add(new EventPipeProvider( "System.Runtime", EventLevel.Informational, 0, new Dictionary <string, string>() { { "EventCounterIntervalSec", "1" } })); using var session = await clientShim.StartEventPipeSession(providers); _outputHelper.WriteLine($"{info.RuntimeInstanceCookie}: Verifying session produces events."); await VerifyEventStreamProvidesEventsAsync(info, session, 1); _outputHelper.WriteLine($"{info.RuntimeInstanceCookie}: Session verification complete."); }
public static Task <EventPipeSession> StartEventPipeSession(this DiagnosticsClientApiShim shim, EventPipeProvider provider) { return(shim.StartEventPipeSession(provider, DefaultPositiveVerificationTimeout)); }